Skip to content

Commit 9485e36

Browse files
authored
Merge pull request #217 from magento-firedrakes/MAGETWO-55695
[Firedrakes] Remove saving order from Creditmemo repository save
2 parents 0878622 + ee19602 commit 9485e36

File tree

10 files changed

+766
-37
lines changed

10 files changed

+766
-37
lines changed

app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public function execute()
102102
$creditmemoManagement = $this->_objectManager->create(
103103
\Magento\Sales\Api\CreditmemoManagementInterface::class
104104
);
105-
$creditmemoManagement->refund($creditmemo, (bool)$data['do_offline'], !empty($data['send_email']));
105+
$creditmemoManagement->refund($creditmemo, (bool)$data['do_offline']);
106106

107107
if (!empty($data['send_email'])) {
108108
$this->creditmemoSender->send($creditmemo);
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Model\Order\Creditmemo;
7+
8+
use Magento\Sales\Api\Data\CreditmemoInterface;
9+
use Magento\Sales\Api\Data\OrderInterface;
10+
use Magento\Sales\Model\Order\Creditmemo;
11+
12+
class RefundOperation
13+
{
14+
/**
15+
* @var \Magento\Framework\Event\ManagerInterface
16+
*/
17+
private $eventManager;
18+
19+
/**
20+
* @var \Magento\Framework\Pricing\PriceCurrencyInterface
21+
*/
22+
private $priceCurrency;
23+
24+
/**
25+
* @param \Magento\Framework\Model\Context $context
26+
* @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
27+
*/
28+
public function __construct(
29+
\Magento\Framework\Model\Context $context,
30+
\Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
31+
) {
32+
$this->eventManager = $context->getEventDispatcher();
33+
$this->priceCurrency = $priceCurrency;
34+
}
35+
36+
/**
37+
* @param CreditmemoInterface $creditmemo
38+
* @param OrderInterface $order
39+
* @param bool $online
40+
* @return OrderInterface
41+
*/
42+
public function execute(CreditmemoInterface $creditmemo, OrderInterface $order, $online = false)
43+
{
44+
if ($creditmemo->getState() == Creditmemo::STATE_REFUNDED
45+
&& $creditmemo->getOrderId() == $order->getEntityId()
46+
) {
47+
foreach ($creditmemo->getItems() as $item) {
48+
if ($item->isDeleted()) {
49+
continue;
50+
}
51+
$item->setCreditMemo($creditmemo);
52+
if ($item->getQty() > 0) {
53+
$item->register();
54+
} else {
55+
$item->isDeleted(true);
56+
}
57+
}
58+
59+
$baseOrderRefund = $this->priceCurrency->round(
60+
$order->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()
61+
);
62+
$orderRefund = $this->priceCurrency->round(
63+
$order->getTotalRefunded() + $creditmemo->getGrandTotal()
64+
);
65+
$order->setBaseTotalRefunded($baseOrderRefund);
66+
$order->setTotalRefunded($orderRefund);
67+
68+
$order->setBaseSubtotalRefunded($order->getBaseSubtotalRefunded() + $creditmemo->getBaseSubtotal());
69+
$order->setSubtotalRefunded($order->getSubtotalRefunded() + $creditmemo->getSubtotal());
70+
71+
$order->setBaseTaxRefunded($order->getBaseTaxRefunded() + $creditmemo->getBaseTaxAmount());
72+
$order->setTaxRefunded($order->getTaxRefunded() + $creditmemo->getTaxAmount());
73+
$order->setBaseDiscountTaxCompensationRefunded(
74+
$order->getBaseDiscountTaxCompensationRefunded() + $creditmemo->getBaseDiscountTaxCompensationAmount()
75+
);
76+
$order->setDiscountTaxCompensationRefunded(
77+
$order->getDiscountTaxCompensationRefunded() + $creditmemo->getDiscountTaxCompensationAmount()
78+
);
79+
80+
$order->setBaseShippingRefunded($order->getBaseShippingRefunded() + $creditmemo->getBaseShippingAmount());
81+
$order->setShippingRefunded($order->getShippingRefunded() + $creditmemo->getShippingAmount());
82+
83+
$order->setBaseShippingTaxRefunded(
84+
$order->getBaseShippingTaxRefunded() + $creditmemo->getBaseShippingTaxAmount()
85+
);
86+
$order->setShippingTaxRefunded($order->getShippingTaxRefunded() + $creditmemo->getShippingTaxAmount());
87+
88+
$order->setAdjustmentPositive($order->getAdjustmentPositive() + $creditmemo->getAdjustmentPositive());
89+
$order->setBaseAdjustmentPositive(
90+
$order->getBaseAdjustmentPositive() + $creditmemo->getBaseAdjustmentPositive()
91+
);
92+
93+
$order->setAdjustmentNegative($order->getAdjustmentNegative() + $creditmemo->getAdjustmentNegative());
94+
$order->setBaseAdjustmentNegative(
95+
$order->getBaseAdjustmentNegative() + $creditmemo->getBaseAdjustmentNegative()
96+
);
97+
98+
$order->setDiscountRefunded($order->getDiscountRefunded() + $creditmemo->getDiscountAmount());
99+
$order->setBaseDiscountRefunded($order->getBaseDiscountRefunded() + $creditmemo->getBaseDiscountAmount());
100+
101+
if ($online) {
102+
$order->setTotalOnlineRefunded($order->getTotalOnlineRefunded() + $creditmemo->getGrandTotal());
103+
$order->setBaseTotalOnlineRefunded(
104+
$order->getBaseTotalOnlineRefunded() + $creditmemo->getBaseGrandTotal()
105+
);
106+
} else {
107+
$order->setTotalOfflineRefunded($order->getTotalOfflineRefunded() + $creditmemo->getGrandTotal());
108+
$order->setBaseTotalOfflineRefunded(
109+
$order->getBaseTotalOfflineRefunded() + $creditmemo->getBaseGrandTotal()
110+
);
111+
}
112+
113+
$order->setBaseTotalInvoicedCost(
114+
$order->getBaseTotalInvoicedCost() - $creditmemo->getBaseCost()
115+
);
116+
117+
if ($online) {
118+
$order->getPayment()->refund($creditmemo);
119+
}
120+
121+
$this->eventManager->dispatch('sales_order_creditmemo_refund', ['creditmemo' => $creditmemo]);
122+
}
123+
124+
return $order;
125+
}
126+
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,40 @@
1212
*/
1313
class PaymentAdapter implements PaymentAdapterInterface
1414
{
15+
/**
16+
* @var \Magento\Sales\Model\Order\Creditmemo\RefundOperation
17+
*/
18+
private $refundOperation;
19+
1520
/**
1621
* @var \Magento\Sales\Model\Order\Invoice\PayOperation
1722
*/
1823
private $payOperation;
1924

2025
/**
26+
* PaymentAdapter constructor.
27+
* @param \Magento\Sales\Model\Order\Creditmemo\RefundOperation $refundOperation
2128
* @param \Magento\Sales\Model\Order\Invoice\PayOperation $payOperation
2229
*/
2330
public function __construct(
31+
\Magento\Sales\Model\Order\Creditmemo\RefundOperation $refundOperation,
2432
\Magento\Sales\Model\Order\Invoice\PayOperation $payOperation
2533
) {
34+
$this->refundOperation = $refundOperation;
2635
$this->payOperation = $payOperation;
2736
}
2837

38+
/**
39+
* {@inheritdoc}
40+
*/
41+
public function refund(
42+
\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo,
43+
\Magento\Sales\Api\Data\OrderInterface $order,
44+
$isOnline = false
45+
) {
46+
return $this->refundOperation->execute($creditmemo, $order, $isOnline);
47+
}
48+
2949
/**
3050
* {@inheritdoc}
3151
*/

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,16 @@ interface PaymentAdapterInterface
2323
* @return OrderInterface
2424
*/
2525
public function pay(OrderInterface $order, InvoiceInterface $invoice, $capture);
26+
27+
/**
28+
* @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
29+
* @param \Magento\Sales\Api\Data\OrderInterface $order
30+
* @param bool $isOnline
31+
* @return \Magento\Sales\Api\Data\OrderInterface
32+
*/
33+
public function refund(
34+
\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo,
35+
\Magento\Sales\Api\Data\OrderInterface $order,
36+
$isOnline = false
37+
);
2638
}

app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo/Relation/Refund.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
/**
1212
* Class Relation
13+
* @deprecated
1314
*/
1415
class Refund implements RelationInterface
1516
{

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

Lines changed: 100 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
/**
1010
* Class CreditmemoService
11+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1112
*/
1213
class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterface
1314
{
@@ -46,6 +47,26 @@ class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterf
4647
*/
4748
protected $eventManager;
4849

50+
/**
51+
* @var \Magento\Framework\App\ResourceConnection
52+
*/
53+
private $resource;
54+
55+
/**
56+
* @var \Magento\Sales\Model\Order\PaymentAdapterInterface
57+
*/
58+
private $paymentAdapter;
59+
60+
/**
61+
* @var \Magento\Sales\Api\OrderRepositoryInterface
62+
*/
63+
private $orderRepository;
64+
65+
/**
66+
* @var \Magento\Sales\Api\InvoiceRepositoryInterface
67+
*/
68+
private $invoiceRepository;
69+
4970
/**
5071
* @param \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository
5172
* @param \Magento\Sales\Api\CreditmemoCommentRepositoryInterface $creditmemoCommentRepository
@@ -130,6 +151,7 @@ public function notify($id)
130151
* @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
131152
* @param bool $offlineRequested
132153
* @return \Magento\Sales\Api\Data\CreditmemoInterface
154+
* @throws \Magento\Framework\Exception\LocalizedException
133155
*/
134156
public function refund(
135157
\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo,
@@ -138,19 +160,31 @@ public function refund(
138160
$this->validateForRefund($creditmemo);
139161
$creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_REFUNDED);
140162

141-
foreach ($creditmemo->getAllItems() as $item) {
142-
$item->setCreditMemo($creditmemo);
143-
if ($item->getQty() > 0) {
144-
$item->register();
145-
} else {
146-
$item->isDeleted(true);
163+
$connection = $this->getResource()->getConnection('sales');
164+
$connection->beginTransaction();
165+
try {
166+
$order = $this->getPaymentAdapter()->refund(
167+
$creditmemo,
168+
$creditmemo->getOrder(),
169+
!$offlineRequested
170+
);
171+
$this->getOrderRepository()->save($order);
172+
$invoice = $creditmemo->getInvoice();
173+
if ($invoice && !$offlineRequested) {
174+
$invoice->setIsUsedForRefund(true);
175+
$invoice->setBaseTotalRefunded(
176+
$invoice->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()
177+
);
178+
$creditmemo->setInvoiceId($invoice->getId());
179+
$this->getInvoiceRepository()->save($creditmemo->getInvoice());
147180
}
181+
$this->creditmemoRepository->save($creditmemo);
182+
$connection->commit();
183+
} catch (\Exception $e) {
184+
$connection->rollBack();
185+
throw new \Magento\Framework\Exception\LocalizedException($e->getMessage());
148186
}
149187

150-
$creditmemo->setDoTransaction(!$offlineRequested);
151-
152-
$this->eventManager->dispatch('sales_order_creditmemo_refund', ['creditmemo' => $creditmemo]);
153-
$this->creditmemoRepository->save($creditmemo);
154188
return $creditmemo;
155189
}
156190

@@ -183,4 +217,60 @@ protected function validateForRefund(\Magento\Sales\Api\Data\CreditmemoInterface
183217
}
184218
return true;
185219
}
220+
221+
/**
222+
* @return \Magento\Sales\Model\Order\PaymentAdapterInterface
223+
*
224+
* @deprecated
225+
*/
226+
private function getPaymentAdapter()
227+
{
228+
if ($this->paymentAdapter === null) {
229+
$this->paymentAdapter = \Magento\Framework\App\ObjectManager::getInstance()
230+
->get(\Magento\Sales\Model\Order\PaymentAdapterInterface::class);
231+
}
232+
return $this->paymentAdapter;
233+
}
234+
235+
/**
236+
* @return \Magento\Framework\App\ResourceConnection|mixed
237+
*
238+
* @deprecated
239+
*/
240+
private function getResource()
241+
{
242+
if ($this->resource === null) {
243+
$this->resource = \Magento\Framework\App\ObjectManager::getInstance()
244+
->get(\Magento\Framework\App\ResourceConnection::class);
245+
}
246+
return $this->resource;
247+
}
248+
249+
/**
250+
* @return \Magento\Sales\Api\OrderRepositoryInterface
251+
*
252+
* @deprecated
253+
*/
254+
private function getOrderRepository()
255+
{
256+
if ($this->orderRepository === null) {
257+
$this->orderRepository = \Magento\Framework\App\ObjectManager::getInstance()
258+
->get(\Magento\Sales\Api\OrderRepositoryInterface::class);
259+
}
260+
return $this->orderRepository;
261+
}
262+
263+
/**
264+
* @return \Magento\Sales\Api\InvoiceRepositoryInterface
265+
*
266+
* @deprecated
267+
*/
268+
private function getInvoiceRepository()
269+
{
270+
if ($this->invoiceRepository === null) {
271+
$this->invoiceRepository = \Magento\Framework\App\ObjectManager::getInstance()
272+
->get(\Magento\Sales\Api\InvoiceRepositoryInterface::class);
273+
}
274+
return $this->invoiceRepository;
275+
}
186276
}

0 commit comments

Comments
 (0)