Use correct statuses for number of orders filter
MAILPOET-5083
This commit is contained in:
committed by
Aschepikov
parent
192bdce421
commit
aa7bd6eb67
@@ -7,6 +7,7 @@ use MailPoet\Entities\SubscriberEntity;
|
|||||||
use MailPoet\Util\DBCollationChecker;
|
use MailPoet\Util\DBCollationChecker;
|
||||||
use MailPoet\Util\Security;
|
use MailPoet\Util\Security;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
|
use MailPoetVendor\Doctrine\DBAL\Connection;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
||||||
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
@@ -19,12 +20,17 @@ class WooCommerceNumberOfOrders implements Filter {
|
|||||||
/** @var DBCollationChecker */
|
/** @var DBCollationChecker */
|
||||||
private $collationChecker;
|
private $collationChecker;
|
||||||
|
|
||||||
|
/** @var WooFilterHelper */
|
||||||
|
private $wooFilterHelper;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
EntityManager $entityManager,
|
EntityManager $entityManager,
|
||||||
DBCollationChecker $collationChecker
|
DBCollationChecker $collationChecker,
|
||||||
|
WooFilterHelper $wooFilterHelper
|
||||||
) {
|
) {
|
||||||
$this->entityManager = $entityManager;
|
$this->entityManager = $entityManager;
|
||||||
$this->collationChecker = $collationChecker;
|
$this->collationChecker = $collationChecker;
|
||||||
|
$this->wooFilterHelper = $wooFilterHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filter): QueryBuilder {
|
public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filter): QueryBuilder {
|
||||||
@@ -53,7 +59,7 @@ class WooCommerceNumberOfOrders implements Filter {
|
|||||||
'customer',
|
'customer',
|
||||||
$wpdb->prefix . 'wc_order_stats',
|
$wpdb->prefix . 'wc_order_stats',
|
||||||
'orderStats',
|
'orderStats',
|
||||||
'customer.customer_id = orderStats.customer_id AND orderStats.date_created >= :date' . $parameterSuffix . ' AND orderStats.status NOT IN ("wc-cancelled", "wc-failed")'
|
'customer.customer_id = orderStats.customer_id AND orderStats.date_created >= :date' . $parameterSuffix . ' AND orderStats.status IN (:allowedStatuses' . $parameterSuffix . ')'
|
||||||
);
|
);
|
||||||
|
|
||||||
$queryBuilder->add('join', [
|
$queryBuilder->add('join', [
|
||||||
@@ -70,6 +76,7 @@ class WooCommerceNumberOfOrders implements Filter {
|
|||||||
],
|
],
|
||||||
], \true)
|
], \true)
|
||||||
->setParameter('date' . $parameterSuffix, $date->toDateTimeString())
|
->setParameter('date' . $parameterSuffix, $date->toDateTimeString())
|
||||||
|
->setParameter('allowedStatuses' . $parameterSuffix, $this->wooFilterHelper->defaultIncludedStatuses(), Connection::PARAM_STR_ARRAY)
|
||||||
->groupBy('inner_subscriber_id');
|
->groupBy('inner_subscriber_id');
|
||||||
|
|
||||||
if ($type === '=') {
|
if ($type === '=') {
|
||||||
|
@@ -73,6 +73,47 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest {
|
|||||||
$this->assertEqualsCanonicalizing([$createdSub->getEmail()], $emails);
|
$this->assertEqualsCanonicalizing([$createdSub->getEmail()], $emails);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider allowedStatuses
|
||||||
|
*/
|
||||||
|
public function testItIncludesAllowedStatuses($status) {
|
||||||
|
$email = "$status@example.com";
|
||||||
|
$customerId = $this->createCustomer($email, 'customer');
|
||||||
|
$this->createOrder($customerId, Carbon::now(), $status);
|
||||||
|
$segmentFilterData = $this->getSegmentFilterData('=', 1, 1);
|
||||||
|
$emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter);
|
||||||
|
expect($emails)->contains($email);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider disallowedStatuses
|
||||||
|
*/
|
||||||
|
public function testItExcludesDisallowedOrderStatuses($status) {
|
||||||
|
$email = "$status@example.com";
|
||||||
|
$customerId = $this->createCustomer($email, 'customer');
|
||||||
|
$this->createOrder($customerId, Carbon::now(), $status);
|
||||||
|
$segmentFilterData = $this->getSegmentFilterData('=', 1, 1);
|
||||||
|
$emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter);
|
||||||
|
expect($emails)->notContains($email);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function allowedStatuses() {
|
||||||
|
return [
|
||||||
|
'completed' => ['wc-completed'],
|
||||||
|
'processing' => ['wc-processing'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function disallowedStatuses() {
|
||||||
|
return [
|
||||||
|
'refunded' => ['wc-refunded'],
|
||||||
|
'cancelled' => ['wc-cancelled'],
|
||||||
|
'on hold' => ['wc-on-hold'],
|
||||||
|
'pending' => ['wc-pending'],
|
||||||
|
'failed' => ['wc-failed'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
private function getSegmentFilterData(string $comparisonType, int $ordersCount, int $days): DynamicSegmentFilterData {
|
private function getSegmentFilterData(string $comparisonType, int $ordersCount, int $days): DynamicSegmentFilterData {
|
||||||
return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS, [
|
return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS, [
|
||||||
'number_of_orders_type' => $comparisonType,
|
'number_of_orders_type' => $comparisonType,
|
||||||
@@ -99,12 +140,9 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest {
|
|||||||
|
|
||||||
private function cleanUp(): void {
|
private function cleanUp(): void {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
$this->truncateEntity(SegmentEntity::class);
|
||||||
|
$this->truncateEntity(SubscriberEntity::class);
|
||||||
|
|
||||||
if (!empty($this->orders)) {
|
|
||||||
foreach ($this->orders as $orderId) {
|
|
||||||
wp_delete_post($orderId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->connection->executeQuery("TRUNCATE TABLE {$wpdb->prefix}wc_customer_lookup");
|
$this->connection->executeQuery("TRUNCATE TABLE {$wpdb->prefix}wc_customer_lookup");
|
||||||
$this->connection->executeQuery("TRUNCATE TABLE {$wpdb->prefix}wc_order_stats");
|
$this->connection->executeQuery("TRUNCATE TABLE {$wpdb->prefix}wc_order_stats");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user