diff --git a/lib/Newsletter/Scheduler/ReEngagementScheduler.php b/lib/Newsletter/Scheduler/ReEngagementScheduler.php index af837a0a43..31e4c419dd 100644 --- a/lib/Newsletter/Scheduler/ReEngagementScheduler.php +++ b/lib/Newsletter/Scheduler/ReEngagementScheduler.php @@ -75,11 +75,20 @@ class ReEngagementScheduler { } $scheduledTask = $this->scheduleTask($email); - $this->enqueueSubscribers($email, $scheduledTask, $intervalUnit, $intervalValue); - return $scheduledTask; + $enqueuedCount = $this->enqueueSubscribers($email, $scheduledTask, $intervalUnit, $intervalValue); + + if ($enqueuedCount) { + $this->createSendingQueue($email, $scheduledTask, $enqueuedCount); + return $scheduledTask; + } else { + // Nothing to send + $this->scheduledTasksRepository->remove($scheduledTask); + $this->scheduledTasksRepository->flush(); + return null; + } } - private function scheduleTask(NewsletterEntity $email): ScheduledTaskEntity { + private function scheduleTask(NewsletterEntity $email) { // Scheduled task $scheduledTask = new ScheduledTaskEntity(); $scheduledTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); @@ -87,19 +96,27 @@ class ReEngagementScheduler { $scheduledTask->setType(Sending::TASK_TYPE); $scheduledTask->setPriority(SendingQueueEntity::PRIORITY_MEDIUM); $this->scheduledTasksRepository->persist($scheduledTask); - // Sending queue - $sendingQueue = new SendingQueueEntity(); - $sendingQueue->setTask($scheduledTask); - $sendingQueue->setNewsletter($email); - $this->scheduledTasksRepository->persist($sendingQueue); $this->scheduledTasksRepository->flush(); return $scheduledTask; } + private function createSendingQueue(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, int $countToProcess): SendingQueueEntity { + // Sending queue + $sendingQueue = new SendingQueueEntity(); + $sendingQueue->setTask($scheduledTask); + $sendingQueue->setNewsletter($email); + $sendingQueue->setCountToProcess($countToProcess); + $sendingQueue->setCountTotal($countToProcess); + $this->entityManager->persist($sendingQueue); + $this->entityManager->flush(); + return $sendingQueue; + } + /** * Finds subscribers that should receive re-engagement email and saves scheduled tasks subscribers + * @return int Count of enqueued subscribers */ - private function enqueueSubscribers(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, string $intervalUnit, int $intervalValue) { + private function enqueueSubscribers(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, string $intervalUnit, int $intervalValue): int { // Parameters for scheduled task subscribers query $thresholdDate = Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); if ($intervalUnit === 'months') { @@ -134,5 +151,6 @@ class ReEngagementScheduler { $statement->bindParam('newsletterId', $newsletterId, ParameterType::INTEGER); $statement->executeQuery(); + return $statement->rowCount(); } } diff --git a/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php b/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php index 19a0cb8a8a..8504c6b0a9 100644 --- a/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php +++ b/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php @@ -59,6 +59,12 @@ class ReEngagementSchedulerTest extends \MailPoetTest { expect($scheduled)->count(0); } + public function testItDoesntScheduleAnythingIfThereAreNoSubscribersToSendTo() { + $this->createReEngagementEmail(5); + $scheduled = $this->scheduler->scheduleAll(); + expect($scheduled)->count(0); + } + public function testItScheduleEmailWithCorrectSubscribers() { $beforeCheckInterval = Carbon::now(); $beforeCheckInterval->subMonths(10); @@ -119,6 +125,12 @@ class ReEngagementSchedulerTest extends \MailPoetTest { $this->assertInstanceOf(\DateTimeInterface::class, $scheduledAt); expect($scheduledAt->getTimestamp())->equals(Carbon::now()->getTimestamp(), 1); expect($task->getSubscribers()->count())->equals(2); + + $sendingQueue = $this->entityManager->getRepository(SendingQueueEntity::class)->findOneBy(['task' => $task]); + $this->assertInstanceOf(SendingQueueEntity::class, $sendingQueue); + expect($sendingQueue->getCountToProcess())->equals(2); + expect($sendingQueue->getCountTotal())->equals(2); + expect($sendingQueue->getCountProcessed())->equals(0); } private function createReEngagementEmail(int $monthsAfter, string $status = NewsletterEntity::STATUS_ACTIVE) {