/** * Validate Product Rule Condition * * @param \Magento\Framework\Model\AbstractModel $model * @return bool */ public function validate(\Magento\Framework\Model\AbstractModel $model) { //@todo reimplement this method when is fixed MAGETWO-5713 /** @var \Magento\Catalog\Model\Product $product */ $product = $model->getProduct(); if (!$product instanceof \Magento\Catalog\Model\Product) { $product = $this->productRepository->getById($model->getProductId()); } $product->setQuoteItemQty($model->getQty())->setQuoteItemPrice($model->getPrice())->setQuoteItemRowTotal($model->getBaseRowTotal()); return parent::validate($product); }
/** * Save option value price data * * @param \Magento\Framework\Model\AbstractModel $object * @return void */ protected function _saveValuePrices(\Magento\Framework\Model\AbstractModel $object) { $priceTable = $this->getTable('catalog_product_option_type_price'); $price = (double) sprintf('%F', $object->getPrice()); $priceType = $object->getPriceType(); if (!$object->getData('scope', 'price')) { //save for store_id = 0 $select = $this->_getReadAdapter()->select()->from($priceTable, 'option_type_id')->where('option_type_id = ?', (int) $object->getId())->where('store_id = ?', \Magento\Store\Model\Store::DEFAULT_STORE_ID); $optionTypeId = $this->_getReadAdapter()->fetchOne($select); if ($optionTypeId) { if ($object->getStoreId() == '0') { $bind = array('price' => $price, 'price_type' => $priceType); $where = array('option_type_id = ?' => $optionTypeId, 'store_id = ?' => \Magento\Store\Model\Store::DEFAULT_STORE_ID); $this->_getWriteAdapter()->update($priceTable, $bind, $where); } } else { $bind = array('option_type_id' => (int) $object->getId(), 'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID, 'price' => $price, 'price_type' => $priceType); $this->_getWriteAdapter()->insert($priceTable, $bind); } } $scope = (int) $this->_config->getValue(\Magento\Store\Model\Store::XML_PATH_PRICE_SCOPE, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); if ($object->getStoreId() != '0' && $scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE) { $baseCurrency = $this->_config->getValue(\Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE, 'default'); $storeIds = $this->_storeManager->getStore($object->getStoreId())->getWebsite()->getStoreIds(); if (is_array($storeIds)) { foreach ($storeIds as $storeId) { if ($priceType == 'fixed') { $storeCurrency = $this->_storeManager->getStore($storeId)->getBaseCurrencyCode(); /** @var $currencyModel \Magento\Directory\Model\Currency */ $currencyModel = $this->_currencyFactory->create(); $currencyModel->load($baseCurrency); $rate = $currencyModel->getRate($storeCurrency); if (!$rate) { $rate = 1; } $newPrice = $price * $rate; } else { $newPrice = $price; } $select = $this->_getReadAdapter()->select()->from($priceTable, 'option_type_id')->where('option_type_id = ?', (int) $object->getId())->where('store_id = ?', (int) $storeId); $optionTypeId = $this->_getReadAdapter()->fetchOne($select); if ($optionTypeId) { $bind = array('price' => $newPrice, 'price_type' => $priceType); $where = array('option_type_id = ?' => (int) $optionTypeId, 'store_id = ?' => (int) $storeId); $this->_getWriteAdapter()->update($priceTable, $bind, $where); } else { $bind = array('option_type_id' => (int) $object->getId(), 'store_id' => (int) $storeId, 'price' => $newPrice, 'price_type' => $priceType); $this->_getWriteAdapter()->insert($priceTable, $bind); } } } } else { if ($scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE && $object->getData('scope', 'price')) { $where = array('option_type_id = ?' => (int) $object->getId(), 'store_id = ?' => (int) $object->getStoreId()); $this->_getWriteAdapter()->delete($priceTable, $where); } } }
/** * Save value prices * * @param \Magento\Framework\Model\AbstractModel $object * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function _saveValuePrices(\Magento\Framework\Model\AbstractModel $object) { $priceTable = $this->getTable('catalog_product_option_price'); $connection = $this->getConnection(); /* * Better to check param 'price' and 'price_type' for saving. * If there is not price skip saving price */ if ($object->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_FIELD || $object->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_AREA || $object->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_FILE || $object->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_DATE || $object->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_DATE_TIME || $object->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_TIME) { //save for store_id = 0 if (!$object->getData('scope', 'price')) { $statement = $connection->select()->from($priceTable, 'option_id')->where('option_id = ?', $object->getId())->where('store_id = ?', \Magento\Store\Model\Store::DEFAULT_STORE_ID); $optionId = $connection->fetchOne($statement); if ($optionId) { if ($object->getStoreId() == '0') { $data = $this->_prepareDataForTable(new \Magento\Framework\DataObject(['price' => $object->getPrice(), 'price_type' => $object->getPriceType()]), $priceTable); $connection->update($priceTable, $data, ['option_id = ?' => $object->getId(), 'store_id = ?' => \Magento\Store\Model\Store::DEFAULT_STORE_ID]); } } else { $data = $this->_prepareDataForTable(new \Magento\Framework\DataObject(['option_id' => $object->getId(), 'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID, 'price' => $object->getPrice(), 'price_type' => $object->getPriceType()]), $priceTable); $connection->insert($priceTable, $data); } } $scope = (int) $this->_config->getValue(\Magento\Store\Model\Store::XML_PATH_PRICE_SCOPE, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); if ($object->getStoreId() != '0' && $scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE) { $baseCurrency = $this->_config->getValue(\Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE, 'default'); $storeIds = $this->_storeManager->getStore($object->getStoreId())->getWebsite()->getStoreIds(); if (is_array($storeIds)) { foreach ($storeIds as $storeId) { if ($object->getPriceType() == 'fixed') { $storeCurrency = $this->_storeManager->getStore($storeId)->getBaseCurrencyCode(); $rate = $this->_currencyFactory->create()->load($baseCurrency)->getRate($storeCurrency); if (!$rate) { $rate = 1; } $newPrice = $object->getPrice() * $rate; } else { $newPrice = $object->getPrice(); } $statement = $connection->select()->from($priceTable)->where('option_id = ?', $object->getId())->where('store_id = ?', $storeId); if ($connection->fetchOne($statement)) { $data = $this->_prepareDataForTable(new \Magento\Framework\DataObject(['price' => $newPrice, 'price_type' => $object->getPriceType()]), $priceTable); $connection->update($priceTable, $data, ['option_id = ?' => $object->getId(), 'store_id = ?' => $storeId]); } else { $data = $this->_prepareDataForTable(new \Magento\Framework\DataObject(['option_id' => $object->getId(), 'store_id' => $storeId, 'price' => $newPrice, 'price_type' => $object->getPriceType()]), $priceTable); $connection->insert($priceTable, $data); } } } } elseif ($scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE && $object->getData('scope', 'price')) { $connection->delete($priceTable, ['option_id = ?' => $object->getId(), 'store_id = ?' => $object->getStoreId()]); } } return $this; }