131 lines
4.0 KiB
PHP
Executable File
131 lines
4.0 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Mautic\CampaignBundle\Model;
|
|
|
|
use Mautic\CampaignBundle\CampaignEvents;
|
|
use Mautic\CampaignBundle\Entity\Campaign;
|
|
use Mautic\CampaignBundle\Entity\Event;
|
|
use Mautic\CampaignBundle\Entity\LeadEventLog;
|
|
use Mautic\CampaignBundle\Entity\LeadEventLogRepository;
|
|
use Mautic\CampaignBundle\Event\DeleteEvent;
|
|
use Mautic\CoreBundle\Helper\Chart\ChartQuery;
|
|
use Mautic\CoreBundle\Helper\Chart\LineChart;
|
|
use Mautic\CoreBundle\Model\FormModel;
|
|
|
|
/**
|
|
* @extends FormModel<Event>
|
|
*/
|
|
class EventModel extends FormModel
|
|
{
|
|
/**
|
|
* @return \Mautic\CampaignBundle\Entity\EventRepository
|
|
*/
|
|
public function getRepository()
|
|
{
|
|
return $this->em->getRepository(Event::class);
|
|
}
|
|
|
|
/**
|
|
* @return \Mautic\CampaignBundle\Entity\CampaignRepository
|
|
*/
|
|
public function getCampaignRepository()
|
|
{
|
|
return $this->em->getRepository(Campaign::class);
|
|
}
|
|
|
|
/**
|
|
* @return LeadEventLogRepository
|
|
*/
|
|
public function getLeadEventLogRepository()
|
|
{
|
|
return $this->em->getRepository(LeadEventLog::class);
|
|
}
|
|
|
|
public function getPermissionBase(): string
|
|
{
|
|
return 'campaign:campaigns';
|
|
}
|
|
|
|
/**
|
|
* Get a specific entity or generate a new one if id is empty.
|
|
*/
|
|
public function getEntity($id = null): ?Event
|
|
{
|
|
if (null === $id) {
|
|
return new Event();
|
|
}
|
|
|
|
return parent::getEntity($id);
|
|
}
|
|
|
|
public function deleteEvents($currentEvents, $deletedEvents): void
|
|
{
|
|
$deletedKeys = [];
|
|
foreach ($deletedEvents as $k => $deleteMe) {
|
|
if ($deleteMe instanceof Event) {
|
|
$deleteMe = $deleteMe->getId();
|
|
}
|
|
|
|
if (str_starts_with($deleteMe, 'new')) {
|
|
unset($deletedEvents[$k]);
|
|
}
|
|
|
|
if (isset($currentEvents[$deleteMe])) {
|
|
unset($deletedEvents[$k]);
|
|
}
|
|
|
|
if (isset($deletedEvents[$k])) {
|
|
$deletedKeys[] = $deleteMe;
|
|
}
|
|
}
|
|
|
|
if (count($deletedEvents)) {
|
|
// wipe out any references to these events to prevent restraint violations
|
|
$this->getRepository()->nullEventRelationships($deletedKeys);
|
|
$this->getRepository()->setEventsAsDeleted($deletedEvents);
|
|
$this->dispatcher->dispatch(new DeleteEvent($deletedKeys), CampaignEvents::ON_EVENT_DELETE);
|
|
}
|
|
}
|
|
|
|
public function deleteEventsByCampaignId(int $campaignId): void
|
|
{
|
|
$eventIds = $this->getRepository()->getCampaignEventIds($campaignId);
|
|
$this->deleteEventsByEventIds($eventIds);
|
|
}
|
|
|
|
/**
|
|
* @param string[] $eventIds
|
|
*/
|
|
public function deleteEventsByEventIds(array $eventIds): void
|
|
{
|
|
$this->getRepository()->deleteEvents($eventIds);
|
|
$this->dispatcher->dispatch(new DeleteEvent($eventIds), CampaignEvents::ON_AFTER_EVENTS_DELETE);
|
|
}
|
|
|
|
/**
|
|
* Get line chart data of campaign events.
|
|
*
|
|
* @param string $unit {@link php.net/manual/en/function.date.php#refsect1-function.date-parameters}
|
|
* @param string $dateFormat
|
|
* @param array $filter
|
|
* @param bool $canViewOthers
|
|
*/
|
|
public function getEventLineChartData($unit, \DateTime $dateFrom, \DateTime $dateTo, $dateFormat = null, $filter = [], $canViewOthers = true): array
|
|
{
|
|
$chart = new LineChart($unit, $dateFrom, $dateTo, $dateFormat);
|
|
$query = new ChartQuery($this->em->getConnection(), $dateFrom, $dateTo);
|
|
$q = $query->prepareTimeDataQuery('campaign_lead_event_log', 'date_triggered', $filter);
|
|
|
|
if (!$canViewOthers) {
|
|
$q->join('t', MAUTIC_TABLE_PREFIX.'campaigns', 'c', 'c.id = t.campaign_id')
|
|
->andWhere('c.created_by = :userId')
|
|
->setParameter('userId', $this->userHelper->getUser()->getId());
|
|
}
|
|
|
|
$data = $query->loadAndBuildTimeData($q);
|
|
$chart->setDataset($this->translator->trans('mautic.campaign.triggered.events'), $data);
|
|
|
|
return $chart->render();
|
|
}
|
|
}
|