22 private $selectionFactory;
34 $this->selectionFactory = $bundleSelectionFactory;
42 $shouldFindMinOption = $this->isShouldFindMinOption(
$bundleProduct, $searchMin);
43 $canSkipRequiredOptions = $searchMin && !$shouldFindMinOption;
47 $this->priceList = [];
51 if ($this->canSkipOption(
$option, $canSkipRequiredOptions)) {
55 $selectionsCollection =
$typeInstance->getSelectionsCollection(
59 $selectionsCollection->removeAttributeToSelect();
60 $selectionsCollection->addQuantityFilter();
62 if (!$useRegularPrice) {
63 $selectionsCollection->addAttributeToSelect(
'special_price');
64 $selectionsCollection->addAttributeToSelect(
'special_from_date');
65 $selectionsCollection->addAttributeToSelect(
'special_to_date');
66 $selectionsCollection->addAttributeToSelect(
'tax_class_id');
69 if (!$searchMin &&
$option->isMultiSelection()) {
70 $this->addMaximumMultiSelectionPriceList(
$bundleProduct, $selectionsCollection, $useRegularPrice);
72 $this->addMiniMaxPriceList(
$bundleProduct, $selectionsCollection, $searchMin, $useRegularPrice);
76 if ($shouldFindMinOption) {
77 $this->processMinPriceForNonRequiredOptions();
80 return $this->priceList;
90 private function isShouldFindMinOption(Product
$bundleProduct, $searchMin)
92 $shouldFindMinOption =
false;
97 $shouldFindMinOption =
true;
100 return $shouldFindMinOption;
112 private function addMiniMaxPriceList(Product
$bundleProduct, $selectionsCollection, $searchMin, $useRegularPrice)
114 $selectionsCollection->addPriceFilter(
$bundleProduct, $searchMin, $useRegularPrice);
115 $selectionsCollection->setPage(0, 1);
117 $selection = $selectionsCollection->getFirstItem();
119 if (!$selection->isEmpty()) {
120 $this->priceList[] = $this->selectionFactory->create(
123 $selection->getSelectionQty(),
125 'useRegularPrice' => $useRegularPrice,
139 private function addMaximumMultiSelectionPriceList(Product
$bundleProduct, $selectionsCollection, $useRegularPrice)
141 $selectionsCollection->addPriceData();
143 foreach ($selectionsCollection as $selection) {
144 $this->priceList[] = $this->selectionFactory->create(
147 $selection->getSelectionQty(),
149 'useRegularPrice' => $useRegularPrice,
158 private function processMinPriceForNonRequiredOptions()
161 $priceSelection =
null;
162 foreach ($this->priceList as
$price) {
163 $minPriceTmp =
$price->getAmount()->getValue() *
$price->getQuantity();
164 if (!$minPrice || $minPriceTmp < $minPrice) {
165 $minPrice = $minPriceTmp;
169 $this->priceList = $priceSelection ? [$priceSelection] : [];
179 private function canSkipOption(
$option, $canSkipRequiredOption)
181 return $canSkipRequiredOption && !
$option->getRequired();
204 private function getBundleOptions(Product $saleableItem)
206 return $saleableItem->getTypeInstance()->getOptionsCollection($saleableItem);
__construct(BundleSelectionFactory $bundleSelectionFactory)
getPriceList(Product $bundleProduct, $searchMin, $useRegularPrice)