/** * Returns product final price depending on options chosen * * @param float $qty * @param \Magento\Catalog\Model\Product $product * @return float */ public function getFinalPrice($qty, $product) { if ($qty === null && $product->getCalculatedFinalPrice() !== null) { return $product->getCalculatedFinalPrice(); } $finalPrice = parent::getFinalPrice($qty, $product); if ($product->hasCustomOptions()) { /* @var $typeInstance \Magento\GroupedProduct\Model\Product\Type\Grouped */ $typeInstance = $product->getTypeInstance(); $associatedProducts = $typeInstance->setStoreFilter($product->getStore(), $product)->getAssociatedProducts($product); foreach ($associatedProducts as $childProduct) { /* @var $childProduct \Magento\Catalog\Model\Product */ $option = $product->getCustomOption('associated_product_' . $childProduct->getId()); if (!$option) { continue; } $childQty = $option->getValue(); if (!$childQty) { continue; } $finalPrice += $childProduct->getFinalPrice($childQty) * $childQty; } } $product->setFinalPrice($finalPrice); return max(0, $product->getData('final_price')); }
public function testGetFinalPrice() { /** @var $product \Magento\Catalog\Model\Product */ $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Model\\Product'); $product->load(1); // fixture // regular & tier prices $this->assertEquals(10.0, $this->_model->getFinalPrice(1, $product)); $this->assertEquals(8.0, $this->_model->getFinalPrice(2, $product)); $this->assertEquals(5.0, $this->_model->getFinalPrice(5, $product)); // with options $product->addCustomOption('option_ids', implode(',', array_keys($product->getOptions()))); foreach ($product->getOptions() as $id => $option) { $product->addCustomOption("option_{$id}", $option->getValue()); } $this->assertEquals(16.0, $this->_model->getFinalPrice(1, $product)); }
/** * Get product final price * * @param float $qty * @param \Magento\Catalog\Model\Product $product * @return float */ public function getFinalPrice($qty, $product) { if ($qty === null && $product->getCalculatedFinalPrice() !== null) { return $product->getCalculatedFinalPrice(); } if ($product->getCustomOption('simple_product') && $product->getCustomOption('simple_product')->getProduct()) { $finalPrice = parent::getFinalPrice($qty, $product->getCustomOption('simple_product')->getProduct()); } else { $priceInfo = $product->getPriceInfo(); $finalPrice = $priceInfo->getPrice('final_price')->getAmount()->getValue(); } $finalPrice = $this->_applyOptionsPrice($product, $qty, $finalPrice); $finalPrice = max(0, $finalPrice); $product->setFinalPrice($finalPrice); return $finalPrice; }
public function testGetFinalPrice() { $repository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Model\\ProductRepository'); $product = $repository->get('simple'); // fixture // regular & tier prices $this->assertEquals(10.0, $this->_model->getFinalPrice(1, $product)); $this->assertEquals(8.0, $this->_model->getFinalPrice(2, $product)); $this->assertEquals(5.0, $this->_model->getFinalPrice(5, $product)); // with options $buyRequest = $this->prepareBuyRequest($product); $product->getTypeInstance()->prepareForCart($buyRequest, $product); //product price + options price(10+1+2+3+3) $this->assertEquals(19.0, $this->_model->getFinalPrice(1, $product)); //product tier price + options price(5+1+2+3+3) $this->assertEquals(14.0, $this->_model->getFinalPrice(5, $product)); }
/** * Retrieve product final price * * @param integer $qty * @param \Magento\Catalog\Model\Product $product * @return float */ public function getFinalPrice($qty, $product) { if ($qty === null && $product->getCalculatedFinalPrice() !== null) { return $product->getCalculatedFinalPrice(); } $finalPrice = parent::getFinalPrice($qty, $product); /** * links prices are added to base product price only if they can be purchased separately */ if ($product->getLinksPurchasedSeparately()) { if ($linksIds = $product->getCustomOption('downloadable_link_ids')) { $linkPrice = 0; $links = $product->getTypeInstance()->getLinks($product); foreach (explode(',', $linksIds->getValue()) as $linkId) { if (isset($links[$linkId])) { $linkPrice += $links[$linkId]->getPrice(); } } $finalPrice += $linkPrice; } } $product->setData('final_price', $finalPrice); return max(0, $product->getData('final_price')); }