Show merged opens if respective setting is set

[MAILPOET-6164]
This commit is contained in:
alex-mpoet
2024-08-19 20:06:57 +03:00
committed by Aschepikov
parent ee1043fce9
commit 8a506e7278
3 changed files with 37 additions and 6 deletions

View File

@ -14,6 +14,7 @@ use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\StatisticsWooCommercePurchaseEntity; use MailPoet\Entities\StatisticsWooCommercePurchaseEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\UserAgentEntity; use MailPoet\Entities\UserAgentEntity;
use MailPoet\Settings\TrackingConfig;
use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\Query\Expr\Join; use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
@ -28,12 +29,17 @@ class NewsletterStatisticsRepository extends Repository {
/** @var WCHelper */ /** @var WCHelper */
private $wcHelper; private $wcHelper;
/** @var TrackingConfig */
private $trackingConfig;
public function __construct( public function __construct(
EntityManager $entityManager, EntityManager $entityManager,
WCHelper $wcHelper WCHelper $wcHelper,
TrackingConfig $trackingConfig
) { ) {
parent::__construct($entityManager); parent::__construct($entityManager);
$this->wcHelper = $wcHelper; $this->wcHelper = $wcHelper;
$this->trackingConfig = $trackingConfig;
} }
protected function getEntityClassName() { 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 { private function getStatisticCounts(string $statisticsEntityName, array $newsletters, \DateTimeImmutable $from = null, \DateTimeImmutable $to = null): array {
$qb = $this->getStatisticsQuery($statisticsEntityName, $newsletters); $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)') $qb->andWhere('(stats.userAgentType = :userAgentType) OR (stats.userAgentType IS NULL)')
->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN); ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN);
} }

View File

@ -7,6 +7,9 @@ class TrackingConfig {
const LEVEL_PARTIAL = 'partial'; const LEVEL_PARTIAL = 'partial';
const LEVEL_BASIC = 'basic'; const LEVEL_BASIC = 'basic';
const OPENS_MERGED = 'merged';
const OPENS_SEPARATED = 'separated';
/** @var SettingsController */ /** @var SettingsController */
private $settings; private $settings;
@ -26,6 +29,15 @@ class TrackingConfig {
return $level === self::LEVEL_FULL; 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 { public function getConfig(): array {
return [ return [
'level' => $this->settings->get('tracking.level', self::LEVEL_FULL), 'level' => $this->settings->get('tracking.level', self::LEVEL_FULL),

View File

@ -10,6 +10,7 @@ use MailPoet\Entities\StatisticsWooCommercePurchaseEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\UserAgentEntity; use MailPoet\Entities\UserAgentEntity;
use MailPoet\Newsletter\Statistics\WooCommerceRevenue; use MailPoet\Newsletter\Statistics\WooCommerceRevenue;
use MailPoet\Settings\TrackingConfig;
use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
@ -23,12 +24,17 @@ class SubscriberStatisticsRepository extends Repository {
/** @var WCHelper */ /** @var WCHelper */
private $wcHelper; private $wcHelper;
/** @var TrackingConfig */
private $trackingConfig;
public function __construct( public function __construct(
EntityManager $entityManager, EntityManager $entityManager,
WCHelper $wcHelper WCHelper $wcHelper,
TrackingConfig $trackingConfig
) { ) {
parent::__construct($entityManager); parent::__construct($entityManager);
$this->wcHelper = $wcHelper; $this->wcHelper = $wcHelper;
$this->trackingConfig = $trackingConfig;
} }
protected function getEntityClassName() { protected function getEntityClassName() {
@ -64,9 +70,13 @@ class SubscriberStatisticsRepository extends Repository {
} }
public function getStatisticsOpenCount(SubscriberEntity $subscriber, ?Carbon $startTime = null): int { public function getStatisticsOpenCount(SubscriberEntity $subscriber, ?Carbon $startTime = null): int {
return (int)$this->getStatisticsOpenCountQuery($subscriber, $startTime) $queryBuilder = $this->getStatisticsOpenCountQuery($subscriber, $startTime);
->andWhere('(stats.userAgentType = :userAgentType)') if ($this->trackingConfig->areOpensSeparated()) {
->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN) $queryBuilder
->andWhere('(stats.userAgentType = :userAgentType)')
->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN);
}
return (int)$queryBuilder
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
} }