Skip to content

Commit 6619bdf

Browse files
Merge pull request magento#576 from magento-firedrakes/bugfixes
Bugs - MAGETWO-59905 Order create page broken after refresh
2 parents fa0ed96 + c421e93 commit 6619bdf

File tree

18 files changed

+504
-197
lines changed

18 files changed

+504
-197
lines changed

app/code/Magento/Catalog/Model/Indexer/Product/Flat/FlatTableBuilder.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ protected function _fillTemporaryFlatTable(array $tables, $storeId, $valueFieldS
281281
if (!empty($columnValueNames)) {
282282
$select->joinLeft(
283283
$temporaryValueTableName,
284-
sprintf('e.%1$s = %2$s.%1$s', $linkField, $temporaryTableName),
284+
sprintf('e.%1$s = %2$s.%1$s', $linkField, $temporaryValueTableName),
285285
$columnValueNames
286286
);
287287
$allColumns = array_merge($allColumns, $columnValueNames);

app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Flat/FlatTableBuilderTest.php

+23-22
Original file line numberDiff line numberDiff line change
@@ -107,44 +107,42 @@ protected function setUp()
107107

108108
public function testBuild()
109109
{
110-
list($storeId, $changedIds, $valueFieldSuffix, $tableDropSuffix, $fillTmpTables) = [1, [], '', '', true];
110+
$storeId = 1;
111+
$changedIds = [];
112+
$valueFieldSuffix = '_value';
113+
$tableDropSuffix = '';
114+
$fillTmpTables = true;
111115
$tableName = 'catalog_product_entity';
112116
$attributeTable = 'catalog_product_entity_int';
113117
$temporaryTableName = 'catalog_product_entity_int_tmp_indexer';
114-
$temporaryValueTableName = 'catalog_product_entity_int_tmp_indexer';
118+
$temporaryValueTableName = 'catalog_product_entity_int_tmp_indexer_value';
115119
$linkField = 'entity_id';
116120
$statusId = 22;
121+
$eavCustomField = 'space_weight';
122+
$eavCustomValueField = $eavCustomField . $valueFieldSuffix;
117123
$this->flatIndexerMock->expects($this->once())->method('getAttributes')->willReturn([]);
118124
$this->flatIndexerMock->expects($this->exactly(3))->method('getFlatColumns')
119-
->willReturnOnConsecutiveCalls(
120-
[],
121-
[$linkField => []],
122-
[$linkField => []]
123-
);
125+
->willReturnOnConsecutiveCalls([], [$eavCustomValueField => []], [$eavCustomValueField => []]);
124126
$this->flatIndexerMock->expects($this->once())->method('getFlatIndexes')->willReturn([]);
125127
$statusAttributeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute::class)
126128
->disableOriginalConstructor()
127129
->getMock();
130+
$eavCustomAttributeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute::class)
131+
->disableOriginalConstructor()
132+
->getMock();
128133
$this->flatIndexerMock->expects($this->once())->method('getTablesStructure')
129134
->willReturn(
130135
[
131-
'catalog_product_entity' => [
132-
$linkField => $statusAttributeMock
133-
],
136+
'catalog_product_entity' => [$linkField => $statusAttributeMock],
134137
'catalog_product_entity_int' => [
135-
$linkField => $statusAttributeMock
138+
$linkField => $statusAttributeMock,
139+
$eavCustomField => $eavCustomAttributeMock
136140
]
137141
]
138142
);
139143
$this->flatIndexerMock->expects($this->atLeastOnce())->method('getTable')
140-
->withConsecutive(
141-
[$tableName],
142-
['catalog_product_website']
143-
)
144-
->willReturnOnConsecutiveCalls(
145-
$tableName,
146-
'catalog_product_website'
147-
);
144+
->withConsecutive([$tableName], ['catalog_product_website'])
145+
->willReturnOnConsecutiveCalls($tableName, 'catalog_product_website');
148146
$this->flatIndexerMock->expects($this->once())->method('getAttribute')
149147
->with('status')
150148
->willReturn($statusAttributeMock);
@@ -155,6 +153,9 @@ public function testBuild()
155153
$statusAttributeMock->expects($this->atLeastOnce())->method('getBackend')->willReturn(
156154
$backendMock
157155
);
156+
$eavCustomAttributeMock->expects($this->atLeastOnce())->method('getBackend')->willReturn(
157+
$backendMock
158+
);
158159
$statusAttributeMock->expects($this->atLeastOnce())->method('getId')->willReturn($statusId);
159160
$tableMock = $this->getMockBuilder(\Magento\Framework\DB\Ddl\Table::class)
160161
->disableOriginalConstructor()
@@ -185,12 +186,12 @@ public function testBuild()
185186
[
186187
$temporaryTableName,
187188
"e.{$linkField} = {$temporaryTableName}.{$linkField}",
188-
[$linkField]
189+
[$linkField, $eavCustomField]
189190
],
190191
[
191192
$temporaryValueTableName,
192-
"e.{$linkField} = " . $temporaryValueTableName . ".{$linkField}",
193-
[$linkField]
193+
"e.{$linkField} = {$temporaryValueTableName}.{$linkField}",
194+
[$eavCustomValueField]
194195
]
195196
)->willReturnSelf();
196197
$this->metadataPoolMock->expects($this->atLeastOnce())->method('getMetadata')->with(ProductInterface::class)

