Skip to content

Commit ac6bdfb

Browse files
committed
MC-38717: Sales emails asynchronous sending sends out old emails
1 parent ac0500b commit ac6bdfb

File tree

3 files changed

+24
-42
lines changed

3 files changed

+24
-42
lines changed

app/code/Magento/Sales/Model/EmailSenderHandler.php

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
use Magento\Framework\App\Config\ValueFactory;
99
use Magento\Framework\App\Config\ValueInterface;
1010
use Magento\Framework\App\ObjectManager;
11-
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
1211
use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
12+
use Magento\Sales\Model\ResourceModel\Collection\AbstractCollection;
1313

1414
/**
1515
* Sales emails sending
@@ -36,7 +36,7 @@ class EmailSenderHandler
3636
/**
3737
* Entity collection model.
3838
*
39-
* @var \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection
39+
* @var AbstractCollection
4040
*/
4141
protected $entityCollection;
4242

@@ -64,36 +64,29 @@ class EmailSenderHandler
6464
*/
6565
private $configValueFactory;
6666

67-
/**
68-
* @var TimezoneInterface
69-
*/
70-
private $localeDate;
71-
7267
/**
7368
* @var string
7469
*/
75-
private $modifyStartFromDate = '-1 day';
70+
private $modifyStartFromDate;
7671

7772
/**
7873
* @param \Magento\Sales\Model\Order\Email\Sender $emailSender
7974
* @param \Magento\Sales\Model\ResourceModel\EntityAbstract $entityResource
80-
* @param \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection
75+
* @param AbstractCollection $entityCollection
8176
* @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
8277
* @param IdentityInterface|null $identityContainer
8378
* @param \Magento\Store\Model\StoreManagerInterface|null $storeManager
8479
* @param ValueFactory|null $configValueFactory
85-
* @param TimezoneInterface|null $localeDate
8680
* @param string|null $modifyStartFromDate
8781
*/
8882
public function __construct(
8983
\Magento\Sales\Model\Order\Email\Sender $emailSender,
9084
\Magento\Sales\Model\ResourceModel\EntityAbstract $entityResource,
91-
\Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection,
85+
AbstractCollection $entityCollection,
9286
\Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
9387
IdentityInterface $identityContainer = null,
9488
\Magento\Store\Model\StoreManagerInterface $storeManager = null,
9589
?ValueFactory $configValueFactory = null,
96-
?TimezoneInterface $localeDate = null,
9790
?string $modifyStartFromDate = null
9891
) {
9992
$this->emailSender = $emailSender;
@@ -107,7 +100,6 @@ public function __construct(
107100
->get(\Magento\Store\Model\StoreManagerInterface::class);
108101

109102
$this->configValueFactory = $configValueFactory ?: ObjectManager::getInstance()->get(ValueFactory::class);
110-
$this->localeDate = $localeDate ?: ObjectManager::getInstance()->get(TimezoneInterface::class);
111103
$this->modifyStartFromDate = $modifyStartFromDate ?: $this->modifyStartFromDate;
112104
}
113105

@@ -120,8 +112,7 @@ public function sendEmails()
120112
if ($this->globalConfig->getValue('sales_email/general/async_sending')) {
121113
$this->entityCollection->addFieldToFilter('send_email', ['eq' => 1]);
122114
$this->entityCollection->addFieldToFilter('email_sent', ['null' => true]);
123-
$startFromDate = $this->getStartFromDate();
124-
$this->entityCollection->addFieldToFilter('created_at', ['from' => $startFromDate]);
115+
$this->filterCollectionByStartFromDate($this->entityCollection);
125116
$this->entityCollection->setPageSize(
126117
$this->globalConfig->getValue('sales_email/general/sending_limit')
127118
);
@@ -158,7 +149,7 @@ public function sendEmails()
158149
* @throws \Magento\Framework\Exception\NoSuchEntityException
159150
*/
160151
private function getStores(
161-
\Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection
152+
AbstractCollection $entityCollection
162153
): array {
163154
$stores = [];
164155

@@ -174,22 +165,24 @@ private function getStores(
174165
}
175166

176167
/**
177-
* Get start from date for collection filter
168+
* Filter collection by start from date
178169
*
179-
* @return string
170+
* @param AbstractCollection $collection
171+
* @return void
180172
*/
181-
private function getStartFromDate(): string
173+
private function filterCollectionByStartFromDate(AbstractCollection $collection): void
182174
{
183-
$fromDate = $this->localeDate->date()->format('Y-m-d H:i:s');
184175
/** @var $configValue ValueInterface */
185176
$configValue = $this->configValueFactory->create();
186177
$configValue->load('sales_email/general/async_sending', 'path');
187178

188179
if ($configValue->getId()) {
189-
$fromDate = $this->localeDate->date($configValue->getUpdatedAt())
190-
->modify($this->modifyStartFromDate)->format('Y-m-d H:i:s');
191-
}
180+
$startFromDate = date(
181+
'Y-m-d H:i:s',
182+
strtotime($configValue->getUpdatedAt() . ' ' . $this->modifyStartFromDate)
183+
);
192184

193-
return $fromDate;
185+
$collection->addFieldToFilter('created_at', ['from' => $startFromDate]);
186+
}
194187
}
195188
}

app/code/Magento/Sales/Test/Unit/Model/EmailSenderHandlerTest.php

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use Magento\Framework\App\Config\Value;
1313
use Magento\Framework\App\Config\ValueFactory;
1414
use Magento\Framework\DB\Select;
15-
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
1615
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
1716
use Magento\Sales\Model\AbstractModel;
1817
use Magento\Sales\Model\EmailSenderHandler;
@@ -80,11 +79,6 @@ class EmailSenderHandlerTest extends TestCase
8079
*/
8180
private $configValueFactory;
8281

83-
/**
84-
* @var TimezoneInterface|MockObject
85-
*/
86-
private $localeDate;
87-
8882
/**
8983
* @var string
9084
*/
@@ -133,10 +127,6 @@ protected function setUp(): void
133127
ValueFactory::class
134128
);
135129

