diff --git a/lib/Segments/DynamicSegments/Filters/EmailAction.php b/lib/Segments/DynamicSegments/Filters/EmailAction.php index 28d64321e1..cfe4876615 100644 --- a/lib/Segments/DynamicSegments/Filters/EmailAction.php +++ b/lib/Segments/DynamicSegments/Filters/EmailAction.php @@ -8,6 +8,7 @@ use MailPoet\Entities\StatisticsClickEntity; use MailPoet\Entities\StatisticsNewsletterEntity; use MailPoet\Entities\StatisticsOpenEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\Entities\UserAgentEntity; use MailPoet\Util\Security; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; use MailPoetVendor\Doctrine\ORM\EntityManager; @@ -98,6 +99,10 @@ class EmailAction implements Filter { "stats.subscriber_id = $subscribersTable.id AND stats.newsletter_id = :newsletter" . $parameterSuffix )->setParameter('newsletter' . $parameterSuffix, $newsletterId); } + if ($action === EmailAction::ACTION_OPENED) { + $queryBuilder->andWhere('(stats.user_agent_type = :userAgentType) OR (stats.user_agent_type IS NULL)') + ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN); + } if ($action === EmailAction::ACTION_CLICKED && $linkId) { $where .= ' AND stats.link_id = :link' . $parameterSuffix; } diff --git a/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php b/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php index 4b81cc262a..3fc27f8d9a 100644 --- a/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php +++ b/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php @@ -13,6 +13,7 @@ use MailPoet\Entities\StatisticsClickEntity; use MailPoet\Entities\StatisticsNewsletterEntity; use MailPoet\Entities\StatisticsOpenEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\Entities\UserAgentEntity; use MailPoetVendor\Doctrine\DBAL\Driver\Statement; class EmailActionTest extends \MailPoetTest { @@ -177,6 +178,23 @@ class EmailActionTest extends \MailPoetTest { expect($subscriber2->getEmail())->equals('not_opened@example.com'); } + public function testOpensNotIncludeMachineOpens() { + $subscriberOpenedMachine = $this->createSubscriber('opened_machine@example.com'); + $this->createStatsNewsletter($subscriberOpenedMachine); + $open = $this->createStatisticsOpens($subscriberOpenedMachine); + $open->setUserAgentType(UserAgentEntity::USER_AGENT_TYPE_MACHINE); + $userAgent = new UserAgentEntity(UserAgentEntity::MACHINE_USER_AGENTS[0]); + $this->entityManager->persist($userAgent); + $open->setUserAgent($userAgent); + $this->entityManager->flush(); + + $segmentFilter = $this->getSegmentFilter(EmailAction::ACTION_OPENED, (int)$this->newsletter->getId()); + $statement = $this->emailAction->apply($this->getQueryBuilder(), $segmentFilter)->execute(); + assert($statement instanceof Statement); + $result = $statement->rowCount(); + expect($result)->equals(2); + } + private function getQueryBuilder() { $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); return $this->entityManager @@ -258,5 +276,6 @@ class EmailActionTest extends \MailPoetTest { $this->truncateEntity(StatisticsClickEntity::class); $this->truncateEntity(StatisticsNewsletterEntity::class); $this->truncateEntity(NewsletterLinkEntity::class); + $this->truncateEntity(UserAgentEntity::class); } }