Update subscribers last engagement when they create new order
[MAILPOET-3762]
This commit is contained in:
committed by
Veljko V
parent
b215ab13c8
commit
62ae0db39e
@@ -77,6 +77,7 @@ class Hooks {
|
||||
$this->setupWPUsers();
|
||||
$this->setupWooCommerceUsers();
|
||||
$this->setupWooCommercePurchases();
|
||||
$this->setupWooCommerceSubscriberEngagement();
|
||||
$this->setupImageSize();
|
||||
$this->setupListing();
|
||||
$this->setupSubscriptionEvents();
|
||||
@@ -323,6 +324,14 @@ class Hooks {
|
||||
}
|
||||
}
|
||||
|
||||
public function setupWooCommerceSubscriberEngagement() {
|
||||
$this->wp->addAction(
|
||||
'woocommerce_new_order',
|
||||
[$this->hooksWooCommerce, 'updateSubscriberEngagement'],
|
||||
7
|
||||
);
|
||||
}
|
||||
|
||||
public function setupImageSize() {
|
||||
$this->wp->addFilter(
|
||||
'image_size_names_choose',
|
||||
|
@@ -7,6 +7,7 @@ use MailPoet\Segments\WooCommerce as WooCommerceSegment;
|
||||
use MailPoet\Statistics\Track\WooCommercePurchases;
|
||||
use MailPoet\Subscription\Registration;
|
||||
use MailPoet\WooCommerce\Settings as WooCommerceSettings;
|
||||
use MailPoet\WooCommerce\SubscriberEngagement;
|
||||
use MailPoet\WooCommerce\Subscription as WooCommerceSubscription;
|
||||
|
||||
class HooksWooCommerce {
|
||||
@@ -28,13 +29,17 @@ class HooksWooCommerce {
|
||||
/** @var LoggerFactory */
|
||||
private $loggerFactory;
|
||||
|
||||
/** @var SubscriberEngagement */
|
||||
private $subscriberEngagement;
|
||||
|
||||
public function __construct(
|
||||
WooCommerceSubscription $woocommerceSubscription,
|
||||
WooCommerceSegment $woocommerceSegment,
|
||||
WooCommerceSettings $woocommerceSettings,
|
||||
WooCommercePurchases $woocommercePurchases,
|
||||
Registration $subscriberRegistration,
|
||||
LoggerFactory $loggerFactory
|
||||
LoggerFactory $loggerFactory,
|
||||
SubscriberEngagement $subscriberEngagement
|
||||
) {
|
||||
$this->woocommerceSubscription = $woocommerceSubscription;
|
||||
$this->woocommerceSegment = $woocommerceSegment;
|
||||
@@ -42,6 +47,7 @@ class HooksWooCommerce {
|
||||
$this->woocommercePurchases = $woocommercePurchases;
|
||||
$this->loggerFactory = $loggerFactory;
|
||||
$this->subscriberRegistration = $subscriberRegistration;
|
||||
$this->subscriberEngagement = $subscriberEngagement;
|
||||
}
|
||||
|
||||
public function extendWooCommerceCheckoutForm() {
|
||||
@@ -111,6 +117,14 @@ class HooksWooCommerce {
|
||||
return $errors;
|
||||
}
|
||||
|
||||
public function updateSubscriberEngagement($orderId) {
|
||||
try {
|
||||
$this->subscriberEngagement->updateSubscriberEngagement($orderId);
|
||||
} catch (\Throwable $e) {
|
||||
$this->logError($e, 'WooCommerce Update Subscriber Engagement');
|
||||
}
|
||||
}
|
||||
|
||||
private function logError(\Throwable $e, $name) {
|
||||
$logger = $this->loggerFactory->getLogger($name);
|
||||
$logger->addError($e->getMessage(), [
|
||||
|
@@ -380,6 +380,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
// WooCommerce
|
||||
$container->autowire(\MailPoet\WooCommerce\Helper::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\WooCommerce\Settings::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\WooCommerce\SubscriberEngagement::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\WooCommerce\Subscription::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\WooCommerce\TransactionalEmailHooks::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails::class)->setPublic(true);
|
||||
|
@@ -308,7 +308,7 @@ class SubscribersRepository extends Repository {
|
||||
->getResult();
|
||||
}
|
||||
|
||||
public function maybeUpdateLastEngagement(SubscriberEntity $subscriberEntity, ?UserAgentEntity $userAgent): void {
|
||||
public function maybeUpdateLastEngagement(SubscriberEntity $subscriberEntity, ?UserAgentEntity $userAgent = null): void {
|
||||
if ($userAgent instanceof UserAgentEntity && $userAgent->getUserAgentType() === UserAgentEntity::USER_AGENT_TYPE_MACHINE) {
|
||||
return;
|
||||
}
|
||||
|
38
lib/WooCommerce/SubscriberEngagement.php
Normal file
38
lib/WooCommerce/SubscriberEngagement.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\WooCommerce;
|
||||
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
use WC_Order;
|
||||
|
||||
class SubscriberEngagement {
|
||||
|
||||
/** @var Helper */
|
||||
private $woocommerceHelper;
|
||||
|
||||
/** @var SubscribersRepository */
|
||||
private $subscribersRepository;
|
||||
|
||||
public function __construct(
|
||||
Helper $woocommerceHelper,
|
||||
SubscribersRepository $subscribersRepository
|
||||
) {
|
||||
$this->woocommerceHelper = $woocommerceHelper;
|
||||
$this->subscribersRepository = $subscribersRepository;
|
||||
}
|
||||
|
||||
public function updateSubscriberEngagement($orderId): void {
|
||||
$order = $this->woocommerceHelper->wcGetOrder($orderId);
|
||||
if (!$order instanceof WC_Order) {
|
||||
return;
|
||||
}
|
||||
|
||||
$subscriber = $this->subscribersRepository->findOneBy(['email' => $order->get_billing_email()]);
|
||||
if (!$subscriber instanceof SubscriberEntity) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->subscribersRepository->maybeUpdateLastEngagement($subscriber);
|
||||
}
|
||||
}
|
81
tests/integration/WooCommerce/SubscriberEngagementTest.php
Normal file
81
tests/integration/WooCommerce/SubscriberEngagementTest.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\WooCommerce;
|
||||
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
use MailPoetVendor\Carbon\Carbon;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use WC_Order;
|
||||
|
||||
class SubscriberEngagementTest extends \MailPoetTest {
|
||||
|
||||
/** @var Helper & MockObject */
|
||||
private $wooCommerceHelperMock;
|
||||
|
||||
/** @var SubscriberEngagement */
|
||||
private $subscriberEngagement;
|
||||
|
||||
public function _before() {
|
||||
$this->wooCommerceHelperMock = $this->createMock(Helper::class);
|
||||
$this->subscriberEngagement = new SubscriberEngagement(
|
||||
$this->wooCommerceHelperMock,
|
||||
$this->diContainer->get(SubscribersRepository::class)
|
||||
);
|
||||
$this->truncateEntity(SubscriberEntity::class);
|
||||
}
|
||||
|
||||
public function testItUpdatesLastEngagementForSubscriberWhoCreatedNewOrder() {
|
||||
Carbon::setTestNow($now = new Carbon('2021-08-31 13:13:00'));
|
||||
$subscriber = $this->createSubscriber();
|
||||
$order = $this->createOrderMock($subscriber->getEmail());
|
||||
$this->wooCommerceHelperMock
|
||||
->expects($this->once())
|
||||
->method('wcGetOrder')
|
||||
->willReturn($order);
|
||||
$this->subscriberEngagement->updateSubscriberEngagement(1);
|
||||
$this->entityManager->refresh($subscriber);
|
||||
expect($subscriber->getLastEngagementAt())->equals($now);
|
||||
Carbon::setTestNow();
|
||||
}
|
||||
|
||||
public function testItDoesntUpdateAnythingForNonExistingOder() {
|
||||
$subscriber = $this->createSubscriber();
|
||||
$this->wooCommerceHelperMock
|
||||
->expects($this->once())
|
||||
->method('wcGetOrder')
|
||||
->willReturn(false);
|
||||
$this->subscriberEngagement->updateSubscriberEngagement(1);
|
||||
$this->entityManager->refresh($subscriber);
|
||||
expect($subscriber->getLastEngagementAt())->null();
|
||||
}
|
||||
|
||||
public function testItDoesntThrowAnErrorForNonExistingSubscriber() {
|
||||
$order = $this->createOrderMock('some@email.com');
|
||||
$this->wooCommerceHelperMock
|
||||
->expects($this->once())
|
||||
->method('wcGetOrder')
|
||||
->willReturn($order);
|
||||
$this->subscriberEngagement->updateSubscriberEngagement(1);
|
||||
}
|
||||
|
||||
private function createOrderMock($email) {
|
||||
$mock = $this->getMockBuilder(WC_Order::class)
|
||||
->disableOriginalConstructor()
|
||||
->disableOriginalClone()
|
||||
->disableArgumentCloning()
|
||||
->setMethods(['get_billing_email'])
|
||||
->getMock();
|
||||
|
||||
$mock->method('get_billing_email')->willReturn($email);
|
||||
return $mock;
|
||||
}
|
||||
|
||||
private function createSubscriber(): SubscriberEntity {
|
||||
$subscriber = new SubscriberEntity();
|
||||
$subscriber->setEmail('subscriber@egagement.com');
|
||||
$this->entityManager->persist($subscriber);
|
||||
$this->entityManager->flush();
|
||||
return $subscriber;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user