Skip to content

Commit e0d8149

Browse files
author
Graham Wharton
committed
Updated method used to determine whether emails are sent on creation of invoices,
creditmemos and shipments from the admin page. Now takes into account global "enabled" setting and the checkbox on creation page. Updated Unit and Integration tests to suit.
1 parent 26acabe commit e0d8149

File tree

8 files changed

+439
-27
lines changed

8 files changed

+439
-27
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
99
use Magento\Backend\App\Action;
10+
use Magento\Sales\Helper\Data as SalesData;
1011
use Magento\Sales\Model\Order;
1112
use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
1213

@@ -34,21 +35,30 @@ class Save extends \Magento\Backend\App\Action implements HttpPostActionInterfac
3435
*/
3536
protected $resultForwardFactory;
3637

38+
/**
39+
* @var SalesData
40+
*/
41+
private $salesData;
42+
3743
/**
3844
* @param Action\Context $context
3945
* @param \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader
4046
* @param CreditmemoSender $creditmemoSender
4147
* @param \Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory
48+
* @param SalesData $salesData
4249
*/
4350
public function __construct(
4451
Action\Context $context,
4552
\Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader,
4653
CreditmemoSender $creditmemoSender,
47-
\Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory
54+
\Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory,
55+
SalesData $salesData = null
4856
) {
4957
$this->creditmemoLoader = $creditmemoLoader;
5058
$this->creditmemoSender = $creditmemoSender;
5159
$this->resultForwardFactory = $resultForwardFactory;
60+
$this->salesData = $salesData ?: \Magento\Framework\App\ObjectManager::getInstance()
61+
->get(SalesData::class);
5262
parent::__construct($context);
5363
}
5464

@@ -108,7 +118,7 @@ public function execute()
108118
$doOffline = isset($data['do_offline']) ? (bool)$data['do_offline'] : false;
109119
$creditmemoManagement->refund($creditmemo, $doOffline);
110120

