/** * Gets total data array * * @param string $id The identifier of the subject * @param string $name The name of the subject * @param array $currentPeriod * @param array $previousPeriod * @param array $previousWholePeriod * @param array $detailed Details by each point on chart * @param ChartPeriodIterator $iterator optional Iterator is needed when it returns long form of array * @param bool $bshort optional Whether it should return short form of array * @return array Returns data array */ public function getTotalDataArray($id, $name, $currentPeriod, $previousPeriod, $previousWholePeriod, $detailed, ChartPeriodIterator $iterator = null, $bshort = false) { $cl = ['id' => $id, 'name' => $name, 'cost' => isset($currentPeriod['cost']) ? round($currentPeriod['cost'], 2) : 0, 'costPct' => isset($currentPeriod['cost_percentage']) ? $currentPeriod['cost_percentage'] : 0, 'prevCost' => isset($previousPeriod['cost']) ? round($previousPeriod['cost'], 2) : 0, 'prevCostPct' => isset($previousPeriod['cost_percentage']) ? $previousPeriod['cost_percentage'] : 0]; $cl['growth'] = $cl['cost'] - $cl['prevCost']; // growth $cl['growthPct'] = $cl['prevCost'] == 0 ? null : round(abs($cl['growth'] / $cl['prevCost'] * 100), 0); //growth percentage //short form of the data array if ($bshort) { return $cl; } // forecasted spend for period $cl['forecastCost'] = self::calculateForecast($cl['cost'], $iterator->getStart(), $iterator->getEnd(), $previousWholePeriod['cost'], ($cl['growth'] > 0 ? 1 : -1) * $cl['growthPct']); $mediandata = []; if (!empty($detailed[$id]['data'])) { $dt = $iterator->getStart(); //FIXME rewrite searching a point foreach ($detailed[$id]['data'] as $i => $v) { if ($dt > $iterator->today) { break; } $mediandata[] = !isset($v['cost']) ? 0 : $v['cost']; if ($iterator->getInterval() == '1 week') { $dt->modify('next sunday'); } else { $dt->add($iterator->getIterationInterval()); } } } $cl['median'] = empty($detailed[$id]['data']) ? 0 : round((double) Scalr_Util_Arrays::median($mediandata), 2); $cl['averageCost'] = count($mediandata) ? round(array_sum($mediandata) / count($mediandata), 2) : 0; // percentage difference between current and previous period $cl['curPrevPctGrowth'] = $cl['costPct'] - $cl['prevCostPct']; return $cl; }