暂无描述

SubscriberStatisticsRepository.php 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace MailPoet\Subscribers\Statistics;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Doctrine\Repository;
  5. use MailPoet\Entities\StatisticsClickEntity;
  6. use MailPoet\Entities\StatisticsNewsletterEntity;
  7. use MailPoet\Entities\StatisticsOpenEntity;
  8. use MailPoet\Entities\StatisticsWooCommercePurchaseEntity;
  9. use MailPoet\Entities\SubscriberEntity;
  10. use MailPoet\Entities\UserAgentEntity;
  11. use MailPoet\Newsletter\Statistics\WooCommerceRevenue;
  12. use MailPoet\WooCommerce\Helper as WCHelper;
  13. use MailPoetVendor\Doctrine\ORM\EntityManager;
  14. use MailPoetVendor\Doctrine\ORM\QueryBuilder;
  15. /**
  16. * @extends Repository<SubscriberEntity>
  17. */
  18. class SubscriberStatisticsRepository extends Repository {
  19. /** @var WCHelper */
  20. private $wcHelper;
  21. public function __construct(
  22. EntityManager $entityManager,
  23. WCHelper $wcHelper
  24. ) {
  25. parent::__construct($entityManager);
  26. $this->wcHelper = $wcHelper;
  27. }
  28. protected function getEntityClassName() {
  29. return SubscriberEntity::class;
  30. }
  31. public function getStatistics(SubscriberEntity $subscriber) {
  32. return new SubscriberStatistics(
  33. $this->getStatisticsClickCount($subscriber),
  34. $this->getStatisticsOpenCount($subscriber),
  35. $this->getStatisticsMachineOpenCount($subscriber),
  36. $this->getTotalSentCount($subscriber),
  37. $this->getWooCommerceRevenue($subscriber)
  38. );
  39. }
  40. private function getStatisticsClickCount(SubscriberEntity $subscriber): int {
  41. return (int)$this->getStatisticsCountQuery(StatisticsClickEntity::class, $subscriber)
  42. ->getQuery()
  43. ->getSingleScalarResult();
  44. }
  45. private function getStatisticsOpenCount(SubscriberEntity $subscriber): int {
  46. return (int)$this->getStatisticsCountQuery(StatisticsOpenEntity::class, $subscriber)
  47. ->andWhere('(stats.userAgentType = :userAgentType) OR (stats.userAgentType IS NULL)')
  48. ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_HUMAN)
  49. ->getQuery()
  50. ->getSingleScalarResult();
  51. }
  52. private function getStatisticsMachineOpenCount(SubscriberEntity $subscriber): int {
  53. return (int)$this->getStatisticsCountQuery(StatisticsOpenEntity::class, $subscriber)
  54. ->andWhere('(stats.userAgentType = :userAgentType)')
  55. ->setParameter('userAgentType', UserAgentEntity::USER_AGENT_TYPE_MACHINE)
  56. ->getQuery()
  57. ->getSingleScalarResult();
  58. }
  59. private function getTotalSentCount(SubscriberEntity $subscriber): int {
  60. return $this->getStatisticsCountQuery(StatisticsNewsletterEntity::class, $subscriber)
  61. ->getQuery()
  62. ->getSingleScalarResult();
  63. }
  64. private function getStatisticsCountQuery(string $entityName, SubscriberEntity $subscriber): QueryBuilder {
  65. return $this->entityManager->createQueryBuilder()
  66. ->select('COUNT(DISTINCT stats.newsletter) as cnt')
  67. ->from($entityName, 'stats')
  68. ->where('stats.subscriber = :subscriber')
  69. ->setParameter('subscriber', $subscriber);
  70. }
  71. private function getWooCommerceRevenue(SubscriberEntity $subscriber) {
  72. if (!$this->wcHelper->isWooCommerceActive()) {
  73. return null;
  74. }
  75. $currency = $this->wcHelper->getWoocommerceCurrency();
  76. $purchases = $this->entityManager->createQueryBuilder()
  77. ->select('stats.orderPriceTotal')
  78. ->from(StatisticsWooCommercePurchaseEntity::class, 'stats')
  79. ->where('stats.subscriber = :subscriber')
  80. ->andWhere('stats.orderCurrency = :currency')
  81. ->setParameter('subscriber', $subscriber)
  82. ->setParameter('currency', $currency)
  83. ->groupBy('stats.orderId, stats.orderPriceTotal')
  84. ->getQuery()
  85. ->getResult();
  86. $sum = array_sum(array_column($purchases, 'orderPriceTotal'));
  87. return new WooCommerceRevenue(
  88. $currency,
  89. (float)$sum,
  90. count($purchases),
  91. $this->wcHelper
  92. );
  93. }
  94. }