Ejemplo n.º 1
0
 /**
  * @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;
 }
Ejemplo n.º 2
0
 /**
  * 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']);
 }
Ejemplo n.º 3
0
 /**
  * @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];
 }
Ejemplo n.º 4
0
 /**
  * @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']);
 }
Ejemplo n.º 5
0
 /**
  * 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']);
 }
Ejemplo n.º 6
0
 /**
  * @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;
 }
Ejemplo n.º 7
0
 /**
  * @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;
 }
Ejemplo n.º 8
0
 /**
  * @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);
         }
     }
 }
Ejemplo n.º 9
0
 /**
  * @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);
 }
Ejemplo n.º 10
0
 /**
  * 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');
         }
     }
 }
Ejemplo n.º 11
0
 /**
  * @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;
 }
Ejemplo n.º 12
0
 /**
  * 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');
 }
Ejemplo n.º 13
0
 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;
 }
Ejemplo n.º 14
0
 /**
  * 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];
 }
Ejemplo n.º 15
0
 /**
  * @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();
 }
Ejemplo n.º 16
0
 /**
  * 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);
     }
 }
Ejemplo n.º 17
0
 /**
  * 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']);
 }
Ejemplo n.º 18
0
 /**
  * @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;
 }
Ejemplo n.º 19
0
 /**
  * @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();
 }
Ejemplo n.º 21
0
 /**
  * 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;
 }
Ejemplo n.º 22
0
 /**
  * @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;
 }