*/ class StatisticsOpensRepository extends Repository { protected function getEntityClassName(): string { return StatisticsOpenEntity::class; } public function recalculateSubscriberScore(SubscriberEntity $subscriber): void { $subscriber->setEngagementScoreUpdatedAt(new \DateTimeImmutable()); $newslettersSentCount = $this ->entityManager ->createQueryBuilder() ->select('count(DISTINCT task.id)') ->from(ScheduledTaskSubscriberEntity::class, 'scheduledTaskSubscriber') ->where('scheduledTaskSubscriber.subscriber = :subscriber') ->setParameter('subscriber', $subscriber) ->join('scheduledTaskSubscriber.task', 'task') ->andWhere('task.type = :sending') ->setParameter('sending', Sending::TASK_TYPE) ->getQuery() ->getSingleScalarResult(); if ($newslettersSentCount < 3) { $this->entityManager->flush(); return; } $opens = $this ->entityManager ->createQueryBuilder() ->select('count(DISTINCT opens.newsletter)') ->from(StatisticsOpenEntity::class, 'opens') ->where('opens.subscriber = :subscriberId') ->setParameter('subscriberId', $subscriber) ->getQuery() ->getSingleScalarResult(); $score = (int)round(($opens / $newslettersSentCount) * 100); $subscriber->setEngagementScore($score); $this->entityManager->flush(); } }