Spaces:
No application file
No application file
namespace Mautic\PageBundle\Helper; | |
use Mautic\CoreBundle\Factory\MauticFactory; | |
use Mautic\PageBundle\Entity\Hit; | |
use Mautic\PageBundle\Entity\Page; | |
class PointActionHelper | |
{ | |
/** | |
* @param MauticFactory $factory | |
*/ | |
public static function validatePageHit($factory, $eventDetails, $action): bool | |
{ | |
$pageHit = $eventDetails->getPage(); | |
if ($pageHit instanceof Page) { | |
/** @var \Mautic\PageBundle\Model\PageModel $pageModel */ | |
$pageModel = $factory->getModel('page'); | |
[$parent, $children] = $pageHit->getVariants(); | |
// use the parent (self or configured parent) | |
$pageHitId = $parent->getId(); | |
} else { | |
$pageHitId = 0; | |
} | |
// If no pages are selected, the pages array does not exist | |
if (isset($action['properties']['pages'])) { | |
$limitToPages = $action['properties']['pages']; | |
} | |
if (!empty($limitToPages) && !in_array($pageHitId, $limitToPages)) { | |
// no points change | |
return false; | |
} | |
return true; | |
} | |
/** | |
* @param MauticFactory $factory | |
*/ | |
public static function validateUrlHit($factory, $eventDetails, $action): bool | |
{ | |
$changePoints = []; | |
$url = $eventDetails->getUrl(); | |
$limitToUrl = html_entity_decode(trim($action['properties']['page_url'])); | |
if (!$limitToUrl || !fnmatch($limitToUrl, $url)) { | |
// no points change | |
return false; | |
} | |
$hitRepository = $factory->getEntityManager()->getRepository(Hit::class); | |
$lead = $eventDetails->getLead(); | |
$urlWithSqlWC = str_replace('*', '%', $limitToUrl); | |
if (isset($action['properties']['first_time']) && true === $action['properties']['first_time']) { | |
$hitStats = $hitRepository->getDwellTimesForUrl($urlWithSqlWC, ['leadId' => $lead->getId()]); | |
if (isset($hitStats['count']) && $hitStats['count']) { | |
$changePoints['first_time'] = false; | |
} else { | |
$changePoints['first_time'] = true; | |
} | |
} | |
$now = new \DateTime(); | |
if ($action['properties']['returns_within'] || $action['properties']['returns_after']) { | |
// get the latest hit only when it's needed | |
$latestHit = $hitRepository->getLatestHit(['leadId' => $lead->getId(), $urlWithSqlWC, 'second_to_last' => $eventDetails->getId()]); | |
} else { | |
$latestHit = null; | |
} | |
if ($action['properties']['accumulative_time']) { | |
if (!isset($hitStats)) { | |
$hitStats = $hitRepository->getDwellTimesForUrl($urlWithSqlWC, ['leadId' => $lead->getId()]); | |
} | |
if (isset($hitStats['sum'])) { | |
if ($action['properties']['accumulative_time'] <= $hitStats['sum']) { | |
$changePoints['accumulative_time'] = true; | |
} else { | |
$changePoints['accumulative_time'] = false; | |
} | |
} else { | |
$changePoints['accumulative_time'] = false; | |
} | |
} | |
if ($action['properties']['page_hits']) { | |
if (!isset($hitStats)) { | |
$hitStats = $hitRepository->getDwellTimesForUrl($urlWithSqlWC, ['leadId' => $lead->getId()]); | |
} | |
if (isset($hitStats['count']) && $hitStats['count'] >= $action['properties']['page_hits']) { | |
$changePoints['page_hits'] = true; | |
} else { | |
$changePoints['page_hits'] = false; | |
} | |
} | |
if ($action['properties']['returns_within']) { | |
if ($latestHit && $now->getTimestamp() - $latestHit->getTimestamp() <= $action['properties']['returns_within']) { | |
$changePoints['returns_within'] = true; | |
} else { | |
$changePoints['returns_within'] = false; | |
} | |
} | |
if ($action['properties']['returns_after']) { | |
if ($latestHit && $now->getTimestamp() - $latestHit->getTimestamp() >= $action['properties']['returns_after']) { | |
$changePoints['returns_after'] = true; | |
} else { | |
$changePoints['returns_after'] = false; | |
} | |
} | |
// return true only if all configured options are true | |
return !in_array(false, $changePoints); | |
} | |
} | |