/** * @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(); }
/** * {@inheritdoc} */ public function getConvertedValue(array $widgetConfig, $value = null, array $config = [], array $options = []) { if (is_null($value) || $value['value']['start'] === null && $value['value']['end'] === null) { list($start, $end) = $this->dateHelper->getDateTimeInterval('P1M'); $type = AbstractDateFilterType::TYPE_BETWEEN; } else { list($startValue, $endValue, $type) = $this->getPeriodValues($value); $start = $startValue instanceof DateTime ? $startValue : $this->dateCompiler->compile($startValue); $start->setTime(0, 0, 0); $end = $endValue instanceof DateTime ? $endValue : $this->dateCompiler->compile($endValue); $end->setTime(23, 59, 59); } return ['start' => $start, 'end' => $end, 'type' => $type]; }
/** * @dataProvider getRevenueOverTimeChartViewDataProvider */ public function testGetRevenueOverTimeChartView($sourceData, $expectedArrayData, $expectedOptions, $chartConfig) { $from = new DateTime('2015-05-10'); $to = new DateTime('2015-05-15'); $previousFrom = new DateTime('2015-05-05'); $previousTo = new DateTime('2015-05-10'); $this->dateHelper->expects($this->any())->method('getFormatStrings')->willReturn(['viewType' => 'day']); $this->dateHelper->expects($this->once())->method('getPeriod')->willReturnCallback(function ($dateRange) { return [$dateRange['start'], $dateRange['end']]; }); $this->dateHelper->expects($this->once())->method('convertToCurrentPeriod')->will($this->returnValue($expectedArrayData['2015-05-10 - 2015-05-15'])); $this->dateHelper->expects($this->once())->method('combinePreviousDataWithCurrentPeriod')->will($this->returnValue($expectedArrayData['2015-05-05 - 2015-05-10'])); $this->dateTimeFormatter->expects($this->exactly(4))->method('formatDate')->will($this->onConsecutiveCalls('2015-05-05', '2015-05-10', '2015-05-10', '2015-05-15')); $orderRepository = $this->getMockBuilder('OroCRM\\Bundle\\MagentoBundle\\Entity\\Repository\\OrderRepository')->disableOriginalConstructor()->getMock(); $orderRepository->expects($this->at(0))->method('getRevenueOverTime')->with($this->aclHelper, $this->dateHelper, $from, $to)->will($this->returnValue($sourceData[0])); $orderRepository->expects($this->at(1))->method('getRevenueOverTime')->with($this->aclHelper, $this->dateHelper, $previousFrom, $previousTo)->will($this->returnValue($sourceData[1])); $this->registry->expects($this->any())->method('getRepository')->with('OroCRMMagentoBundle:Order')->will($this->returnValue($orderRepository)); $chartView = $this->getMockBuilder('Oro\\Bundle\\ChartBundle\\Model\\ChartView')->disableOriginalConstructor()->getMock(); $chartViewBuilder = $this->getMockBuilder('Oro\\Bundle\\ChartBundle\\Model\\ChartViewBuilder')->disableOriginalConstructor()->getMock(); $chartViewBuilder->expects($this->once())->method('setOptions')->with($expectedOptions)->will($this->returnSelf()); $chartViewBuilder->expects($this->once())->method('setArrayData')->with($expectedArrayData)->will($this->returnSelf()); $chartViewBuilder->expects($this->once())->method('getView')->will($this->returnValue($chartView)); $this->configProvider->expects($this->once())->method('getChartConfig')->with('revenue_over_time_chart')->will($this->returnValue($chartConfig)); $this->assertEquals($chartView, $this->dataProvider->getRevenueOverTimeChartView($chartViewBuilder, ['start' => $from, 'end' => $to])); }
/** * Returns data grouped by created_at, data_channel_id * * @param AclHelper $aclHelper * @param DateHelper $dateHelper * @param \DateTime $dateFrom * @param \DateTime $dateTo * @param array $ids Filter by channel ids * * @return array */ public function getGroupedByChannelArray(AclHelper $aclHelper, DateHelper $dateHelper, \DateTime $dateFrom, \DateTime $dateTo = null, $ids = []) { $qb = $this->createQueryBuilder('c'); $qb->select('COUNT(c) as cnt', 'IDENTITY(c.dataChannel) as channelId'); $dateHelper->addDatePartsSelect($dateFrom, $dateTo, $qb, 'c.createdAt'); if ($dateTo) { $qb->andWhere($qb->expr()->between('c.createdAt', ':dateFrom', ':dateTo'))->setParameter('dateTo', $dateTo); } else { $qb->andWhere('c.createdAt > :dateFrom'); } $qb->setParameter('dateFrom', $dateFrom); $qb->addGroupBy('c.dataChannel'); if ($ids) { $qb->andWhere($qb->expr()->in('c.dataChannel', ':channelIds'))->setParameter('channelIds', $ids); } return $aclHelper->apply($qb)->getArrayResult(); }
public function testCombinePreviousDataWithCurrentPeriod() { $previousFrom = new DateTime('2015-05-05'); $previousTo = new DateTime('2015-05-10'); $data = [['yearCreated' => '2015', 'monthCreated' => '05', 'dayCreated' => '07', 'cnt' => 5]]; $expectedData = [['date' => '2015-05-10'], ['date' => '2015-05-11'], ['date' => '2015-05-12', 'count' => 5], ['date' => '2015-05-13'], ['date' => '2015-05-14'], ['date' => '2015-05-15']]; $actualData = $this->helper->combinePreviousDataWithCurrentPeriod($previousFrom, $previousTo, $data, 'cnt', 'count'); $this->assertEquals($expectedData, $actualData); }
/** * @param ChartViewBuilder $viewBuilder * @param array $dateRange * * @return ChartView */ public function getRevenueOverTimeChartView(ChartViewBuilder $viewBuilder, array $dateRange) { /* @var $from DateTime */ /* @var $to DateTime */ list($from, $to) = $this->dateHelper->getPeriod($dateRange, 'OroCRMMagentoBundle:Order', 'createdAt'); $orderRepository = $this->getOrderRepository(); $result = $orderRepository->getRevenueOverTime($this->aclHelper, $this->dateHelper, $from, $to); $items = $this->dateHelper->convertToCurrentPeriod($from, $to, $result, 'amount', 'amount'); $previousFrom = $this->createPreviousFrom($from, $to); $previousResult = $orderRepository->getRevenueOverTime($this->aclHelper, $this->dateHelper, $previousFrom, $from); $previousItems = $this->dateHelper->combinePreviousDataWithCurrentPeriod($previousFrom, $from, $previousResult, 'amount', 'amount'); $chartType = $this->dateHelper->getFormatStrings($from, $to)['viewType']; $data = [$this->createPeriodLabel($previousFrom, $from) => $previousItems, $this->createPeriodLabel($from, $to) => $items]; return $this->createPeriodChartView($viewBuilder, 'revenue_over_time_chart', $chartType, $data); }
/** * @param AclHelper $aclHelper * @param DateHelper $dateHelper * @param DateTime $from * @param DateTime|null $to * * @return array */ public function getRevenueOverTime(AclHelper $aclHelper, DateHelper $dateHelper, DateTime $from, DateTime $to = null) { $from = clone $from; $to = clone $to; $qb = $this->createQueryBuilder('o')->select('SUM( 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 amount'); $dateHelper->addDatePartsSelect($from, $to, $qb, 'o.createdAt'); if ($to) { $qb->andWhere($qb->expr()->between('o.createdAt', ':from', ':to'))->setParameter('to', $to); } else { $qb->andWhere('o.createdAt > :from'); } $qb->setParameter('from', $from); $this->applyActiveChannelLimitation($qb); return $aclHelper->apply($qb)->getResult(); }
/** * @dataProvider combinePreviousDataWithCurrentPeriodDataProvider */ public function testCombinePreviousDataWithCurrentPeriod($previousFrom, $previousTo, $data, $expectedData) { $actualData = $this->helper->combinePreviousDataWithCurrentPeriod($previousFrom, $previousTo, $data, 'cnt', 'count'); $this->assertEquals($expectedData, $actualData); }
/** * @dataProvider getPreviousDateTimeIntervalDataProvider * * @param Datetime $from * @param Datetime $to * @param Datetime $expectedStart * @param Datetime $expectedEnd */ public function testGetPreviousDateTimeInterval(\Datetime $from, \Datetime $to, \Datetime $expectedStart, \Datetime $expectedEnd) { list($start, $end) = $this->helper->getPreviousDateTimeInterval($from, $to); $this->assertEquals($start, $expectedStart); $this->assertEquals($end, $expectedEnd); }