Skip to content

Commit d0b525b

Browse files
⏫ Forwardport of #11550 to 2.3-develop branch
Applied pull request patch https://github.com/magento/magento2/pull/11550.patch (created by @ajpevers) based on commit(s): 1. 9380c95 2. 8a6c3f2 3. 480f8ae
1 parent 8e77e2f commit d0b525b

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public function refund(
195195
*/
196196
protected function validateForRefund(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo)
197197
{
198-
if ($creditmemo->getId()) {
198+
if ($creditmemo->getId() && $creditmemo->getState() != \Magento\Sales\Model\Order\Creditmemo::STATE_OPEN) {
199199
throw new \Magento\Framework\Exception\LocalizedException(
200200
__('We cannot register an existing credit memo.')
201201
);

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,78 @@ public function testRefund()
243243
$this->assertSame($creditMemoMock, $this->creditmemoService->refund($creditMemoMock, true));
244244
}
245245

246+
public function testRefundPendingCreditMemo()
247+
{
248+
$creditMemoMock = $this->getMockBuilder(\Magento\Sales\Api\Data\CreditmemoInterface::class)
249+
->setMethods(['getId', 'getOrder', 'getState', 'getInvoice'])
250+
->disableOriginalConstructor()
251+
->getMockForAbstractClass();
252+
$creditMemoMock->expects($this->once())->method('getId')->willReturn(444);
253+
$creditMemoMock->expects($this->once())->method('getState')
254+
->willReturn(\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN);
255+
$orderMock = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock();
256+
257+
$creditMemoMock->expects($this->atLeastOnce())->method('getOrder')->willReturn($orderMock);
258+
$orderMock->expects($this->once())->method('getBaseTotalRefunded')->willReturn(0);
259+
$orderMock->expects($this->once())->method('getBaseTotalPaid')->willReturn(10);
260+
$creditMemoMock->expects($this->once())->method('getBaseGrandTotal')->willReturn(10);
261+
262+
$this->priceCurrencyMock->expects($this->any())
263+
->method('round')
264+
->willReturnArgument(0);
265+
266+
// Set payment adapter dependency
267+
$refundAdapterMock = $this->getMockBuilder(\Magento\Sales\Model\Order\RefundAdapterInterface::class)
268+
->disableOriginalConstructor()
269+
->getMockForAbstractClass();
270+
$this->objectManagerHelper->setBackwardCompatibleProperty(
271+
$this->creditmemoService,
272+
'refundAdapter',
273+
$refundAdapterMock
274+
);
275+
276+
// Set resource dependency
277+
$resourceMock = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
278+
->disableOriginalConstructor()
279+
->getMock();
280+
$this->objectManagerHelper->setBackwardCompatibleProperty(
281+
$this->creditmemoService,
282+
'resource',
283+
$resourceMock
284+
);
285+
286+
// Set order repository dependency
287+
$orderRepositoryMock = $this->getMockBuilder(\Magento\Sales\Api\OrderRepositoryInterface::class)
288+
->disableOriginalConstructor()
289+
->getMockForAbstractClass();
290+
$this->objectManagerHelper->setBackwardCompatibleProperty(
291+
$this->creditmemoService,
292+
'orderRepository',
293+
$orderRepositoryMock
294+
);
295+
296+
$adapterMock = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
297+
->disableOriginalConstructor()
298+
->getMockForAbstractClass();
299+
$resourceMock->expects($this->once())->method('getConnection')->with('sales')->willReturn($adapterMock);
300+
$adapterMock->expects($this->once())->method('beginTransaction');
301+
$refundAdapterMock->expects($this->once())
302+
->method('refund')
303+
->with($creditMemoMock, $orderMock, false)
304+
->willReturn($orderMock);
305+
$orderRepositoryMock->expects($this->once())
306+
->method('save')
307+
->with($orderMock);
308+
$creditMemoMock->expects($this->once())
309+
->method('getInvoice')
310+
->willReturn(null);
311+
$adapterMock->expects($this->once())->method('commit');
312+
$this->creditmemoRepositoryMock->expects($this->once())
313+
->method('save');
314+
315+
$this->assertSame($creditMemoMock, $this->creditmemoService->refund($creditMemoMock, true));
316+
}
317+
246318
/**
247319
* @expectedExceptionMessage The most money available to refund is 1.
248320
* @expectedException \Magento\Framework\Exception\LocalizedException

0 commit comments

Comments
 (0)