/** * @return array */ public function getClickthrough() { if (!in_array('lead', $this->clickthrough)) { $this->clickthrough['lead'] = is_array($this->lead) ? $this->lead['id'] : $this->lead->getId(); } return $this->clickthrough; }
/** * Determine if this campaign applies * * @param $eventDetails * @param $event * * @return bool */ public static function validateFormValue(MauticFactory $factory, $event, Lead $lead) { if (!$lead || !$lead->getId()) { return false; } $model = $factory->getModel('form'); $operators = $model->getFilterExpressionFunctions(); $form = $model->getRepository()->findOneById($event['properties']['form']); if (!$form || !$form->getId()) { return false; } return $factory->getModel('form.submission')->getRepository()->compareValue($lead->getId(), $form->getId(), $form->getAlias(), $event['properties']['field'], $event['properties']['value'], $operators[$event['properties']['operator']]['expr']); }
/** * @param array $parameters * @param Lead $lead * @param CompanyModel $companyModel * * @return array */ public static function identifyLeadsCompany($parameters, Lead $lead, CompanyModel $companyModel) { $companyName = $companyDomain = null; $leadAdded = false; if (isset($parameters['company'])) { $companyName = filter_var($parameters['company'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); } elseif (isset($parameters['email'])) { $companyName = $companyDomain = self::domainExists($parameters['email']); } if ($companyName) { $companyRepo = $companyModel->getRepository(); $city = isset($parameters['city']) ? $parameters['city'] : null; $country = isset($parameters['country']) ? $parameters['country'] : null; $state = isset($parameters['state']) ? $parameters['state'] : null; $company = $companyRepo->identifyCompany($companyName, $city, $country, $state); if (!empty($company)) { //check if lead is already assigned to company $companyLeadRepo = $companyModel->getCompanyLeadRepository(); if (empty($companyLeadRepo->getCompaniesByLeadId($lead->getId(), $company['id']))) { $leadAdded = true; } } else { //create new company $company = ['companyname' => $companyName, 'companywebsite' => $companyDomain, 'companycity' => $city, 'companystate' => $state, 'companycountry' => $country]; $companyEntity = $companyModel->getEntity(); $companyModel->setFieldValues($companyEntity, $company, true); $companyModel->saveEntity($companyEntity); $company['id'] = $companyEntity->getId(); $leadAdded = true; } return [$company, $leadAdded]; } return [null, false]; }
/** * @param Lead $lead * @param array $options * * @return array */ public function getLeadIpLogs(Lead $lead, array $options = []) { $qb = $this->getEntityManager()->getConnection()->createQueryBuilder(); $sqb = $this->getEntityManager()->getConnection()->createQueryBuilder(); // Just a check to ensure reused IDs (happens with innodb) doesn't infect data $dt = new DateTimeHelper($lead->getDateAdded(), 'Y-m-d H:i:s', 'local'); $sqb->select('MAX(l.date_added) as date_added, l.ip_address')->from(MAUTIC_TABLE_PREFIX . 'audit_log', 'l')->where($sqb->expr()->andX($sqb->expr()->eq('l.bundle', $sqb->expr()->literal('lead')), $sqb->expr()->eq('l.object', $sqb->expr()->literal('lead')), $sqb->expr()->eq('l.action', $sqb->expr()->literal('ipadded')), $sqb->expr()->eq('l.object_id', $lead->getId()), $sqb->expr()->gte('l.date_added', $sqb->expr()->literal($dt->getUtcTimestamp()))))->groupBy('l.ip_address'); $qb->select('ip.date_added, ip.ip_address')->from(sprintf('(%s)', $sqb->getSQL()), 'ip'); return $this->getTimelineResults($qb, $options, 'ip.ip_address', 'ip.date_added', [], ['date_added']); }
/** * Get tag entities by lead. * * @param $utmTags * * @return array */ public function getUtmTagsByLead(Lead $lead, $options = []) { if (empty($lead)) { return []; } $qb = $this->getEntityManager()->getConnection()->createQueryBuilder()->select('*')->from(MAUTIC_TABLE_PREFIX . 'lead_utmtags', 'ut')->where('ut.lead_id = ' . $lead->getId()); if (isset($options['search']) && $options['search']) { $qb->andWhere($qb->expr()->orX($qb->expr()->like('ut.utm_campaign', $qb->expr()->literal('%' . $options['search'] . '%')), $qb->expr()->like('ut.utm_content', $qb->expr()->literal('%' . $options['search'] . '%')), $qb->expr()->like('ut.utm_medium', $qb->expr()->literal('%' . $options['search'] . '%')), $qb->expr()->like('ut.utm_source', $qb->expr()->literal('%' . $options['search'] . '%')), $qb->expr()->like('ut.utm_term', $qb->expr()->literal('%' . $options['search'] . '%')))); } return $this->getTimelineResults($qb, $options, 'ut.utm_campaign', 'ut.date_added', ['query'], ['date_added']); }
/** * @param Lead $lead * @param array $action * * @return int */ public static function engagePointAction($lead, $action) { static $initiated = []; $pointsChange = 0; //only initiate once per lead per type if (empty($initiated[$lead->getId()][$action['type']])) { if (!empty($action['properties']['delta'])) { $pointsChange = $action['properties']['delta']; } } return $pointsChange; }
/** * @param Lead $lead * * @return mixed */ public function getAvatar(Lead $lead) { $preferred = $lead->getPreferredProfileImage(); $socialData = $lead->getSocialCache(); $leadEmail = $lead->getEmail(); if ($preferred == 'custom') { if ($fmtime = filemtime($this->getAvatarPath(true) . '/avatar' . $lead->getId())) { // Append file modified time to ensure the latest is used by browser $img = $this->factory->getHelper('template.assets')->getUrl($this->getAvatarPath() . '/avatar' . $lead->getId() . '?' . $fmtime, null, null, false, true); } } elseif (isset($socialData[$preferred]) && !empty($socialData[$preferred]['profile']['profileImage'])) { $img = $socialData[$preferred]['profile']['profileImage']; } if (empty($img)) { // Default to gravatar if others failed if (!empty($leadEmail)) { $img = $this->factory->getHelper('template.gravatar')->getImage($leadEmail); } else { $img = $this->getDefaultAvatar(); } } return $img; }
/** * @param $event * @param Lead $lead * @param MauticFactory $factory */ public static function sendEmail($event, Lead $lead, MauticFactory $factory) { $properties = $event['properties']; $emailId = (int) $properties['email']; /** @var \Mautic\EmailBundle\Model\EmailModel $model */ $model = $factory->getModel('email'); $email = $model->getEntity($emailId); //make sure the email still exists and is published if ($email != null && $email->isPublished()) { $leadFields = $lead->getFields(); if (isset($leadFields['core']['email']['value']) && $leadFields['core']['email']['value']) { $leadCredentials = array('email' => $leadFields['core']['email']['value'], 'id' => $lead->getId(), 'firstname' => $leadFields['core']['firstname']['value'], 'lastname' => $leadFields['core']['lastname']['value']); $options = array('source' => array('trigger', $event['id'])); $model->sendEmail($email, $leadCredentials, $options); } } }
/** * @param Lead $lead * @param array|null $filters * @param array|null $orderBy * @param int $page * * @return array */ protected function getEngagements(Lead $lead, array $filters = null, array $orderBy = null, $page = 1) { $session = $this->get('session'); if (null == $filters) { $filters = $session->get('mautic.lead.' . $lead->getId() . '.timeline.filters', ['search' => '', 'includeEvents' => [], 'excludeEvents' => []]); } if (null == $orderBy) { if (!$session->has('mautic.lead.' . $lead->getId() . '.timeline.orderby')) { $session->set('mautic.lead.' . $lead->getId() . '.timeline.orderby', 'timestamp'); $session->set('mautic.lead.' . $lead->getId() . '.timeline.orderbydir', 'DESC'); } $orderBy = [$session->get('mautic.lead.' . $lead->getId() . '.timeline.orderby'), $session->get('mautic.lead.' . $lead->getId() . '.timeline.orderbydir')]; } /** @var LeadModel $model */ $model = $this->getModel('lead'); return $model->getEngagements($lead, $filters, $orderBy, $page); }
/** * Trigger events for the current lead * * @param Lead $lead */ public function triggerEvents(Lead $lead) { $points = $lead->getPoints(); //find all published triggers that is applicable to this points /** @var \Mautic\PointBundle\Entity\TriggerEventRepository $repo */ $repo = $this->getEventRepository(); $events = $repo->getPublishedByPointTotal($points); if (!empty($events)) { //get a list of actions that has already been applied to this lead $appliedEvents = $repo->getLeadTriggeredEvents($lead->getId()); $ipAddress = $this->factory->getIpAddress(); $persist = array(); foreach ($events as $event) { if (isset($appliedEvents[$event['id']])) { //don't apply the event to the lead if it's already been done continue; } if ($this->triggerEvent($event, $lead, true)) { $log = new LeadTriggerLog(); $log->setIpAddress($ipAddress); $log->setEvent($this->em->getReference('MauticPointBundle:TriggerEvent', $event['id'])); $log->setLead($lead); $log->setDateFired(new \DateTime()); $persist[] = $log; } } if (!empty($persist)) { $this->getEventRepository()->saveEntities($persist); $this->em->clear('Mautic\\PointBundle\\Entity\\LeadTriggerLog'); $this->em->clear('Mautic\\PointBundle\\Entity\\TriggerEvent'); } } }
/** * @param Lead $lead * @param $company * * @return bool */ public function addToCompany(Lead $lead, $company) { //check if lead is in company already if (!$company instanceof Company) { $company = $this->companyModel->getEntity($company); } $companyLead = $this->companyModel->getCompanyLeadRepository()->getCompaniesByLeadId($lead->getId(), $company->getId()); if (empty($companyLead)) { $this->companyModel->addLeadToCompany($company, $lead); return true; } return false; }
/** * Upload an asset * * @param Lead $lead */ private function uploadAvatar(Lead $lead) { $file = $this->request->files->get('lead[custom_avatar]', null, true); $avatarDir = $this->factory->getHelper('template.avatar')->getAvatarPath(true); if (!file_exists($avatarDir)) { mkdir($avatarDir); } $file->move($avatarDir, 'avatar' . $lead->getId()); //remove the file from request $this->request->files->remove('lead'); }
public function applyFrequencyRules(Lead $lead) { $frequencyRule = $lead->getFrequencyRules(); $statRepo = $this->smsModel->getStatRepository(); $now = new \DateTime(); $channels = $frequencyRule['channels']; $frequencyTime = $frequencyNumber = null; if (!empty($frequencyRule) && in_array('sms', $channels, true)) { $frequencyTime = new \DateInterval('P' . $frequencyRule['frequency_time']); $frequencyNumber = $frequencyRule['frequency_number']; } elseif ($this->smsFrequencyNumber > 0) { $frequencyTime = new \DateInterval('P' . $frequencyRule['sms_frequency_time']); $frequencyNumber = $this->smsFrequencyNumber; } $now->sub($frequencyTime); $sentQuery = $statRepo->getLeadStats($lead->getId(), array('fromDate' => $now)); if (!empty($sentQuery) && count($sentQuery) < $frequencyNumber) { return true; } elseif (empty($sentQuery)) { return true; } return false; }
/** * Fetch start/limit for queries. * * @return array */ public function getEventLimit() { return ['leadId' => $this->lead->getId(), 'limit' => $this->limit, 'start' => 1 === $this->page ? 0 : ($this->page - 1) * $this->limit]; }
/** * @param $slot * @param Lead|array $lead * * @return DynamicContent */ public function getSlotContentForLead($slot, $lead) { $qb = $this->em->getConnection()->createQueryBuilder(); $id = $lead instanceof Lead ? $lead->getId() : $lead['id']; $qb->select('dc.id, dc.content')->from(MAUTIC_TABLE_PREFIX . 'dynamic_content', 'dc')->leftJoin('dc', MAUTIC_TABLE_PREFIX . 'dynamic_content_lead_data', 'dcld', 'dcld.dynamic_content_id = dc.id')->andWhere($qb->expr()->eq('dcld.slot', ':slot'))->andWhere($qb->expr()->eq('dcld.lead_id', ':lead_id'))->setParameter('slot', $slot)->setParameter('lead_id', $id)->orderBy('dcld.date_added', 'DESC')->addOrderBy('dcld.id', 'DESC'); return $qb->execute()->fetch(); }
/** * Modify tags with support to remove via a prefixed minus sign * * @param Lead $lead * @param $tags * @param $removeTags * @param $persist */ public function modifyTags(Lead $lead, $tags, array $removeTags = null, $persist = true) { $logger = $this->factory->getLogger(); $leadTags = $lead->getTags(); if ($leadTags) { $logger->debug('LEAD: Lead currently has tags ' . implode(', ', $leadTags->getKeys())); } if (!is_array($tags)) { $tags = explode(',', $tags); } $logger->debug('CONTACT: Adding ' . implode(', ', $tags) . ' to contact ID# ' . $lead->getId()); array_walk($tags, create_function('&$val', '$val = trim($val); \\Mautic\\CoreBundle\\Helper\\InputHelper::clean($val);')); // See which tags already exist $foundTags = $this->getTagRepository()->getTagsByName($tags); foreach ($tags as $tag) { if (strpos($tag, '-') === 0) { // Tag to be removed $tag = substr($tag, 1); if (array_key_exists($tag, $foundTags) && $leadTags->contains($foundTags[$tag])) { $lead->removeTag($foundTags[$tag]); $logger->debug('LEAD: Removed ' . $tag); } } else { // Tag to be added if (!array_key_exists($tag, $foundTags)) { // New tag $newTag = new Tag(); $newTag->setTag($tag); $lead->addTag($newTag); $logger->debug('LEAD: Added ' . $tag); } elseif (!$leadTags->contains($foundTags[$tag])) { $lead->addTag($foundTags[$tag]); $logger->debug('LEAD: Added ' . $tag); } } } if (!empty($removeTags)) { $logger->debug('CONTACT: Removing ' . implode(', ', $removeTags) . ' for contact ID# ' . $lead->getId()); array_walk($removeTags, create_function('&$val', '$val = trim($val); \\Mautic\\CoreBundle\\Helper\\InputHelper::clean($val);')); // See which tags really exist $foundRemoveTags = $this->getTagRepository()->getTagsByName($removeTags); foreach ($removeTags as $tag) { // Tag to be removed if (array_key_exists($tag, $foundRemoveTags) && $leadTags->contains($foundRemoveTags[$tag])) { $lead->removeTag($foundRemoveTags[$tag]); $logger->debug('LEAD: Removed ' . $tag); } } } if ($persist) { $this->saveEntity($lead); } }
/** * Determine if this campaign applies * * @param $eventDetails * @param $event * * @return bool */ public static function validateFormValue(MauticFactory $factory, $event, Lead $lead) { if (!$lead || !$lead->getId()) { return false; } $operators = $factory->getModel('lead')->getFilterExpressionFunctions(); return $factory->getModel('lead.field')->getRepository()->compareValue($lead->getId(), $event['properties']['field'], $event['properties']['value'], $operators[$event['properties']['operator']]['expr']); }
/** * @param $fields * @param $data * @param null $owner * @param null $list * @param null $tags * @param bool $persist Persist to the database; otherwise return entity * * @return bool * @throws \Doctrine\ORM\ORMException * @throws \Swift_RfcComplianceException */ public function importLead($fields, $data, $owner = null, $list = null, $tags = null, $persist = true) { // Let's check for an existing lead by email $hasEmail = !empty($fields['email']) && !empty($data[$fields['email']]); if ($hasEmail) { // Validate the email MailHelper::validateEmail($data[$fields['email']]); $leadFound = $this->getRepository()->getLeadByEmail($data[$fields['email']]); $lead = $leadFound ? $this->em->getReference('MauticLeadBundle:Lead', $leadFound['id']) : new Lead(); $merged = $leadFound; } else { $lead = new Lead(); $merged = false; } if (!empty($fields['dateAdded']) && !empty($data[$fields['dateAdded']])) { $dateAdded = new DateTimeHelper($data[$fields['dateAdded']]); $lead->setDateAdded($dateAdded->getUtcDateTime()); } unset($fields['dateAdded']); if (!empty($fields['dateModified']) && !empty($data[$fields['dateModified']])) { $dateModified = new DateTimeHelper($data[$fields['dateModified']]); $lead->setDateModified($dateModified->getUtcDateTime()); } unset($fields['dateModified']); if (!empty($fields['lastActive']) && !empty($data[$fields['lastActive']])) { $lastActive = new DateTimeHelper($data[$fields['lastActive']]); $lead->setLastActive($lastActive->getUtcDateTime()); } unset($fields['lastActive']); if (!empty($fields['dateIdentified']) && !empty($data[$fields['dateIdentified']])) { $dateIdentified = new DateTimeHelper($data[$fields['dateIdentified']]); $lead->setDateIdentified($dateIdentified->getUtcDateTime()); } unset($fields['dateIdentified']); if (!empty($fields['createdByUser']) && !empty($data[$fields['createdByUser']])) { $userRepo = $this->em->getRepository('MauticUserBundle:User'); $createdByUser = $userRepo->findByIdentifier($data[$fields['createdByUser']]); if ($createdByUser !== null) { $lead->setCreatedBy($createdByUser); } } unset($fields['createdByUser']); if (!empty($fields['modifiedByUser']) && !empty($data[$fields['modifiedByUser']])) { $userRepo = $this->em->getRepository('MauticUserBundle:User'); $modifiedByUser = $userRepo->findByIdentifier($data[$fields['modifiedByUser']]); if ($modifiedByUser !== null) { $lead->setModifiedBy($modifiedByUser); } } unset($fields['modifiedByUser']); if (!empty($fields['ip']) && !empty($data[$fields['ip']])) { $addresses = explode(',', $data[$fields['ip']]); foreach ($addresses as $address) { $ipAddress = new IpAddress(); $ipAddress->setIpAddress(trim($address)); $lead->addIpAddress($ipAddress); } } unset($fields['ip']); if (!empty($fields['points']) && !empty($data[$fields['points']]) && $lead->getId() === null) { // Add points only for new leads $lead->setPoints($data[$fields['points']]); //add a lead point change log $log = new PointsChangeLog(); $log->setDelta($data[$fields['points']]); $log->setLead($lead); $log->setType('lead'); $log->setEventName($this->factory->getTranslator()->trans('mautic.lead.import.event.name')); $log->setActionName($this->factory->getTranslator()->trans('mautic.lead.import.action.name', array('%name%' => $this->factory->getUser()->getUsername()))); $log->setIpAddress($this->factory->getIpAddress()); $log->setDateAdded(new \DateTime()); $lead->addPointsChangeLog($log); } unset($fields['points']); if (!empty($fields['doNotEmail']) && !empty($data[$fields['doNotEmail']]) && $hasEmail) { $doNotEmail = filter_var($data[$fields['doNotEmail']], FILTER_VALIDATE_BOOLEAN); if ($doNotEmail) { $reason = $this->factory->getTranslator()->trans('mautic.lead.import.by.user', array("%user%" => $this->factory->getUser()->getUsername())); $this->setDoNotContact($lead, $data[$fields['email']], $reason, false); } } unset($fields['doNotEmail']); if ($owner !== null) { $lead->setOwner($this->em->getReference('MauticUserBundle:User', $owner)); } if ($tags !== null) { $this->modifyTags($lead, $tags, null, false); } foreach ($fields as $leadField => $importField) { // Prevent overwriting existing data with empty data if (array_key_exists($importField, $data) && !is_null($data[$importField]) && $data[$importField] != '') { $lead->addUpdatedField($leadField, $data[$importField]); } } $lead->imported = true; if ($persist) { $this->saveEntity($lead); if ($list !== null) { $this->addToLists($lead, array($list)); } } return $merged; }
/** * @param Lead $lead * @param $useFilters * @return mixed */ public function getNoteCount(Lead $lead, $useFilters = false) { $session = $this->factory->getSession(); $filter = $useFilters ? $session->get('mautic.lead.' . $lead->getId() . '.note.filter', '') : null; $noteType = $useFilters ? $session->get('mautic.lead.' . $lead->getId() . '.notetype.filter', array()) : null; return $this->getRepository()->getNoteCount($lead->getId(), $filter, $noteType); }
/** * {@inheritDoc} */ public function getId() { if ($this->__isInitialized__ === false) { return (int) parent::getId(); } $this->__initializer__ && $this->__initializer__->__invoke($this, 'getId', array()); return parent::getId(); }
/** * Execute or schedule an event. Condition events are executed recursively * * @param array $event * @param Campaign $campaign * @param Lead $lead * @param array $eventSettings * @param bool $allowNegative * @param \DateTime $parentTriggeredDate * @param \DateTime|bool $eventTriggerDate * @param bool $logExists * @param integer $evaluatedEventCount The number of events evaluated for the current method (kickoff, negative/inaction, scheduled) * @param integer $executedEventCount The number of events successfully executed for the current method * @param integer $totalEventCount The total number of events across all methods * * @return bool */ public function executeEvent($event, $campaign, $lead, $eventSettings = null, $allowNegative = false, \DateTime $parentTriggeredDate = null, $eventTriggerDate = null, $logExists = false, &$evaluatedEventCount = 0, &$executedEventCount = 0, &$totalEventCount = 0) { $evaluatedEventCount++; $totalEventCount++; // Get event settings if applicable if ($eventSettings === null) { /** @var \Mautic\CampaignBundle\Model\CampaignModel $campaignModel */ $campaignModel = $this->factory->getModel('campaign'); $eventSettings = $campaignModel->getEvents(); } // Set date timing should be compared with if applicable if ($parentTriggeredDate === null) { // Default to today $parentTriggeredDate = new \DateTime(); } $repo = $this->getRepository(); $logger = $this->factory->getLogger(); if (isset($eventSettings[$event['eventType']][$event['type']])) { $thisEventSettings = $eventSettings[$event['eventType']][$event['type']]; } else { $logger->debug('CAMPAIGN: Settings not found for ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId()); unset($event); return false; } if ($event['eventType'] == 'condition') { $allowNegative = true; } // Set campaign ID $event['campaign'] = array('id' => $campaign->getId(), 'name' => $campaign->getName()); // Ensure properties is an array if ($event['properties'] === null) { $event['properties'] = array(); } elseif (!is_array($event['properties'])) { $event['properties'] = unserialize($event['properties']); } // Ensure triggerDate is a \DateTime if ($event['triggerMode'] == 'date' && !$event['triggerDate'] instanceof \DateTime) { $triggerDate = new DateTimeHelper($event['triggerDate']); $event['triggerDate'] = $triggerDate->getDateTime(); unset($triggerDate); } if ($eventTriggerDate == null) { $eventTriggerDate = $this->checkEventTiming($event, $parentTriggeredDate, $allowNegative); } $result = true; // Create/get log entry if ($logExists) { $log = $this->em->getReference('MauticCampaignBundle:LeadEventLog', array('lead' => $lead->getId(), 'event' => $event['id'])); } else { $systemTriggered = !defined('MAUTIC_CAMPAIGN_NOT_SYSTEM_TRIGGERED'); $log = $this->getLogEntity($event['id'], $campaign, $lead, null, $systemTriggered); } if ($eventTriggerDate instanceof \DateTime) { $executedEventCount++; //lead actively triggered this event, a decision wasn't involved, or it was system triggered and a "no" path so schedule the event to be fired at the defined time $logger->debug('CAMPAIGN: ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId() . ' has timing that is not appropriate and thus scheduled for ' . $eventTriggerDate->format('Y-m-d H:m:i T')); $log->setIsScheduled(true); $log->setTriggerDate($eventTriggerDate); $repo->saveEntity($log); if ($this->dispatcher->hasListeners(CampaignEvents::ON_EVENT_SCHEDULED)) { $args = array('eventSettings' => $thisEventSettings, 'eventDetails' => null, 'event' => $event, 'lead' => $lead, 'factory' => $this->factory, 'systemTriggered' => true, 'dateScheduled' => $eventTriggerDate); $scheduledEvent = new CampaignScheduledEvent($args); $this->dispatcher->dispatch(CampaignEvents::ON_EVENT_SCHEDULED, $scheduledEvent); unset($scheduledEvent, $args); } } elseif ($eventTriggerDate) { $wasScheduled = $log->getIsScheduled(); $log->setIsScheduled(false); $log->setTriggerDate(null); $log->setDateTriggered(new \DateTime()); try { $repo->saveEntity($log); } catch (EntityNotFoundException $exception) { // The lead has been likely removed from this lead/list $logger->debug('CAMPAIGN: ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId() . ' wasn\'t found: ' . $exception->getMessage()); return false; } catch (DBALException $exception) { $logger->debug('CAMPAIGN: ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId() . ' failed with DB error: ' . $exception->getMessage()); return false; } //trigger the action $response = $this->invokeEventCallback($event, $thisEventSettings, $lead, null, true, $log); if ($response instanceof LeadEventLog) { // Listener handled the event and returned a log entry $repo->saveEntity($response); $this->em->detach($response); $executedEventCount++; $logger->debug('CAMPAIGN: Listener handled event for ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId()); } elseif ($response === false && $event['eventType'] == 'action') { $result = false; // Something failed if ($wasScheduled) { // Reschedule $log->setIsScheduled(true); $log->setTriggerDate(new \DateTime()); $log->setDateTriggered(null); $repo->saveEntity($log); } else { // Remove $repo->deleteEntity($log); } $logger->debug('CAMPAIGN: ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId() . ' failed with a response of ' . var_export($response, true)); } else { $executedEventCount++; if ($response !== true) { if ($this->triggeredResponses !== false) { if (!is_array($this->triggeredResponses[$event['eventType']])) { $this->triggeredResponses[$event['eventType']] = array(); } $this->triggeredResponses[$event['eventType']][$event['id']] = $response; } $log->setMetadata($response); $repo->saveEntity($log); } $logger->debug('CAMPAIGN: ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId() . ' successfully executed and logged with a response of ' . var_export($response, true)); } $this->handleCondition($response, $eventSettings, $event, $campaign, $lead, $evaluatedEventCount, $executedEventCount, $totalEventCount); } else { //else do nothing $result = false; $logger->debug('CAMPAIGN: Timing failed (' . gettype($eventTriggerDate) . ') for ' . ucfirst($event['eventType']) . ' ID# ' . $event['id'] . ' for contact ID# ' . $lead->getId()); } if (!empty($log)) { // Detach log $this->em->detach($log); unset($log); } unset($eventTriggerDate, $event); return $result; }
/** * @param Lead $lead */ public function applyFrequencyRules(Lead $lead) { $frequencyRule = $lead->getFrequencyRules(); /** @var \Mautic\EmailBundle\Model\EmailModel $emailModel */ $emailModel = $this->factory->getModel('email'); $statRepo = $emailModel->getStatRepository(); $now = new \DateTime(); $channels = $frequencyRule['channels']; if (!empty($frequencyRule) and in_array('email', $channels, true)) { $frequencyTime = new \DateInterval('P' . $frequencyRule['frequency_time']); $frequencyNumber = $frequencyRule['frequency_number']; } elseif ($this->factory->getParameter('frequency_number') > 0) { $frequencyTime = new \DateInterval('P' . $frequencyRule['frequency_time']); $frequencyNumber = $this->factory->getParameter('frequency_number'); } $now->sub($frequencyTime); $sentQuery = $statRepo->getLeadStats($lead->getId(), ['fromDate' => $now]); if (!empty($sentQuery) and count($sentQuery) < $frequencyNumber) { return true; } elseif (empty($sentQuery)) { return true; } return false; }