er->getId()] ?? 0; } public function getStatisticsOpenCount(NewsletterEntity $newsletter): int { $counts = $this->getStatisticCounts(StatisticsOpenEntity::class, [$newsletter]); return $counts[$newsletter->getId()] ?? 0; } public function getStatisticsMachineOpenCount(NewsletterEntity $newsletter): int { $qb = $this->getStatisticsQuery(StatisticsOpenEntity::class, [$newsletter]); $result = $qb->andWhere('(stats.userAgentType = :userAgentType)') ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_MACHINE) ->getQuery() ->getOneOrNullResult(); if (empty($result)) return 0; return $result['cnt'] ?? 0; } /** * @param SubscriberEntity $subscriber * @param int|null $limit * @param int|null $offset * @return array(newsletter_id: string, newsletter_rendered_subject: string, opened_at: string|null, sent_at: string) */ public function getAllForSubscriber( SubscriberEntity $subscriber, int $limit = null, int $offset = null ): array { return $this->entityManager->createQueryBuilder() ->select('IDENTITY(statistics.newsletter) AS newsletter_id') ->addSelect('opens.createdAt AS opened_at') ->addSelect('queue.newsletterRenderedSubject AS newsletter_rendered_subject') ->addSelect('statistics.sentAt AS sent_at') ->from(StatisticsNewsletterEntity::class, 'statistics') ->join(SendingQueueEntity::class, 'queue', Join::WITH, 'statistics.queue = queue') ->leftJoin( StatisticsOpenEntity::class, 'opens', Join::WITH, 'statistics.newsletter = opens.newsletter AND statistics.subscriber = opens.subscriber' ) ->where('statistics.subscriber = :subscriber') ->setParameter('subscriber', $subscriber) ->addOrderBy('newsletter_id') ->setMaxResults($limit) ->setFirstResult($offset) ->getQuery() ->getResult(); } public function getStatisticsUnsubscribeCount(NewsletterEntity $newsletter): int { $counts = $this->getStatisticCounts(StatisticsUnsubscribeEntity::class, [$newsletter]); return $counts[$newsletter->getId()] ?? 0; } public function getStatisticsBounceCount(NewsletterEntity $newsletter): int { $counts = $this->getStatisticCounts(StatisticsBounceEntity::class, [$newsletter]); return $counts[$newsletter->getId()] ?? 0; } public function getWooCommerceRevenue(NewsletterEntity $newsletter) { $revenues = $this->getWooCommerceRevenues([$newsletter]); return $revenues[$newsletter->getId()] ?? null; } /** * @param NewsletterEntity $newsletter * @return int */ public function getChildrenCount(NewsletterEntity $newsletter) { try { return (int)$this->entityManager ->createQueryBuilder() ->select('COUNT(n.id) as cnt') ->from(NewsletterEntity::class, 'n') ->where('n.parent = :newsletter') ->setParameter('newsletter', $newsletter) ->getQuery() ->getSingleScalarResult(); } catch (UnexpectedResultException $e) { return 0; } } private function getTotalSentCounts(array $newsletters, \DateTimeImmutable $from = null, \DateTimeImmutable $to = null): array { $query = $this->doctrineRepository ->createQueryBuilder('n') ->select('n.id, SUM(q.countProcessed) AS cnt') ->join('n.queues', 'q') ->join('q.task', 't') ->where('t.status = :status') ->setParameter('status', ScheduledTaskEntity::STATUS_COMPLETED) ->andWhere('q.newsletter IN (:newsletters)') ->setParameter('newsletters', $newsletters) ->groupBy('n.id'); if ($from && $to) { $query->andWhere('q.createdAt BETWEEN :from AND :to') ->setParameter('from', $from) ->setParameter('to', $to); } elseif ($from && $to === null) { $query->andWhere('q.createdAt >= :from') ->setParameter('from', $from); } elseif ($from === null && $to) { $query->andWhere('q.createdAt <= :to') ->setParameter('to', $to); } $results = $query->getQuery() ->getResult(); $counts = []; foreach ($results ?: [] as $result) { $counts[(int)$result['id']] = (int)$result['cnt']; } return $counts; } private function getStatisticCounts(string $statisticsEntityName, array $newsletters, \DateTimeImmutable $from = null, \DateTimeImmutable $to = null): array { $qb = $this->getStatisticsQuery($statisticsEntityName, $newsletters); if (in_array($statisticsEntityName, [StatisticsOpenEntity::class, StatisticsClickEntity::class], true)) { $qb->andWhere('(stats.userAgentType = :userAgentType) OR (stats.userAgentType IS NULL)') ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN); } if ($from && $to) { $qb->andWhere('stats.createdAt BETWEEN :from AND :to') ->setParameter('from', $from) ->setParameter('to', $to); } elseif ($from && $to === null) { $qb->andWhere('stats.createdAt >= :from') ->setParameter('from', $from); } elseif ($from === null && $to) { $qb->andWhere('stats.createdAt <= :to') ->setParameter('to', $to); } $results = $qb ->getQuery() ->getResult(); $counts = []; foreach ($results ?: [] as $result) { $counts[(int)$result['id']] = (int)$result['cnt']; } return $counts; } private function getStatisticsQuery(string $statisticsEntityName, array $newsletters): QueryBuilder { return $this->entityManager->createQueryBuilder() ->select('IDENTITY(stats.newsletter) AS id, COUNT(DISTINCT stats.subscriber) as cnt') ->from($statisticsEntityName, 'stats') ->where('stats.newsletter IN (:newsletters)') ->groupBy('stats.newsletter') ->setParameter('newsletters', $newsletters); } private function getWooCommerceRevenues(array $newsletters, \DateTimeImmutable $from = null, \DateTimeImmutable $to = null) { if (!$this->wcHelper->isWooCommerceActive()) { return null; } $revenueStatus = $this->wcHelper->getPurchaseStates(); $currency = $this->wcHelper->getWoocommerceCurrency(); $query = $this->entityManager ->createQueryBuilder() ->select('IDENTITY(stats.newsletter) AS id, SUM(stats.orderPriceTotal) AS total, COUNT(stats.id) AS cnt') ->from(StatisticsWooCommercePurchaseEntity::class, 'stats') ->where('stats.newsletter IN (:newsletters)') ->andWhere('stats.orderCurrency = :currency') ->andWhere('stats.status IN (:revenue_status)') ->setParameter('newsletters', $newsletters) ->setParameter('currency', $currency) ->setParameter('revenue_status', $revenueStatus) ->groupBy('stats.newsletter'); if ($from && $to) { $query->andWhere('stats.createdAt BETWEEN :from AND :to') ->setParameter('from', $from) ->setParameter('to', $to); } elseif ($from && $to === null) { $query->andWhere('stats.createdAt >= :from') ->setParameter('from', $from); } elseif ($from === null && $to) { $query->andWhere('stats.createdAt <= :to') ->setParameter('to', $to); } $results = $query->getQuery() ->getResult(); $revenues = []; foreach ($results ?: [] as $result) { $revenues[(int)$result['id']] = new WooCommerceRevenue( $currency, (float)$result['total'], (int)$result['cnt'], $this->wcHelper ); } return $revenues; } }
Fatal error: Uncaught Error: Class "MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository" not found in /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php:4221 Stack trace: #0 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(5672): MailPoetGenerated\FreeCachedContainer->getNewsletterStatisticsRepositoryService() #1 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(5662): MailPoetGenerated\FreeCachedContainer->getMPMarketingChannelDataControllerService() #2 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(2622): MailPoetGenerated\FreeCachedContainer->getMPMarketingChannelControllerService() #3 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(2612): MailPoetGenerated\FreeCachedContainer->getHooksWooCommerceService() #4 /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php(2640): MailPoetGenerated\FreeCachedContainer->getHooks2Service() #5 /htdocs/wp-content/plugins/mailpoet/vendor-prefixed/symfony/dependency-injection/Container.php(122): MailPoetGenerated\FreeCachedContainer->getInitializerService() #6 /htdocs/wp-content/plugins/mailpoet/vendor-prefixed/symfony/dependency-injection/Container.php(110): MailPoetVendor\Symfony\Component\DependencyInjection\Container->make('MailPoet\\Config...', 1) #7 /htdocs/wp-content/plugins/mailpoet/lib/DI/ContainerWrapper.php(39): MailPoetVendor\Symfony\Component\DependencyInjection\Container->get('MailPoet\\Config...') #8 /htdocs/wp-content/plugins/mailpoet/mailpoet_initializer.php(89): MailPoet\DI\ContainerWrapper->get('MailPoet\\Config...') #9 /htdocs/wp-content/plugins/mailpoet/mailpoet.php(194): require_once('/htdocs/wp-cont...') #10 /htdocs/wp-settings.php(545): include_once('/htdocs/wp-cont...') #11 /htdocs/wp-config.php(85): require_once('/htdocs/wp-sett...') #12 /htdocs/wp-load.php(50): require_once('/htdocs/wp-conf...') #13 /htdocs/wp-blog-header.php(13): require_once('/htdocs/wp-load...') #14 /htdocs/index.php(17): require('/htdocs/wp-blog...') #15 {main} thrown in /htdocs/wp-content/plugins/mailpoet/generated/FreeCachedContainer.php on line 4221