Skip to content

Commit c4570d2

Browse files
committed
MC-40950: Email may not be sent if Magento has enabled asynchronous email sending on multiple websites.
1 parent 2e2af0a commit c4570d2

File tree

8 files changed

+161
-36
lines changed

8 files changed

+161
-36
lines changed

app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,11 @@ public function __construct(
100100
*/
101101
public function send(Creditmemo $creditmemo, $forceSyncMode = false)
102102
{
103+
$this->identityContainer->setStore($creditmemo->getStore());
103104
$creditmemo->setSendEmail($this->identityContainer->isEnabled());
104105

105106
if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
106107
$order = $creditmemo->getOrder();
107-
$this->identityContainer->setStore($order->getStore());
108-
109108
$transport = [
110109
'order' => $order,
111110
'order_id' => $order->getId(),

app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,11 @@ public function __construct(
102102
*/
103103
public function send(Invoice $invoice, $forceSyncMode = false)
104104
{
105+
$this->identityContainer->setStore($invoice->getStore());
105106
$invoice->setSendEmail($this->identityContainer->isEnabled());
106107

107108
if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
108109
$order = $invoice->getOrder();
109-
$this->identityContainer->setStore($order->getStore());
110-
111110
if ($this->checkIfPartialInvoice($order, $invoice)) {
112111
$order->setBaseSubtotal((float) $invoice->getBaseSubtotal());
113112
$order->setBaseTaxAmount((float) $invoice->getBaseTaxAmount());

app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public function __construct(
9898
*/
9999
public function send(Order $order, $forceSyncMode = false)
100100
{
101+
$this->identityContainer->setStore($order->getStore());
101102
$order->setSendEmail($this->identityContainer->isEnabled());
102103

103104
if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {

app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,10 @@ public function send(
109109
ShipmentCommentCreationInterface $comment = null,
110110
$forceSyncMode = false
111111
) {
112+
$this->identityContainer->setStore($order->getStore());
112113
$shipment->setSendEmail($this->identityContainer->isEnabled());
113114

114115
if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
115-
$this->identityContainer->setStore($order->getStore());
116-
117116
$transport = [
118117
'order' => $order,
119118
'order_id' => $order->getId(),

dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Sales\Model\Order\Email\Sender;
78

89
use Magento\Customer\Api\CustomerRepositoryInterface;
910
use Magento\Customer\Model\ResourceModel\CustomerRepository;
11+
use Magento\Framework\App\Area;
1012
use Magento\Sales\Model\Order;
13+
use Magento\Sales\Model\Order\Creditmemo;
1114
use Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity;
15+
use Magento\Store\Model\StoreManagerInterface;
1216
use Magento\TestFramework\Helper\Bootstrap;
17+
use PHPUnit\Framework\TestCase;
1318

14-
class CreditmemoSenderTest extends \PHPUnit\Framework\TestCase
19+
class CreditmemoSenderTest extends TestCase
1520
{
1621
const NEW_CUSTOMER_EMAIL = 'new.customer@example.com';
1722
const OLD_CUSTOMER_EMAIL = 'customer@null.com';
@@ -27,32 +32,25 @@ class CreditmemoSenderTest extends \PHPUnit\Framework\TestCase
2732
*/
2833
protected function setUp(): void
2934
{
30-
parent::setUp();
31-
$this->customerRepository = Bootstrap::getObjectManager()
32-
->get(CustomerRepositoryInterface::class);
35+
$this->customerRepository = Bootstrap::getObjectManager()->get(CustomerRepositoryInterface::class);
3336
}
3437

3538
/**
3639
* @magentoDataFixture Magento/Sales/_files/order.php
3740
*/
3841
public function testSend()
3942
{
40-
Bootstrap::getInstance()
41-
->loadArea(\Magento\Framework\App\Area::AREA_FRONTEND);
42-
$order = Bootstrap::getObjectManager()
43-
->create(\Magento\Sales\Model\Order::class);
43+
Bootstrap::getInstance()->loadArea(Area::AREA_FRONTEND);
44+
$order = Bootstrap::getObjectManager()->create(Order::class);
4445
$order->loadByIncrementId('100000001');
4546
$order->setCustomerEmail('customer@example.com');
4647

47-
$creditmemo = Bootstrap::getObjectManager()->create(
48-
\Magento\Sales\Model\Order\Creditmemo::class
49-
);
48+
$creditmemo = Bootstrap::getObjectManager()->create(Creditmemo::class);
5049
$creditmemo->setOrder($order);
5150

5251
$this->assertEmpty($creditmemo->getEmailSent());
5352

54-
$creditmemoSender = Bootstrap::getObjectManager()
55-
->create(\Magento\Sales\Model\Order\Email\Sender\CreditmemoSender::class);
53+
$creditmemoSender = Bootstrap::getObjectManager()->create(CreditmemoSender::class);
5654
$result = $creditmemoSender->send($creditmemo, true);
5755

5856
$this->assertTrue($result);
@@ -129,29 +127,49 @@ public function testSendWithoutCustomer()
129127
$this->assertNotEmpty($creditmemo->getEmailSent());
130128
}
131129

132-
private function createCreditmemo(Order $order): Order\Creditmemo
130+
/**
131+
* Verify order will be marked send email on non default store in case default store order email sent is disabled.
132+
*
133+
* @magentoDataFixture Magento/Sales/_files/order_fixture_store.php
134+
* @magentoConfigFixture default/sales_email/creditmemo/enabled 0
135+
* @magentoConfigFixture default/sales_email/general/async_sending 1
136+
* @magentoConfigFixture fixturestore/sales_email/creditmemo/enabled 1
137+
* @magentoAppArea adminhtml
138+
* @magentoDbIsolation disabled
139+
*/
140+
public function testSendCreditmemeoEmailFromNonDefaultStore()
141+
{
142+
$storeManager = Bootstrap::getObjectManager()->get(StoreManagerInterface::class);
143+
$store = $storeManager->getStore('fixturestore');
144+
$order = Bootstrap::getObjectManager()->create(Order::class);
145+
$order->loadByIncrementIdAndStoreId('100000001', $store->getId());
146+
$order->setCustomerEmail('customer@example.com');
147+
$creditmemo = Bootstrap::getObjectManager()->create(Creditmemo::class);
148+
$creditmemo->setOrder($order);
149+
$creditmemoSender = Bootstrap::getObjectManager()->create(CreditmemoSender::class);
150+
$result = $creditmemoSender->send($creditmemo);
151+
$this->assertFalse($result);
152+
$this->assertTrue($creditmemo->getSendEmail());
153+
}
154+
155+
private function createCreditmemo(Order $order): Creditmemo
133156
{
134-
$creditmemo = Bootstrap::getObjectManager()->create(
135-
\Magento\Sales\Model\Order\Creditmemo::class
136-
);
157+
$creditmemo = Bootstrap::getObjectManager()->create(Creditmemo::class);
137158
$creditmemo->setOrder($order);
138159
return $creditmemo;
139160
}
140161

141162
private function createOrder(): Order
142163
{
143-
$order = Bootstrap::getObjectManager()
144-
->create(Order::class);
164+
$order = Bootstrap::getObjectManager()->create(Order::class);
145165
$order->loadByIncrementId('100000001');
146166

147167
return $order;
148168
}
149169

150170
private function createCreditMemoIdentity(): CreditmemoIdentity
151171
{
152-
return Bootstrap::getObjectManager()->create(
153-
CreditmemoIdentity::class
154-
);
172+
return Bootstrap::getObjectManager()->create(CreditmemoIdentity::class);
155173
}
156174

157175
private function createCreditMemoSender(CreditmemoIdentity $creditmemoIdentity): CreditmemoSender

dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Magento\Sales\Api\Data\InvoiceInterfaceFactory;
1414
use Magento\Sales\Api\Data\OrderInterface;
1515
use Magento\Sales\Api\Data\OrderInterfaceFactory;
16+
use Magento\Sales\Model\Order;
1617
use Magento\Sales\Model\Order\Email\Container\InvoiceIdentity;
1718
use Magento\Sales\Model\Order\Invoice;
1819
use Magento\TestFramework\Helper\Bootstrap;
@@ -178,6 +179,27 @@ public function testSendWithAsyncSendingEnabled(): void
178179
);
179180
}
180181

182+
/**
183+
* Verify invoice will be marked send email on non default store in case default store email sent is disabled.
184+
*
185+
* @magentoDataFixture Magento/Sales/_files/order_fixture_store.php
186+
* @magentoConfigFixture sales_email/general/async_sending 1
187+
* @magentoConfigFixture default_store sales_email/invoice/enabled 0
188+
* @magentoConfigFixture fixturestore_store sales_email/invoice/enabled 1
189+
* @magentoAppArea adminhtml
190+
* @magentoDbIsolation disabled
191+
*/
192+
public function testSendInvoiceEmailFromNonDefaultStore()
193+
{
194+
$order = Bootstrap::getObjectManager()->create(Order::class);
195+
$order->loadByIncrementId('100000004');
196+
$order->setCustomerEmail('customer@example.com');
197+
$invoice = $this->createInvoice($order);
198+
$result = $this->invoiceSender->send($invoice);
199+
$this->assertFalse($result);
200+
$this->assertTrue($invoice->getSendEmail());
201+
}
202+
181203
/**
182204
* Create invoice and set order
183205
*

dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,65 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Sales\Model\Order\Email\Sender;
78

9+
use Magento\Framework\App\Area;
10+
use Magento\Sales\Model\Order;
811
use Magento\TestFramework\Helper\Bootstrap;
12+
use PHPUnit\Framework\TestCase;
913

10-
class OrderSenderTest extends \PHPUnit\Framework\TestCase
14+
class OrderSenderTest extends TestCase
1115
{
16+
/**
17+
* @var OrderSender
18+
*/
19+
private $orderSender;
20+
21+
/**
22+
* @inheirtDoc
23+
*/
24+
protected function setUp(): void
25+
{
26+
$this->orderSender = Bootstrap::getObjectManager()->create(OrderSender::class);
27+
}
28+
1229
/**
1330
* @magentoDataFixture Magento/Sales/_files/order.php
1431
*/
1532
public function testSendNewOrderEmail()
1633
{
17-
\Magento\TestFramework\Helper\Bootstrap::getInstance()
18-
->loadArea(\Magento\Framework\App\Area::AREA_FRONTEND);
19-
$order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
20-
->create(\Magento\Sales\Model\Order::class);
34+
Bootstrap::getInstance()->loadArea(Area::AREA_FRONTEND);
35+
$order = Bootstrap::getObjectManager()->create(Order::class);
2136
$order->loadByIncrementId('100000001');
2237
$order->setCustomerEmail('customer@example.com');
2338

2439
$this->assertEmpty($order->getEmailSent());
2540

26-
$orderSender = Bootstrap::getObjectManager()
27-
->create(\Magento\Sales\Model\Order\Email\Sender\OrderSender::class);
28-
$result = $orderSender->send($order);
41+
$result = $this->orderSender->send($order);
2942

3043
$this->assertTrue($result);
3144

3245
$this->assertNotEmpty($order->getEmailSent());
3346
}
47+
48+
/**
49+
* Verify order will be marked send email on non default store in case default store order email sent is disabled.
50+
*
51+
* @magentoDataFixture Magento/Sales/_files/order_fixture_store.php
52+
* @magentoConfigFixture sales_email/general/async_sending 1
53+
* @magentoConfigFixture default_store sales_email/order/enabled 0
54+
* @magentoConfigFixture fixturestore_store sales_email/order/enabled 1
55+
* @magentoAppArea adminhtml
56+
* @magentoDbIsolation disabled
57+
*/
58+
public function testSendOrderEmailFromNonDefaultStore()
59+
{
60+
$order = Bootstrap::getObjectManager()->create(Order::class);
61+
$order->loadByIncrementId('100000004');
62+
$order->setCustomerEmail('customer@example.com');
63+
$result = $this->orderSender->send($order);
64+
$this->assertFalse($result);
65+
$this->assertTrue($order->getSendEmail());
66+
}
3467
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Magento\Sales\Model\Order\Shipment\Sender;
10+
11+
use Magento\Sales\Model\Order;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
use PHPUnit\Framework\TestCase;
14+
15+
/**
16+
* Provides tests for shipment email sender.
17+
*/
18+
class EmailSenderTest extends TestCase
19+
{
20+
/**
21+
* @var EmailSender
22+
*/
23+
private $emailSender;
24+
25+
/**
26+
* @inheirtDoc
27+
*/
28+
protected function setUp(): void
29+
{
30+
$this->emailSender = Bootstrap::getObjectManager()->create(EmailSender::class);
31+
}
32+
33+
/**
34+
* Verify shipment will be marked send email on non default store in case default store order email sent is disabled
35+
*
36+
* @magentoDataFixture Magento/Sales/_files/order_fixture_store.php
37+
* @magentoConfigFixture sales_email/general/async_sending 1
38+
* @magentoConfigFixture default_store sales_email/shipment/enabled 0
39+
* @magentoConfigFixture fixturestore_store sales_email/shipment/enabled 1
40+
* @magentoAppArea adminhtml
41+
* @magentoDbIsolation disabled
42+
*/
43+
public function testSendShipmentEmailFromNonDefaultStore()
44+
{
45+
$order = Bootstrap::getObjectManager()->create(Order::class);
46+
$order->loadByIncrementId('100000004');
47+
$order->setCustomerEmail('customer@example.com');
48+
$shipment = Bootstrap::getObjectManager()->create(Order\Shipment::class);
49+
$shipment->setOrder($order);
50+
$result = $this->emailSender->send($order, $shipment);
51+
$this->assertFalse($result);
52+
$this->assertTrue($shipment->getSendEmail());
53+
}
54+
}

0 commit comments

Comments
 (0)