diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index ac81f872fe..1bd53607f6 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -65,8 +65,15 @@ class Scheduler { function processPostNotificationNewsletter($newsletter, $queue) { $next_run_date = $this->getQueueNextRunDate($newsletter->schedule); $segments = unserialize($newsletter->segments); - $subscribers = SubscriberSegment::whereIn('segment_id', $segments) - ->findArray(); + if((boolean) Setting::getValue('signup_confirmation.enabled')) { + $subscribers = Subscriber::getSubscribedInSegments($segments) + ->findArray(); + } + else { + $subscribers = SubscriberSegment::whereIn('segment_id', $segments) + ->where('status', 'subscribed') + ->findArray(); + } $subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id'); $subscribers = array_unique($subscribers); if(!count($subscribers) || !$this->checkIfNewsletterChanged($newsletter)) { diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index e9c269e344..54985a8742 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -316,6 +316,19 @@ class Subscriber extends Model { return $orm; } + static function getSubscribedInSegments($segment_ids) { + $subscribers = SubscriberSegment::table_alias('relation') + ->whereIn('relation.segment_id', $segment_ids) + ->where('relation.status', 'subscribed') + ->join( + MP_SUBSCRIBERS_TABLE, + 'subscribers.id = relation.subscriber_id', + 'subscribers' + ) + ->where('subscribers.status', 'subscribed'); + return $subscribers; + } + function customFields() { return $this->hasManyThrough( __NAMESPACE__.'\CustomField', diff --git a/lib/Router/SendingQueue.php b/lib/Router/SendingQueue.php index 836255fbb7..c65838a2cb 100644 --- a/lib/Router/SendingQueue.php +++ b/lib/Router/SendingQueue.php @@ -5,6 +5,8 @@ use MailPoet\Mailer\Mailer; use MailPoet\Models\Newsletter; use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOptionField; +use MailPoet\Models\Setting; +use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Util\Helpers; use Cron\CronExpression as Cron; @@ -81,9 +83,18 @@ class SendingQueue { $queue = \MailPoet\Models\SendingQueue::create(); $queue->newsletter_id = $newsletter->id; - $subscribers = SubscriberSegment::whereIn('segment_id', $data['segments']) - ->findArray(); + + if((boolean) Setting::getValue('signup_confirmation.enabled')) { + $subscribers = Subscriber::getSubscribedInSegments($data['segments']) + ->findArray(); + } + else { + $subscribers = SubscriberSegment::whereIn('segment_id', $data['segments']) + ->where('status', 'subscribed') + ->findArray(); + } $subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id'); + $subscribers = array_unique($subscribers); if(!count($subscribers)) { return array( diff --git a/tests/unit/Models/SubscriberTest.php b/tests/unit/Models/SubscriberTest.php index bb77fd59f5..effb7a4bda 100644 --- a/tests/unit/Models/SubscriberTest.php +++ b/tests/unit/Models/SubscriberTest.php @@ -389,16 +389,45 @@ class SubscriberTest extends MailPoetTest { ->equals('non_default_value'); } + function testItCanGetOnlySubscribedSubscribersInSegments() { + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + $columns = array( + 'first_name', + 'last_name', + 'email', + 'status' + ); + $values = array( + array( + 'first_name' => 'Adam', + 'last_name' => 'Smith', + 'email' => 'adam@smith.com', + 'status' => 'unconfirmed' + ), + array( + 'first_name' => 'Mary', + 'last_name' => 'Jane', + 'email' => 'mary@jane.com', + 'status' => 'subscribed' + ) + ); + Subscriber::createMultiple($columns, $values); + SubscriberSegment::createMultiple(array(1), array(1,2)); + $subscribed_subscribers_in_segment = + Subscriber::getSubscribedInSegments(array(1))->findArray(); + expect(count($subscribed_subscribers_in_segment))->equals(1); + $subscriber = Subscriber::findOne(1); + $subscriber->status = 'subscribed'; + $subscriber->save(); + $subscribed_subscribers_in_segment = + Subscriber::getSubscribedInSegments(array(1))->findArray(); + expect(count($subscribed_subscribers_in_segment))->equals(2); + } function _after() { - ORM::forTable(Subscriber::$_table) - ->deleteMany(); - ORM::forTable(Segment::$_table) - ->deleteMany(); - ORM::forTable(SubscriberSegment::$_table) - ->deleteMany(); - ORM::forTable(CustomField::$_table) - ->deleteMany(); - ORM::forTable(SubscriberCustomField::$_table) - ->deleteMany(); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + ORM::raw_execute('TRUNCATE ' . Segment::$_table); + ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table); + ORM::raw_execute('TRUNCATE ' . CustomField::$_table); + ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table); } } \ No newline at end of file