Skip to content

Commit b5900bc

Browse files
committed
Merge pull request #619 from magento-firedrakes/MAGETWO-52746
[Firedrakes] P0-P1 Bug fixes
2 parents fe3bf09 + 4d5ca55 commit b5900bc

File tree

19 files changed

+448
-33
lines changed

19 files changed

+448
-33
lines changed

app/code/Magento/Catalog/etc/di.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@
9797
<argument name="productRepository" xsi:type="object">Magento\Catalog\Api\ProductRepositoryInterface\Proxy</argument>
9898
</arguments>
9999
</type>
100+
<type name="Magento\Catalog\Helper\Product\Edit\Action\Attribute">
101+
<arguments>
102+
<argument name="session" xsi:type="object">Magento\Backend\Model\Session\Proxy</argument>
103+
</arguments>
104+
</type>
100105
<type name="Magento\Catalog\Model\Product">
101106
<arguments>
102107
<argument name="catalogProductStatus" xsi:type="object">Magento\Catalog\Model\Product\Attribute\Source\Status\Proxy</argument>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogSearch\Model\Indexer\Fulltext;
7+
8+
use Magento\Framework\Indexer\AbstractProcessor;
9+
use Magento\CatalogSearch\Model\Indexer\Fulltext;
10+
11+
/**
12+
* Class Processor
13+
*/
14+
class Processor extends AbstractProcessor
15+
{
16+
/**
17+
* Indexer ID
18+
*/
19+
const INDEXER_ID = Fulltext::INDEXER_ID;
20+
}

app/code/Magento/Sales/Model/Order/Creditmemo/Item.php

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,40 @@ public function setOrderItem(\Magento\Sales\Model\Order\Item $item)
127127
public function getOrderItem()
128128
{
129129
if ($this->_orderItem === null) {
130-
if ($this->getCreditmemo()) {
131-
$this->_orderItem = $this->getCreditmemo()->getOrder()->getItemById($this->getOrderItemId());
132-
} else {
133-
$this->_orderItem = $this->_orderItemFactory->create()->load($this->getOrderItemId());
134-
}
130+
$this->_orderItem = $this->getOrderItemWithoutCaching();
135131
}
136132
return $this->_orderItem;
137133
}
138134

