generator = app('FireflyIII\Generator\Chart\Report\ReportChartGenerator'); } /** * Summarizes all income and expenses, per month, for a given year. * * @param ReportQueryInterface $query * @param $reportType * @param Carbon $start * @param Carbon $end * @param Collection $accounts * * @return \Illuminate\Http\JsonResponse */ public function yearInOut(ReportQueryInterface $query, $reportType, Carbon $start, Carbon $end, Collection $accounts) { // chart properties for cache: $cache = new CacheProperties; $cache->addProperty('yearInOut'); $cache->addProperty($start); $cache->addProperty($accounts); $cache->addProperty($end); if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } // spent per month, and earned per month. For a specific set of accounts // grouped by month $spentArray = $query->spentPerMonth($accounts, $start, $end); $earnedArray = $query->earnedPerMonth($accounts, $start, $end); // per year? put all months together. if ($start->diffInMonths($end) > 12) { $entries = new Collection; while ($start < $end) { $incomeSum = $this->pluckFromArray($start->year, $earnedArray); $expenseSum = $this->pluckFromArray($start->year, $spentArray) * -1; $entries->push([clone $start, $incomeSum, $expenseSum]); $start->addYear(); } $data = $this->generator->multiYearInOut($entries); $cache->store($data); } else { // per month? simply use each month. $entries = new Collection; while ($start < $end) { // total income and total expenses: $date = $start->format('Y-m'); $incomeSum = isset($earnedArray[$date]) ? $earnedArray[$date] : 0; $expenseSum = isset($spentArray[$date]) ? ($spentArray[$date] * -1) : 0; $entries->push([clone $start, $incomeSum, $expenseSum]); $start->addMonth(); } $data = $this->generator->yearInOut($entries); $cache->store($data); } return Response::json($data); } /** * Summarizes all income and expenses for a given year. Gives a total and an average. * * @param ReportQueryInterface $query * @param $reportType * @param Carbon $start * @param Carbon $end * @param Collection $accounts * * @return \Illuminate\Http\JsonResponse */ public function yearInOutSummarized(ReportQueryInterface $query, $reportType, Carbon $start, Carbon $end, Collection $accounts) { // chart properties for cache: $cache = new CacheProperties; $cache->addProperty('yearInOutSummarized'); $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty($accounts); if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } // spent per month, and earned per month. For a specific set of accounts // grouped by month $spentArray = $query->spentPerMonth($accounts, $start, $end); $earnedArray = $query->earnedPerMonth($accounts, $start, $end); $income = '0'; $expense = '0'; $count = 0; bcscale(2); if ($start->diffInMonths($end) > 12) { // per year while ($start < $end) { $currentIncome = $this->pluckFromArray($start->year, $earnedArray); $currentExpense = $this->pluckFromArray($start->year, $spentArray) * -1; $income = bcadd($income, $currentIncome); $expense = bcadd($expense, $currentExpense); $count++; $start->addYear(); } $data = $this->generator->multiYearInOutSummarized($income, $expense, $count); $cache->store($data); } else { // per month! while ($start < $end) { $date = $start->format('Y-m'); $currentIncome = isset($earnedArray[$date]) ? $earnedArray[$date] : 0; $currentExpense = isset($spentArray[$date]) ? ($spentArray[$date] * -1) : 0; $income = bcadd($income, $currentIncome); $expense = bcadd($expense, $currentExpense); $count++; $start->addMonth(); } $data = $this->generator->yearInOutSummarized($income, $expense, $count); $cache->store($data); } return Response::json($data); } /** * @param int $year * @param array $set * * @return string */ protected function pluckFromArray($year, array $set) { bcscale(2); $sum = '0'; foreach ($set as $date => $amount) { if (substr($date, 0, 4) == $year) { $sum = bcadd($sum, $amount); } } return $sum; } }