diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index d7a8d7b35a..aaebf3ca0a 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -280,7 +280,9 @@ class Subscriber extends Model { 'value' => '' ); - $subscribers_without_segment = self::filter('withoutSegments')->count(); + $subscribers_without_segment = self::filter('withoutSegments') + ->whereNull('deleted_at') + ->count(); $subscribers_without_segment_label = sprintf( __('Subscribers without a list (%s)', 'mailpoet'), number_format($subscribers_without_segment) @@ -782,13 +784,18 @@ class Subscriber extends Model { static function withoutSegments($orm) { return $orm->select(MP_SUBSCRIBERS_TABLE.'.*') - ->leftOuterJoin( - MP_SUBSCRIBER_SEGMENT_TABLE, + ->rawJoin( + 'LEFT OUTER JOIN ( + SELECT `subscriber_id` + FROM '.MP_SUBSCRIBER_SEGMENT_TABLE.' + WHERE `status` = "'.self::STATUS_SUBSCRIBED.'" + )', array( MP_SUBSCRIBERS_TABLE.'.id', '=', MP_SUBSCRIBER_SEGMENT_TABLE.'.subscriber_id' - ) + ), + MP_SUBSCRIBER_SEGMENT_TABLE ) ->whereNull(MP_SUBSCRIBER_SEGMENT_TABLE.'.subscriber_id'); } diff --git a/tests/unit/Models/SubscriberTest.php b/tests/unit/Models/SubscriberTest.php index c1dcff2422..e1962c2e3b 100644 --- a/tests/unit/Models/SubscriberTest.php +++ b/tests/unit/Models/SubscriberTest.php @@ -141,6 +141,56 @@ class SubscriberTest extends MailPoetTest { } } + function testItHasSegmentFilter() { + // remove all subscribers + Subscriber::deleteMany(); + + $subscriber = Subscriber::create(); + $subscriber->hydrate(Fixtures::get('subscriber_template')); + $subscriber->save(); + + $segment = Segment::createOrUpdate(array( + 'name' => 'Test segment' + )); + $segment_2 = Segment::createOrUpdate(array( + 'name' => 'Test segment 2' + )); + + // not yet subscribed + $subscribers = Subscriber::filter('filterBy', array('segment' => 'none')) + ->findMany(); + expect($subscribers)->count(1); + $subscribers = Subscriber::filter('filterBy', array('segment' => $segment->id)) + ->findMany(); + expect($subscribers)->count(0); + + // subscribed to a segment + SubscriberSegment::subscribeToSegments( + $subscriber, + array($segment->id, $segment_2->id) + ); + + $subscribers = Subscriber::filter('filterBy', array('segment' => 'none')) + ->findMany(); + expect($subscribers)->count(0); + $subscribers = Subscriber::filter('filterBy', array('segment' => $segment->id)) + ->findMany(); + expect($subscribers)->count(1); + + // unsubscribed + SubscriberSegment::unsubscribeFromSegments( + $subscriber, + array($segment->id, $segment_2->id) + ); + + $subscribers = Subscriber::filter('filterBy', array('segment' => 'none')) + ->findMany(); + expect($subscribers)->count(1); + $subscribers = Subscriber::filter('filterBy', array('segment' => $segment->id)) + ->findMany(); + expect($subscribers)->count(0); + } + function testItCanHaveSegment() { $segment = Segment::createOrUpdate(array( 'name' => 'some name'