/**
  * @param ObjectManager $manager
  */
 public function load(ObjectManager $manager)
 {
     $factory = $this->container->get('mautic.factory');
     $leadRepo = $factory->getModel('lead.lead')->getRepository();
     $today = new \DateTime();
     $leads = CsvHelper::csv_to_array(__DIR__ . '/fakeleaddata.csv');
     foreach ($leads as $count => $l) {
         $key = $count + 1;
         $lead = new Lead();
         $lead->setDateAdded($today);
         $ipAddress = new IpAddress();
         $ipAddress->setIpAddress($l['ip'], $factory->getSystemParameters());
         $this->setReference('ipAddress-' . $key, $ipAddress);
         unset($l['ip']);
         $lead->addIpAddress($ipAddress);
         $lead->setOwner($this->getReference('sales-user'));
         foreach ($l as $col => $val) {
             $lead->addUpdatedField($col, $val);
         }
         $leadRepo->saveEntity($lead);
         $this->setReference('lead-' . $count, $lead);
     }
 }
 /**
  * Get an IpAddress entity for current session or for passed in IP address
  *
  * @param string $ip
  *
  * @return IpAddress
  */
 public function getIpAddress($ip = null)
 {
     static $ipAddresses = array();
     if ($ip === null) {
         $ip = $this->getIpAddressFromRequest();
     }
     if (empty($ip)) {
         //assume local as the ip is empty
         $ip = '127.0.0.1';
     }
     if (empty($ipAddress[$ip])) {
         $repo = $this->getEntityManager()->getRepository('MauticCoreBundle:IpAddress');
         $ipAddress = $repo->findOneByIpAddress($ip);
         $saveIp = $ipAddress === null;
         if ($ipAddress === null) {
             $ipAddress = new IpAddress();
             $ipAddress->setIpAddress($ip);
         }
         // Ensure the do not track list is inserted
         $doNotTrack = $this->getParameter('do_not_track_ips', array());
         $internalIps = $this->getParameter('do_not_track_internal_ips', array());
         $doNotTrack = array_merge(array('127.0.0.1', '::1'), $doNotTrack, $internalIps);
         $ipAddress->setDoNotTrackList($doNotTrack);
         $details = $ipAddress->getIpDetails();
         if ($ipAddress->isTrackable() && empty($details['city'])) {
             // Get the IP lookup service
             if ($ipService = $this->getParameter('ip_lookup_service')) {
                 // Find the service class
                 $bundles = $this->getMauticBundles(true);
                 foreach ($bundles as $bundle) {
                     if (!empty($bundle['config']['ip_lookup_services'][$ipService])) {
                         $class = $bundle['config']['ip_lookup_services'][$ipService]['class'];
                         if (substr($class, 0, 1) !== '\\') {
                             $class = '\\' . $class;
                         }
                         /** @var \Mautic\CoreBundle\IpLookup\AbstractIpLookup $lookupClass */
                         $lookupClass = new $class($ip, $this->getParameter('ip_lookup_auth'), $this->getLogger());
                         // Fetch the data
                         $lookupClass->getData();
                         // Get and set the details
                         $details = get_object_vars($lookupClass);
                         $ipAddress->setIpDetails($details);
                         // Save new details
                         $saveIp = true;
                         unset($lookupClass);
                         break;
                     }
                 }
                 unset($bundles);
             }
         }
         if ($saveIp) {
             $repo->saveEntity($ipAddress);
         }
         $ipAddresses[$ip] = $ipAddress;
     }
     return $ipAddresses[$ip];
 }
Beispiel #3
0
 /**
  * Add ipAddress.
  *
  * @param IpAddress $ipAddress
  *
  * @return Lead
  */
 public function addIpAddress(IpAddress $ipAddress)
 {
     if (!$ipAddress->isTrackable()) {
         return $this;
     }
     $ip = $ipAddress->getIpAddress();
     if (!isset($this->ipAddresses[$ip])) {
         $this->isChanged('ipAddresses', $ipAddress);
         $this->ipAddresses[$ip] = $ipAddress;
     }
     return $this;
 }
Beispiel #4
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']);
     // Set unsubscribe status
     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()));
             // The email must be set for successful unsubscribtion
             $lead->addUpdatedField('email', $data[$fields['email']]);
             $this->unsubscribeLead($lead, $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);
     }
     // Set profile data
     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;
 }
