diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index 59d5131cdd..3bd2ca73ae 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -8,6 +8,7 @@ use MailPoet\Models\Newsletter; use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterPost; +use MailPoet\Models\ScheduledTask; use MailPoet\Models\SendingQueue; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\WP\Functions as WPFunctions; @@ -129,9 +130,21 @@ class Scheduler { } static function createPostNotificationSendingTask($newsletter) { - $existing_notification_history = Newsletter::where('parent_id', $newsletter->id) - ->where('type', Newsletter::TYPE_NOTIFICATION_HISTORY) - ->where('status', Newsletter::STATUS_SENDING) + $existing_notification_history = Newsletter::table_alias('newsletters') + ->where('newsletters.parent_id', $newsletter->id) + ->where('newsletters.type', Newsletter::TYPE_NOTIFICATION_HISTORY) + ->where('newsletters.status', Newsletter::STATUS_SENDING) + ->join( + MP_SENDING_QUEUES_TABLE, + 'queues.newsletter_id = newsletters.id', + 'queues' + ) + ->join( + MP_SCHEDULED_TASKS_TABLE, + 'queues.task_id = tasks.id', + 'tasks' + ) + ->whereNotEqual('tasks.status', ScheduledTask::STATUS_PAUSED) ->findOne(); if($existing_notification_history) { return; diff --git a/tests/integration/Newsletter/Scheduler/SchedulerTest.php b/tests/integration/Newsletter/Scheduler/SchedulerTest.php index 70c4d62da8..d8ec09c6d0 100644 --- a/tests/integration/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/integration/Newsletter/Scheduler/SchedulerTest.php @@ -94,6 +94,28 @@ class SchedulerTest extends \MailPoetTest { expect(SendingQueue::findMany())->count(1); } + function testItCreatesPostNotificationSendingTaskIfAPausedNotificationExists() { + $newsletter = $this->_createNewsletter(); + $newsletter->schedule = '* 5 * * *'; + + // new queue record should be created + $queue_to_be_paused = Scheduler::createPostNotificationSendingTask($newsletter); + $queue_to_be_paused->task()->pause(); + + // another queue record should be created because the first one was paused + $newsletter->schedule = '* 10 * * *'; // different time to not clash with the first queue + $queue = Scheduler::createPostNotificationSendingTask($newsletter); + expect(SendingQueue::findMany())->count(2); + expect($queue->newsletter_id)->equals($newsletter->id); + expect($queue->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect($queue->scheduled_at)->equals(Scheduler::getNextRunDate('* 10 * * *')); + expect($queue->priority)->equals(SendingQueue::PRIORITY_MEDIUM); + + // duplicate queue record should not be created + Scheduler::createPostNotificationSendingTask($newsletter); + expect(SendingQueue::findMany())->count(2); + } + function testItDoesNotCreateDuplicateWelcomeNotificationSendingTasks() { $newsletter = (object)array( 'id' => 1, @@ -728,6 +750,11 @@ class SchedulerTest extends \MailPoetTest { $notification_history->parent_id = $newsletter->id; $notification_history->save(); + $sending_task = SendingTask::create(); + $sending_task->newsletter_id = $notification_history->id; + $sending_task->status = SendingQueue::STATUS_SCHEDULED; + $sending_task->save(); + $post_data = array( 'post_title' => 'title', 'post_status' => 'publish',