Spaces:
No application file
No application file
File size: 4,783 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
<?php
namespace Mautic\LeadBundle\Entity;
use Doctrine\DBAL\Query\QueryBuilder;
use Mautic\CoreBundle\Helper\Chart\ChartQuery;
use Mautic\CoreBundle\Helper\DateTimeHelper;
use Mautic\CoreBundle\Helper\Serializer;
trait TimelineTrait
{
/**
* @param QueryBuilder $query DBAL QueryBuilder
* @param array<mixed> $options Query optons from LeadTimelineEvent
* @param string $eventNameColumn Name of column to sort event name by
* @param string $timestampColumn Name of column to sort timestamp by
* @param array<mixed> $serializedColumns Array of columns to unserialize
* @param array<mixed> $dateTimeColumns Array of columns to be converted to \DateTime
* @param mixed|null $resultsParserCallback Callback to custom parse results
*
* @return array<mixed>
*/
private function getTimelineResults(
QueryBuilder $query,
array $options,
$eventNameColumn,
$timestampColumn,
$serializedColumns = [],
$dateTimeColumns = [],
$resultsParserCallback = null
) {
if (!empty($options['unitCounts'])) {
[$tablePrefix, $column] = explode('.', $timestampColumn);
// Get counts grouped by unit based on date range
/** @var ChartQuery $cq */
$cq = $options['chartQuery'];
$cq->modifyTimeDataQuery($query, $column, $tablePrefix);
$cq->applyDateFilters($query, $column, $tablePrefix);
$data = $query->execute()->fetchAllAssociative();
return $cq->completeTimeData($data);
}
if (!empty($options['fromDate']) && !empty($options['toDate'])) {
$query->andWhere($timestampColumn.' BETWEEN :dateFrom AND :dateTo')
->setParameter('dateFrom', $options['fromDate']->format('Y-m-d H:i:s'))
->setParameter('dateTo', $options['toDate']->format('Y-m-d H:i:s'));
} elseif (!empty($options['fromDate'])) {
$query->andWhere($query->expr()->gte($timestampColumn, ':dateFrom'))
->setParameter('dateFrom', $options['fromDate']->format('Y-m-d H:i:s'));
} elseif (!empty($options['toDate'])) {
$query->andWhere($query->expr()->lte($timestampColumn, ':dateTo'))
->setParameter('dateTo', $options['toDate']->format('Y-m-d H:i:s'));
}
if (isset($options['leadIds'])) {
$leadColumn = $this->getTableAlias().'.lead_id';
$query->addSelect($leadColumn);
$query->andWhere(
$query->expr()->in($leadColumn, $options['leadIds'])
);
}
if (isset($options['order'])) {
[$orderBy, $orderByDir] = $options['order'];
$orderBy = match ($orderBy) {
'eventLabel' => $eventNameColumn,
default => $timestampColumn,
};
$query->orderBy($orderBy, $orderByDir);
}
if (!empty($options['limit'])) {
$query->setMaxResults($options['limit']);
if (!empty($options['start'])) {
$query->setFirstResult($options['start']);
}
}
$results = $query->executeQuery()->fetchAllAssociative();
if (!empty($serializedColumns) || !empty($dateTimeColumns) || is_callable($resultsParserCallback)) {
// Convert to array or \DateTime since we're using DBAL here
foreach ($results as &$result) {
foreach ($serializedColumns as $col) {
if (isset($result[$col])) {
$result[$col] = (null == $result[$col]) ? [] : Serializer::decode($result[$col]);
}
}
foreach ($dateTimeColumns as $col) {
if (isset($result[$col]) && !empty($result[$col])) {
$dt = new DateTimeHelper($result[$col], 'Y-m-d H:i:s', 'UTC');
$result[$col] = $dt->getLocalDateTime();
unset($dt);
}
}
if (is_callable($resultsParserCallback)) {
$resultsParserCallback($result);
}
}
}
if (!empty($options['paginated'])) {
// Get a total count along with results
$query->resetQueryParts(['select', 'orderBy'])
->setFirstResult(0)
->setMaxResults(null)
->select('count(*)');
$total = $query->executeQuery()->fetchOne();
return [
'total' => $total,
'results' => $results,
];
}
return $results;
}
}
|