135+
/**
136+
* Retrieve order item instance without set it to property.
137+
* It is need for ability to process setQty on api when credit memo and order has not built yet.
138+
*
139+
* @return \Magento\Sales\Model\Order\Item
140+
*/
141+
private function getOrderItemWithoutCaching()
142+
{
143+
if ($this->getCreditmemo()) {
144+
$orderItem = $this->getCreditmemo()->getOrder()->getItemById($this->getOrderItemId());
145+
} else {
146+
$orderItem = $this->_orderItemFactory->create()->load($this->getOrderItemId());
147+
}
148+
149+
return $orderItem;
150+
}
151+
152+
/**
153+
* Checks if quantity available for refund
154+
*
155+
* @param int $qty
156+
* @param \Magento\Sales\Model\Order\Item $orderItem
157+
* @return bool
158+
*/
159+
private function isQtyAvailable($qty, \Magento\Sales\Model\Order\Item $orderItem)
160+
{
161+
return $qty <= $orderItem->getQtyToRefund() || $orderItem->isDummy();
162+
}
163+
139164
/**
140165
* Declare qty
141166
*
@@ -145,16 +170,14 @@ public function getOrderItem()
145170
*/
146171
public function setQty($qty)
147172
{
148-
if ($this->getOrderItem()->getIsQtyDecimal()) {
173+
$orderItem = $this->getOrderItemWithoutCaching();
174+
if ($orderItem->getIsQtyDecimal()) {
149175
$qty = (double)$qty;
150176
} else {
151177
$qty = (int)$qty;
152178
}
153179
$qty = $qty > 0 ? $qty : 0;
154-
/**
155-
* Check qty availability
156-
*/
157-
if ($qty <= $this->getOrderItem()->getQtyToRefund() || $this->getOrderItem()->isDummy()) {
180+
if ($this->isQtyAvailable($qty, $orderItem)) {
158181
$this->setData('qty', $qty);
159182
} else {
160183
throw new \Magento\Framework\Exception\LocalizedException(
@@ -582,6 +605,7 @@ public function getWeeeTaxRowDisposition()
582605
}
583606

584607
//@codeCoverageIgnoreStart
608+
585609
/**
586610
* {@inheritdoc}
587611
*/

app/code/Magento/Sales/Model/Service/CreditmemoService.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ public function refund(
139139
$creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_REFUNDED);
140140

141141
foreach ($creditmemo->getAllItems() as $item) {
142+
$item->setCreditMemo($creditmemo);
142143
if ($item->getQty() > 0) {
143144
$item->register();
144145
} else {

app/code/Magento/Sales/Test/Unit/Model/Order/Creditmemo/ItemTest.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,12 @@ public function testSetQtyDecimalException()
111111
$orderItemMock->expects($this->once())
112112
->method('getQtyToRefund')
113113
->willReturn($orderItemQty);
114-
114+
$orderItemMock->expects($this->atLeastOnce())
115+
->method('load')
116+
->willReturnSelf();
117+
$this->orderItemFactoryMock->expects($this->atLeastOnce())
118+
->method('create')
119+
->willReturn($orderItemMock);
115120
$this->item->setData(CreditmemoItemInterface::NAME, $name);
116121
$this->item->setOrderItem($orderItemMock);
117122
$this->item->setQty($qty);
@@ -136,7 +141,12 @@ public function testSetQtyNumericException()
136141
$orderItemMock->expects($this->once())
137142
->method('getQtyToRefund')
138143
->willReturn($orderItemQty);
139-
144+
$orderItemMock->expects($this->atLeastOnce())
145+
->method('load')
146+
->willReturnSelf();
147+
$this->orderItemFactoryMock->expects($this->atLeastOnce())
148+
->method('create')
149+
->willReturn($orderItemMock);
140150
$this->item->setData(CreditmemoItemInterface::NAME, $name);
141151
$this->item->setOrderItem($orderItemMock);
142152
$this->item->setQty($qty);
@@ -156,7 +166,12 @@ public function testSetQty()
156166
$orderItemMock->expects($this->once())
157167
->method('getQtyToRefund')
158168
->willReturn($orderItemQty);
159-
169+
$orderItemMock->expects($this->atLeastOnce())
170+
->method('load')
171+
->willReturnSelf();
172+
$this->orderItemFactoryMock->expects($this->atLeastOnce())
173+
->method('create')
174+
->willReturn($orderItemMock);
160175
$this->item->setOrderItem($orderItemMock);
161176
$this->item->setQty($qty);
162177
$this->assertEquals($qty, $this->item->getQty());

app/code/Magento/Sales/Test/Unit/Model/Service/CreditmemoServiceTest.php

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
*/
66
namespace Magento\Sales\Test\Unit\Model\Service;
77

8+
use Magento\Framework\Pricing\PriceCurrencyInterface;
89
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
10+
use Magento\Sales\Api\Data\CreditmemoInterface;
11+
use Magento\Sales\Model\Order;
12+
use Magento\Sales\Model\Order\Creditmemo;
13+
use Magento\Sales\Model\Order\Creditmemo\Item;
914

1015
/**
1116
* Class CreditmemoServiceTest
@@ -37,6 +42,11 @@ class CreditmemoServiceTest extends \PHPUnit_Framework_TestCase
3742
*/
3843
protected $creditmemoNotifierMock;
3944

45+
/**
46+
* @var PriceCurrencyInterface|\PHPUnit_Framework_MockObject_MockObject
47+
*/
48+
private $priceCurrencyMock;
49+
4050
/**
4151
* @var \Magento\Sales\Model\Service\CreditmemoService
4252
*/
@@ -82,6 +92,7 @@ protected function setUp()
8292
'',
8393
false
8494
);
95+
$this->priceCurrencyMock = $this->getMockBuilder(PriceCurrencyInterface::class)->getMockForAbstractClass();
8596

8697
$this->creditmemoService = $objectManager->getObject(
8798
'Magento\Sales\Model\Service\CreditmemoService',
@@ -90,7 +101,8 @@ protected function setUp()
90101
'creditmemoCommentRepository' => $this->creditmemoCommentRepositoryMock,
91102
'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock,
92103
'filterBuilder' => $this->filterBuilderMock,
93-
'creditmemoNotifier' => $this->creditmemoNotifierMock
104+
'creditmemoNotifier' => $this->creditmemoNotifierMock,
105+
'priceCurrency' => $this->priceCurrencyMock
94106
]
95107
);
96108
}
@@ -183,4 +195,69 @@ public function testNotify()
183195

184196
$this->assertEquals($returnValue, $this->creditmemoService->notify($id));
185197
}
198+
199+
public function testRefund()
200+
{
201+
$creditMemoMock = $this->getMockBuilder(Creditmemo::class)
202+
->setMethods(['getId', 'getOrder', 'getBaseGrandTotal', 'getAllItems', 'setDoTransaction'])
203+
->disableOriginalConstructor()
204+
->getMock();
205+
$creditMemoMock->expects($this->once())->method('getId')->willReturn(null);
206+
$orderMock = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock();
207+
$creditMemoMock->expects($this->atLeastOnce())->method('getOrder')->willReturn($orderMock);
208+
$itemMock = $this->getMockBuilder(
209+
Item::class
210+
)->disableOriginalConstructor()->getMock();
211+
$creditMemoMock->expects($this->once())->method('getAllItems')->willReturn([$itemMock]);
212+
$itemMock->expects($this->once()) -> method('setCreditMemo')->with($creditMemoMock);
213+
$itemMock->expects($this->once()) -> method('getQty')->willReturn(1);
214+
$itemMock->expects($this->once()) -> method('register');
215+
$creditMemoMock->expects($this->once())->method('setDoTransaction')->with(false);
216+
$this->assertSame($creditMemoMock, $this->creditmemoService->refund($creditMemoMock, true));
217+
}
218+
219+
/**
220+
* @expectedExceptionMessage The most money available to refund is 1.
221+
* @expectedException \Magento\Framework\Exception\LocalizedException
222+
*/
223+
public function testRefundExpectsMoneyAvailableToReturn()
224+
{
225+
$baseGrandTotal = 10;
226+
$baseTotalRefunded = 9;
227+
$baseTotalPaid = 10;
228+
$creditMemoMock = $this->getMockBuilder(CreditmemoInterface::class)
229+
->setMethods(['getId', 'getOrder', 'getBaseGrandTotal', 'formatBasePrice'])
230+
->getMockForAbstractClass();
231+
$creditMemoMock->expects($this->once())->method('getId')->willReturn(null);
232+
$orderMock = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock();
233+
$creditMemoMock->expects($this->atLeastOnce())->method('getOrder')->willReturn($orderMock);
234+
$creditMemoMock->expects($this->once())->method('getBaseGrandTotal')->willReturn($baseGrandTotal);
235+
$orderMock->expects($this->atLeastOnce())->method('getBaseTotalRefunded')->willReturn($baseTotalRefunded);
236+
$this->priceCurrencyMock->expects($this->exactly(2))->method('round')->withConsecutive(
237+
[$baseTotalRefunded + $baseGrandTotal],
238+
[$baseTotalPaid]
239+
)->willReturnOnConsecutiveCalls(
240+
$baseTotalRefunded + $baseGrandTotal,
241+
$baseTotalPaid
242+
);
243+
$orderMock->expects($this->atLeastOnce())->method('getBaseTotalPaid')->willReturn($baseTotalPaid);
244+
$baseAvailableRefund = $baseTotalPaid - $baseTotalRefunded;
245+
$orderMock->expects($this->once())->method('formatBasePrice')->with(
246+
$baseAvailableRefund
247+
)->willReturn($baseAvailableRefund);
248+
$this->creditmemoService->refund($creditMemoMock, true);
249+
}
250+
251+
/**
252+
* @expectedExceptionMessage We cannot register an existing credit memo.
253+
* @expectedException \Magento\Framework\Exception\LocalizedException
254+
*/
255+
public function testRefundDoNotExpectsId()
256+
{
257+
$creditMemoMock = $this->getMockBuilder(CreditmemoInterface::class)
258+
->setMethods(['getId'])
259+
->getMockForAbstractClass();
260+
$creditMemoMock->expects($this->once())->method('getId')->willReturn(444);
261+
$this->creditmemoService->refund($creditMemoMock, true);
262+
}
186263
}

app/code/Magento/Sales/etc/webapi.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161
<resource ref="Magento_Sales::sales" />
6262
</resources>
6363
</route>
64+
<route url="/V1/orders/create" method="PUT">
65+
<service class="Magento\Sales\Api\OrderRepositoryInterface" method="save"/>
66+
<resources>
67+
<resource ref="Magento_Sales::sales" />
68+
</resources>
69+
</route>
6470
<route url="/V1/orders/:parent_id" method="PUT">
6571
<service class="Magento\Sales\Api\OrderAddressRepositoryInterface" method="save"/>
6672
<resources>
@@ -157,6 +163,12 @@
157163
<resource ref="Magento_Sales::sales" />
158164
</resources>
159165
</route>
166+
<route url="/V1/creditmemo/refund" method="POST">
167+
<service class="Magento\Sales\Api\CreditmemoManagementInterface" method="refund"/>
168+
<resources>
169+
<resource ref="Magento_Sales::sales" />
170+
</resources>
171+
</route>
160172
<route url="/V1/creditmemo/:id/comments" method="POST">
161173
<service class="Magento\Sales\Api\CreditmemoCommentRepositoryInterface" method="save"/>
162174
<resources>
@@ -223,6 +235,12 @@
223235
<resource ref="Magento_Sales::sales" />
224236
</resources>
225237
</route>
238+
<route url="/V1/orders/" method="POST">
239+
<service class="Magento\Sales\Api\OrderRepositoryInterface" method="save"/>
240+
<resources>
241+
<resource ref="Magento_Sales::sales" />
242+
</resources>
243+
</route>
226244
<route url="/V1/transactions/:id" method="GET">
227245
<service class="Magento\Sales\Api\TransactionRepositoryInterface" method="get"/>
228246
<resources>

app/code/Magento/SalesRule/view/adminhtml/ui_component/sales_rule_form.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@
437437
<field name="apply_to_shipping">
438438
<argument name="data" xsi:type="array">
439439
<item name="config" xsi:type="array">
440+
<item name="component" xsi:type="string">Magento_Ui/js/form/element/single-checkbox-toggle-notice</item>
440441
<item name="dataType" xsi:type="string">boolean</item>
441442
<item name="formElement" xsi:type="string">checkbox</item>
442443
<item name="source" xsi:type="string">sales_rule</item>
@@ -445,6 +446,10 @@
445446
<item name="true" xsi:type="number">1</item>
446447
<item name="false" xsi:type="number">0</item>
447448
</item>
449+
<item name="notices" xsi:type="array">
450+
<item name="0" xsi:type="string" translate="true">Discount amount is applied to subtotal only</item>
451+
<item name="1" xsi:type="string" translate="true">Discount amount is applied to subtotal and shipping amount separately</item>
452+
</item>
448453
<item name="default" xsi:type="number">0</item>
449454
<item name="label" xsi:type="string" translate="true">Apply to Shipping Amount</item>
450455
</item>

app/code/Magento/Store/Model/Store.php

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,11 @@ class Store extends AbstractExtensibleModel implements
312312
*/
313313
private $_storeManager;
314314

315+
/**
316+
* @var \Magento\Framework\Url\ModifierInterface
317+
*/
318+
private $urlModifier;
319+
315320
/**
316321
* @param \Magento\Framework\Model\Context $context
317322
* @param \Magento\Framework\Registry $registry
@@ -640,7 +645,10 @@ public function getBaseUrl($type = UrlInterface::URL_TYPE_LINK, $secure = null)
640645
$url = str_replace(self::BASE_URL_PLACEHOLDER, $this->_request->getDistroBaseUrl(), $url);
641646
}
642647

643-
$this->_baseUrlCache[$cacheKey] = rtrim($url, '/') . '/';
648+
$this->_baseUrlCache[$cacheKey] = $this->getUrlModifier()->execute(
649+
rtrim($url, '/') . '/',
650+
\Magento\Framework\Url\ModifierInterface::MODE_BASE
651+
);
644652
}
645653

646654
return $this->_baseUrlCache[$cacheKey];
@@ -1306,4 +1314,21 @@ public function setExtensionAttributes(
13061314
) {
13071315
return $this->_setExtensionAttributes($extensionAttributes);
13081316
}
1317+
1318+
/**
1319+
* Gets URL modifier.
1320+
*
1321+
* @return \Magento\Framework\Url\ModifierInterface
1322+
* @deprecated
1323+
*/
1324+
private function getUrlModifier()
1325+
{
1326+
if ($this->urlModifier === null) {
1327+
$this->urlModifier = \Magento\Framework\App\ObjectManager::getInstance()->get(
1328+
'Magento\Framework\Url\ModifierInterface'
1329+
);
1330+
}
1331+
1332+
return $this->urlModifier;
1333+
}
13091334
}

app/code/Magento/Store/Model/StoreResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
4545
*/
4646
protected $scopeCode;
4747

48-
/*
48+
/**
4949
* @var \Magento\Framework\App\RequestInterface
5050
*/
5151
protected $request;

0 commit comments

Comments
 (0)