diff --git a/mailpoet/lib/Subscribers/SubscriberListingRepository.php b/mailpoet/lib/Subscribers/SubscriberListingRepository.php index 47b2ed11c6..b09d8feade 100644 --- a/mailpoet/lib/Subscribers/SubscriberListingRepository.php +++ b/mailpoet/lib/Subscribers/SubscriberListingRepository.php @@ -41,6 +41,9 @@ class SubscriberListingRepository extends ListingRepository { /** @var SubscribersCountsController */ private $subscribersCountsController; + /** @var null | ListingDefinition */ + private $definition = null; + public function __construct( EntityManager $entityManager, FilterHandler $dynamicSegmentsFilter, @@ -55,6 +58,7 @@ class SubscriberListingRepository extends ListingRepository { } public function getData(ListingDefinition $definition): array { + $this->definition = $definition; $dynamicSegment = $this->getDynamicSegmentFromFilters($definition); if ($dynamicSegment === null) { return parent::getData($definition); @@ -63,6 +67,7 @@ class SubscriberListingRepository extends ListingRepository { } public function getCount(ListingDefinition $definition): int { + $this->definition = $definition; $dynamicSegment = $this->getDynamicSegmentFromFilters($definition); if ($dynamicSegment === null) { return parent::getCount($definition); @@ -78,6 +83,7 @@ class SubscriberListingRepository extends ListingRepository { } public function getActionableIds(ListingDefinition $definition): array { + $this->definition = $definition; $ids = $definition->getSelection(); if (!empty($ids)) { return $ids; @@ -118,8 +124,24 @@ class SubscriberListingRepository extends ListingRepository { return; } + if (!in_array($group, [SubscriberEntity::STATUS_SUBSCRIBED, SubscriberEntity::STATUS_UNSUBSCRIBED])) { + $queryBuilder + ->andWhere('s.status = :status') + ->setParameter('status', $group); + return; + } + + $segment = $this->definition && array_key_exists('segment', $this->definition->getFilters()) ? $this->entityManager->find(SegmentEntity::class, (int)$this->definition->getFilters()['segment']) : null; + if (!$segment instanceof SegmentEntity || !$segment->isStatic()) { + $queryBuilder + ->andWhere('s.status = :status') + ->setParameter('status', $group); + return; + } + + $operator = $group === SubscriberEntity::STATUS_SUBSCRIBED ? 'AND' : 'OR'; $queryBuilder - ->andWhere('s.status = :status') + ->andWhere('(s.status = :status ' . $operator . ' ss.status = :status)') ->setParameter('status', $group); }