diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index 806ce81524..5cedf63ea7 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -412,6 +412,11 @@ class Subscriber extends Model { $new_status = $subscriber->status; } + // Update last_subscribed_at when status changes to subscribed + if ($old_status !== self::STATUS_SUBSCRIBED && $subscriber->status === self::STATUS_SUBSCRIBED) { + $subscriber->set('last_subscribed_at', WPFunctions::get()->currentTime('mysql')); + } + if ($subscriber->save()) { if (!empty($custom_fields)) { $subscriber->saveCustomFields($custom_fields); diff --git a/tests/integration/Models/SubscriberTest.php b/tests/integration/Models/SubscriberTest.php index 2067803d1d..a927e26ebf 100644 --- a/tests/integration/Models/SubscriberTest.php +++ b/tests/integration/Models/SubscriberTest.php @@ -129,6 +129,35 @@ class SubscriberTest extends \MailPoetTest { expect($subscriber_updated->status)->equals(Subscriber::STATUS_SUBSCRIBED); } + function testItUpdateLastSubscribedAtCorrectly() { + $subscriber = Subscriber::where('email', $this->test_data['email'])->findOne(); + $subscriber->status = Subscriber::STATUS_UNCONFIRMED; + $subscriber->last_subscribed_at = null; + $subscriber->save(); + $subscriber_updated = Subscriber::where('email', $this->test_data['email']) + ->findOne(); + expect($subscriber_updated->last_subscribed_at)->null(); + + // Change to subscribed updates last_updated_at + $subscriber->status = Subscriber::STATUS_SUBSCRIBED; + $subscriber->save(); + $subscriber_updated = Subscriber::where('email', $this->test_data['email']) + ->findOne(); + $last_subscribed_at = new Carbon($subscriber_updated->last_updated_at); + expect($last_subscribed_at)->lessThan((new Carbon())->addSeconds(2)); + expect($last_subscribed_at)->greaterThan((new Carbon())->subSeconds(2)); + + // Change to other status keeps last_updated_at + $last_subscribed_at = (new Carbon())->subHour(); + $subscriber->last_subscribed_at = $last_subscribed_at; + $subscriber->save(); + $subscriber->status = Subscriber::STATUS_INACTIVE; + $subscriber->save(); + $subscriber_updated = Subscriber::where('email', $this->test_data['email']) + ->findOne(); + expect($subscriber_updated->last_subscribed_at)->equals($last_subscribed_at->toDateTimeString()); + } + function testItHasSearchFilter() { $subscriber = Subscriber::filter('search', 'john') ->findOne();