diff --git a/mailpoet/lib/Newsletter/Statistics/NewsletterStatisticsRepository.php b/mailpoet/lib/Newsletter/Statistics/NewsletterStatisticsRepository.php index 38b7ac1469..65a43d0575 100644 --- a/mailpoet/lib/Newsletter/Statistics/NewsletterStatisticsRepository.php +++ b/mailpoet/lib/Newsletter/Statistics/NewsletterStatisticsRepository.php @@ -14,6 +14,7 @@ use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\StatisticsWooCommercePurchaseEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\UserAgentEntity; +use MailPoet\Settings\TrackingConfig; use MailPoet\WooCommerce\Helper as WCHelper; use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\Query\Expr\Join; @@ -28,12 +29,17 @@ class NewsletterStatisticsRepository extends Repository { /** @var WCHelper */ private $wcHelper; + /** @var TrackingConfig */ + private $trackingConfig; + public function __construct( EntityManager $entityManager, - WCHelper $wcHelper + WCHelper $wcHelper, + TrackingConfig $trackingConfig ) { parent::__construct($entityManager); $this->wcHelper = $wcHelper; + $this->trackingConfig = $trackingConfig; } protected function getEntityClassName() { @@ -222,7 +228,10 @@ class NewsletterStatisticsRepository extends Repository { private function getStatisticCounts(string $statisticsEntityName, array $newsletters, \DateTimeImmutable $from = null, \DateTimeImmutable $to = null): array { $qb = $this->getStatisticsQuery($statisticsEntityName, $newsletters); - if (in_array($statisticsEntityName, [StatisticsOpenEntity::class, StatisticsClickEntity::class], true)) { + if ( + $statisticsEntityName === StatisticsClickEntity::class + || ($statisticsEntityName === StatisticsOpenEntity::class && $this->trackingConfig->areOpensSeparated()) + ) { $qb->andWhere('(stats.userAgentType = :userAgentType) OR (stats.userAgentType IS NULL)') ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN); } diff --git a/mailpoet/lib/Settings/TrackingConfig.php b/mailpoet/lib/Settings/TrackingConfig.php index 5bbec8e869..c7f18828c3 100644 --- a/mailpoet/lib/Settings/TrackingConfig.php +++ b/mailpoet/lib/Settings/TrackingConfig.php @@ -7,6 +7,9 @@ class TrackingConfig { const LEVEL_PARTIAL = 'partial'; const LEVEL_BASIC = 'basic'; + const OPENS_MERGED = 'merged'; + const OPENS_SEPARATED = 'separated'; + /** @var SettingsController */ private $settings; @@ -26,6 +29,15 @@ class TrackingConfig { return $level === self::LEVEL_FULL; } + public function areOpensMerged(string $opens = null): bool { + $opens = $opens ?? $this->settings->get('tracking.opens', self::OPENS_MERGED); + return $opens !== self::OPENS_SEPARATED; + } + + public function areOpensSeparated(string $opens = null): bool { + return !$this->areOpensMerged($opens); + } + public function getConfig(): array { return [ 'level' => $this->settings->get('tracking.level', self::LEVEL_FULL), diff --git a/mailpoet/lib/Subscribers/Statistics/SubscriberStatisticsRepository.php b/mailpoet/lib/Subscribers/Statistics/SubscriberStatisticsRepository.php index 1d018f8b30..02e320aec9 100644 --- a/mailpoet/lib/Subscribers/Statistics/SubscriberStatisticsRepository.php +++ b/mailpoet/lib/Subscribers/Statistics/SubscriberStatisticsRepository.php @@ -10,6 +10,7 @@ use MailPoet\Entities\StatisticsWooCommercePurchaseEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\UserAgentEntity; use MailPoet\Newsletter\Statistics\WooCommerceRevenue; +use MailPoet\Settings\TrackingConfig; use MailPoet\WooCommerce\Helper as WCHelper; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Doctrine\ORM\EntityManager; @@ -23,12 +24,17 @@ class SubscriberStatisticsRepository extends Repository { /** @var WCHelper */ private $wcHelper; + /** @var TrackingConfig */ + private $trackingConfig; + public function __construct( EntityManager $entityManager, - WCHelper $wcHelper + WCHelper $wcHelper, + TrackingConfig $trackingConfig ) { parent::__construct($entityManager); $this->wcHelper = $wcHelper; + $this->trackingConfig = $trackingConfig; } protected function getEntityClassName() { @@ -64,9 +70,13 @@ class SubscriberStatisticsRepository extends Repository { } public function getStatisticsOpenCount(SubscriberEntity $subscriber, ?Carbon $startTime = null): int { - return (int)$this->getStatisticsOpenCountQuery($subscriber, $startTime) - ->andWhere('(stats.userAgentType = :userAgentType)') - ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN) + $queryBuilder = $this->getStatisticsOpenCountQuery($subscriber, $startTime); + if ($this->trackingConfig->areOpensSeparated()) { + $queryBuilder + ->andWhere('(stats.userAgentType = :userAgentType)') + ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN); + } + return (int)$queryBuilder ->getQuery() ->getSingleScalarResult(); }