/** * @param $reportType * @param Carbon $start * @param Carbon $end * @param Collection $accounts * @param Collection $categories * * @return \Illuminate\Http\JsonResponse */ public function multiYear($reportType, Carbon $start, Carbon $end, Collection $accounts, Collection $categories) { /** @var CRI $repository */ $repository = app('FireflyIII\\Repositories\\Category\\CategoryRepositoryInterface'); // chart properties for cache: $cache = new CacheProperties(); $cache->addProperty($reportType); $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty($accounts); $cache->addProperty($categories); $cache->addProperty('multiYearCategory'); if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } $entries = new Collection(); $set = $repository->listMultiYear($categories, $accounts, $start, $end); /** @var Category $category */ foreach ($categories as $category) { $entry = ['name' => '', 'spent' => [], 'earned' => []]; $currentStart = clone $start; while ($currentStart < $end) { // fix the date: $year = $currentStart->year; $currentEnd = clone $currentStart; $currentEnd->endOfYear(); // get data: if (is_null($category->id)) { $name = trans('firefly.noCategory'); $spent = $repository->sumSpentNoCategory($accounts, $currentStart, $currentEnd); $earned = $repository->sumEarnedNoCategory($accounts, $currentStart, $currentEnd); } else { // get from set: $entrySpent = $set->filter(function (Category $cat) use($year, $category) { return $cat->type == 'Withdrawal' && $cat->dateFormatted == $year && $cat->id == $category->id; })->first(); $entryEarned = $set->filter(function (Category $cat) use($year, $category) { return $cat->type == 'Deposit' && $cat->dateFormatted == $year && $cat->id == $category->id; })->first(); $name = $category->name; $spent = !is_null($entrySpent) ? $entrySpent->sum : 0; $earned = !is_null($entryEarned) ? $entryEarned->sum : 0; } // save to array: $entry['name'] = $name; $entry['spent'][$year] = $spent * -1; $entry['earned'][$year] = $earned; // jump to next year. $currentStart = clone $currentEnd; $currentStart->addDay(); } $entries->push($entry); } // generate chart with data: $data = $this->generator->multiYear($entries); $cache->store($data); return Response::json($data); }
/** * @param Carbon $start * @param Carbon $end * @param Collection $accounts * @param Collection $categories * * @return \Illuminate\Http\JsonResponse */ public function multiYear(Carbon $start, Carbon $end, Collection $accounts, Collection $categories) { /** @var CRI $repository */ $repository = app(CRI::class); // chart properties for cache: $cache = new CacheProperties(); $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty($accounts); $cache->addProperty($categories); $cache->addProperty('multiYearCategory'); if ($cache->has()) { return Response::json($cache->get()); } $entries = new Collection(); /** @var Category $category */ foreach ($categories as $category) { $entry = ['name' => '', 'spent' => [], 'earned' => []]; $currentStart = clone $start; while ($currentStart < $end) { // fix the date: $year = $currentStart->year; $currentEnd = clone $currentStart; $currentEnd->endOfYear(); // get data: if (is_null($category->id)) { $entry['name'] = trans('firefly.noCategory'); $entry['spent'][$year] = $repository->spentInPeriodWithoutCategory($accounts, $currentStart, $currentEnd) * -1; $entry['earned'][$year] = $repository->earnedInPeriodWithoutCategory($accounts, $currentStart, $currentEnd); // jump to next year. $currentStart = clone $currentEnd; $currentStart->addDay(); continue; } // alternative is a normal category: $entry['name'] = $category->name; $entry['spent'][$year] = $repository->spentInPeriod(new Collection([$category]), $accounts, $currentStart, $currentEnd) * -1; $entry['earned'][$year] = $repository->earnedInPeriod(new Collection([$category]), $accounts, $currentStart, $currentEnd); // jump to next year. $currentStart = clone $currentEnd; $currentStart->addDay(); } $entries->push($entry); } // generate chart with data: $data = $this->generator->multiYear($entries); $cache->store($data); return Response::json($data); }