Add segment for machine opens

[MAILPOET-3737]
This commit is contained in:
Pavel Dohnal
2021-08-30 13:24:00 +02:00
committed by Veljko V
parent cdd3ff5178
commit 2ab5f04f46
5 changed files with 27 additions and 0 deletions

View File

@@ -14,6 +14,7 @@ import { EmailOpensAbsoluteCountFields } from './email_opens_absolute_count';
export const EmailSegmentOptions = [ export const EmailSegmentOptions = [
{ value: EmailActionTypes.OPENS_ABSOLUTE_COUNT, label: MailPoet.I18n.t('emailActionOpensAbsoluteCount'), group: SegmentTypes.Email }, { value: EmailActionTypes.OPENS_ABSOLUTE_COUNT, label: MailPoet.I18n.t('emailActionOpensAbsoluteCount'), group: SegmentTypes.Email },
{ value: EmailActionTypes.OPENED, label: MailPoet.I18n.t('emailActionOpened'), group: SegmentTypes.Email }, { value: EmailActionTypes.OPENED, label: MailPoet.I18n.t('emailActionOpened'), group: SegmentTypes.Email },
{ value: EmailActionTypes.MACHINE_OPENED, label: MailPoet.I18n.t('emailActionMachineOpened'), group: SegmentTypes.Email },
{ value: EmailActionTypes.NOT_OPENED, label: MailPoet.I18n.t('emailActionNotOpened'), group: SegmentTypes.Email }, { value: EmailActionTypes.NOT_OPENED, label: MailPoet.I18n.t('emailActionNotOpened'), group: SegmentTypes.Email },
{ value: EmailActionTypes.CLICKED, label: MailPoet.I18n.t('emailActionClicked'), group: SegmentTypes.Email }, { value: EmailActionTypes.CLICKED, label: MailPoet.I18n.t('emailActionClicked'), group: SegmentTypes.Email },
{ value: EmailActionTypes.CLICKED_ANY, label: MailPoet.I18n.t('emailActionClickedAnyEmail'), group: SegmentTypes.Email }, { value: EmailActionTypes.CLICKED_ANY, label: MailPoet.I18n.t('emailActionClickedAnyEmail'), group: SegmentTypes.Email },
@@ -48,6 +49,7 @@ const componentsMap = {
[EmailActionTypes.CLICKED]: EmailStatisticsFields, [EmailActionTypes.CLICKED]: EmailStatisticsFields,
[EmailActionTypes.NOT_CLICKED]: EmailStatisticsFields, [EmailActionTypes.NOT_CLICKED]: EmailStatisticsFields,
[EmailActionTypes.OPENED]: EmailStatisticsFields, [EmailActionTypes.OPENED]: EmailStatisticsFields,
[EmailActionTypes.MACHINE_OPENED]: EmailStatisticsFields,
[EmailActionTypes.NOT_OPENED]: EmailStatisticsFields, [EmailActionTypes.NOT_OPENED]: EmailStatisticsFields,
[EmailActionTypes.CLICKED_ANY]: null, [EmailActionTypes.CLICKED_ANY]: null,
}; };

View File

@@ -9,6 +9,7 @@ export enum SegmentTypes {
export enum EmailActionTypes { export enum EmailActionTypes {
OPENS_ABSOLUTE_COUNT = 'opensAbsoluteCount', OPENS_ABSOLUTE_COUNT = 'opensAbsoluteCount',
OPENED = 'opened', OPENED = 'opened',
MACHINE_OPENED = 'machineOpened',
NOT_OPENED = 'notOpened', NOT_OPENED = 'notOpened',
CLICKED = 'clicked', CLICKED = 'clicked',
CLICKED_ANY = 'clickedAny', CLICKED_ANY = 'clickedAny',

View File

@@ -15,6 +15,7 @@ use MailPoetVendor\Doctrine\ORM\EntityManager;
class EmailAction implements Filter { class EmailAction implements Filter {
const ACTION_OPENED = 'opened'; const ACTION_OPENED = 'opened';
const ACTION_MACHINE_OPENED = 'machineOpened';
const ACTION_NOT_OPENED = 'notOpened'; const ACTION_NOT_OPENED = 'notOpened';
const ACTION_CLICKED = 'clicked'; const ACTION_CLICKED = 'clicked';
const ACTION_CLICKED_ANY = 'clickedAny'; const ACTION_CLICKED_ANY = 'clickedAny';
@@ -22,6 +23,7 @@ class EmailAction implements Filter {
const ALLOWED_ACTIONS = [ const ALLOWED_ACTIONS = [
self::ACTION_OPENED, self::ACTION_OPENED,
self::ACTION_MACHINE_OPENED,
self::ACTION_NOT_OPENED, self::ACTION_NOT_OPENED,
self::ACTION_CLICKED, self::ACTION_CLICKED,
self::ACTION_NOT_CLICKED, self::ACTION_NOT_CLICKED,
@@ -103,6 +105,10 @@ class EmailAction implements Filter {
$queryBuilder->andWhere('(stats.user_agent_type = :userAgentType) OR (stats.user_agent_type IS NULL)') $queryBuilder->andWhere('(stats.user_agent_type = :userAgentType) OR (stats.user_agent_type IS NULL)')
->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN); ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN);
} }
if ($action === EmailAction::ACTION_MACHINE_OPENED) {
$queryBuilder->andWhere('(stats.user_agent_type = :userAgentType)')
->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_MACHINE);
}
if ($action === EmailAction::ACTION_CLICKED && $linkId) { if ($action === EmailAction::ACTION_CLICKED && $linkId) {
$where .= ' AND stats.link_id = :link' . $parameterSuffix; $where .= ' AND stats.link_id = :link' . $parameterSuffix;
} }

View File

@@ -195,6 +195,23 @@ class EmailActionTest extends \MailPoetTest {
expect($result)->equals(2); expect($result)->equals(2);
} }
public function testMachineOpens() {
$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_MACHINE_OPENED, (int)$this->newsletter->getId());
$statement = $this->emailAction->apply($this->getQueryBuilder(), $segmentFilter)->execute();
assert($statement instanceof Statement);
$result = $statement->rowCount();
expect($result)->equals(1);
}
private function getQueryBuilder() { private function getQueryBuilder() {
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
return $this->entityManager return $this->entityManager

View File

@@ -140,6 +140,7 @@
'selectUserRolePlaceholder': __('Select user role'), 'selectUserRolePlaceholder': __('Select user role'),
'selectCustomFieldPlaceholder': __('Select custom field'), 'selectCustomFieldPlaceholder': __('Select custom field'),
'emailActionOpened': _x('opened', 'Dynamic segment creation: when newsletter was opened'), 'emailActionOpened': _x('opened', 'Dynamic segment creation: when newsletter was opened'),
'emailActionMachineOpened': _x('machine-opened', 'Dynamic segment creation: list of all subscribers that opened the newsletter automatically in the background'),
'emailActionOpensAbsoluteCount': __('# of opens'), 'emailActionOpensAbsoluteCount': __('# of opens'),
'emailActionOpens': __('opens'), 'emailActionOpens': __('opens'),
'emailActionDays': __('days'), 'emailActionDays': __('days'),