Spaces:
No application file
No application file
namespace Mautic\CampaignBundle\Model; | |
use Doctrine\ORM\EntityManager; | |
use Mautic\CampaignBundle\Entity\Event; | |
use Mautic\CampaignBundle\Entity\LeadEventLog; | |
use Mautic\CampaignBundle\Entity\LeadEventLogRepository; | |
use Mautic\CampaignBundle\Executioner\Scheduler\EventScheduler; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\InputHelper; | |
use Mautic\CoreBundle\Helper\IpLookupHelper; | |
use Mautic\CoreBundle\Helper\UserHelper; | |
use Mautic\CoreBundle\Model\AbstractCommonModel; | |
use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
use Mautic\CoreBundle\Translation\Translator; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Psr\Log\LoggerInterface; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
/** | |
* @extends AbstractCommonModel<LeadEventLog> | |
*/ | |
class EventLogModel extends AbstractCommonModel | |
{ | |
public function __construct( | |
protected EventModel $eventModel, | |
protected CampaignModel $campaignModel, | |
protected IpLookupHelper $ipLookupHelper, | |
protected EventScheduler $eventScheduler, | |
EntityManager $em, | |
CorePermissions $security, | |
EventDispatcherInterface $dispatcher, | |
UrlGeneratorInterface $router, | |
Translator $translator, | |
UserHelper $userHelper, | |
LoggerInterface $mauticLogger, | |
CoreParametersHelper $coreParametersHelper | |
) { | |
parent::__construct($em, $security, $dispatcher, $router, $translator, $userHelper, $mauticLogger, $coreParametersHelper); | |
} | |
public function getRepository(): LeadEventLogRepository | |
{ | |
return $this->em->getRepository(LeadEventLog::class); | |
} | |
public function getPermissionBase(): string | |
{ | |
return 'campaign:campaigns'; | |
} | |
public function getEntities(array $args = []) | |
{ | |
/** @var LeadEventLog[] $logs */ | |
$logs = parent::getEntities($args); | |
if (!empty($args['campaign_id']) && !empty($args['contact_id'])) { | |
/** @var Event[] $events */ | |
$events = $this->eventModel->getEntities( | |
[ | |
'campaign_id' => $args['campaign_id'], | |
'ignore_children' => true, | |
'index_by' => 'id', | |
'ignore_paginator' => true, | |
] | |
); | |
foreach ($logs as $log) { | |
$event = $log->getEvent()->getId(); | |
$events[$event]->addContactLog($log); | |
} | |
return array_values($events); | |
} | |
return $logs; | |
} | |
/** | |
* @return string|mixed[] | |
*/ | |
public function updateContactEvent(Event $event, Lead $contact, array $parameters): string|array | |
{ | |
$campaign = $event->getCampaign(); | |
// Check that contact is part of the campaign | |
$membership = $campaign->getContactMembership($contact); | |
if (0 === count($membership)) { | |
return $this->translator->trans( | |
'mautic.campaign.error.contact_not_in_campaign', | |
['%campaign%' => $campaign->getId(), '%contact%' => $contact->getId()], | |
'flashes' | |
); | |
} | |
/** @var \Mautic\CampaignBundle\Entity\Lead $m */ | |
foreach ($membership as $m) { | |
if ($m->getManuallyRemoved()) { | |
return $this->translator->trans( | |
'mautic.campaign.error.contact_not_in_campaign', | |
['%campaign%' => $campaign->getId(), '%contact%' => $contact->getId()], | |
'flashes' | |
); | |
} | |
} | |
// Check that contact has not executed the event already | |
$logs = $event->getContactLog($contact); | |
$created = false; | |
if (count($logs)) { | |
$log = $logs[0]; | |
if ($log->getDateTriggered()) { | |
return $this->translator->trans( | |
'mautic.campaign.error.event_already_executed', | |
[ | |
'%campaign%' => $campaign->getId(), | |
'%event%' => $event->getId(), | |
'%contact%' => $contact->getId(), | |
'%dateTriggered%' => $log->getDateTriggered()->format(\DateTimeInterface::ATOM), | |
], | |
'flashes' | |
); | |
} | |
} else { | |
if (!isset($parameters['triggerDate']) && !isset($parameters['dateTriggered'])) { | |
return $this->translator->trans( | |
'mautic.campaign.error.event_must_be_scheduled', | |
[ | |
'%campaign%' => $campaign->getId(), | |
'%event%' => $event->getId(), | |
'%contact%' => $contact->getId(), | |
], | |
'flashes' | |
); | |
} | |
$log = (new LeadEventLog()) | |
->setLead($contact) | |
->setEvent($event); | |
$created = true; | |
} | |
foreach ($parameters as $property => $value) { | |
switch ($property) { | |
case 'dateTriggered': | |
$log->setDateTriggered( | |
new \DateTime($value) | |
); | |
break; | |
case 'triggerDate': | |
if (Event::TYPE_DECISION === $event->getEventType()) { | |
return $this->translator->trans( | |
'mautic.campaign.error.decision_cannot_be_scheduled', | |
[ | |
'%campaign%' => $campaign->getId(), | |
'%event%' => $event->getId(), | |
'%contact%' => $contact->getId(), | |
], | |
'flashes' | |
); | |
} | |
$log->setTriggerDate( | |
new \DateTime($value) | |
); | |
break; | |
case 'ipAddress': | |
if (!defined('MAUTIC_CAMPAIGN_SYSTEM_TRIGGERED')) { | |
$log->setIpAddress( | |
$this->ipLookupHelper->getIpAddress($value) | |
); | |
} | |
break; | |
case 'metadata': | |
$metadata = $log->getMetadata(); | |
if (is_array($value)) { | |
$newMetadata = $value; | |
} elseif ($jsonDecoded = json_decode($value, true)) { | |
$newMetadata = $jsonDecoded; | |
} else { | |
$newMetadata = (array) $value; | |
} | |
$newMetadata = InputHelper::cleanArray($newMetadata); | |
$log->setMetadata(array_merge($metadata, $newMetadata)); | |
break; | |
case 'nonActionPathTaken': | |
$log->setNonActionPathTaken((bool) $value); | |
break; | |
case 'channel': | |
$log->setChannel(InputHelper::clean($value)); | |
break; | |
case 'channelId': | |
$log->setChannel(intval($value)); | |
break; | |
} | |
} | |
$this->saveEntity($log); | |
return [$log, $created]; | |
} | |
public function saveEntity(LeadEventLog $entity): void | |
{ | |
$triggerDate = $entity->getTriggerDate(); | |
if (null === $triggerDate) { | |
// Reschedule for now | |
$triggerDate = new \DateTime(); | |
} | |
$this->eventScheduler->reschedule($entity, $triggerDate); | |
} | |
} | |