Beispiel #5
0
 /**
  * Get an IpAddress entity for current session or for passed in IP address.
  *
  * @param string $ip
  *
  * @return IpAddress
  */
 public function getIpAddress($ip = null)
 {
     static $ipAddresses = [];
     if ($ip === null) {
         $ip = $this->getIpAddressFromRequest();
     }
     if (empty($ip)) {
         //assume local as the ip is empty
         $ip = '127.0.0.1';
     }
     if (empty($ipAddress[$ip])) {
         $repo = $this->em->getRepository('MauticCoreBundle:IpAddress');
         $ipAddress = $repo->findOneByIpAddress($ip);
         $saveIp = $ipAddress === null;
         if ($ipAddress === null) {
             $ipAddress = new IpAddress();
             $ipAddress->setIpAddress($ip);
         }
         // Ensure the do not track list is inserted
         if (!is_array($this->doNotTrackIps)) {
             $this->doNotTrackIps = [];
         }
         if (!is_array($this->doNotTrackInternalIps)) {
             $this->doNotTrackInternalIps = [];
         }
         $doNotTrack = array_merge(['127.0.0.1', '::1'], $this->doNotTrackIps, $this->doNotTrackInternalIps);
         $ipAddress->setDoNotTrackList($doNotTrack);
         $details = $ipAddress->getIpDetails();
         if ($ipAddress->isTrackable() && empty($details['city'])) {
             // Get the IP lookup service
             // Fetch the data
             if ($this->ipLookup) {
                 $details = $this->ipLookup->setIpAddress($ip)->getDetails();
                 $ipAddress->setIpDetails($details);
                 // Save new details
                 $saveIp = true;
             }
         }
         if ($saveIp) {
             $repo->saveEntity($ipAddress);
         }
         $ipAddresses[$ip] = $ipAddress;
     }
     return $ipAddresses[$ip];
 }
Beispiel #6
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->translator->trans('mautic.lead.import.event.name'));
         $log->setActionName($this->translator->trans('mautic.lead.import.action.name', array('%name%' => $this->user->getUsername())));
         $log->setIpAddress($this->ipLookupHelper->getIpAddress());
         $log->setDateAdded(new \DateTime());
         $lead->addPointsChangeLog($log);
     }
     if (!empty($fields['stage']) && !empty($data[$fields['stage']])) {
         static $stages = [];
         $stageName = $data[$fields['stage']];
         if (!array_key_exists($stageName, $stages)) {
             // Set stage for contact
             $stage = $this->em->getRepository('MauticStageBundle:Stage')->getStageByName($stageName);
             if (empty($stage)) {
                 $stage = new Stage();
                 $stage->setName($stageName);
                 $stages[$stageName] = $stage;
             }
         } else {
             $stage = $stages[$stageName];
         }
         $lead->setStage($stage);
         //add a contact stage change log
         $log = new StagesChangeLog();
         $log->setEventName($stage->getId() . ":" . $stage->getName());
         $log->setLead($lead);
         $log->setActionName($this->translator->trans('mautic.lead.import.action.name', ['%name%' => $this->user->getUsername()]));
         $log->setDateAdded(new \DateTime());
         $lead->stageChangeLog($log);
     }
     unset($fields['stage']);
     // Set unsubscribe status
     if (!empty($fields['doNotEmail']) && !empty($data[$fields['doNotEmail']]) && $hasEmail) {
         $doNotEmail = filter_var($data[$fields['doNotEmail']], FILTER_VALIDATE_BOOLEAN);
         if ($doNotEmail) {
             $reason = $this->translator->trans('mautic.lead.import.by.user', array("%user%" => $this->user->getUsername()));
             // The email must be set for successful unsubscribtion
             $lead->addUpdatedField('email', $data[$fields['email']]);
             $this->addDncForLead($lead, 'email', $reason, DoNotContact::MANUAL);
         }
     }
     unset($fields['doNotEmail']);
     if ($owner !== null) {
         $lead->setOwner($this->em->getReference('MauticUserBundle:User', $owner));
     }
     if ($tags !== null) {
         $this->modifyTags($lead, $tags, null, false);
     }
     // Set profile data using the form so that values are validated
     $fieldData = [];
     foreach ($fields as $leadField => $importField) {
         // Prevent overwriting existing data with empty data
         if (array_key_exists($importField, $data) && !is_null($data[$importField]) && $data[$importField] != '') {
             $fieldData[$leadField] = $data[$importField];
         }
     }
     static $leadFields;
     if (null === $leadFields) {
         $leadFields = $this->leadFieldModel->getEntities(array('force' => array(array('column' => 'f.isPublished', 'expr' => 'eq', 'value' => true)), 'hydration_mode' => 'HYDRATE_ARRAY'));
     }
     $form = $this->createForm($lead, $this->formFactory, null, ['fields' => $leadFields, 'csrf_protection' => false]);
     // Unset stage and owner from the form because it's already been handled
     unset($form['stage'], $form['owner']);
     $form->submit($fieldData);
     if (!$form->isValid()) {
         $fieldErrors = [];
         foreach ($form as $formField) {
             $errors = $formField->getErrors(true);
             if (count($errors)) {
                 $errorString = $formField->getConfig()->getOption('label') . ": ";
                 foreach ($errors as $error) {
                     $errorString .= " {$error->getMessage()}";
                 }
                 $fieldErrors[] = $errorString;
             }
         }
         $fieldErrors = implode("\n", $fieldErrors);
         throw new \Exception($fieldErrors);
     } else {
         // All clear
         foreach ($fieldData as $field => $value) {
             $lead->addUpdatedField($field, $value);
         }
     }
     $lead->imported = true;
     if ($persist) {
         $this->saveEntity($lead);
         if ($list !== null) {
             $this->addToLists($lead, array($list));
         }
     }
     return $merged;
 }
