diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php index b34099095e..de75b35d1b 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php @@ -78,6 +78,12 @@ class WooCommerceNumberOfOrders implements Filter { $joinCondition ); + $action = $filterData->getAction(); + + if ($action === self::ACTION_NUMBER_OF_ORDERS_WITH_COUPON) { + $subQuery->innerJoin('orderStats', $wpdb->prefix . 'wc_order_coupon_lookup', 'couponLookup', 'orderStats.order_id = couponLookup.order_id'); + } + $queryBuilder->add('join', [ $subscribersTable => [ /** diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php index 26a6fb71b1..d29a866d4d 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php @@ -19,11 +19,18 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { */ private $subscriberFactory; + /** @var \WC_Product */ + private $product; + public function _before(): void { $this->subscriberFactory = new SubscriberFactory(); $this->numberOfOrdersFilter = $this->diContainer->get(WooCommerceNumberOfOrders::class); $this->cleanUp(); + $this->product = $this->tester->createWooCommerceProduct(['price' => 20]); + $this->tester->createWooCommerceCoupon(['code' => 'Coupon']); + } + public function testItGetsCustomersThatPlacedTwoOrdersInTheLastDay(): void { $customerId1 = $this->tester->createCustomer('customer1@example.com', 'customer'); $customerId2 = $this->tester->createCustomer('customer2@example.com', 'customer'); $customerId3 = $this->tester->createCustomer('customer3@example.com', 'customer'); @@ -32,33 +39,62 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { $this->createOrder($customerId2, Carbon::now()); $this->createOrder($customerId2, Carbon::now()); $this->createOrder($customerId3, Carbon::now()); - } - - public function testItGetsCustomersThatPlacedTwoOrdersInTheLastDay(): void { $segmentFilterData = $this->getSegmentFilterData('=', 2, 1); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); $this->assertEqualsCanonicalizing(['customer2@example.com'], $emails); } public function testItGetsCustomersThatPlacedZeroOrdersInTheLastDay(): void { + $customerId1 = $this->tester->createCustomer('customer1@example.com', 'customer'); + $customerId2 = $this->tester->createCustomer('customer2@example.com', 'customer'); + $customerId3 = $this->tester->createCustomer('customer3@example.com', 'customer'); + + $this->createOrder($customerId1, Carbon::now()->subDays(3)); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId3, Carbon::now()); $segmentFilterData = $this->getSegmentFilterData('=', 0, 1); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); $this->assertEqualsCanonicalizing(['customer1@example.com'], $emails); } public function testItGetsCustomersThatDidNotPlaceTwoOrdersInTheLastWeek(): void { + $customerId1 = $this->tester->createCustomer('customer1@example.com', 'customer'); + $customerId2 = $this->tester->createCustomer('customer2@example.com', 'customer'); + $customerId3 = $this->tester->createCustomer('customer3@example.com', 'customer'); + + $this->createOrder($customerId1, Carbon::now()->subDays(3)); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId3, Carbon::now()); $segmentFilterData = $this->getSegmentFilterData('!=', 2, 7); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); $this->assertEqualsCanonicalizing(['customer1@example.com', 'customer3@example.com'], $emails); } public function testItGetsCustomersThatPlacedAtLeastOneOrderInTheLastWeek(): void { + $customerId1 = $this->tester->createCustomer('customer1@example.com', 'customer'); + $customerId2 = $this->tester->createCustomer('customer2@example.com', 'customer'); + $customerId3 = $this->tester->createCustomer('customer3@example.com', 'customer'); + + $this->createOrder($customerId1, Carbon::now()->subDays(3)); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId3, Carbon::now()); $segmentFilterData = $this->getSegmentFilterData('>', 0, 7); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); $this->assertEqualsCanonicalizing(['customer1@example.com', 'customer2@example.com', 'customer3@example.com'], $emails); } public function testItGetsNoneCustomerSubscriberInLastDays() { + $customerId1 = $this->tester->createCustomer('customer1@example.com', 'customer'); + $customerId2 = $this->tester->createCustomer('customer2@example.com', 'customer'); + $customerId3 = $this->tester->createCustomer('customer3@example.com', 'customer'); + + $this->createOrder($customerId1, Carbon::now()->subDays(3)); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId3, Carbon::now()); $createdSub = $this->subscriberFactory ->withSource(Source::API) ->withCreatedAt(Carbon::now()->subDays(5)) @@ -69,6 +105,14 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { } public function testItWorksWithAllTimeTimeframe(): void { + $customerId1 = $this->tester->createCustomer('customer1@example.com', 'customer'); + $customerId2 = $this->tester->createCustomer('customer2@example.com', 'customer'); + $customerId3 = $this->tester->createCustomer('customer3@example.com', 'customer'); + + $this->createOrder($customerId1, Carbon::now()->subDays(3)); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId2, Carbon::now()); + $this->createOrder($customerId3, Carbon::now()); $segmentFilterData = $this->getSegmentFilterData('>', 0, 0, DynamicSegmentFilterData::TIMEFRAME_ALL_TIME); $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); $this->assertEqualsCanonicalizing([ @@ -78,8 +122,23 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { ], $emails); } - 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, [ + public function testItWorksWithNumberOfOrdersWithCoupon(): void { + $customerWithoutCouponOrder = $this->tester->createCustomer('customerwithoutcoupon@example.com'); + $this->createOrder($customerWithoutCouponOrder, Carbon::now()->subDays(2)); + + $segmentFilterData = $this->getSegmentFilterData('>', 0, 7, 'inTheLast', WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS_WITH_COUPON); + $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); + $this->assertEqualsCanonicalizing([], $emails); + + $customerWithCouponOrder = $this->tester->createCustomer('customer-with-coupon-order@example.com'); + $this->createOrder($customerWithCouponOrder, Carbon::now()->subDays(2), true); + + $emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter); + $this->assertEqualsCanonicalizing(['customer-with-coupon-order@example.com'], $emails); + } + + private function getSegmentFilterData(string $comparisonType, int $ordersCount, int $days, $timeframe = DynamicSegmentFilterData::TIMEFRAME_IN_THE_LAST, $action = WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS): DynamicSegmentFilterData { + return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, $action, [ 'number_of_orders_type' => $comparisonType, 'number_of_orders_count' => $ordersCount, 'days' => $days, @@ -87,11 +146,15 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest { ]); } - private function createOrder(int $customerId, Carbon $createdAt, $status = 'wc-completed'): int { + private function createOrder(int $customerId, Carbon $createdAt, $withCoupon = false, $status = 'wc-completed'): int { $order = $this->tester->createWooCommerceOrder(); $order->set_customer_id($customerId); $order->set_date_created($createdAt->toDateTimeString()); $order->set_status($status); + if ($withCoupon) { + $order->add_product($this->product); + $order->apply_coupon('Coupon'); + } $order->save(); $this->tester->updateWooOrderStats($order->get_id());