Skip to content

Commit db09833

Browse files
committed
MAGETWO-90286: Bundle Product is_salable check is wrong
1 parent f658498 commit db09833

File tree

4 files changed

+87
-19
lines changed

4 files changed

+87
-19
lines changed

app/code/Magento/Bundle/Model/Product/Type.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\Framework\Serialize\Serializer\Json;
1313
use Magento\Framework\EntityManager\MetadataPool;
1414
use Magento\Bundle\Model\ResourceModel\Selection\Collection\FilterApplier as SelectionCollectionFilterApplier;
15+
use Magento\Bundle\Model\ResourceModel\Selection\Collection as Selections;
1516

1617
/**
1718
* Bundle Type Model
@@ -484,7 +485,9 @@ public function getSelectionsCollection($optionIds, $product)
484485
\Magento\Catalog\Api\Data\ProductInterface::class
485486
);
486487

487-
$selectionsCollection = $this->_bundleCollection->create()
488+
/** @var Selections $selectionsCollection */
489+
$selectionsCollection = $this->_bundleCollection->create();
490+
$selectionsCollection
488491
->addAttributeToSelect($this->_config->getProductAttributes())
489492
->addAttributeToSelect('tax_class_id') //used for calculation item taxes in Bundle with Dynamic Price
490493
->setFlag('product_children', true)
@@ -853,8 +856,9 @@ public function getSelectionsByIds($selectionIds, $product)
853856

854857
if (!$usedSelections || $usedSelectionsIds !== $selectionIds) {
855858
$storeId = $product->getStoreId();
856-
$usedSelections = $this->_bundleCollection
857-
->create()
859+
/** @var Selections $usedSelections */
860+
$usedSelections = $this->_bundleCollection->create();
861+
$usedSelections
858862
->addAttributeToSelect('*')
859863
->setFlag('product_children', true)
860864
->addStoreFilter($this->getStoreFilter($product))

app/code/Magento/Bundle/Model/ResourceModel/Selection/Collection.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,33 @@ public function setPositionOrder()
163163
}
164164

165165
/**
166-
* Add filtering of product then havent enoght stock
166+
* Add filtering of products that have 0 items left.
167167
*
168168
* @return $this
169169
* @since 100.2.0
170170
*/
171171
public function addQuantityFilter()
172172
{
173+
$stockItemTable = $this->getTable('cataloginventory_stock_item');
174+
$stockStatusTable = $this->getTable('cataloginventory_stock_status');
173175
$this->getSelect()
174176
->joinInner(
175-
['stock' => $this->getTable('cataloginventory_stock_status')],
177+
['stock' => $stockStatusTable],
176178
'selection.product_id = stock.product_id',
177179
[]
180+
)->joinInner(
181+
['stock_item' => $stockItemTable],
182+
'selection.product_id = stock_item.product_id',
183+
[]
178184
)
179185
->where(
180-
'(selection.selection_can_change_qty or selection.selection_qty <= stock.qty) and stock.stock_status'
186+
'('
187+
. 'selection.selection_can_change_qty'
188+
. ' or '
189+
. 'selection.selection_qty <= stock.qty'
190+
. ' or '
191+
.'stock_item.manage_stock = 0'
192+
. ') and stock.stock_status = 1'
181193
);
182194
return $this;
183195
}

app/code/Magento/Bundle/Test/Unit/Model/ResourceModel/Selection/CollectionTest.php

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,17 +111,39 @@ protected function setUp()
111111

