/** * Compile events for the lead timeline. * * @param LeadTimelineEvent $event */ public function onTimelineGenerate(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'stage.changed'; $eventTypeName = $this->translator->trans('mautic.stage.event.changed'); $event->addEventType($eventTypeKey, $eventTypeName); if (!$event->isApplicable($eventTypeKey)) { return; } $lead = $event->getLead(); /** @var StagesChangeLogRepository $logRepository */ $logRepository = $this->em->getRepository('MauticLeadBundle:StagesChangeLog'); $logs = $logRepository->getLeadTimelineEvents($lead->getId(), $event->getQueryOptions()); // Add to counter $event->addToCounter($eventTypeKey, $logs); if (!$event->isEngagementCount()) { // Add the logs to the event array foreach ($logs['results'] as $log) { if (isset($log['reference']) && $log['reference'] != null) { $eventLabel = ['label' => $log['eventName'], 'href' => $this->router->generate('mautic_stage_action', ['objectAction' => 'edit', 'objectId' => $log['reference']]), 'isExternal' => false]; } else { $eventLabel = $log['eventName']; } $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => $eventLabel, 'eventType' => $eventTypeName, 'timestamp' => $log['dateAdded'], 'extra' => ['log' => $log], 'icon' => 'fa-tachometer']); } } }
/** * @param LeadTimelineEvent $event * @param $state */ protected function addEmailEvents(LeadTimelineEvent $event, $state) { // Set available event types $eventTypeKey = 'email.' . $state; $eventTypeName = $this->translator->trans('mautic.email.' . $state); $event->addEventType($eventTypeKey, $eventTypeName); // Decide if those events are filtered if (!$event->isApplicable($eventTypeKey)) { return; } $lead = $event->getLead(); /** @var \Mautic\EmailBundle\Entity\StatRepository $statRepository */ $statRepository = $this->em->getRepository('MauticEmailBundle:Stat'); $queryOptions = $event->getQueryOptions(); $queryOptions['state'] = $state; $stats = $statRepository->getLeadStats($lead->getId(), $queryOptions); // Add total to counter $event->addToCounter($eventTypeKey, $stats); if (!$event->isEngagementCount()) { // Add the events to the event array foreach ($stats['results'] as $stat) { if (!empty($stat['storedSubject'])) { $label = $this->translator->trans('mautic.email.timeline.event.custom_email') . ': ' . $stat['storedSubject']; } elseif (!empty($stat['email_name'])) { $label = $stat['email_name']; } else { $label = $this->translator->trans('mautic.email.timeline.event.custom_email'); } if (!empty($stat['idHash'])) { $eventName = ['label' => $label, 'href' => $this->router->generate('mautic_email_webview', ['idHash' => $stat['idHash']]), 'isExternal' => true]; } else { $eventName = $label; } if ('failed' == $state or 'sent' == $state) { //this is to get the correct column for date dateSent $dateSent = 'sent'; } else { $dateSent = 'read'; } $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => $eventName, 'eventType' => $eventTypeName, 'timestamp' => $stat['date' . ucfirst($dateSent)], 'dateSent' => $stat['dateSent'], 'extra' => ['stat' => $stat, 'type' => $state], 'contentTemplate' => 'MauticEmailBundle:SubscribedEvents\\Timeline:index.html.php', 'icon' => $state == 'read' ? 'fa-envelope-o' : 'fa-envelope']); } } }
/** * Compile events for the lead timeline. * * @param LeadTimelineEvent $event */ public function onTimelineGenerate(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'point.gained'; $eventTypeName = $this->translator->trans('mautic.point.event.gained'); $event->addEventType($eventTypeKey, $eventTypeName); if (!$event->isApplicable($eventTypeKey)) { return; } $lead = $event->getLead(); /** @var \Mautic\PageBundle\Entity\HitRepository $hitRepository */ $logRepository = $this->em->getRepository('MauticLeadBundle:PointsChangeLog'); $logs = $logRepository->getLeadTimelineEvents($lead->getId(), $event->getQueryOptions()); // Add to counter $event->addToCounter($eventTypeKey, $logs); if (!$event->isEngagementCount()) { // Add the logs to the event array foreach ($logs['results'] as $log) { $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => $log['eventName'] . ' / ' . $log['delta'], 'eventType' => $eventTypeName, 'timestamp' => $log['dateAdded'], 'extra' => ['log' => $log], 'icon' => 'fa-calculator']); } } }
/** * Compile events for the lead timeline. * * @param LeadTimelineEvent $event */ public function onTimelineGenerate(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'asset.download'; $eventTypeName = $this->translator->trans('mautic.asset.event.download'); $event->addEventType($eventTypeKey, $eventTypeName); // Decide if those events are filtered if (!$event->isApplicable($eventTypeKey)) { return; } $lead = $event->getLead(); /** @var \Mautic\AssetBundle\Entity\DownloadRepository $downloadRepository */ $downloadRepository = $this->em->getRepository('MauticAssetBundle:Download'); $downloads = $downloadRepository->getLeadDownloads($lead->getId(), $event->getQueryOptions()); // Add total number to counter $event->addToCounter($eventTypeKey, $downloads); if (!$event->isEngagementCount()) { // Add the downloads to the event array foreach ($downloads['results'] as $download) { $asset = $this->assetModel->getEntity($download['asset_id']); $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => ['label' => $download['title'], 'href' => $this->router->generate('mautic_asset_action', ['objectAction' => 'view', 'objectId' => $download['asset_id']])], 'extra' => ['asset' => $asset, 'assetDownloadUrl' => $this->assetModel->generateUrl($asset)], 'eventType' => $eventTypeName, 'timestamp' => $download['dateDownload'], 'icon' => 'fa-download', 'contentTemplate' => 'MauticAssetBundle:SubscribedEvents\\Timeline:index.html.php']); } } }
/** * Compile events for the lead timeline. * * @param LeadTimelineEvent $event */ public function onTimelineGenerate(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'dynamic.content.sent'; $eventTypeNameSent = $this->translator->trans('mautic.dynamic.content.sent'); $event->addEventType($eventTypeKey, $eventTypeNameSent); if (!$event->isApplicable($eventTypeKey)) { return; } $lead = $event->getLead(); /** @var \Mautic\DynamicContentBundle\Entity\StatRepository $statRepository */ $statRepository = $this->em->getRepository('MauticDynamicContentBundle:Stat'); $stats = $statRepository->getLeadStats($lead->getId(), $event->getQueryOptions()); // Add total number to counter $event->addToCounter($eventTypeKey, $stats); if (!$event->isEngagementCount()) { // Add the events to the event array foreach ($stats['results'] as $stat) { if ($stat['dateSent']) { $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => ['label' => $stat['name'], 'href' => $this->router->generate('mautic_dynamicContent_action', ['objectId' => $stat['dynamic_content_id'], 'objectAction' => 'view'])], 'eventType' => $eventTypeNameSent, 'timestamp' => $stat['dateSent'], 'extra' => ['stat' => $stat, 'type' => 'sent'], 'contentTemplate' => 'MauticDynamicContentBundle:SubscribedEvents\\Timeline:index.html.php', 'icon' => 'fa-envelope']); } } } }
/** * Compile events for the lead timeline * * @param LeadTimelineEvent $event */ public function onTimelineGenerate(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'form.submitted'; $eventTypeName = $this->translator->trans('mautic.form.event.submitted'); $event->addEventType($eventTypeKey, $eventTypeName); if (!$event->isApplicable($eventTypeKey)) { return; } /** @var \Mautic\FormBundle\Entity\SubmissionRepository $submissionRepository */ $submissionRepository = $this->em->getRepository('MauticFormBundle:Submission'); $rows = $submissionRepository->getSubmissions($event->getQueryOptions()); // Add total to counter $event->addToCounter($eventTypeKey, $rows); if (!$event->isEngagementCount()) { // Add the submissions to the event array foreach ($rows['results'] as $row) { // Convert to local from UTC $form = $this->formModel->getEntity($row['form_id']); $submission = $submissionRepository->getEntity($row['id']); $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => ['label' => $form->getName(), 'href' => $this->router->generate('mautic_form_action', ['objectAction' => 'view', 'objectId' => $form->getId()])], 'eventType' => $eventTypeName, 'timestamp' => $row['dateSubmitted'], 'extra' => ['submission' => $submission, 'form' => $form, 'page' => $this->pageModel->getEntity($row['page_id'])], 'contentTemplate' => 'MauticFormBundle:SubscribedEvents\\Timeline:index.html.php', 'icon' => 'fa-pencil-square-o']); } } }
/** * Compile events for the lead timeline. * * @param LeadTimelineEvent $event */ public function onTimelineGenerateVideo(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'page.videohit'; $eventTypeName = $this->translator->trans('mautic.page.event.videohit'); $event->addEventType($eventTypeKey, $eventTypeName); if (!$event->isApplicable($eventTypeKey)) { return; } /** @var \Mautic\PageBundle\Entity\VideoHitRepository $hitRepository */ $hitRepository = $this->em->getRepository('MauticPageBundle:VideoHit'); $hits = $hitRepository->getTimelineStats($event->getLead()->getId(), $event->getQueryOptions()); $event->addToCounter($eventTypeKey, $hits); if (!$event->isEngagementCount()) { // Add the hits to the event array foreach ($hits['results'] as $hit) { $template = 'MauticPageBundle:SubscribedEvents\\Timeline:videohit.html.php'; $eventLabel = $eventTypeName; $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => $eventLabel, 'eventType' => $eventTypeName, 'timestamp' => $hit['date_hit'], 'extra' => ['hit' => $hit], 'contentTemplate' => $template, 'icon' => 'fa-video-camera']); } } }
/** * Compile events for the lead timeline * * @param LeadTimelineEvent $event */ public function onTimelineGenerate(LeadTimelineEvent $event) { // Set available event types $eventTypeKey = 'campaign.event'; $eventTypeName = $this->translator->trans('mautic.campaign.triggered'); $event->addEventType($eventTypeKey, $eventTypeName); // Decide if those events are filtered if (!$event->isApplicable($eventTypeKey)) { return; } $lead = $event->getLead(); /** @var \Mautic\CampaignBundle\Entity\LeadEventLogRepository $logRepository */ $logRepository = $this->em->getRepository('MauticCampaignBundle:LeadEventLog'); $logs = $logRepository->getLeadLogs($lead->getId(), $event->getQueryOptions()); $eventSettings = $this->campaignModel->getEvents(); // Add total number to counter $event->addToCounter($eventTypeKey, $logs); if (!$event->isEngagementCount()) { foreach ($logs['results'] as $log) { // Hide this from the time line all together if (!empty($log['metadata']['failed'])) { $event->subtractFromCounter($eventTypeKey); continue; } $template = !empty($eventSettings['action'][$log['type']]['timelineTemplate']) ? $eventSettings['action'][$log['type']]['timelineTemplate'] : 'MauticCampaignBundle:SubscribedEvents\\Timeline:index.html.php'; $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => ['label' => $log['event_name'] . ' / ' . $log['campaign_name'], 'href' => $this->router->generate('mautic_campaign_action', ['objectAction' => 'view', 'objectId' => $log['campaign_id']])], 'eventType' => $eventTypeName, 'timestamp' => $log['dateTriggered'], 'extra' => ['log' => $log], 'contentTemplate' => $template, 'icon' => 'fa-clock-o']); } } }
/** * @param Events\LeadTimelineEvent $event * @param $eventTypeKey * @param $eventTypeName */ protected function addTimelineDoNotContactEntries(Events\LeadTimelineEvent $event, $eventTypeKey, $eventTypeName) { $lead = $event->getLead(); /** @var \Mautic\LeadBundle\Entity\DoNotContactRepository $dncRepo */ $dncRepo = $this->em->getRepository('MauticLeadBundle:DoNotContact'); /** @var \Mautic\LeadBundle\Entity\DoNotContact[] $entries */ $rows = $dncRepo->getTimelineStats($lead->getId(), $event->getQueryOptions()); // Add to counter $event->addToCounter($eventTypeKey, $rows); if (!$event->isEngagementCount()) { foreach ($rows['results'] as $row) { switch ($row['reason']) { case DoNotContact::UNSUBSCRIBED: $row['reason'] = $this->translator->trans('mautic.lead.event.donotcontact_unsubscribed'); break; case DoNotContact::BOUNCED: $row['reason'] = $this->translator->trans('mautic.lead.event.donotcontact_bounced'); break; case DoNotContact::MANUAL: $row['reason'] = $this->translator->trans('mautic.lead.event.donotcontact_manual'); break; } $template = 'MauticLeadBundle:SubscribedEvents\\Timeline:donotcontact.html.php'; $icon = 'fa-ban'; if (!empty($row['channel'])) { if ($channelModel = $this->getChannelModel($row['channel'])) { // Allow a custom template if applicable if (method_exists($channelModel, 'getDoNotContactLeadTimelineTemplate')) { $template = $channelModel->getDoNotContactLeadTimelineTemplate($row); } if (method_exists($channelModel, 'getDoNotContactLeadTimelineLabel')) { $eventTypeName = $channelModel->getDoNotContactLeadTimelineLabel($row); } if (method_exists($channelModel, 'getDoNotContactLeadTimelineIcon')) { $icon = $channelModel->getDoNotContactLeadTimelineIcon($row); } if (!empty($row['channel_id'])) { if ($item = $this->getChannelEntityName($row['channel'], $row['channel_id'], true)) { $row['itemName'] = $item['name']; $row['itemRoute'] = $item['url']; } } } } $event->addEvent(['event' => $eventTypeKey, 'eventLabel' => isset($row['itemName']) ? ['label' => ucfirst($row['channel']) . ' / ' . $row['itemName'], 'href' => $row['itemRoute']] : ucfirst($row['channel']), 'eventType' => $eventTypeName, 'timestamp' => $row['date_added'], 'extra' => ['dnc' => $row], 'contentTemplate' => $template, 'icon' => $icon]); } } }