123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\Bundle\Pricing\Price;
- use Magento\Bundle\Pricing\Adjustment\BundleCalculatorInterface;
- use Magento\Framework\Pricing\SaleableInterface;
- use Magento\Framework\Pricing\Amount\AmountInterface;
- use Magento\Catalog\Model\Product;
- /**
- * Bundle option price calculation model.
- */
- class BundleOptions
- {
- /**
- * @var BundleCalculatorInterface
- */
- private $calculator;
- /**
- * @var BundleSelectionFactory
- */
- private $selectionFactory;
- /**
- * @var AmountInterface[]
- */
- private $optionSelectionAmountCache = [];
- /**
- * @param BundleCalculatorInterface $calculator
- * @param BundleSelectionFactory $bundleSelectionFactory
- */
- public function __construct(
- BundleCalculatorInterface $calculator,
- BundleSelectionFactory $bundleSelectionFactory
- ) {
- $this->calculator = $calculator;
- $this->selectionFactory = $bundleSelectionFactory;
- }
- /**
- * Get Options with attached Selections collection.
- *
- * @param SaleableInterface $bundleProduct
- * @return \Magento\Bundle\Model\ResourceModel\Option\Collection|array
- */
- public function getOptions(SaleableInterface $bundleProduct)
- {
- /** @var \Magento\Bundle\Model\Product\Type $typeInstance */
- $typeInstance = $bundleProduct->getTypeInstance();
- $typeInstance->setStoreFilter($bundleProduct->getStoreId(), $bundleProduct);
- /** @var \Magento\Bundle\Model\ResourceModel\Option\Collection $optionCollection */
- $optionCollection = $typeInstance->getOptionsCollection($bundleProduct);
- /** @var \Magento\Bundle\Model\ResourceModel\Selection\Collection $selectionCollection */
- $selectionCollection = $typeInstance->getSelectionsCollection(
- $typeInstance->getOptionsIds($bundleProduct),
- $bundleProduct
- );
- $priceOptions = $optionCollection->appendSelections($selectionCollection, true, false);
- return $priceOptions;
- }
- /**
- * Calculate maximal or minimal options value.
- *
- * @param SaleableInterface $bundleProduct
- * @param bool $searchMin
- *
- * @return float
- */
- public function calculateOptions(
- SaleableInterface $bundleProduct,
- bool $searchMin = true
- ) : float {
- $priceList = [];
- /* @var \Magento\Bundle\Model\Option $option */
- foreach ($this->getOptions($bundleProduct) as $option) {
- if ($searchMin && !$option->getRequired()) {
- continue;
- }
- /** @var \Magento\Bundle\Pricing\Price\BundleSelectionPrice $selectionPriceList */
- $selectionPriceList = $this->calculator->createSelectionPriceList($option, $bundleProduct);
- $selectionPriceList = $this->calculator->processOptions($option, $selectionPriceList, $searchMin);
- $priceList = array_merge($priceList, $selectionPriceList);
- }
- $amount = $this->calculator->calculateBundleAmount(0., $bundleProduct, $priceList);
- return $amount->getValue();
- }
- /**
- * Get selection amount.
- *
- * @param Product $bundleProduct
- * @param \Magento\Bundle\Model\Selection|Product $selection
- * @param bool $useRegularPrice
- *
- * @return AmountInterface
- */
- public function getOptionSelectionAmount(
- Product $bundleProduct,
- $selection,
- bool $useRegularPrice = false
- ) : AmountInterface {
- $cacheKey = implode(
- '_',
- [
- $bundleProduct->getId(),
- $selection->getOptionId(),
- $selection->getSelectionId(),
- $useRegularPrice ? 1 : 0,
- ]
- );
- if (!isset($this->optionSelectionAmountCache[$cacheKey])) {
- $selectionPrice = $this->selectionFactory
- ->create(
- $bundleProduct,
- $selection,
- $selection->getSelectionQty(),
- ['useRegularPrice' => $useRegularPrice]
- );
- $this->optionSelectionAmountCache[$cacheKey] = $selectionPrice->getAmount();
- }
- return $this->optionSelectionAmountCache[$cacheKey];
- }
- }
|