app/code/Magento/CatalogInventory/etc/events.xml

-3
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@
3333
<event name="sales_order_item_cancel">
3434
<observer name="inventory" instance="Magento\CatalogInventory\Observer\CancelOrderItemObserver"/>
3535
</event>
36-
<event name="sales_order_creditmemo_save_after">
37-
<observer name="inventory" instance="Magento\CatalogInventory\Observer\RefundOrderInventoryObserver"/>
38-
</event>
3936
<event name="catalog_product_save_after">
4037
<observer name="inventory" instance="Magento\CatalogInventory\Observer\SaveInventoryDataObserver"/>
4138
</event>

app/code/Magento/Checkout/view/frontend/web/js/region-updater.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
define([
88
'jquery',
99
'mage/template',
10+
'underscore',
1011
'jquery/ui',
1112
'mage/validation'
12-
], function ($, mageTemplate) {
13+
], function ($, mageTemplate, _) {
1314
'use strict';
1415

1516
$.widget('mage.regionUpdater', {
@@ -124,6 +125,8 @@ define([
124125
* @private
125126
*/
126127
_clearError: function () {
128+
var args = ['clearError', this.options.regionListId, this.options.regionInputId, this.options.postcodeId];
129+
127130
if (this.options.clearError && typeof this.options.clearError === 'function') {
128131
this.options.clearError.call(this);
129132
} else {
@@ -133,8 +136,8 @@ define([
133136

134137
this.options.form = $(this.options.form);
135138

136-
this.options.form && this.options.form.data('validator') && this.options.form.validation('clearError',
137-
this.options.regionListId, this.options.regionInputId, this.options.postcodeId);
139+
this.options.form && this.options.form.data('validator') &&
140+
this.options.form.validation.apply(this.options.form, _.compact(args));
138141

139142
// Clean up errors on region & zip fix
140143
$(this.options.regionInputId).removeClass('mage-error').parent().find('[generated]').remove();

app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,9 @@ public function load()
217217
foreach ($creditmemo->getAllItems() as $creditmemoItem) {
218218
$orderItem = $creditmemoItem->getOrderItem();
219219
$parentId = $orderItem->getParentItemId();
220-
if (isset($backToStock[$orderItem->getId()])) {
220+
if ($parentId && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
221221
$creditmemoItem->setBackToStock(true);
222-
} elseif ($orderItem->getParentItem() && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
222+
} elseif (isset($backToStock[$orderItem->getId()])) {
223223
$creditmemoItem->setBackToStock(true);
224224
} elseif (empty($savedData)) {
225225
$creditmemoItem->setBackToStock(

app/code/Magento/Sales/Model/Order/CreditmemoFactory.php

+51-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* Copyright © 2016 Magento. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
76
namespace Magento\Sales\Model\Order;
87

98
/**
@@ -23,6 +22,11 @@ class CreditmemoFactory
2322
*/
2423
protected $taxConfig;
2524

25+
/**
26+
* @var \Magento\Framework\Unserialize\Unserialize
27+
*/
28+
protected $unserialize;
29+
2630
/**
2731
* Factory constructor
2832
*
@@ -57,7 +61,12 @@ public function createByOrder(\Magento\Sales\Model\Order $order, array $data = [
5761

5862
$item = $this->convertor->itemToCreditmemoItem($orderItem);
5963
if ($orderItem->isDummy()) {
60-
$qty = 1;
64+
if (isset($data['qtys'][$orderItem->getParentItemId()])) {
65+
$parentQty = $data['qtys'][$orderItem->getParentItemId()];
66+
} else {
67+
$parentQty = $orderItem->getParentItem() ? $orderItem->getParentItem()->getQtyToRefund() : 1;
68+
}
69+
$qty = $this->calculateProductOptions($orderItem, $parentQty);
6170
$orderItem->setLockedDoShip(true);
6271
} else {
6372
if (isset($qtys[$orderItem->getId()])) {
@@ -132,7 +141,12 @@ public function createByInvoice(\Magento\Sales\Model\Order\Invoice $invoice, arr
132141

133142
$item = $this->convertor->itemToCreditmemoItem($orderItem);
134143
if ($orderItem->isDummy()) {
135-
$qty = 1;
144+
if (isset($data['qtys'][$orderItem->getParentItemId()])) {
145+
$parentQty = $data['qtys'][$orderItem->getParentItemId()];
146+
} else {
147+
$parentQty = $orderItem->getParentItem() ? $orderItem->getParentItem()->getQtyToRefund() : 1;
148+
}
149+
$qty = $this->calculateProductOptions($orderItem, $parentQty);
136150
} else {
137151
if (isset($qtys[$orderItem->getId()])) {
138152
$qty = (double)$qtys[$orderItem->getId()];
@@ -245,4 +259,38 @@ protected function initData($creditmemo, $data)
245259
$creditmemo->setAdjustmentNegative($data['adjustment_negative']);
246260
}
247261
}
262+
263+
/**
264+
* @param \Magento\Sales\Api\Data\OrderItemInterface $orderItem
265+
* @param array $qtys
266+
* @return int
267+
*/
268+
private function calculateProductOptions(\Magento\Sales\Api\Data\OrderItemInterface $orderItem, $parentQty)
269+
{
270+
$qty = $parentQty;
271+
$productOptions = $orderItem->getProductOptions();
272+
if (isset($productOptions['bundle_selection_attributes'])) {
273+
$bundleSelectionAttributes = $this->getUnserialize()
274+
->unserialize($productOptions['bundle_selection_attributes']);
275+
if ($bundleSelectionAttributes) {
276+
$qty = $bundleSelectionAttributes['qty'] * $parentQty;
277+
}
278+
}
279+
return $qty;
280+
}
281+
282+
/**
283+
* Get Unserialize
284+
*
285+
* @return \Magento\Framework\Unserialize\Unserialize
286+
* @deprecated
287+
*/
288+
private function getUnserialize()
289+
{
290+
if (!$this->unserialize) {
291+
$this->unserialize = \Magento\Framework\App\ObjectManager::getInstance()
292+
->get(\Magento\Framework\Unserialize\Unserialize::class);
293+
}
294+
return $this->unserialize;
295+
}
248296
}

app/code/Magento/Sales/view/adminhtml/templates/order/create/sidebar/items.phtml

+7-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,13 @@
6666
<?php endif; ?>
6767

6868
<?php if ($block->canDisplayPrice()): ?>
69-
<td class="col-price"><?php /* @noEscape */ echo $block->getItemPrice($_item) ?></td>
69+
<td class="col-price">
70+
<?php if ($block->getDataId() == 'cart'): ?>
71+
<?php /* @noEscape */ echo $block->getItemPrice($_item->getProduct()) ?>
72+
<?php else: ?>
73+
<?php /* @noEscape */ echo $block->getItemPrice($_item) ?>
74+
<?php endif; ?>
75+
</td>
7076
<?php endif; ?>
7177

7278
<?php if ($block->canRemoveItems()): ?>

app/code/Magento/SalesInventory/Model/Order/ReturnProcessor.php

+6-39
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
namespace Magento\SalesInventory\Model\Order;
77

88
use Magento\Sales\Api\Data\CreditmemoInterface;
9-
use Magento\Sales\Api\Data\CreditmemoItemInterface;
109
use Magento\Sales\Api\Data\OrderInterface;
1110

1211
/**
@@ -29,75 +28,58 @@ class ReturnProcessor
2928
*/
3029
private $priceIndexer;
3130

32-
/**
33-
* @var \Magento\Sales\Api\CreditmemoRepositoryInterface
34-
*/
35-
private $creditmemoRepository;
36-
3731
/**
3832
* @var \Magento\Store\Model\StoreManagerInterface
3933
*/
4034
private $storeManager;
4135

42-
/**
43-
* @var \Magento\Sales\Api\OrderRepositoryInterface
44-
*/
45-
private $orderRepository;
46-
4736
/**
4837
* @var \Magento\Sales\Api\OrderItemRepositoryInterface
4938
*/
5039
private $orderItemRepository;
5140

5241
/**
53-
* ReturnToStockPlugin constructor.
54-
* @param \Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration
42+
* ReturnProcessor constructor.
5543
* @param \Magento\CatalogInventory\Api\StockManagementInterface $stockManagement
5644
* @param \Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexer
5745
* @param \Magento\Catalog\Model\Indexer\Product\Price\Processor $priceIndexer
58-
* @param \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository
5946
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
60-
* @param \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
6147
* @param \Magento\Sales\Api\OrderItemRepositoryInterface $orderItemRepository
6248
*/
6349
public function __construct(
6450
\Magento\CatalogInventory\Api\StockManagementInterface $stockManagement,
6551
\Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexer,
6652
\Magento\Catalog\Model\Indexer\Product\Price\Processor $priceIndexer,
67-
\Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository,
6853
\Magento\Store\Model\StoreManagerInterface $storeManager,
69-
\Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
7054
\Magento\Sales\Api\OrderItemRepositoryInterface $orderItemRepository
7155
) {
7256
$this->stockManagement = $stockManagement;
7357
$this->stockIndexerProcessor = $stockIndexer;
7458
$this->priceIndexer = $priceIndexer;
75-
$this->creditmemoRepository = $creditmemoRepository;
7659
$this->storeManager = $storeManager;
77-
$this->orderRepository = $orderRepository;
7860
$this->orderItemRepository = $orderItemRepository;
7961
}
8062

8163
/**
8264
* @param CreditmemoInterface $creditmemo
8365
* @param OrderInterface $order
8466
* @param array $returnToStockItems
67+
* @param bool $isAutoReturn
8568
* @return void
8669
*/
8770
public function execute(
8871
CreditmemoInterface $creditmemo,
8972
OrderInterface $order,
90-
array $returnToStockItems = []
73+
array $returnToStockItems = [],
74+
$isAutoReturn = false
9175
) {
9276
$itemsToUpdate = [];
9377
foreach ($creditmemo->getItems() as $item) {
94-
$qty = $item->getQty();
9578
$productId = $item->getProductId();
9679
$orderItem = $this->orderItemRepository->get($item->getOrderItemId());
9780
$parentItemId = $orderItem->getParentItemId();
98-
if ($this->canReturnItem($item, $qty, $parentItemId, $returnToStockItems)) {
99-
$parentItem = $parentItemId ? $this->getItemByOrderId($creditmemo, $parentItemId) : false;
100-
$qty = $parentItem ? $parentItem->getQty() * $qty : $qty;
81+
$qty = $item->getQty();
82+
if ($isAutoReturn || $this->canReturnItem($item, $qty, $parentItemId, $returnToStockItems)) {
10183
if (isset($itemsToUpdate[$productId])) {
10284
$itemsToUpdate[$productId] += $qty;
10385
} else {
@@ -122,21 +104,6 @@ public function execute(
122104
}
123105
}
124106

125-
/**
126-
* @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
127-
* @param int $parentItemId
128-
* @return bool|CreditmemoItemInterface
129-
*/
130-
private function getItemByOrderId(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo, $parentItemId)
131-
{
132-
foreach ($creditmemo->getItems() as $item) {
133-
if ($item->getOrderItemId() == $parentItemId) {
134-
return $item;
135-
}
136-
}
137-
return false;
138-
}
139-
140107
/**
141108
* @param \Magento\Sales\Api\Data\CreditmemoItemInterface $item
142109
* @param int $qty

0 commit comments

Comments
 (0)