mautic / app /bundles /PluginBundle /Entity /IntegrationEntityRepository.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
raw
history blame contribute delete
20 kB
<?php
namespace Mautic\PluginBundle\Entity;
use Doctrine\DBAL\ArrayParameterType;
use Doctrine\DBAL\Query\Expression\CompositeExpression;
use Mautic\CoreBundle\Entity\CommonRepository;
/**
* @extends CommonRepository<IntegrationEntity>
*/
class IntegrationEntityRepository extends CommonRepository
{
/**
* @param array<int>|int|null $internalEntityIds
* @param mixed $startDate
* @param mixed $endDate
* @param bool $push
* @param int $start
* @param int $limit
* @param int|string|array<int|string>|null $integrationEntityIds
*/
public function getIntegrationsEntityId(
$integration,
$integrationEntity,
$internalEntity,
$internalEntityIds = null,
$startDate = null,
$endDate = null,
$push = false,
$start = 0,
$limit = 0,
$integrationEntityIds = null
): array {
$q = $this->_em->getConnection()->createQueryBuilder()
->select('DISTINCT(i.integration_entity_id), i.id, i.internal_entity_id, i.integration_entity, i.internal_entity')
->from(MAUTIC_TABLE_PREFIX.'integration_entity', 'i');
$q->where('i.integration = :integration')
->andWhere('i.internal_entity = :internalEntity')
->setParameter('integration', $integration)
->setParameter('internalEntity', $internalEntity);
if ($integrationEntity) {
$q->andWhere('i.integration_entity = :integrationEntity')
->setParameter('integrationEntity', $integrationEntity);
}
if ('lead' === $internalEntity) {
$joinCondition = $q->expr()->and(
$q->expr()->eq('l.id', 'i.internal_entity_id')
);
if ($push) {
$joinCondition->with(
$q->expr()->gte('l.last_active', ':startDate')
);
$q->setParameter('startDate', $startDate);
}
$q->join('i', MAUTIC_TABLE_PREFIX.'leads', 'l', $joinCondition);
}
if ($internalEntityIds) {
if (is_array($internalEntityIds)) {
$q->andWhere('i.internal_entity_id in (:internalEntityIds)')
->setParameter('internalEntityIds', $internalEntityIds, ArrayParameterType::STRING);
} else {
$q->andWhere('i.internal_entity_id = :internalEntityId')
->setParameter('internalEntityId', $internalEntityIds);
}
}
if ($startDate and !$push) {
$q->andWhere('i.last_sync_date >= :startDate')
->setParameter('startDate', $startDate);
}
if ($endDate and !$push) {
$q->andWhere('i.last_sync_date <= :endDate')
->setParameter('endDate', $endDate);
}
if ($integrationEntityIds) {
if (is_array($integrationEntityIds)) {
$q->andWhere('i.integration_entity_id in (:integrationEntityIds)')
->setParameter('integrationEntityIds', $integrationEntityIds, ArrayParameterType::STRING);
} else {
$q->andWhere('i.integration_entity_id = :integrationEntityId')
->setParameter('integrationEntityId', $integrationEntityIds);
}
}
if ($start) {
$q->setFirstResult((int) $start);
}
if ($limit) {
$q->setMaxResults((int) $limit);
}
return $q->executeQuery()->fetchAllAssociative();
}
/**
* @return array
*/
public function getIntegrationEntity($integration, $integrationEntity, $internalEntity, $internalEntityId, $leadFields = null)
{
$q = $this->_em->getConnection()->createQueryBuilder()
->from(MAUTIC_TABLE_PREFIX.'integration_entity', 'i')
->join('i', MAUTIC_TABLE_PREFIX.'leads', 'l', 'l.id = i.internal_entity_id');
$q->select('i.integration_entity_id, i.integration_entity, i.id, i.internal_entity_id');
if ($leadFields) {
$q->addSelect($leadFields);
}
$q->where(
$q->expr()->and(
$q->expr()->eq('i.integration', ':integration'),
$q->expr()->eq('i.internal_entity', ':internalEntity'),
$q->expr()->eq('i.integration_entity', ':integrationEntity'),
$q->expr()->eq('i.internal_entity_id', (int) $internalEntityId)
)
)
->setParameter('integration', $integration)
->setParameter('internalEntity', $internalEntity)
->setParameter('integrationEntity', $integrationEntity)
->setMaxResults(1);
$results = $q->executeQuery()->fetchAllAssociative();
return ($results) ? $results[0] : null;
}
/**
* @return IntegrationEntity[]
*/
public function getIntegrationEntities($integration, $integrationEntity, $internalEntity, $internalEntityIds)
{
$q = $this->createQueryBuilder('i', 'i.internalEntityId');
$q->where(
$q->expr()->andX(
$q->expr()->eq('i.integration', ':integration'),
$q->expr()->eq('i.internalEntity', ':internalEntity'),
$q->expr()->eq('i.integrationEntity', ':integrationEntity'),
$q->expr()->in('i.internalEntityId', ':internalEntityIds')
)
)
->setParameter('integration', $integration)
->setParameter('internalEntity', $internalEntity)
->setParameter('integrationEntity', $integrationEntity)
->setParameter('internalEntityIds', $internalEntityIds);
return $q->getQuery()->getResult();
}
/**
* @param int $limit
* @param array|string $integrationEntity
* @param array $excludeIntegrationIds
*
* @return mixed[]
*/
public function findLeadsToUpdate(
$integration,
$internalEntity,
$leadFields,
$limit = 25,
$fromDate = null,
$toDate = null,
$integrationEntity = ['Contact', 'Lead'],
$excludeIntegrationIds = []
): array {
if ('company' == $internalEntity) {
$joinTable = 'companies';
} else {
$joinTable = 'leads';
}
$q = $this->_em->getConnection()->createQueryBuilder()
->from(MAUTIC_TABLE_PREFIX.'integration_entity', 'i')
->join('i', MAUTIC_TABLE_PREFIX.$joinTable, 'l', 'l.id = i.internal_entity_id');
if (false === $limit) {
$q->select('count(i.integration_entity_id) as total');
if ($integrationEntity) {
$q->addSelect('i.integration_entity');
}
} else {
$q->select('i.integration_entity_id, i.integration_entity, i.id, i.internal_entity_id,'.$leadFields);
}
$q->where('i.integration = :integration');
if ($integrationEntity) {
if (!is_array($integrationEntity)) {
$integrationEntity = [$integrationEntity];
}
$sub = null;
foreach ($integrationEntity as $key => $entity) {
if (null === $sub) {
$sub = CompositeExpression::or($q->expr()->eq('i.integration_entity', ':entity'.$key));
$q->setParameter('entity'.$key, $entity);
continue;
}
$sub->with($q->expr()->eq('i.integration_entity', ':entity'.$key));
$q->setParameter('entity'.$key, $entity);
}
$q->andWhere($sub);
}
$q->andWhere('i.internal_entity = :internalEntity')
->setParameter('integration', $integration)
->setParameter('internalEntity', $internalEntity);
if (!empty($excludeIntegrationIds)) {
$q->andWhere(
$q->expr()->notIn(
'i.integration_entity_id',
array_map(
fn ($x): string => "'".$x."'",
$excludeIntegrationIds
)
)
);
}
$q->andWhere(
$q->expr()->and(
$q->expr()->isNotNull('i.integration_entity_id'),
$q->expr()->or(
$q->expr()->and(
$q->expr()->isNotNull('i.last_sync_date'),
$q->expr()->gt('l.date_modified', 'i.last_sync_date')
),
$q->expr()->and(
$q->expr()->isNull('i.last_sync_date'),
$q->expr()->isNotNull('l.date_modified'),
$q->expr()->gt('l.date_modified', 'l.date_added')
)
)
)
);
if ('lead' == $internalEntity) {
$q->andWhere(
$q->expr()->and($q->expr()->isNotNull('l.email')));
} else {
$q->andWhere(
$q->expr()->and($q->expr()->isNotNull('l.companyname')));
}
if ($fromDate) {
if ($toDate) {
$q->andWhere(
$q->expr()->comparison('l.date_modified', 'BETWEEN', ':dateFrom and :dateTo')
)
->setParameter('dateFrom', $fromDate)
->setParameter('dateTo', $toDate);
} else {
$q->andWhere(
$q->expr()->gte('l.date_modified', ':dateFrom')
)
->setParameter('dateFrom', $fromDate);
}
} elseif ($toDate) {
$q->andWhere(
$q->expr()->lte('l.date_modified', ':dateTo')
)
->setParameter('dateTo', $toDate);
}
// Group by email to prevent duplicates from affecting this
if (false === $limit and $integrationEntity) {
$q->groupBy('i.integration_entity')->having('total');
}
if ($limit) {
$q->setMaxResults($limit);
}
$results = $q->executeQuery()->fetchAllAssociative();
$leads = [];
if ($integrationEntity) {
foreach ($integrationEntity as $entity) {
$leads[$entity] = (false === $limit) ? 0 : [];
}
}
foreach ($results as $result) {
if ($integrationEntity) {
if (false === $limit) {
$leads[$result['integration_entity']] = (int) $result['total'];
} else {
$leads[$result['integration_entity']][$result['internal_entity_id']] = $result;
}
} else {
$leads[$result['internal_entity_id']] = $result['internal_entity_id'];
}
}
return $leads;
}
/**
* @param int $limit
*
* @return array|int
*/
public function findLeadsToCreate($integration, $leadFields, $limit = 25, $fromDate = null, $toDate = null, $internalEntity = 'lead')
{
if ('company' == $internalEntity) {
$joinTable = 'companies';
} else {
$joinTable = 'leads';
}
$q = $this->_em->getConnection()->createQueryBuilder()
->from(MAUTIC_TABLE_PREFIX.$joinTable, 'l');
if (false === $limit) {
$q->select('count(*) as total');
} else {
$q->select('l.id as internal_entity_id,'.$leadFields);
}
if ('company' == $internalEntity) {
$q->where('not exists (select null from '.MAUTIC_TABLE_PREFIX
.'integration_entity i where i.integration = :integration and i.internal_entity LIKE "'.$internalEntity.'%" and i.internal_entity_id = l.id)')
->setParameter('integration', $integration);
} else {
$q->where('l.date_identified is not null')
->andWhere(
'not exists (select null from '.MAUTIC_TABLE_PREFIX
.'integration_entity i where i.integration = :integration and i.internal_entity LIKE "'.$internalEntity.'%" and i.internal_entity_id = l.id)'
)
->setParameter('integration', $integration);
}
if ('company' == $internalEntity) {
$q->andWhere('l.companyname is not null');
} else {
$q->andWhere('l.email is not null');
}
if ($limit) {
$q->setMaxResults($limit);
}
if ($fromDate) {
if ($toDate) {
$q->andWhere(
$q->expr()->or(
$q->expr()->and(
$q->expr()->isNotNull('l.date_modified'),
$q->expr()->comparison('l.date_modified', 'BETWEEN', ':dateFrom and :dateTo')
),
$q->expr()->and(
$q->expr()->isNull('l.date_modified'),
$q->expr()->comparison('l.date_added', 'BETWEEN', ':dateFrom and :dateTo')
)
)
)
->setParameter('dateFrom', $fromDate)
->setParameter('dateTo', $toDate);
} else {
$q->andWhere(
$q->expr()->or(
$q->expr()->and(
$q->expr()->isNotNull('l.date_modified'),
$q->expr()->gte('l.date_modified', ':dateFrom')
),
$q->expr()->and(
$q->expr()->isNull('l.date_modified'),
$q->expr()->gte('l.date_added', ':dateFrom')
)
)
)
->setParameter('dateFrom', $fromDate);
}
} elseif ($toDate) {
$q->andWhere(
$q->expr()->or(
$q->expr()->and(
$q->expr()->isNotNull('l.date_modified'),
$q->expr()->lte('l.date_modified', ':dateTo')
),
$q->expr()->and(
$q->expr()->isNull('l.date_modified'),
$q->expr()->lte('l.date_added', ':dateTo')
)
)
)
->setParameter('dateTo', $toDate);
}
$results = $q->executeQuery()->fetchAllAssociative();
if (false === $limit) {
return (int) $results[0]['total'];
}
$leads = [];
foreach ($results as $result) {
$leads[$result['internal_entity_id']] = $result;
}
return $leads;
}
/**
* @return int
*/
public function getIntegrationEntityCount($leadId, $integration = null, $integrationEntity = null, $internalEntity = null)
{
return $this->getIntegrationEntityByLead($leadId, $integration, $integrationEntity, $internalEntity, false);
}
/**
* @param int|bool $limit
*
* @return array|int
*/
public function getIntegrationEntityByLead($leadId, $integration = null, $integrationEntity = null, $internalEntity = null, $limit = 100)
{
$q = $this->_em->getConnection()->createQueryBuilder()
->from(MAUTIC_TABLE_PREFIX.'integration_entity', 'i');
if (false === $limit) {
$q->select('count(*) as total');
} else {
$q->select('i.integration, i.integration_entity, i.integration_entity_id, i.date_added, i.last_sync_date, i.internal');
}
$q->where('i.internal not like \'%error%\' and i.integration_entity_id is not null');
$q->orderBy('i.last_sync_date', 'DESC');
if (empty($integration)) {
// get list of published integrations
$pq = $this->_em->getConnection()->createQueryBuilder()
->select('p.name')
->from(MAUTIC_TABLE_PREFIX.'plugin_integration_settings', 'p')
->where('p.is_published = 1');
$rows = $pq->executeQuery()->fetchAllAssociative();
$plugins = array_map(static fn ($i): string => "'{$i['name']}'", $rows);
if (count($plugins) > 0) {
$q->andWhere($q->expr()->in('i.integration', $plugins));
} else {
return [];
}
} else {
$q->andWhere($q->expr()->eq('i.integration', ':integration'));
$q->setParameter('integration', $integration);
}
$q->andWhere(
$q->expr()->and(
"i.internal_entity='lead'",
$q->expr()->eq('i.internal_entity_id', ':internalEntityId')
)
);
$q->setParameter('internalEntityId', $leadId);
if (!empty($internalEntity)) {
$q->andWhere($q->expr()->eq('i.internalEntity', ':internalEntity'));
$q->setParameter('internalEntity', $internalEntity);
}
if (!empty($integrationEntity)) {
$q->andWhere($q->expr()->eq('i.integrationEntity', ':integrationEntity'));
$q->setParameter('integrationEntity', $integrationEntity);
}
$results = $q->executeQuery()->fetchAllAssociative();
if (false === $limit && count($results) > 0) {
return (int) $results[0]['total'];
}
return $results;
}
public function markAsDeleted(array $integrationIds, $integration, $internalEntityType): void
{
$q = $this->_em->getConnection()->createQueryBuilder();
$q->update(MAUTIC_TABLE_PREFIX.'integration_entity')
->set('internal_entity', ':entity')
->where(
$q->expr()->and(
$q->expr()->eq('integration', ':integration'),
$q->expr()->in('integration_entity_id', array_map([$q->expr(), 'literal'], $integrationIds))
)
)
->setParameter('integration', $integration)
->setParameter('entity', $internalEntityType.'-deleted')
->executeStatement();
}
public function findLeadsToDelete($internalEntity, $leadId): void
{
$q = $this->_em->getConnection()->createQueryBuilder()
->delete(MAUTIC_TABLE_PREFIX.'integration_entity')
->from(MAUTIC_TABLE_PREFIX.'integration_entity');
$q->where('internal_entity_id = :leadId')
->andWhere($q->expr()->like('internal_entity', ':internalEntity'))
->setParameter('leadId', $leadId)
->setParameter('internalEntity', $internalEntity)
->executeStatement();
}
public function updateErrorLeads($internalEntity, $leadId): void
{
$q = $this->_em->getConnection()->createQueryBuilder()
->update(MAUTIC_TABLE_PREFIX.'integration_entity')
->set('internal_entity', ':lead')->setParameter('lead', 'lead');
$q->where('internal_entity_id = :leadId')
->andWhere($q->expr()->isNotNull('integration_entity_id'))
->andWhere($q->expr()->eq('internal_entity', ':internalEntity'))
->setParameter('leadId', $leadId)
->setParameter('internalEntity', $internalEntity)
->executeStatement();
$z = $this->_em->getConnection()->createQueryBuilder()
->delete(MAUTIC_TABLE_PREFIX.'integration_entity')
->from(MAUTIC_TABLE_PREFIX.'integration_entity');
$z->where('internal_entity_id = :leadId')
->andWhere($q->expr()->isNull('integration_entity_id'))
->andWhere($q->expr()->like('internal_entity', ':internalEntity'))
->setParameter('leadId', $leadId)
->setParameter('internalEntity', $internalEntity)
->executeStatement();
}
}