PageRenderTime 55ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/mautic/app/bundles/LeadBundle/EventListener/ReportSubscriber.php

https://gitlab.com/randydanniswara/website
PHP | 335 lines | 256 code | 37 blank | 42 comment | 12 complexity | df3153cb9c07081e1ec9e3876c5b6a0e MD5 | raw file
  1. <?php
  2. /**
  3. * @package Mautic
  4. * @copyright 2014 Mautic Contributors. All rights reserved.
  5. * @author Mautic
  6. * @link http://mautic.org
  7. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
  8. */
  9. namespace Mautic\LeadBundle\EventListener;
  10. use Mautic\CoreBundle\EventListener\CommonSubscriber;
  11. use Mautic\CoreBundle\Helper\GraphHelper;
  12. use Mautic\ReportBundle\Event\ReportBuilderEvent;
  13. use Mautic\ReportBundle\Event\ReportGeneratorEvent;
  14. use Mautic\ReportBundle\Event\ReportGraphEvent;
  15. use Mautic\ReportBundle\ReportEvents;
  16. /**
  17. * Class ReportSubscriber
  18. *
  19. * @package Mautic\LeadBundle\EventListener
  20. */
  21. class ReportSubscriber extends CommonSubscriber
  22. {
  23. /**
  24. * @return array
  25. */
  26. static public function getSubscribedEvents ()
  27. {
  28. return array(
  29. ReportEvents::REPORT_ON_BUILD => array('onReportBuilder', 0),
  30. ReportEvents::REPORT_ON_GENERATE => array('onReportGenerate', 0),
  31. ReportEvents::REPORT_ON_GRAPH_GENERATE => array('onReportGraphGenerate', 0)
  32. );
  33. }
  34. /**
  35. * Add available tables and columns to the report builder lookup
  36. *
  37. * @param ReportBuilderEvent $event
  38. *
  39. * @return void
  40. */
  41. public function onReportBuilder (ReportBuilderEvent $event)
  42. {
  43. if ($event->checkContext(array('leads', 'lead.pointlog'))) {
  44. $prefix = 'l.';
  45. $userPrefix = 'u.';
  46. $columns = array(
  47. $prefix . 'date_identified' => array(
  48. 'label' => 'mautic.lead.report.date_identified',
  49. 'type' => 'datetime'
  50. ),
  51. $prefix . 'points' => array(
  52. 'label' => 'mautic.lead.points',
  53. 'type' => 'int'
  54. ),
  55. $prefix . 'owner_id' => array(
  56. 'label' => 'mautic.lead.report.owner_id',
  57. 'type' => 'int'
  58. ),
  59. $userPrefix . 'first_name' => array(
  60. 'label' => 'mautic.lead.report.owner_firstname',
  61. 'type' => 'string'
  62. ),
  63. $userPrefix . 'last_name' => array(
  64. 'label' => 'mautic.lead.report.owner_lastname',
  65. 'type' => 'string'
  66. )
  67. );
  68. /** @var \Mautic\LeadBundle\Model\FieldModel $model */
  69. $model = $this->factory->getModel('lead.field');
  70. $leadFields = $model->getEntities();
  71. $fieldColumns = array();
  72. foreach ($leadFields as $f) {
  73. switch ($f->getType()) {
  74. case 'boolean':
  75. $type = 'bool';
  76. break;
  77. case 'date':
  78. case 'datetime':
  79. case 'time':
  80. $type = 'datetime';
  81. break;
  82. case 'url':
  83. $type = 'url';
  84. break;
  85. case 'email':
  86. $type = 'email';
  87. break;
  88. default:
  89. $type = 'string';
  90. break;
  91. }
  92. $fieldColumns[$prefix . $f->getAlias()] = array(
  93. 'label' => $f->getLabel(),
  94. 'type' => $type
  95. );
  96. }
  97. $columns = array_merge($columns, $fieldColumns);
  98. $data = array(
  99. 'display_name' => 'mautic.lead.leads',
  100. 'columns' => $columns
  101. );
  102. $event->addTable('leads', $data);
  103. // Add graphs
  104. $event->addGraph('leads', 'line', 'mautic.lead.graph.line.leads');
  105. if ($event->checkContext('lead.pointlog')) {
  106. $pointPrefix = 'lp.';
  107. $pointColumns = array(
  108. $pointPrefix . 'type' => array(
  109. 'label' => 'mautic.lead.report.points.type',
  110. 'type' => 'string'
  111. ),
  112. $pointPrefix . 'event_name' => array(
  113. 'label' => 'mautic.lead.report.points.event_name',
  114. 'type' => 'string'
  115. ),
  116. $pointPrefix . 'action_name' => array(
  117. 'label' => 'mautic.lead.report.points.action_name',
  118. 'type' => 'string'
  119. ),
  120. $pointPrefix . 'delta' => array(
  121. 'label' => 'mautic.lead.report.points.delta',
  122. 'type' => 'int'
  123. ),
  124. $pointPrefix . 'date_added' => array(
  125. 'label' => 'mautic.lead.report.points.date_added',
  126. 'type' => 'datetime'
  127. )
  128. );
  129. $data = array(
  130. 'display_name' => 'mautic.lead.report.points.table',
  131. 'columns' => array_merge($columns, $pointColumns, $event->getIpColumn())
  132. );
  133. $event->addTable('lead.pointlog', $data);
  134. // Register graphs
  135. $context = 'lead.pointlog';
  136. $event->addGraph($context, 'line', 'mautic.lead.graph.line.points');
  137. $event->addGraph($context, 'table', 'mautic.lead.table.most.points');
  138. $event->addGraph($context, 'table', 'mautic.lead.table.top.countries');
  139. $event->addGraph($context, 'table', 'mautic.lead.table.top.cities');
  140. $event->addGraph($context, 'table', 'mautic.lead.table.top.events');
  141. $event->addGraph($context, 'table', 'mautic.lead.table.top.actions');
  142. }
  143. }
  144. }
  145. /**
  146. * Initialize the QueryBuilder object to generate reports from
  147. *
  148. * @param ReportGeneratorEvent $event
  149. *
  150. * @return void
  151. */
  152. public function onReportGenerate (ReportGeneratorEvent $event)
  153. {
  154. $context = $event->getContext();
  155. if ($context == 'leads') {
  156. $qb = $this->factory->getEntityManager()->getConnection()->createQueryBuilder();
  157. $qb->from(MAUTIC_TABLE_PREFIX . 'leads', 'l');
  158. $qb->leftJoin('l', MAUTIC_TABLE_PREFIX . 'users', 'u', 'u.id = l.owner_id');
  159. $event->setQueryBuilder($qb);
  160. } elseif ($context == 'lead.pointlog') {
  161. $qb = $this->factory->getEntityManager()->getConnection()->createQueryBuilder();
  162. $qb->from(MAUTIC_TABLE_PREFIX . 'lead_points_change_log', 'lp')
  163. ->leftJoin('lp', MAUTIC_TABLE_PREFIX . 'leads', 'l', 'l.id = lp.lead_id')
  164. ->leftJoin('l', MAUTIC_TABLE_PREFIX . 'users', 'u', 'u.id = l.owner_id');
  165. $event->addIpAddressLeftJoin($qb, 'lp');
  166. $event->setQueryBuilder($qb);
  167. }
  168. }
  169. /**
  170. * Initialize the QueryBuilder object to generate reports from
  171. *
  172. * @param ReportGraphEvent $event
  173. *
  174. * @return void
  175. */
  176. public function onReportGraphGenerate (ReportGraphEvent $event)
  177. {
  178. // Context check, we only want to fire for Lead reports
  179. if (!$event->checkContext(array('leads', 'lead.pointlog'))) {
  180. return;
  181. }
  182. $graphs = $event->getRequestedGraphs();
  183. $qb = $event->getQueryBuilder();
  184. $pointLogRepo = $this->factory->getEntityManager()->getRepository('MauticLeadBundle:PointsChangeLog');
  185. foreach ($graphs as $g) {
  186. $options = $event->getOptions($g);
  187. $queryBuilder = clone $qb;
  188. switch ($g) {
  189. case 'mautic.lead.graph.line.leads':
  190. // Generate data for leads line graph
  191. $unit = 'D';
  192. $amount = 30;
  193. if (isset($options['amount'])) {
  194. $amount = $options['amount'];
  195. }
  196. if (isset($options['unit'])) {
  197. $unit = $options['unit'];
  198. }
  199. $timeStats = GraphHelper::prepareDatetimeLineGraphData($amount, $unit, array('leads', 'emails'));
  200. $queryBuilder->select('l.id as lead, l.date_added as "dateAdded", LENGTH(l.email) > 0 as email');
  201. $queryBuilder->andwhere($queryBuilder->expr()->gte('l.date_added', ':date'))
  202. ->setParameter('date', $timeStats['fromDate']->format('Y-m-d H:i:s'));
  203. $leads = $queryBuilder->execute()->fetchAll();
  204. $timeStats = GraphHelper::mergeLineGraphData($timeStats, $leads, $unit, 0, 'dateAdded');
  205. $timeStats = GraphHelper::mergeLineGraphData($timeStats, $leads, $unit, 1, 'dateAdded', 'email');
  206. $timeStats['name'] = 'mautic.lead.graph.line.leads';
  207. $event->setGraph($g, $timeStats);
  208. break;
  209. case 'mautic.lead.graph.line.points':
  210. // Generate data for points line graph
  211. $unit = 'D';
  212. $amount = 30;
  213. if (isset($options['amount'])) {
  214. $amount = $options['amount'];
  215. }
  216. if (isset($options['unit'])) {
  217. $unit = $options['unit'];
  218. }
  219. $timeStats = GraphHelper::prepareDatetimeLineGraphData($amount, $unit, array('points'));
  220. $queryBuilder->select('lp.lead_id as lead, lp.date_added as dateAdded, lp.delta');
  221. $queryBuilder->andwhere($queryBuilder->expr()->gte('lp.date_added', ':date'))
  222. ->setParameter('date', $timeStats['fromDate']->format('Y-m-d H:i:s'));
  223. $points = $queryBuilder->execute()->fetchAll();
  224. $timeStats = GraphHelper::mergeLineGraphData($timeStats, $points, $unit, 0, 'dateAdded', 'delta');
  225. $timeStats['name'] = 'mautic.lead.graph.line.points';
  226. $event->setGraph($g, $timeStats);
  227. break;
  228. case 'mautic.lead.table.most.points':
  229. $queryBuilder->select('l.id, l.email as title, sum(lp.delta) as points')
  230. ->groupBy('l.id, l.email')
  231. ->orderBy('points', 'DESC');
  232. $limit = 10;
  233. $offset = 0;
  234. $items = $pointLogRepo->getMostPoints($queryBuilder, $limit, $offset);
  235. $graphData = array();
  236. $graphData['data'] = $items;
  237. $graphData['name'] = 'mautic.lead.table.most.points';
  238. $graphData['iconClass'] = 'fa-asterisk';
  239. $graphData['link'] = 'mautic_lead_action';
  240. $event->setGraph($g, $graphData);
  241. break;
  242. case 'mautic.lead.table.top.countries':
  243. $queryBuilder->select('l.country as title, count(l.country) as quantity')
  244. ->groupBy('l.country')
  245. ->orderBy('quantity', 'DESC');
  246. $limit = 10;
  247. $offset = 0;
  248. $items = $pointLogRepo->getMostLeads($queryBuilder, $limit, $offset);
  249. $graphData = array();
  250. $graphData['data'] = $items;
  251. $graphData['name'] = 'mautic.lead.table.top.countries';
  252. $graphData['iconClass'] = 'fa-globe';
  253. $event->setGraph($g, $graphData);
  254. break;
  255. case 'mautic.lead.table.top.cities':
  256. $queryBuilder->select('l.city as title, count(l.city) as quantity')
  257. ->groupBy('l.city')
  258. ->orderBy('quantity', 'DESC');
  259. $limit = 10;
  260. $offset = 0;
  261. $items = $pointLogRepo->getMostLeads($queryBuilder, $limit, $offset);
  262. $graphData = array();
  263. $graphData['data'] = $items;
  264. $graphData['name'] = 'mautic.lead.table.top.cities';
  265. $graphData['iconClass'] = 'fa-university';
  266. $event->setGraph($g, $graphData);
  267. break;
  268. case 'mautic.lead.table.top.events':
  269. $queryBuilder->select('lp.event_name as title, count(lp.event_name) as events')
  270. ->groupBy('lp.event_name')
  271. ->orderBy('events', 'DESC');
  272. $limit = 10;
  273. $offset = 0;
  274. $items = $pointLogRepo->getMostPoints($queryBuilder, $limit, $offset);
  275. $graphData = array();
  276. $graphData['data'] = $items;
  277. $graphData['name'] = 'mautic.lead.table.top.events';
  278. $graphData['iconClass'] = 'fa-calendar';
  279. $event->setGraph($g, $graphData);
  280. break;
  281. case 'mautic.lead.table.top.actions':
  282. $queryBuilder->select('lp.action_name as title, count(lp.action_name) as actions')
  283. ->groupBy('lp.action_name')
  284. ->orderBy('actions', 'DESC');
  285. $limit = 10;
  286. $offset = 0;
  287. $items = $pointLogRepo->getMostPoints($queryBuilder, $limit, $offset);
  288. $graphData = array();
  289. $graphData['data'] = $items;
  290. $graphData['name'] = 'mautic.lead.table.top.actions';
  291. $graphData['iconClass'] = 'fa-bolt';
  292. $event->setGraph($g, $graphData);
  293. break;
  294. }
  295. unset($queryBuilder);
  296. }
  297. }
  298. }