/** * @param ChartViewBuilder $viewBuilder * @param array $dateRange * * @return ChartView */ public function getNewCustomerChartView(ChartViewBuilder $viewBuilder, $dateRange) { /** @var CustomerRepository $customerRepository */ $customerRepository = $this->registry->getRepository('OroCRMMagentoBundle:Customer'); /** @var ChannelRepository $channelRepository */ $channelRepository = $this->registry->getRepository('OroCRMChannelBundle:Channel'); list($past, $now) = $this->dateHelper->getPeriod($dateRange, 'OroCRMMagentoBundle:Customer', 'createdAt'); $items = []; // get all integration channels $channels = $channelRepository->getAvailableChannelNames($this->aclHelper, ChannelType::TYPE); $channelIds = array_keys($channels); $dates = $this->dateHelper->getDatePeriod($past, $now); $data = $customerRepository->getGroupedByChannelArray($this->aclHelper, $this->dateHelper, $past, $now, $channelIds); foreach ($data as $row) { $key = $this->dateHelper->getKey($past, $now, $row); $channelId = (int) $row['channelId']; $channelName = $channels[$channelId]['name']; if (!isset($items[$channelName])) { $items[$channelName] = $dates; } if (isset($items[$channelName][$key])) { $items[$channelName][$key]['cnt'] = (int) $row['cnt']; } } // restore default keys foreach ($items as $channelName => $item) { $items[$channelName] = array_values($item); } $chartOptions = array_merge_recursive(['name' => 'multiline_chart'], $this->configProvider->getChartConfig('new_web_customers')); $chartType = $this->dateHelper->getFormatStrings($past, $now)['viewType']; $chartOptions['data_schema']['label']['type'] = $chartType; $chartOptions['data_schema']['label']['label'] = sprintf('oro.dashboard.chart.%s.label', $chartType); return $viewBuilder->setOptions($chartOptions)->setArrayData($items)->getView(); }
/** * @param AclHelper $aclHelper * @param \DateTime $dateFrom * @param \DateTime $dateTo * @param DateHelper $dateHelper * @return array */ public function getAverageOrderAmount(AclHelper $aclHelper, \DateTime $dateFrom, \DateTime $dateTo, DateHelper $dateHelper) { /** @var EntityManager $entityManager */ $entityManager = $this->getEntityManager(); $channels = $entityManager->getRepository('OroCRMChannelBundle:Channel')->getAvailableChannelNames($aclHelper, ChannelType::TYPE); // execute data query $queryBuilder = $this->createQueryBuilder('o'); $selectClause = ' IDENTITY(o.dataChannel) AS dataChannelId, AVG( CASE WHEN o.subtotalAmount IS NOT NULL THEN o.subtotalAmount ELSE 0 END - CASE WHEN o.discountAmount IS NOT NULL THEN ABS(o.discountAmount) ELSE 0 END ) as averageOrderAmount'; $dates = $dateHelper->getDatePeriod($dateFrom, $dateTo); $queryBuilder->select($selectClause)->andWhere($queryBuilder->expr()->between('o.createdAt', ':dateStart', ':dateEnd'))->setParameter('dateStart', $dateFrom)->setParameter('dateEnd', $dateTo)->groupBy('dataChannelId'); $this->applyActiveChannelLimitation($queryBuilder); $dateHelper->addDatePartsSelect($dateFrom, $dateTo, $queryBuilder, 'o.createdAt'); $amountStatistics = $aclHelper->apply($queryBuilder)->getArrayResult(); $items = []; foreach ($amountStatistics as $row) { $key = $dateHelper->getKey($dateFrom, $dateTo, $row); $channelId = (int) $row['dataChannelId']; $channelName = $channels[$channelId]['name']; if (!isset($items[$channelName])) { $items[$channelName] = $dates; } $items[$channelName][$key]['amount'] = (double) $row['averageOrderAmount']; } // restore default keys foreach ($items as $channelName => $item) { $items[$channelName] = array_values($item); } return $items; }
/** * @dataProvider datePeriodProvider */ public function testGetDatePeriod($start, $end, $expects) { $start = new \DateTime($start, new \DateTimeZone('UTC')); $end = new \DateTime($end, new \DateTimeZone('UTC')); $this->assertEquals($expects, $this->helper->getDatePeriod($start, $end)); }