Spaces:
No application file
No application file
| namespace Mautic\CampaignBundle\Entity; | |
| use Doctrine\ORM\Mapping as ORM; | |
| use Mautic\ApiBundle\Serializer\Driver\ApiMetadataDriver; | |
| use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder; | |
| use Mautic\CoreBundle\Entity\IpAddress; | |
| use Mautic\LeadBundle\Entity\Lead as LeadEntity; | |
| class LeadEventLog implements ChannelInterface | |
| { | |
| public const TABLE_NAME = 'campaign_lead_event_log'; | |
| /** | |
| * @var string|null | |
| */ | |
| private $id; | |
| /** | |
| * @var Event | |
| */ | |
| private $event; | |
| /** | |
| * @var LeadEntity | |
| */ | |
| private $lead; | |
| /** | |
| * @var Campaign|null | |
| */ | |
| private $campaign; | |
| /** | |
| * @var IpAddress|null | |
| */ | |
| private $ipAddress; | |
| /** | |
| * @var \DateTimeInterface|null | |
| **/ | |
| private $dateTriggered; | |
| /** | |
| * @var bool | |
| */ | |
| private $isScheduled = false; | |
| /** | |
| * @var \DateTimeInterface|null | |
| */ | |
| private $triggerDate; | |
| /** | |
| * @var bool | |
| */ | |
| private $systemTriggered = false; | |
| /** | |
| * @var array | |
| */ | |
| private $metadata = []; | |
| /** | |
| * @var bool|null | |
| */ | |
| private $nonActionPathTaken = false; | |
| /** | |
| * @var string|null | |
| */ | |
| private $channel; | |
| /** | |
| * @var int|null | |
| */ | |
| private $channelId; | |
| /** | |
| * @var bool|null | |
| */ | |
| private $previousScheduledState; | |
| /** | |
| * @var int | |
| */ | |
| private $rotation = 1; | |
| /** | |
| * @var FailedLeadEventLog|null | |
| */ | |
| private $failedLog; | |
| /** | |
| * Subscribers can fail log with custom reschedule interval. | |
| * | |
| * @var \DateInterval|null | |
| */ | |
| private $rescheduleInterval; | |
| public static function loadMetadata(ORM\ClassMetadata $metadata): void | |
| { | |
| $builder = new ClassMetadataBuilder($metadata); | |
| $builder->setTable(self::TABLE_NAME) | |
| ->setCustomRepositoryClass(LeadEventLogRepository::class) | |
| ->addIndex(['is_scheduled', 'lead_id'], 'campaign_event_upcoming_search') | |
| ->addIndex(['campaign_id', 'is_scheduled', 'trigger_date'], 'campaign_event_schedule_counts') | |
| ->addIndex(['date_triggered'], 'campaign_date_triggered') | |
| ->addIndex(['lead_id', 'campaign_id', 'rotation'], 'campaign_leads') | |
| ->addIndex(['channel', 'channel_id', 'lead_id'], 'campaign_log_channel') | |
| ->addIndex(['campaign_id', 'event_id', 'date_triggered'], 'campaign_actions') | |
| ->addIndex(['campaign_id', 'date_triggered', 'event_id', 'non_action_path_taken'], 'campaign_stats') | |
| ->addIndex(['trigger_date'], 'campaign_trigger_date_order') | |
| ->addUniqueConstraint(['event_id', 'lead_id', 'rotation'], 'campaign_rotation'); | |
| $builder->addBigIntIdField(); | |
| $builder->createManyToOne('event', 'Event') | |
| ->inversedBy('log') | |
| ->addJoinColumn('event_id', 'id', false, false) | |
| ->build(); | |
| $builder->addLead(false, 'CASCADE'); | |
| $builder->addField('rotation', 'integer'); | |
| $builder->createManyToOne('campaign', 'Campaign') | |
| ->addJoinColumn('campaign_id', 'id') | |
| ->build(); | |
| $builder->addIpAddress(true); | |
| $builder->createField('dateTriggered', 'datetime') | |
| ->columnName('date_triggered') | |
| ->nullable() | |
| ->build(); | |
| $builder->createField('isScheduled', 'boolean') | |
| ->columnName('is_scheduled') | |
| ->build(); | |
| $builder->createField('triggerDate', 'datetime') | |
| ->columnName('trigger_date') | |
| ->nullable() | |
| ->build(); | |
| $builder->createField('systemTriggered', 'boolean') | |
| ->columnName('system_triggered') | |
| ->build(); | |
| $builder->createField('metadata', 'array') | |
| ->nullable() | |
| ->build(); | |
| $builder->createField('channel', 'string') | |
| ->nullable() | |
| ->build(); | |
| $builder->addNamedField('channelId', 'integer', 'channel_id', true); | |
| $builder->addNullableField('nonActionPathTaken', 'boolean', 'non_action_path_taken'); | |
| $builder->createOneToOne('failedLog', 'FailedLeadEventLog') | |
| ->mappedBy('log') | |
| ->fetchExtraLazy() | |
| ->cascadeAll() | |
| ->build(); | |
| } | |
| /** | |
| * Prepares the metadata for API usage. | |
| */ | |
| public static function loadApiMetadata(ApiMetadataDriver $metadata): void | |
| { | |
| $metadata->setGroupPrefix('campaignEventLog') | |
| ->addProperties( | |
| [ | |
| 'ipAddress', | |
| 'dateTriggered', | |
| 'isScheduled', | |
| 'triggerDate', | |
| 'metadata', | |
| 'nonActionPathTaken', | |
| 'channel', | |
| 'channelId', | |
| 'rotation', | |
| ] | |
| ) | |
| // Add standalone groups | |
| ->setGroupPrefix('campaignEventStandaloneLog') | |
| ->addProperties( | |
| [ | |
| 'event', | |
| 'lead', | |
| 'campaign', | |
| 'ipAddress', | |
| 'dateTriggered', | |
| 'isScheduled', | |
| 'triggerDate', | |
| 'metadata', | |
| 'nonActionPathTaken', | |
| 'channel', | |
| 'channelId', | |
| 'rotation', | |
| ] | |
| ) | |
| ->build(); | |
| } | |
| public function getId(): int | |
| { | |
| return (int) $this->id; | |
| } | |
| /** | |
| * @return \DateTimeInterface|null | |
| */ | |
| public function getDateTriggered() | |
| { | |
| return $this->dateTriggered; | |
| } | |
| /** | |
| * @return $this | |
| */ | |
| public function setDateTriggered(\DateTimeInterface $dateTriggered = null) | |
| { | |
| $this->dateTriggered = $dateTriggered; | |
| if (null !== $dateTriggered) { | |
| $this->setIsScheduled(false); | |
| } | |
| return $this; | |
| } | |
| /** | |
| * @return IpAddress|null | |
| */ | |
| public function getIpAddress() | |
| { | |
| return $this->ipAddress; | |
| } | |
| /** | |
| * @return $this | |
| */ | |
| public function setIpAddress(IpAddress $ipAddress) | |
| { | |
| $this->ipAddress = $ipAddress; | |
| return $this; | |
| } | |
| /** | |
| * @return LeadEntity|null | |
| */ | |
| public function getLead() | |
| { | |
| return $this->lead; | |
| } | |
| /** | |
| * @return $this | |
| */ | |
| public function setLead(LeadEntity $lead) | |
| { | |
| $this->lead = $lead; | |
| return $this; | |
| } | |
| /** | |
| * @return Event|null | |
| */ | |
| public function getEvent() | |
| { | |
| return $this->event; | |
| } | |
| /*** | |
| * @param $event | |
| * | |
| * @return $this | |
| */ | |
| public function setEvent(Event $event) | |
| { | |
| $this->event = $event; | |
| if (!$this->campaign) { | |
| $this->setCampaign($event->getCampaign()); | |
| } | |
| return $this; | |
| } | |
| /** | |
| * @return bool | |
| */ | |
| public function getIsScheduled() | |
| { | |
| return $this->isScheduled; | |
| } | |
| /** | |
| * @param bool $isScheduled | |
| * | |
| * @return $this | |
| */ | |
| public function setIsScheduled($isScheduled) | |
| { | |
| if (null === $this->previousScheduledState) { | |
| $this->previousScheduledState = $this->isScheduled; | |
| } | |
| $this->isScheduled = $isScheduled; | |
| return $this; | |
| } | |
| /** | |
| * If isScheduled was changed, this will have the previous state. | |
| * | |
| * @return bool|null | |
| */ | |
| public function getPreviousScheduledState() | |
| { | |
| return $this->previousScheduledState; | |
| } | |
| /** | |
| * @return \DateTimeInterface|null | |
| */ | |
| public function getTriggerDate() | |
| { | |
| return $this->triggerDate; | |
| } | |
| /** | |
| * @return $this | |
| */ | |
| public function setTriggerDate(\DateTimeInterface $triggerDate = null) | |
| { | |
| $this->triggerDate = $triggerDate; | |
| $this->setIsScheduled(true); | |
| return $this; | |
| } | |
| /** | |
| * @return Campaign|null | |
| */ | |
| public function getCampaign() | |
| { | |
| return $this->campaign; | |
| } | |
| /** | |
| * @return $this | |
| */ | |
| public function setCampaign(Campaign $campaign) | |
| { | |
| $this->campaign = $campaign; | |
| return $this; | |
| } | |
| /** | |
| * @return bool | |
| */ | |
| public function getSystemTriggered() | |
| { | |
| return $this->systemTriggered; | |
| } | |
| /** | |
| * @param bool $systemTriggered | |
| * | |
| * @return $this | |
| */ | |
| public function setSystemTriggered($systemTriggered) | |
| { | |
| $this->systemTriggered = $systemTriggered; | |
| return $this; | |
| } | |
| /** | |
| * @return bool | |
| */ | |
| public function getNonActionPathTaken() | |
| { | |
| return $this->nonActionPathTaken; | |
| } | |
| /** | |
| * @param bool $nonActionPathTaken | |
| * | |
| * @return $this | |
| */ | |
| public function setNonActionPathTaken($nonActionPathTaken) | |
| { | |
| $this->nonActionPathTaken = $nonActionPathTaken; | |
| return $this; | |
| } | |
| /** | |
| * @return mixed[]|null | |
| */ | |
| public function getMetadata() | |
| { | |
| return $this->metadata; | |
| } | |
| /** | |
| * @param mixed[] $metadata | |
| */ | |
| public function appendToMetadata($metadata): void | |
| { | |
| if (!is_array($metadata)) { | |
| // Assumed output for timeline BC for <2.14 | |
| $metadata = ['timeline' => $metadata]; | |
| } | |
| $this->metadata = array_merge($this->metadata, $metadata); | |
| } | |
| /** | |
| * @param mixed[] $metadata | |
| * | |
| * @return $this | |
| */ | |
| public function setMetadata($metadata) | |
| { | |
| if (!is_array($metadata)) { | |
| // Assumed output for timeline | |
| $metadata = ['timeline' => $metadata]; | |
| } | |
| $this->metadata = $metadata; | |
| return $this; | |
| } | |
| /** | |
| * @return string|null | |
| */ | |
| public function getChannel() | |
| { | |
| return $this->channel; | |
| } | |
| /** | |
| * @param string $channel | |
| */ | |
| public function setChannel($channel): void | |
| { | |
| $this->channel = $channel; | |
| } | |
| /** | |
| * @return int|null | |
| */ | |
| public function getChannelId() | |
| { | |
| return $this->channelId; | |
| } | |
| /** | |
| * @param int|null $channelId | |
| */ | |
| public function setChannelId($channelId): void | |
| { | |
| $this->channelId = $channelId; | |
| } | |
| /** | |
| * @return int|null | |
| */ | |
| public function getRotation() | |
| { | |
| return $this->rotation; | |
| } | |
| /** | |
| * @param int $rotation | |
| * | |
| * @return LeadEventLog | |
| */ | |
| public function setRotation($rotation) | |
| { | |
| $this->rotation = (int) $rotation; | |
| return $this; | |
| } | |
| /** | |
| * @return FailedLeadEventLog|null | |
| */ | |
| public function getFailedLog() | |
| { | |
| return $this->failedLog; | |
| } | |
| /** | |
| * @return $this | |
| */ | |
| public function setFailedLog(FailedLeadEventLog $log = null) | |
| { | |
| $this->failedLog = $log; | |
| return $this; | |
| } | |
| public function isFailed(): bool | |
| { | |
| $log = $this->getFailedLog(); | |
| return !empty($log); | |
| } | |
| public function isSuccess(): bool | |
| { | |
| return !$this->isFailed(); | |
| } | |
| public function setRescheduleInterval(?\DateInterval $interval): void | |
| { | |
| $this->rescheduleInterval = $interval; | |
| } | |
| public function getRescheduleInterval(): ?\DateInterval | |
| { | |
| return $this->rescheduleInterval; | |
| } | |
| } | |