Skip to content

Commit 8289572

Browse files
ENGCOM-8472: Fixed 'Email Copy of Invoice', 'Email Copy of Shipment' and 'Email Copy of Creditmemo' Issues #30868
- Merge Pull Request #30868 from gwharton/magento2:emailcopyof - Merged commits: 1. e0d8149
2 parents 479f304 + e0d8149 commit 8289572

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)