/** * @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']); }
/** * {@inheritDoc} */ public function getDateAdded() { $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDateAdded', array()); return parent::getDateAdded(); }
/** * Merge two leads; if a conflict of data occurs, the newest lead will get precedence * * @param Lead $lead * @param Lead $lead2 * @param bool $autoMode If true, the newest lead will be merged into the oldes then deleted; otherwise, $lead will be merged into $lead2 then deleted * * @return Lead */ public function mergeLeads(Lead $lead, Lead $lead2, $autoMode = true) { $logger = $this->factory->getLogger(); $logger->debug('LEAD: Merging leads'); $leadId = $lead->getId(); $lead2Id = $lead2->getId(); //if they are the same lead, then just return one if ($leadId === $lead2Id) { $logger->debug('LEAD: Leads are the same'); return $lead; } if ($autoMode) { //which lead is the oldest? $mergeWith = $lead->getDateAdded() < $lead2->getDateAdded() ? $lead : $lead2; $mergeFrom = $mergeWith->getId() === $leadId ? $lead2 : $lead; } else { $mergeWith = $lead2; $mergeFrom = $lead; } $logger->debug('LEAD: Lead ID# ' . $mergeFrom->getId() . ' will be merged into ID# ' . $mergeWith->getId()); //dispatch pre merge event $event = new LeadMergeEvent($mergeWith, $mergeFrom); if ($this->dispatcher->hasListeners(LeadEvents::LEAD_PRE_MERGE)) { $this->dispatcher->dispatch(LeadEvents::LEAD_PRE_MERGE, $event); } //merge IP addresses $ipAddresses = $mergeFrom->getIpAddresses(); foreach ($ipAddresses as $ip) { $mergeWith->addIpAddress($ip); $logger->debug('LEAD: Associating with IP ' . $ip->getIpAddress()); } //merge fields $mergeFromFields = $mergeFrom->getFields(); foreach ($mergeFromFields as $group => $groupFields) { foreach ($groupFields as $alias => $details) { //overwrite old lead's data with new lead's if new lead's is not empty if (!empty($details['value'])) { $mergeWith->addUpdatedField($alias, $details['value']); $logger->debug('LEAD: Updated ' . $alias . ' = ' . $details['value']); } } } //merge owner $oldOwner = $mergeWith->getOwner(); $newOwner = $mergeFrom->getOwner(); if ($oldOwner === null && $newOwner !== null) { $mergeWith->setOwner($newOwner); $logger->debug('LEAD: New owner is ' . $newOwner->getId()); } //sum points $mergeWithPoints = $mergeWith->getPoints(); $mergeFromPoints = $mergeFrom->getPoints(); $mergeWith->setPoints($mergeWithPoints + $mergeFromPoints); $logger->debug('LEAD: Adding ' . $mergeFromPoints . ' points to lead'); //merge tags $mergeFromTags = $mergeFrom->getTags(); $addTags = $mergeFromTags->getKeys(); $this->modifyTags($mergeWith, $addTags, null, false); //save the updated lead $this->saveEntity($mergeWith, false); //post merge events if ($this->dispatcher->hasListeners(LeadEvents::LEAD_POST_MERGE)) { $this->dispatcher->dispatch(LeadEvents::LEAD_POST_MERGE, $event); } //delete the old $this->deleteEntity($mergeFrom); //return the merged lead return $mergeWith; }
/** * Merge two leads; if a conflict of data occurs, the newest lead will get precedence * * @param Lead $lead * @param Lead $lead2 */ public function mergeLeads(Lead $lead, Lead $lead2) { $leadId = $lead->getId(); $lead2Id = $lead2->getId(); //if they are the same lead, then just return one if ($leadId === $lead2Id) { return $lead; } //which lead is the oldest? $mergeWith = $lead->getDateAdded() < $lead2->getDateAdded() ? $lead : $lead2; $mergeFrom = $mergeWith->getId() === $leadId ? $lead2 : $lead; //dispatch pre merge event $event = new LeadMergeEvent($mergeWith, $mergeFrom); if ($this->dispatcher->hasListeners(LeadEvents::LEAD_PRE_MERGE)) { $this->dispatcher->dispatch(LeadEvents::LEAD_PRE_MERGE, $event); } //merge IP addresses $ipAddresses = $mergeFrom->getIpAddresses(); foreach ($ipAddresses as $ip) { $mergeWith->addIpAddress($ip); } //merge fields $mergeFromFields = $mergeFrom->getFields(); foreach ($mergeFromFields as $group => $groupFields) { foreach ($groupFields as $alias => $details) { //overwrite old lead's data with new lead's if new lead's is not empty if (!empty($details['value'])) { $mergeWith->addUpdatedField($alias, $details['value']); } } } //merge owner $oldOwner = $mergeWith->getOwner(); $newOwner = $mergeFrom->getOwner(); if ($oldOwner === null) { $mergeWith->setOwner($newOwner); } //sum points $mergeWithPoints = $mergeWith->getPoints(); $mergeFromPoints = $mergeFrom->getPoints(); $mergeWith->setPoints($mergeWithPoints + $mergeFromPoints); //save the updated lead $this->saveEntity($mergeWith, false); //post merge events if ($this->dispatcher->hasListeners(LeadEvents::LEAD_POST_MERGE)) { $this->dispatcher->dispatch(LeadEvents::LEAD_POST_MERGE, $event); } //delete the old $this->deleteEntity($mergeFrom); //return the merged lead return $mergeWith; }