diff --git a/lib/Statistics/StatisticsOpensRepository.php b/lib/Statistics/StatisticsOpensRepository.php index 614ded86b0..3d161c9a48 100644 --- a/lib/Statistics/StatisticsOpensRepository.php +++ b/lib/Statistics/StatisticsOpensRepository.php @@ -41,7 +41,8 @@ class StatisticsOpensRepository extends Repository { ->from(StatisticsOpenEntity::class, 'opens') ->join('opens.newsletter', 'newsletter') ->where('opens.subscriber = :subscriberId') - ->andWhere('newsletter.sentAt > :dateTime') + ->andWhere('(newsletter.sentAt > :dateTime OR newsletter.sentAt IS NULL)') + ->andWhere('opens.createdAt > :dateTime') ->setParameter('subscriberId', $subscriber) ->setParameter('dateTime', $dateTime) ->getQuery() diff --git a/tests/integration/Statistics/StatisticsOpensRepositoryTest.php b/tests/integration/Statistics/StatisticsOpensRepositoryTest.php index e45d41a7cf..381489a347 100644 --- a/tests/integration/Statistics/StatisticsOpensRepositoryTest.php +++ b/tests/integration/Statistics/StatisticsOpensRepositoryTest.php @@ -113,6 +113,32 @@ class StatisticsOpensRepositoryTest extends \MailPoetTest { expect($scoreUpdatedAt->isAfter((new CarbonImmutable())->subMinutes(5)))->true(); } + public function testForWooCommerce() { + $subscriber = $this->createSubscriber(); + $subscriber->setEngagementScoreUpdatedAt((new CarbonImmutable())->subDays(4)); + $this->createStatisticsNewsletter($this->createWooNewsletter(), $subscriber); + $this->createStatisticsNewsletter($this->createWooNewsletter(), $subscriber); + $statisticsNewsletter = $this->createStatisticsNewsletter($this->createWooNewsletter(), $subscriber); + $newsletter = $statisticsNewsletter->getNewsletter(); + assert($newsletter instanceof NewsletterEntity); + $queue = $newsletter->getQueues()->first(); + assert($queue instanceof SendingQueueEntity); + $open = new StatisticsOpenEntity($newsletter, $queue, $subscriber); + $this->entityManager->persist($open); + $this->entityManager->flush(); + + $this->repository->recalculateSubscriberScore($subscriber); + + $newSubscriber = $this->subscribersRepository->findOneById($subscriber->getId()); + $this->assertInstanceOf(SubscriberEntity::class, $newSubscriber); + expect($newSubscriber->getEngagementScore())->equals(33, 1); + expect($newSubscriber->getEngagementScoreUpdatedAt())->notNull(); + $updated = $newSubscriber->getEngagementScoreUpdatedAt(); + $this->assertInstanceOf(\DateTimeInterface::class, $updated); + $scoreUpdatedAt = new CarbonImmutable($updated->format('Y-m-d H:i:s')); + expect($scoreUpdatedAt->isAfter((new CarbonImmutable())->subMinutes(5)))->true(); + } + private function createSubscriber(): SubscriberEntity { $subscriber = new SubscriberEntity(); $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); @@ -121,6 +147,16 @@ class StatisticsOpensRepositoryTest extends \MailPoetTest { return $subscriber; } + private function createWooNewsletter(): NewsletterEntity { + $newsletter = new NewsletterEntity(); + $newsletter->setSubject('Newsletter'); + $newsletter->setType(NewsletterEntity::TYPE_AUTOMATIC); + $newsletter->setStatus(NewsletterEntity::STATUS_ACTIVE); + $this->entityManager->persist($newsletter); + $this->entityManager->flush(); + return $newsletter; + } + private function createNewsletter(?Carbon $sentAt = null): NewsletterEntity { $newsletter = new NewsletterEntity(); $newsletter->setSubject('Newsletter');