Beispiel #7
0
 /**
  * Get an IpAddress entity for current session or for passed in IP address
  *
  * @param string $ip
  *
  * @return IpAddress
  */
 public function getIpAddress($ip = null)
 {
     static $ipAddresses = array();
     if ($ip === null) {
         $ip = $this->getIpAddressFromRequest();
     }
     if (empty($ip)) {
         //assume local as the ip is empty
         $ip = '127.0.0.1';
     }
     if (empty($ipAddress[$ip])) {
         $repo = $this->getEntityManager()->getRepository('MauticCoreBundle:IpAddress');
         $ipAddress = $repo->findOneByIpAddress($ip);
         if ($ipAddress === null) {
             $ipAddress = new IpAddress();
             $ipAddress->setIpAddress($ip, $this->getSystemParameters());
             $repo->saveEntity($ipAddress);
         }
         // Ensure the do not track list is inserted
         $doNotTrack = $this->getParameter('do_not_track_ips');
         if (!empty($doNotTrack)) {
             $ipAddress->setDoNotTrackList($doNotTrack);
         }
         $ipAddresses[$ip] = $ipAddress;
     }
     return $ipAddresses[$ip];
 }
Beispiel #8
0
 /**
  * Get an IpAddress entity for current session or for passed in IP address
  *
  * @param string $ip
  *
  * @return IpAddress
  */
 public function getIpAddress($ip = null)
 {
     static $ipAddresses = array();
     if ($ip === null) {
         $ip = $this->getIpAddressFromRequest();
     }
     if (empty($ip)) {
         //assume local as the ip is empty
         $ip = '127.0.0.1';
     }
     if (empty($ipAddress[$ip])) {
         $repo = $this->getEntityManager()->getRepository('MauticCoreBundle:IpAddress');
         $ipAddress = $repo->findOneByIpAddress($ip);
         $saveIp = $ipAddress === null;
         if ($ipAddress === null) {
             $ipAddress = new IpAddress();
             $ipAddress->setIpAddress($ip);
         }
         // Ensure the do not track list is inserted
         $doNotTrack = $this->getParameter('do_not_track_ips', array());
         if (!is_array($doNotTrack)) {
             $doNotTrack = array();
         }
         $internalIps = $this->getParameter('do_not_track_internal_ips', array());
         if (!is_array($internalIps)) {
             $internalIps = array();
         }
         $doNotTrack = array_merge(array('127.0.0.1', '::1'), $doNotTrack, $internalIps);
         $ipAddress->setDoNotTrackList($doNotTrack);
         $details = $ipAddress->getIpDetails();
         if ($ipAddress->isTrackable() && empty($details['city'])) {
             // Get the IP lookup service
             // Fetch the data
             /** @var \Mautic\CoreBundle\IpLookup\AbstractLookup $ipLookup */
             $ipLookup = $this->container->get('mautic.ip_lookup');
             if ($ipLookup) {
                 $details = $ipLookup->setIpAddress($ip)->getDetails();
                 $ipAddress->setIpDetails($details);
                 // Save new details
                 $saveIp = true;
             }
         }
         if ($saveIp) {
             $repo->saveEntity($ipAddress);
         }
         $ipAddresses[$ip] = $ipAddress;
     }
     return $ipAddresses[$ip];
 }
 /**
  * {@inheritDoc}
  */
 public function isTrackable()
 {
     $this->__initializer__ && $this->__initializer__->__invoke($this, 'isTrackable', array());
     return parent::isTrackable();
 }
Beispiel #10
0
 /**
  * Get an IpAddress entity for current session or for passed in IP address
  *
  * @param string $ip
  *
  * @return IpAddress
  */
 public function getIpAddress($ip = null)
 {
     static $ipAddresses = array();
     if ($ip === null) {
         $ip = $this->getIpAddressFromRequest();
     }
     if (empty($ip)) {
         //assume local as the ip is empty
         $ip = '127.0.0.1';
     }
     if (empty($ipAddress[$ip])) {
         $repo = $this->getEntityManager()->getRepository('MauticCoreBundle:IpAddress');
         $ipAddress = $repo->findOneByIpAddress($ip);
         if ($ipAddress === null) {
             $ipAddress = new IpAddress();
             $ipAddress->setIpAddress($ip, $this->getSystemParameters());
             $repo->saveEntity($ipAddress);
         }
         $ipAddresses[$ip] = $ipAddress;
     }
     return $ipAddresses[$ip];
 }
Beispiel #11
0
 /**
  * Add ipAddresses
  *
  * @param IpAddress $ipAddresses
  *
  * @return Lead
  */
 public function addIpAddress(IpAddress $ipAddresses)
 {
     $ip = $ipAddresses->getIpAddress();
     if (!isset($this->ipAddresses[$ip])) {
         $this->isChanged('ipAddresses', $ipAddresses);
         $this->ipAddresses[$ip] = $ipAddresses;
     }
     return $this;
 }