136-
$this->localeDate = $this->createMock(
137-
TimezoneInterface::class
138-
);
139-
140130
$this->object = $objectManager->getObject(
141131
EmailSenderHandler::class,
142132
[
@@ -147,7 +137,6 @@ protected function setUp(): void
147137
'identityContainer' => $this->identityContainerMock,
148138
'storeManager' => $this->storeManagerMock,
149139
'configValueFactory' => $this->configValueFactory,
150-
'localeDate' => $this->localeDate,
151140
'modifyStartFromDate' => $this->modifyStartFromDate
152141
]
153142
);
@@ -181,9 +170,8 @@ public function testExecute($configValue, $collectionItems, $emailSendingResult)
181170
->method('addFieldToFilter')
182171
->with('email_sent', ['null' => true]);
183172

184-
$dateTime = new \DateTime();
185-
$nowDate = $dateTime->format('Y-m-d H:i:s');
186-
$fromDate = $dateTime->modify($this->modifyStartFromDate)->format('Y-m-d H:i:s');
173+
$nowDate = date('Y-m-d H:i:s');
174+
$fromDate = date('Y-m-d H:i:s', strtotime($nowDate . ' ' . $this->modifyStartFromDate));
187175
$this->entityCollection
188176
->expects($this->at(2))
189177
->method('addFieldToFilter')
@@ -227,10 +215,6 @@ public function testExecute($configValue, $collectionItems, $emailSendingResult)
227215
->method('create')
228216
->willReturn($backendModelMock);
229217

230-
$this->localeDate->expects($this->exactly(2))
231-
->method('date')
232-
->willReturn(new \DateTime($nowDate));
233-
234218
if ($collectionItems) {
235219

236220
/** @var AbstractModel|MockObject $collectionItem */

app/code/Magento/Sales/etc/di.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,11 @@
215215
</argument>
216216
</arguments>
217217
</type>
218+
<type name="Magento\Sales\Model\EmailSenderHandler">
219+
<arguments>
220+
<argument name="modifyStartFromDate" xsi:type="string">-1 day</argument>
221+
</arguments>
222+
</type>
218223
<virtualType name="SalesOrderIndexGridSyncRemove" type="Magento\Sales\Observer\GridSyncRemoveObserver">
219224
<arguments>
220225
<argument name="entityGrid" xsi:type="object">Magento\Sales\Model\ResourceModel\Order\Grid</argument>

0 commit comments

Comments
 (0)