diff --git a/lib/Entities/StatisticsUnsubscribeEntity.php b/lib/Entities/StatisticsUnsubscribeEntity.php index 8e51791784..9b49ee8e5b 100644 --- a/lib/Entities/StatisticsUnsubscribeEntity.php +++ b/lib/Entities/StatisticsUnsubscribeEntity.php @@ -17,6 +17,8 @@ class StatisticsUnsubscribeEntity { use SafeToOneAssociationLoadTrait; const SOURCE_NEWSLETTER = 'newsletter'; + const SOURCE_MANAGE = 'manage'; + /** * @ORM\ManyToOne(targetEntity="MailPoet\Entities\NewsletterEntity") * @ORM\JoinColumn(name="newsletter_id", referencedColumnName="id") diff --git a/lib/Subscription/Manage.php b/lib/Subscription/Manage.php index a703e45411..2bdb0a40a8 100644 --- a/lib/Subscription/Manage.php +++ b/lib/Subscription/Manage.php @@ -2,11 +2,14 @@ namespace MailPoet\Subscription; +use MailPoet\Entities\StatisticsUnsubscribeEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Models\CustomField; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Settings\SettingsController; +use MailPoet\Statistics\Track\Unsubscribes; use MailPoet\Subscribers\LinkTokens; use MailPoet\Util\Url as UrlHelper; @@ -24,9 +27,19 @@ class Manage { /** @var SettingsController */ private $settings; - public function __construct(UrlHelper $urlHelper, FieldNameObfuscator $fieldNameObfuscator, LinkTokens $linkTokens, SettingsController $settings) { + /** @var Unsubscribes */ + private $unsubscribesTracker; + + public function __construct( + UrlHelper $urlHelper, + FieldNameObfuscator $fieldNameObfuscator, + LinkTokens $linkTokens, + Unsubscribes $unsubscribesTracker, + SettingsController $settings + ) { $this->urlHelper = $urlHelper; $this->fieldNameObfuscator = $fieldNameObfuscator; + $this->unsubscribesTracker = $unsubscribesTracker; $this->linkTokens = $linkTokens; $this->settings = $settings; } @@ -43,6 +56,19 @@ class Manage { if (!empty($subscriberData['email'])) { $subscriber = Subscriber::where('email', $subscriberData['email'])->findOne(); + + if ( + ($subscriberData['status'] === SubscriberEntity::STATUS_UNSUBSCRIBED) + && ($subscriber instanceof Subscriber) + && ($subscriber->status === SubscriberEntity::STATUS_SUBSCRIBED) + ) { + $this->unsubscribesTracker->track( + (int)$subscriber->id, + null, + StatisticsUnsubscribeEntity::SOURCE_MANAGE + ); + } + if ($subscriber && $this->linkTokens->verifyToken($subscriber, $token)) { if ($subscriberData['email'] !== Pages::DEMO_EMAIL) { $this->updateSubscriptions($subscriber, $subscriberData); diff --git a/tests/integration/Subscription/ManageTest.php b/tests/integration/Subscription/ManageTest.php index 7126e1589a..0892a0e1e3 100644 --- a/tests/integration/Subscription/ManageTest.php +++ b/tests/integration/Subscription/ManageTest.php @@ -8,6 +8,7 @@ use MailPoet\Models\Segment; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Settings\SettingsController; +use MailPoet\Statistics\Track\Unsubscribes; use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscription\Manage; use MailPoet\Util\Url as UrlHelper; @@ -54,6 +55,7 @@ class ManageTest extends \MailPoetTest { return true; }, ]), + $this->diContainer->get(Unsubscribes::class), $this->settings ); $_POST['action'] = 'mailpoet_subscription_update';