diff --git a/mailpoet/lib/Entities/DynamicSegmentFilterData.php b/mailpoet/lib/Entities/DynamicSegmentFilterData.php index 67bbaf39ea..907428e689 100644 --- a/mailpoet/lib/Entities/DynamicSegmentFilterData.php +++ b/mailpoet/lib/Entities/DynamicSegmentFilterData.php @@ -43,6 +43,9 @@ class DynamicSegmentFilterData { DynamicSegmentFilterData::OPERATOR_NOT_ENDS_WITH, ]; + public const TIMEFRAME_ALL_TIME = 'allTime'; + public const TIMEFRAME_IN_THE_LAST = 'inTheLast'; + /** * @ORM\Column(type="serialized_array") * @var array|null diff --git a/mailpoet/lib/Segments/DynamicSegments/FilterDataMapper.php b/mailpoet/lib/Segments/DynamicSegments/FilterDataMapper.php index 14e691a6d0..e10d9a6d61 100644 --- a/mailpoet/lib/Segments/DynamicSegments/FilterDataMapper.php +++ b/mailpoet/lib/Segments/DynamicSegments/FilterDataMapper.php @@ -69,7 +69,7 @@ class FilterDataMapper { private function createFilter(array $filterData): DynamicSegmentFilterData { if (isset($filterData['days']) && !isset($filterData['timeframe'])) { // Backwards compatibility for filters created before time period component had "over all time" option - $filterData['timeframe'] = 'inTheLast'; + $filterData['timeframe'] = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST; } switch ($this->getSegmentType($filterData)) { case DynamicSegmentFilterData::TYPE_AUTOMATIONS: @@ -318,7 +318,7 @@ class FilterDataMapper { 'opens' => $data['opens'], 'days' => $data['days'] ?? 0, 'operator' => $data['operator'] ?? 'more', - 'timeframe' => $data['timeframe'] ?? 'inTheLast', // backwards compatibility + 'timeframe' => $data['timeframe'] ?? DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, // backwards compatibility 'connect' => $data['connect'], ]; $filterType = DynamicSegmentFilterData::TYPE_EMAIL; @@ -513,11 +513,11 @@ class FilterDataMapper { } private function validateDaysPeriodData(array $data): void { - if (!isset($data['timeframe']) || !in_array($data['timeframe'], ['allTime', 'inTheLast'], true)) { + if (!isset($data['timeframe']) || !in_array($data['timeframe'], [DynamicSegmentFilterData::TIMEFRAME_ALL_TIME, DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST], true)) { throw new InvalidFilterException('Missing timeframe type', InvalidFilterException::MISSING_VALUE); } - if ($data['timeframe'] === 'allTime') { + if ($data['timeframe'] === DynamicSegmentFilterData::TIMEFRAME_ALL_TIME) { return; } diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php b/mailpoet/lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php index 61382aef96..8777e450c8 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments\DynamicSegments\Filters; +use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\StatisticsOpenEntity; use MailPoet\Entities\SubscriberEntity; @@ -34,7 +35,7 @@ class EmailOpensAbsoluteCountAction implements Filter { $statsTable = $this->entityManager->getClassMetadata(StatisticsOpenEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); - if ($timeframe === 'allTime') { + if ($timeframe === DynamicSegmentFilterData::TIMEFRAME_ALL_TIME) { $queryBuilder->leftJoin( $subscribersTable, $statsTable, diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceAverageSpent.php b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceAverageSpent.php index 729b3e2131..7a72453fd6 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceAverageSpent.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceAverageSpent.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments\DynamicSegments\Filters; +use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; @@ -31,7 +32,7 @@ class WooCommerceAverageSpent implements Filter { $orderStatsAlias = $this->wooFilterHelper->applyOrderStatusFilter($queryBuilder); - if ($timeframe !== 'allTime') { + if ($timeframe !== DynamicSegmentFilterData::TIMEFRAME_ALL_TIME) { $days = intval($filterData->getParam('days')); $date = Carbon::now()->subDays($days); $dateParam = $this->filterHelper->getUniqueParameterName('date'); diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php index d4bd85d9a0..cd7601fa32 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments\DynamicSegments\Filters; +use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Util\DBCollationChecker; @@ -39,7 +40,7 @@ class WooCommerceNumberOfOrders implements Filter { $filterData = $filter->getFilterData(); $type = strval($filterData->getParam('number_of_orders_type')); $count = intval($filterData->getParam('number_of_orders_count')); - $isAllTime = $filterData->getParam('timeframe') === 'allTime'; + $isAllTime = $filterData->getParam('timeframe') === DynamicSegmentFilterData::TIMEFRAME_ALL_TIME; $parameterSuffix = $filter->getId() ?? Security::generateRandomString(); $collation = $this->collationChecker->getCollateIfNeeded( $subscribersTable, diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValue.php b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValue.php index 6240eac97b..4a4eb802c4 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValue.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValue.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments\DynamicSegments\Filters; +use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Util\Security; use MailPoetVendor\Carbon\Carbon; @@ -23,7 +24,7 @@ class WooCommerceSingleOrderValue implements Filter { $filterData = $filter->getFilterData(); $type = $filterData->getParam('single_order_value_type'); $amount = $filterData->getParam('single_order_value_amount'); - $isAllTime = $filterData->getParam('timeframe') === 'allTime'; + $isAllTime = $filterData->getParam('timeframe') === DynamicSegmentFilterData::TIMEFRAME_ALL_TIME; $parameterSuffix = $filter->getId() ?? Security::generateRandomString(); $orderStatsAlias = $this->wooFilterHelper->applyOrderStatusFilter($queryBuilder); diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceTotalSpent.php b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceTotalSpent.php index 3e7207e098..183f109b7a 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceTotalSpent.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceTotalSpent.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments\DynamicSegments\Filters; +use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Util\Security; use MailPoetVendor\Carbon\Carbon; @@ -23,7 +24,7 @@ class WooCommerceTotalSpent implements Filter { $filterData = $filter->getFilterData(); $type = $filterData->getParam('total_spent_type'); $amount = $filterData->getParam('total_spent_amount'); - $isAllTime = $filterData->getParam('timeframe') === 'allTime'; + $isAllTime = $filterData->getParam('timeframe') === DynamicSegmentFilterData::TIMEFRAME_ALL_TIME; $parameterSuffix = $filter->getId() ?? Security::generateRandomString(); $orderStatsAlias = $this->wooFilterHelper->applyOrderStatusFilter($queryBuilder); diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountActionTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountActionTest.php index da229787c2..4fca1e8793 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountActionTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountActionTest.php @@ -93,7 +93,7 @@ class EmailOpensAbsoluteCountActionTest extends \MailPoetTest { } public function testGetMachineOpened(): void { - $segmentFilterData = $this->getSegmentFilterData(1, 'more', 5, 'inTheLast', EmailOpensAbsoluteCountAction::MACHINE_TYPE); + $segmentFilterData = $this->getSegmentFilterData(1, 'more', 5, DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, EmailOpensAbsoluteCountAction::MACHINE_TYPE); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->action); $this->assertEqualsCanonicalizing(['opened-3-newsletters@example.com'], $emails); } @@ -135,7 +135,7 @@ class EmailOpensAbsoluteCountActionTest extends \MailPoetTest { } public function testOverAllTime() { - $segmentFilterData = $this->getSegmentFilterData(1000000, 'less', 0, 'allTime'); + $segmentFilterData = $this->getSegmentFilterData(1000000, 'less', 0, DynamicSegmentFilterData::TIMEFRAME_ALL_TIME); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->action); $this->assertEqualsCanonicalizing([ 'opened-3-newsletters@example.com', @@ -145,7 +145,7 @@ class EmailOpensAbsoluteCountActionTest extends \MailPoetTest { ], $emails); } - private function getSegmentFilterData(int $opens, string $operator, int $days, string $timeframe = 'inTheLast', string $action = EmailOpensAbsoluteCountAction::TYPE): DynamicSegmentFilterData { + private function getSegmentFilterData(int $opens, string $operator, int $days, string $timeframe = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, string $action = EmailOpensAbsoluteCountAction::TYPE): DynamicSegmentFilterData { return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_EMAIL, $action, [ 'operator' => $operator, 'opens' => $opens, diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceAverageSpentTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceAverageSpentTest.php index 388a95c45f..4f423cb5ba 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceAverageSpentTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceAverageSpentTest.php @@ -136,11 +136,11 @@ class WooCommerceAverageSpentTest extends \MailPoetTest { $this->createOrder($id1, 100, 3); $id1 = $this->tester->createCustomer('2@e.com'); $this->createOrder($id1, 100, 30000); - $matchingEmails = $this->getMatchingEmails('>=', 50, 0, 'allTime'); + $matchingEmails = $this->getMatchingEmails('>=', 50, 0, DynamicSegmentFilterData::TIMEFRAME_ALL_TIME); $this->assertEqualsCanonicalizing(['1@e.com', '2@e.com'], $matchingEmails); } - private function getMatchingEmails(string $operator, float $amount, int $days = 365, string $timeframe = 'inTheLast'): array { + private function getMatchingEmails(string $operator, float $amount, int $days = 365, string $timeframe = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST): array { $filterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceAverageSpent::ACTION, [ 'average_spent_type' => $operator, 'average_spent_amount' => $amount, diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php index 8a597f6000..26a6fb71b1 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php @@ -69,7 +69,7 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { } public function testItWorksWithAllTimeTimeframe(): void { - $segmentFilterData = $this->getSegmentFilterData('>', 0, 0, 'allTime'); + $segmentFilterData = $this->getSegmentFilterData('>', 0, 0, DynamicSegmentFilterData::TIMEFRAME_ALL_TIME); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); $this->assertEqualsCanonicalizing([ 'customer1@example.com', @@ -78,7 +78,7 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { ], $emails); } - private function getSegmentFilterData(string $comparisonType, int $ordersCount, int $days, $timeframe = 'inTheLast'): DynamicSegmentFilterData { + private function getSegmentFilterData(string $comparisonType, int $ordersCount, int $days, $timeframe = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST): DynamicSegmentFilterData { return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS, [ 'number_of_orders_type' => $comparisonType, 'number_of_orders_count' => $ordersCount, diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommercePurchaseDateTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommercePurchaseDateTest.php index fe4a448a16..4c467cd77e 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommercePurchaseDateTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommercePurchaseDateTest.php @@ -48,7 +48,7 @@ class WooCommercePurchaseDateTest extends \MailPoetTest { $this->createOrder($customerId1, Carbon::now()->subDays(3)); $this->createOrder($customerId2, Carbon::now()->subDays(4)); $this->createOrder($customerId3, Carbon::now()->subDays(5)); - $emails = $this->getSubscriberEmailsMatchingFilter('inTheLast', '5'); + $emails = $this->getSubscriberEmailsMatchingFilter(DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, '5'); expect(count($emails))->equals(2); $this->assertEqualsCanonicalizing(['c1@example.com', 'c2@example.com'], $emails); } diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValueTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValueTest.php index 5ae6b0455b..1a48cc2eba 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValueTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceSingleOrderValueTest.php @@ -64,12 +64,12 @@ class WooCommerceSingleOrderValueTest extends \MailPoetTest { } public function testItWorksWithLifetimeOption(): void { - $segmentFilterData = $this->getSegmentFilterData('<', 1000000000, 0, 'allTime'); + $segmentFilterData = $this->getSegmentFilterData('<', 1000000000, 0, DynamicSegmentFilterData::TIMEFRAME_ALL_TIME); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->singleOrderValue); $this->assertEqualsCanonicalizing(['customer1@example.com', 'customer2@example.com', 'customer3@example.com'], $emails); } - private function getSegmentFilterData(string $type, float $amount, int $days, $timeframe = 'inTheLast'): DynamicSegmentFilterData { + private function getSegmentFilterData(string $type, float $amount, int $days, $timeframe = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST): DynamicSegmentFilterData { return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceSingleOrderValue::ACTION_SINGLE_ORDER_VALUE, [ 'single_order_value_type' => $type, 'single_order_value_amount' => $amount, diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceTotalSpentTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceTotalSpentTest.php index 8aadc12f7c..eb6e3a7b12 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceTotalSpentTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceTotalSpentTest.php @@ -71,12 +71,12 @@ class WooCommerceTotalSpentTest extends \MailPoetTest { } public function testItWorksWithAllTimeOption(): void { - $segmentFilterData = $this->getSegmentFilterData('<', 100000000000, 0, 'allTime'); + $segmentFilterData = $this->getSegmentFilterData('<', 100000000000, 0, DynamicSegmentFilterData::TIMEFRAME_ALL_TIME); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->totalSpentFilter); $this->assertEqualsCanonicalizing(['customer1@example.com', 'customer2@example.com', 'customer3@example.com'], $emails); } - private function getSegmentFilterData(string $type, float $amount, int $days, $timeframe = 'inTheLast'): DynamicSegmentFilterData { + private function getSegmentFilterData(string $type, float $amount, int $days, $timeframe = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST): DynamicSegmentFilterData { return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceTotalSpent::ACTION_TOTAL_SPENT, [ 'total_spent_type' => $type, 'total_spent_amount' => $amount, diff --git a/mailpoet/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php b/mailpoet/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php index 1199b94cff..ea44d30c59 100644 --- a/mailpoet/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php +++ b/mailpoet/tests/unit/Segments/DynamicSegments/FilterDataMapperTest.php @@ -314,7 +314,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { expect($filter->getData())->equals([ 'opens' => 5, 'days' => 3, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, 'operator' => 'more', 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_AND, ]); @@ -358,7 +358,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { expect($filter->getData())->equals([ 'opens' => 5, 'days' => 3, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, 'operator' => 'less', 'connect' => DynamicSegmentFilterData::CONNECT_TYPE_AND, ]); @@ -369,7 +369,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { 'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL, 'action' => EmailOpensAbsoluteCountAction::TYPE, 'days' => 3, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, ]]]; $this->expectException(InvalidFilterException::class); $this->mapper->map($data); @@ -392,7 +392,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { 'number_of_orders_type' => '=', 'number_of_orders_count' => 2, 'days' => 1, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, 'some_mess' => 'mess', ]]]; @@ -420,7 +420,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { $this->mapper->map(['filters' => [[ 'segmentType' => DynamicSegmentFilterData::TYPE_WOOCOMMERCE, 'action' => WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, 'days' => 2, ]]]); } @@ -432,7 +432,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { 'single_order_value_type' => '=', 'single_order_value_amount' => 20, 'days' => 7, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, 'some_mess' => 'mess', ]]]; @@ -461,7 +461,7 @@ class FilterDataMapperTest extends \MailPoetUnitTest { 'segmentType' => DynamicSegmentFilterData::TYPE_WOOCOMMERCE, 'action' => WooCommerceSingleOrderValue::ACTION_SINGLE_ORDER_VALUE, 'days' => 2, - 'timeframe' => 'inTheLast', + 'timeframe' => DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, ]]]); }