forked from mautic/mautic
-
Notifications
You must be signed in to change notification settings - Fork 1
/
LeadSubscriber.php
112 lines (98 loc) · 3.79 KB
/
LeadSubscriber.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
namespace Mautic\PointBundle\EventListener;
use Mautic\LeadBundle\Entity\PointsChangeLogRepository;
use Mautic\LeadBundle\Event\LeadEvent;
use Mautic\LeadBundle\Event\LeadMergeEvent;
use Mautic\LeadBundle\Event\LeadTimelineEvent;
use Mautic\LeadBundle\Event\PointsChangeEvent;
use Mautic\LeadBundle\LeadEvents;
use Mautic\PointBundle\Entity\LeadPointLogRepository;
use Mautic\PointBundle\Entity\LeadTriggerLogRepository;
use Mautic\PointBundle\Model\TriggerModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class LeadSubscriber implements EventSubscriberInterface
{
public function __construct(private TriggerModel $triggerModel, private TranslatorInterface $translator, private PointsChangeLogRepository $pointsChangeLogRepository, private LeadPointLogRepository $leadPointLogRepository, private LeadTriggerLogRepository $leadTriggerLogRepository)
{
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
LeadEvents::LEAD_POINTS_CHANGE => ['onLeadPointsChange', 0],
LeadEvents::TIMELINE_ON_GENERATE => ['onTimelineGenerate', 0],
LeadEvents::LEAD_POST_MERGE => ['onLeadMerge', 0],
LeadEvents::LEAD_POST_SAVE => ['onLeadSave', -1],
];
}
/**
* Trigger applicable events for the lead.
*/
public function onLeadPointsChange(PointsChangeEvent $event): void
{
$this->triggerModel->triggerEvents($event->getLead());
}
/**
* Handle point triggers for new leads (including 0 point triggers).
*/
public function onLeadSave(LeadEvent $event): void
{
if ($event->isNew()) {
$this->triggerModel->triggerEvents($event->getLead());
}
}
/**
* Compile events for the lead timeline.
*/
public function onTimelineGenerate(LeadTimelineEvent $event): void
{
// Set available event types
$eventTypeKey = 'point.gained';
$eventTypeName = $this->translator->trans('mautic.point.event.gained');
$event->addEventType($eventTypeKey, $eventTypeName);
$event->addSerializerGroup('pointList');
if (!$event->isApplicable($eventTypeKey)) {
return;
}
$logs = $this->pointsChangeLogRepository->getLeadTimelineEvents($event->getLeadId(), $event->getQueryOptions());
// Add to counter
$event->addToCounter($eventTypeKey, $logs);
if (!$event->isEngagementCount()) {
// Add the logs to the event array
foreach ($logs['results'] as $log) {
$eventLabel = $log['eventName'].' / '.$log['delta'];
if (!empty($log['groupName'])) {
$eventLabel .= ' ('.$log['groupName'].')';
}
$event->addEvent(
[
'event' => $eventTypeKey,
'eventId' => $eventTypeKey.$log['id'],
'eventLabel' => $eventLabel,
'eventType' => $eventTypeName,
'timestamp' => $log['dateAdded'],
'extra' => [
'log' => $log,
],
'icon' => 'fa-calculator',
'contactId' => $log['lead_id'],
]
);
}
}
}
public function onLeadMerge(LeadMergeEvent $event): void
{
$this->leadPointLogRepository->updateLead(
$event->getLoser()->getId(),
$event->getVictor()->getId()
);
$this->leadTriggerLogRepository->updateLead(
$event->getLoser()->getId(),
$event->getVictor()->getId()
);
}
}