112112
public function testAddQuantityFilter()
113113
{
114-
$tableName = 'cataloginventory_stock_status';
115-
$this->entity->expects($this->once())
114+
$statusTableName = 'cataloginventory_stock_status';
115+
$itemTableName = 'cataloginventory_stock_item';
116+
$this->entity->expects($this->exactly(2))
116117
->method('getTable')
117-
->willReturn($tableName);
118-
$this->select->expects($this->once())
118+
->willReturnOnConsecutiveCalls($itemTableName, $statusTableName);
119+
$this->select->expects($this->exactly(2))
119120
->method('joinInner')
120-
->with(
121-
['stock' => $tableName],
122-
'selection.product_id = stock.product_id',
123-
[]
121+
->withConsecutive(
122+
[
123+
['stock' => $statusTableName],
124+
'selection.product_id = stock.product_id',
125+
[],
126+
],
127+
[
128+
['stock_item' => $itemTableName],
129+
'selection.product_id = stock_item.product_id',
130+
[],
131+
]
124132
)->willReturnSelf();
133+
$this->select
134+
->expects($this->once())
135+
->method('where')
136+
->with(
137+
'('
138+
. 'selection.selection_can_change_qty'
139+
. ' or '
140+
. 'selection.selection_qty <= stock.qty'
141+
. ' or '
142+
.'stock_item.manage_stock = 0'
143+
. ') and stock.stock_status = 1'
144+
)
145+
->willReturnSelf();
146+
125147
$this->assertEquals($this->model, $this->model->addQuantityFilter());
126148
}
127149
}

dev/tests/integration/testsuite/Magento/Bundle/_files/multiple_products.php

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@
2929
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
3030
->setWebsiteIds([1])
3131
->setCateroryIds([])
32-
->setStockData(['use_config_manage_stock' => 1, 'qty' => 100, 'is_qty_decimal' => 0, 'is_in_stock' => 1]);
32+
->setStockData([
33+
'use_config_manage_stock' => 1,
34+
'qty' => 100,
35+
'is_qty_decimal' => 0,
36+
'is_in_stock' => 1,
37+
'manage_stock' => 1,
38+
]);
3339

3440
$productRepository->save($product);
3541

@@ -54,7 +60,13 @@
5460
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
5561
->setWebsiteIds([1])
5662
->setCateroryIds([])
57-
->setStockData(['use_config_manage_stock' => 1, 'qty' => 50, 'is_qty_decimal' => 0, 'is_in_stock' => 1]);
63+
->setStockData([
64+
'use_config_manage_stock' => 1,
65+
'qty' => 50,
66+
'is_qty_decimal' => 0,
67+
'is_in_stock' => 1,
68+
'manage_stock' => 1,
69+
]);
5870

5971
$productRepository->save($product);
6072

@@ -74,7 +86,13 @@
7486
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
7587
->setWebsiteIds([1])
7688
->setCateroryIds([])
77-
->setStockData(['use_config_manage_stock' => 1, 'qty' => 140, 'is_qty_decimal' => 0, 'is_in_stock' => 1]);
89+
->setStockData([
90+
'use_config_manage_stock' => 1,
91+
'qty' => 140,
92+
'is_qty_decimal' => 0,
93+
'is_in_stock' => 1,
94+
'manage_stock' => 1,
95+
]);
7896

7997
$productRepository->save($product);
8098

@@ -99,7 +117,13 @@
99117
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
100118
->setWebsiteIds([1])
101119
->setCateroryIds([])
102-
->setStockData(['use_config_manage_stock' => 1, 'qty' => 20, 'is_qty_decimal' => 0, 'is_in_stock' => 1]);
120+
->setStockData([
121+
'use_config_manage_stock' => 1,
122+
'qty' => 20,
123+
'is_qty_decimal' => 0,
124+
'is_in_stock' => 1,
125+
'manage_stock' => 1,
126+
]);
103127

104128
$productRepository->save($product);
105129

@@ -124,6 +148,12 @@
124148
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
125149
->setWebsiteIds([1])
126150
->setCateroryIds([])
127-
->setStockData(['use_config_manage_stock' => 1, 'qty' => 15, 'is_qty_decimal' => 0, 'is_in_stock' => 1]);
151+
->setStockData([
152+
'use_config_manage_stock' => 1,
153+
'qty' => 15,
154+
'is_qty_decimal' => 0,
155+
'is_in_stock' => 1,
156+
'manage_stock' => 1,
157+
]);
128158

129159
$productRepository->save($product);

0 commit comments

Comments
 (0)