111-
if (!empty($data['send_email'])) {
121+
if (!empty($data['send_email']) && $this->salesData->canSendNewCreditMemoEmail()) {
112122
$this->creditmemoSender->send($creditmemo);
113123
}
114124

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ public function __construct(
8686
$this->shipmentFactory = $shipmentFactory;
8787
$this->invoiceService = $invoiceService;
8888
parent::__construct($context);
89-
$this->salesData = $salesData ?? $this->_objectManager->get(SalesData::class);
89+
$this->salesData = $salesData ?: \Magento\Framework\App\ObjectManager::getInstance()
90+
->get(SalesData::class);
9091
}
9192

9293
/**
@@ -213,7 +214,7 @@ public function execute()
213214

214215
// send invoice/shipment emails
215216
try {
216-
if (!empty($data['send_email']) || $this->salesData->canSendNewInvoiceEmail()) {
217+
if (!empty($data['send_email']) && $this->salesData->canSendNewInvoiceEmail()) {
217218
$this->invoiceSender->send($invoice);
218219
}
219220
} catch (\Exception $e) {
@@ -222,7 +223,7 @@ public function execute()
222223
}
223224
if ($shipment) {
224225
try {
225-
if (!empty($data['send_email']) || $this->salesData->canSendNewShipmentEmail()) {
226+
if (!empty($data['send_email']) && $this->salesData->canSendNewShipmentEmail()) {
226227
$this->shipmentSender->send($shipment);
227228
}
228229
} catch (\Exception $e) {

app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@
2121
use Magento\Framework\Registry;
2222
use Magento\Framework\Session\Storage;
2323
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
24+
use Magento\Sales\Api\CreditmemoManagementInterface;
2425
use Magento\Sales\Controller\Adminhtml\Order\Creditmemo\Save;
2526
use Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader;
27+
use Magento\Sales\Helper\Data as SalesData;
28+
use Magento\Sales\Model\Order;
2629
use Magento\Sales\Model\Order\Creditmemo;
30+
use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
2731
use PHPUnit\Framework\MockObject\MockObject;
2832
use PHPUnit\Framework\TestCase;
2933

@@ -87,6 +91,16 @@ class SaveTest extends TestCase
8791
*/
8892
protected $resultRedirectMock;
8993

94+
/**
95+
* @var CreditmemoSender|MockObject
96+
*/
97+
private $creditmemoSender;
98+
99+
/**
100+
* @var SalesData|MockObject
101+
*/
102+
private $salesData;
103+
90104
/**
91105
* Init model for future tests
92106
*/
@@ -147,12 +161,32 @@ protected function setUp(): void
147161

148162
$context = $helper->getObject(Context::class, $arguments);
149163

164+
$creditmemoManagement = $this->getMockBuilder(CreditmemoManagementInterface::class)
165+
->disableOriginalConstructor()
166+
->getMock();
167+
$this->_objectManager->expects($this->any())
168+
->method('create')
169+
->with(CreditmemoManagementInterface::class)
170+
->willReturn($creditmemoManagement);
171+
$this->creditmemoSender = $this->getMockBuilder(CreditMemoSender::class)
172+
->disableOriginalConstructor()
173+
->setMethods(['send'])
174+
->getMock();
175+
$this->creditmemoSender->expects($this->any())
176+
->method('send')
177+
->willReturn(true);
178+
$this->salesData = $this->getMockBuilder(SalesData::class)
179+
->disableOriginalConstructor()
180+
->setMethods(['canSendNewCreditmemoEmail'])
181+
->getMock();
150182
$this->memoLoaderMock = $this->createMock(CreditmemoLoader::class);
151183
$this->_controller = $helper->getObject(
152184
Save::class,
153185
[
154186
'context' => $context,
155187
'creditmemoLoader' => $this->memoLoaderMock,
188+
'creditmemoSender' => $this->creditmemoSender,
189+
'salesData' => $this->salesData
156190
]
157191
);
158192
}
@@ -258,4 +292,94 @@ protected function _setSaveActionExpectationForMageCoreException($data, $errorMe
258292
$this->_messageManager->expects($this->once())->method('addErrorMessage')->with($errorMessage);
259293
$this->_sessionMock->expects($this->once())->method('setFormData')->with($data);
260294
}
295+
296+
/**
297+
* @return array
298+
*/
299+
public function testExecuteEmailsDataProvider()
300+
{
301+
/**
302+
* string $sendEmail
303+
* bool $emailEnabled
304+
* bool $shouldEmailBeSent
305+
*/
306+
return [
307+
['', false, false],
308+
['', true, false],
309+
['on', false, false],
310+
['on', true, true]
311+
];
312+
}
313+
314+
/**
315+
* @param string $sendEmail
316+
* @param bool $emailEnabled
317+
* @param bool $shouldEmailBeSent
318+
* @dataProvider testExecuteEmailsDataProvider
319+
*/
320+
public function testExecuteEmails(
321+
$sendEmail,
322+
$emailEnabled,
323+
$shouldEmailBeSent
324+
) {
325+
$orderId = 1;
326+
$creditmemoId = 2;
327+
$invoiceId = 3;
328+
$creditmemoData = ['items' => [], 'send_email' => $sendEmail];
329+
330+
$this->resultRedirectFactoryMock->expects($this->once())
331+
->method('create')
332+
->willReturn($this->resultRedirectMock);
333+
$this->resultRedirectMock->expects($this->once())
334+
->method('setPath')
335+
->with('sales/order/view', ['order_id' => $orderId])
336+
->willReturnSelf();
337+
338+
$order = $this->createPartialMock(
339+
Order::class,
340+
[]
341+
);
342+
343+
$creditmemo = $this->createPartialMock(
344+
Creditmemo::class,
345+
['isValidGrandTotal', 'getOrder', 'getOrderId']
346+
);
347+
$creditmemo->expects($this->once())
348+
->method('isValidGrandTotal')
349+
->willReturn(true);
350+
$creditmemo->expects($this->once())
351+
->method('getOrder')
352+
->willReturn($order);
353+
$creditmemo->expects($this->once())
354+
->method('getOrderId')
355+
->willReturn($orderId);
356+
357+
$this->_requestMock->expects($this->any())
358+
->method('getParam')
359+
->willReturnMap(
360+
[
361+
['order_id', null, $orderId],
362+
['creditmemo_id', null, $creditmemoId],
363+
['creditmemo', null, $creditmemoData],
364+
['invoice_id', null, $invoiceId]
365+
]
366+
);
367+
368+
$this->_requestMock->expects($this->any())
369+
->method('getPost')
370+
->willReturn($creditmemoData);
371+
372+
$this->memoLoaderMock->expects($this->once())
373+
->method('load')
374+
->willReturn($creditmemo);
375+
376+
$this->salesData->expects($this->any())
377+
->method('canSendNewCreditmemoEmail')
378+
->willReturn($emailEnabled);
379+
if ($shouldEmailBeSent) {
380+
$this->creditmemoSender->expects($this->once())
381+
->method('send');
382+
}
383+
$this->assertEquals($this->resultRedirectMock, $this->_controller->execute());
384+
}
261385
}

0 commit comments

Comments
 (0)