Spaces:
No application file
No application file
namespace MauticPlugin\MauticFocusBundle\Entity; | |
use Mautic\CoreBundle\Entity\CommonRepository; | |
use Mautic\LeadBundle\Entity\TimelineTrait; | |
/** | |
* @extends CommonRepository<Stat> | |
*/ | |
class StatRepository extends CommonRepository | |
{ | |
use TimelineTrait; | |
/** | |
* Fetch the base stat data from the database. | |
* | |
* @param int $id | |
* | |
* @return mixed | |
*/ | |
public function getStats($id, $type, $fromDate = null) | |
{ | |
$q = $this->createQueryBuilder('s'); | |
$expr = $q->expr()->andX( | |
$q->expr()->eq('IDENTITY(s.focus)', (int) $id), | |
$q->expr()->eq('s.type', ':type') | |
); | |
if ($fromDate) { | |
$expr->add( | |
$q->expr()->gte('s.dateAdded', ':fromDate') | |
); | |
$q->setParameter('fromDate', $fromDate); | |
} | |
$q->where($expr) | |
->setParameter('type', $type); | |
return $q->getQuery()->getArrayResult(); | |
} | |
public function getViewsCount(int $id): int | |
{ | |
$q = $this->_em->getConnection()->createQueryBuilder(); | |
$q->select('COUNT(s.id) as views_count') | |
->from(MAUTIC_TABLE_PREFIX.'focus_stats', 's'); | |
$expr = $q->expr()->and( | |
$q->expr()->eq('s.focus_id', ':id'), | |
$q->expr()->eq('s.type', ':type') | |
); | |
$q->where($expr) | |
->setParameter('id', $id) | |
->setParameter('type', Stat::TYPE_NOTIFICATION); | |
return (int) $q->executeQuery()->fetchOne(); | |
} | |
public function getUniqueViewsCount(int $id): int | |
{ | |
$q = $this->_em->getConnection()->createQueryBuilder(); | |
$q->select('COUNT(DISTINCT s.lead_id) as views_count') | |
->from(MAUTIC_TABLE_PREFIX.'focus_stats', 's'); | |
$expr = $q->expr()->and( | |
$q->expr()->eq('s.focus_id', ':id'), | |
$q->expr()->eq('s.type', ':type') | |
); | |
$q->where($expr) | |
->setParameter('id', $id) | |
->setParameter('type', Stat::TYPE_NOTIFICATION); | |
return (int) $q->executeQuery()->fetchOne(); | |
} | |
public function getClickThroughCount(int $id): int | |
{ | |
$q = $this->_em->getConnection()->createQueryBuilder(); | |
$q->select('COUNT(DISTINCT s.lead_id) as click_through_count') | |
->from(MAUTIC_TABLE_PREFIX.'focus_stats', 's'); | |
$expr = $q->expr()->and( | |
$q->expr()->eq('s.focus_id', ':id'), | |
$q->expr()->eq('s.type', ':type') | |
); | |
$q->where($expr) | |
->setParameter('id', $id) | |
->setParameter('type', Stat::TYPE_CLICK); | |
return (int) $q->executeQuery()->fetchOne(); | |
} | |
/** | |
* @param array<string, mixed> $options | |
* | |
* @return array<string, mixed> | |
*/ | |
public function getStatsViewByLead(?int $leadId=null, array $options = []): array | |
{ | |
return $this->getStatsByLeadAndType(Stat::TYPE_NOTIFICATION, $leadId, $options); | |
} | |
/** | |
* @param array<string, mixed> $options | |
* | |
* @return array<string, mixed> | |
*/ | |
public function getStatsClickByLead(?int $leadId=null, array $options = []): array | |
{ | |
return $this->getStatsByLeadAndType(Stat::TYPE_CLICK, $leadId, $options); | |
} | |
/** | |
* @param array<string, mixed> $options | |
* | |
* @return array<string, mixed> | |
*/ | |
private function getStatsByLeadAndType(string $type, ?int $leadId=null, array $options = []): array | |
{ | |
$q = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
$q->from(MAUTIC_TABLE_PREFIX.'focus_stats', 's') | |
->select('s.id, s.lead_id, s.type, s.date_added, f.id as focus_id, f.name as focus_name') | |
->leftJoin('s', MAUTIC_TABLE_PREFIX.'focus', 'f', 's.focus_id=f.id'); | |
$q->where($q->expr()->eq('s.type', ':type')); | |
if ($leadId) { | |
$q->andWhere($q->expr()->eq('s.lead_id', (int) $leadId)); | |
} | |
$q->setParameter('type', $type); | |
if (isset($options['search']) && $options['search']) { | |
$q->andWhere($q->expr()->or( | |
$q->expr()->like('f.name', $q->expr()->literal($options['search'].'%')), | |
$q->expr()->eq('s.type', $q->expr()->literal($options['search'])) | |
)); | |
} | |
return $this->getTimelineResults($q, $options, 'f.name', 's.date_added'); | |
} | |
} | |