Add segment for machine opens
[MAILPOET-3737]
This commit is contained in:
@@ -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,
|
||||||
};
|
};
|
||||||
|
@@ -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',
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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'),
|
||||||
|
Reference in New Issue
Block a user