diff --git a/lib/Newsletter/Scheduler/ReEngagementScheduler.php b/lib/Newsletter/Scheduler/ReEngagementScheduler.php index 84bef1d67b..af837a0a43 100644 --- a/lib/Newsletter/Scheduler/ReEngagementScheduler.php +++ b/lib/Newsletter/Scheduler/ReEngagementScheduler.php @@ -2,7 +2,6 @@ namespace MailPoet\Newsletter\Scheduler; -use MailPoet\Cron\Workers\ReEngagementEmailsScheduler; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterOptionFieldEntity; use MailPoet\Entities\ScheduledTaskEntity; @@ -10,8 +9,10 @@ use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\StatisticsNewsletterEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository; +use MailPoet\Tasks\Sending; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Doctrine\DBAL\ParameterType; @@ -73,27 +74,39 @@ class ReEngagementScheduler { return null; } - $thresholdDate = Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); - if ($intervalUnit === 'months') { - $thresholdDate->subMonths($intervalValue); - } else { - $thresholdDate->subWeeks($intervalValue); - } + $scheduledTask = $this->scheduleTask($email); + $this->enqueueSubscribers($email, $scheduledTask, $intervalUnit, $intervalValue); + return $scheduledTask; + } + + private function scheduleTask(NewsletterEntity $email): ScheduledTaskEntity { // Scheduled task $scheduledTask = new ScheduledTaskEntity(); $scheduledTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); $scheduledTask->setScheduledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp'))); - $scheduledTask->setType(ReEngagementEmailsScheduler::TASK_TYPE); + $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; + } + /** + * Finds subscribers that should receive re-engagement email and saves scheduled tasks subscribers + */ + private function enqueueSubscribers(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, string $intervalUnit, int $intervalValue) { // Parameters for scheduled task subscribers query + $thresholdDate = Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); + if ($intervalUnit === 'months') { + $thresholdDate->subMonths($intervalValue); + } else { + $thresholdDate->subWeeks($intervalValue); + } $taskId = $scheduledTask->getId(); $subscribedStatus = SubscriberEntity::STATUS_SUBSCRIBED; $thresholdDateSql = $thresholdDate->toDateTimeString(); @@ -101,6 +114,7 @@ class ReEngagementScheduler { $segmentIds = $email->getSegmentIds(); $newsletterStatsTable = $this->entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName(); $scheduledTaskSubscribersTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName(); + $subscriberSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $nowSql = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'))->toDateTimeString(); @@ -108,7 +122,7 @@ class ReEngagementScheduler { (subscriber_id, task_id, processed, created_at) SELECT DISTINCT ns.subscriber_id as subscriber_id, :taskId as task_id, 0 as processed, :now as created_at FROM $newsletterStatsTable as ns JOIN $subscribersTable s ON ns.subscriber_id = s.id AND s.deleted_at is NULL AND s.status = :subscribed AND GREATEST(COALESCE(s.created_at, '0'), COALESCE(s.last_subscribed_at, '0'), COALESCE(s.last_engagement_at, '0')) < :thresholdDate - JOIN wp_mailpoet_subscriber_segment as ss ON ns.subscriber_id = ss.subscriber_id AND ss.segment_id IN (" . implode(',', $segmentIds) . ") AND ss.status = :subscribed + JOIN $subscriberSegmentTable as ss ON ns.subscriber_id = ss.subscriber_id AND ss.segment_id IN (" . implode(',', $segmentIds) . ") AND ss.status = :subscribed WHERE ns.sent_at > :thresholdDate AND ns.subscriber_id NOT IN (SELECT DISTINCT subscriber_id as id FROM $newsletterStatsTable WHERE newsletter_id = :newsletterId AND sent_at > :thresholdDate); "; @@ -120,6 +134,5 @@ class ReEngagementScheduler { $statement->bindParam('newsletterId', $newsletterId, ParameterType::INTEGER); $statement->executeQuery(); - return $scheduledTask; } } diff --git a/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php b/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php index 2713b63ba9..19a0cb8a8a 100644 --- a/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php +++ b/tests/integration/Newsletter/Scheduler/ReEngagementSchedulerTest.php @@ -13,6 +13,7 @@ use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\StatisticsNewsletterEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberSegmentEntity; +use MailPoet\Tasks\Sending; use MailPoet\Test\DataFactories\Newsletter; use MailPoet\Test\DataFactories\Segment; use MailPoet\Test\DataFactories\Subscriber;