From 00607d2a6d779181a88f281d9e26d14ccec62978 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 14 Jan 2018 19:36:24 +0100 Subject: [PATCH] Code for #1040 --- app/Http/Controllers/BudgetController.php | 18 ++- app/Http/Controllers/CategoryController.php | 148 ++++++++++---------- resources/views/categories/no-category.twig | 2 +- resources/views/categories/show.twig | 2 +- 4 files changed, 84 insertions(+), 86 deletions(-) diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index cf5a41bc6f..71f11a9630 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -611,21 +611,19 @@ class BudgetController extends Controller if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - - Log::debug('Going to get period expenses and incomes.'); - while ($end >= $start) { - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); + $dates = app('navigation')->blockPeriods($start, $end, $range); + foreach ($dates as $date) { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutBudget()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutBudget()->withOpposingAccount()->setTypes( + [TransactionType::WITHDRAWAL] + ); $set = $collector->getJournals(); $sum = strval($set->sum('transaction_amount') ?? '0'); $journals = $set->count(); - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); - $entries->push(['string' => $dateStr, 'name' => $dateName, 'count' => $journals, 'sum' => $sum, 'date' => clone $end]); - $end = app('navigation')->subtractPeriod($end, $range, 1); + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['end'], $date['period']); + $entries->push(['string' => $dateStr, 'name' => $dateName, 'count' => $journals, 'sum' => $sum, 'date' => clone $date['end']]); } $cache->store($entries); diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 0e3013f88a..7d6a73793e 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -46,6 +46,13 @@ use View; */ class CategoryController extends Controller { + /** @var AccountRepositoryInterface */ + private $accountRepos; + /** @var JournalRepositoryInterface */ + private $journalRepos; + /** @var CategoryRepositoryInterface */ + private $repository; + /** * */ @@ -57,6 +64,9 @@ class CategoryController extends Controller function ($request, $next) { app('view')->share('title', trans('firefly.categories')); app('view')->share('mainTitleIcon', 'fa-bar-chart'); + $this->journalRepos = app(JournalRepositoryInterface::class); + $this->repository = app(CategoryRepositoryInterface::class); + $this->accountRepos = app(AccountRepositoryInterface::class); return $next($request); } @@ -95,16 +105,15 @@ class CategoryController extends Controller } /** - * @param Request $request - * @param CategoryRepositoryInterface $repository - * @param Category $category + * @param Request $request + * @param Category $category * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(Request $request, CategoryRepositoryInterface $repository, Category $category) + public function destroy(Request $request, Category $category) { $name = $category->name; - $repository->destroy($category); + $this->repository->destroy($category); $request->session()->flash('success', strval(trans('firefly.deleted_category', ['name' => $name]))); Preferences::mark(); @@ -132,21 +141,21 @@ class CategoryController extends Controller } /** - * @param CategoryRepositoryInterface $repository + * @param Request $request * - * @return View + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function index(Request $request, CategoryRepositoryInterface $repository) + public function index(Request $request) { $page = 0 === intval($request->get('page')) ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('listPageSize', 50)->data); - $collection = $repository->getCategories(); + $collection = $this->repository->getCategories(); $total = $collection->count(); $collection = $collection->slice(($page - 1) * $pageSize, $pageSize); $collection->each( - function (Category $category) use ($repository) { - $category->lastActivity = $repository->lastUseDate($category, new Collection); + function (Category $category) { + $category->lastActivity = $this->repository->lastUseDate($category, new Collection); } ); @@ -158,13 +167,12 @@ class CategoryController extends Controller } /** - * @param Request $request - * @param JournalRepositoryInterface $repository - * @param string $moment + * @param Request $request + * @param string $moment * * @return View */ - public function noCategory(Request $request, JournalRepositoryInterface $repository, string $moment = '') + public function noCategory(Request $request, string $moment = '') { // default values: $range = Preferences::get('viewRange', '1M')->data; @@ -177,27 +185,27 @@ class CategoryController extends Controller // prep for "all" view. if ('all' === $moment) { $subTitle = trans('firefly.all_journals_without_category'); - $first = $repository->first(); + $first = $this->journalRepos->first(); $start = $first->date ?? new Carbon; $end = new Carbon; } - // prep for "specific date" view. + // prep for "specific date" view.$dates = app('navigation')->blockPeriods($start, $end, $range); if (strlen($moment) > 0 && 'all' !== $moment) { - $start = new Carbon($moment); + $start = app('navigation')->startOfPeriod(new Carbon($moment), $range); $end = app('navigation')->endOfPeriod($start, $range); $subTitle = trans( 'firefly.without_category_between', ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] ); - $periods = $this->getNoCategoryPeriodOverview(); + $periods = $this->getNoCategoryPeriodOverview($start); } // prep for current period if (0 === strlen($moment)) { $start = clone session('start', app('navigation')->startOfPeriod(new Carbon, $range)); $end = clone session('end', app('navigation')->endOfPeriod(new Carbon, $range)); - $periods = $this->getNoCategoryPeriodOverview(); + $periods = $this->getNoCategoryPeriodOverview($start); $subTitle = trans( 'firefly.without_category_between', ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] @@ -248,14 +256,14 @@ class CategoryController extends Controller // prep for "specific date" view. if (strlen($moment) > 0 && 'all' !== $moment) { - $start = new Carbon($moment); + $start = app('navigation')->startOfPeriod(new Carbon($moment), $range); $end = app('navigation')->endOfPeriod($start, $range); $subTitle = trans( 'firefly.journals_in_period_for_category', ['name' => $category->name, 'start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat),] ); - $periods = $this->getPeriodOverview($category); + $periods = $this->getPeriodOverview($category, $start); $path = route('categories.show', [$category->id, $moment]); } @@ -265,7 +273,7 @@ class CategoryController extends Controller $start = clone session('start', app('navigation')->startOfPeriod(new Carbon, $range)); /** @var Carbon $end */ $end = clone session('end', app('navigation')->endOfPeriod(new Carbon, $range)); - $periods = $this->getPeriodOverview($category); + $periods = $this->getPeriodOverview($category, $start); $subTitle = trans( 'firefly.journals_in_period_for_category', ['name' => $category->name, 'start' => $start->formatLocalized($this->monthAndDayFormat), @@ -336,38 +344,36 @@ class CategoryController extends Controller } /** + * @param Carbon $theDate + * * @return Collection */ - private function getNoCategoryPeriodOverview(): Collection + private function getNoCategoryPeriodOverview(Carbon $theDate): Collection { - $repository = app(JournalRepositoryInterface::class); - $first = $repository->first(); - $start = $first->date ?? new Carbon; - $range = Preferences::get('viewRange', '1M')->data; - $start = app('navigation')->startOfPeriod($start, $range); - $end = app('navigation')->endOfX(new Carbon, $range, null); - $entries = new Collection; + $range = Preferences::get('viewRange', '1M')->data; + $first = $this->journalRepos->first(); + $start = $first->date ?? new Carbon; + $end = $theDate ?? new Carbon; // properties for cache $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); - $cache->addProperty('no-budget-period-entries'); + $cache->addProperty('no-category-period-entries'); if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - Log::debug(sprintf('Going to get period expenses and incomes between %s and %s.', $start->format('Y-m-d'), $end->format('Y-m-d'))); - while ($end >= $start) { - Log::debug('Loop!'); - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); + $dates = app('navigation')->blockPeriods($start, $end, $range); + $entries = new Collection; + + foreach ($dates as $date) { // count journals without category in this period: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory() + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() ->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $count = $collector->getJournals()->count(); @@ -375,7 +381,7 @@ class CategoryController extends Controller // amount transferred /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory() + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $transferred = Steam::positive($collector->getJournals()->sum('transaction_amount')); @@ -383,17 +389,20 @@ class CategoryController extends Controller // amount spent /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( + [TransactionType::WITHDRAWAL] + ); $spent = $collector->getJournals()->sum('transaction_amount'); // amount earned /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory()->withOpposingAccount()->setTypes([TransactionType::DEPOSIT]); - $earned = $collector->getJournals()->sum('transaction_amount'); - - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( + [TransactionType::DEPOSIT] + ); + $earned = $collector->getJournals()->sum('transaction_amount'); + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['end'], $date['period']); $entries->push( [ 'string' => $dateStr, @@ -402,10 +411,9 @@ class CategoryController extends Controller 'spent' => $spent, 'earned' => $earned, 'transferred' => $transferred, - 'date' => clone $end, + 'date' => clone $date['end'], ] ); - $end = app('navigation')->subtractPeriod($end, $range, 1); } Log::debug('End of loops'); $cache->store($entries); @@ -418,45 +426,39 @@ class CategoryController extends Controller * * @return Collection */ - private function getPeriodOverview(Category $category): Collection + private function getPeriodOverview(Category $category, Carbon $date): Collection { - /** @var CategoryRepositoryInterface $repository */ - $repository = app(CategoryRepositoryInterface::class); - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - $first = $repository->firstUseDate($category); - if (null === $first) { - $first = new Carbon; // @codeCoverageIgnore - } - $range = Preferences::get('viewRange', '1M')->data; - $first = app('navigation')->startOfPeriod($first, $range); - $end = app('navigation')->endOfX(new Carbon, $range, null); - $entries = new Collection; - $count = 0; + $range = Preferences::get('viewRange', '1M')->data; + $first = $this->journalRepos->first(); + $start = $first->date ?? new Carbon; + $end = $date ?? new Carbon; + $accounts = $this->accountRepos->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); // properties for entries with their amounts. $cache = new CacheProperties(); - $cache->addProperty($first); + $cache->addProperty($start); $cache->addProperty($end); + $cache->addProperty($range); $cache->addProperty('categories.entries'); $cache->addProperty($category->id); if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - while ($end >= $first && $count < 90) { - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); - $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); - $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); + + $dates = app('navigation')->blockPeriods($start, $end, $range); + $entries = new Collection; + + foreach ($dates as $date) { + $spent = $this->repository->spentInPeriod(new Collection([$category]), $accounts, $date['start'], $date['end']); + $earned = $this->repository->earnedInPeriod(new Collection([$category]), $accounts, $date['start'], $date['end']); + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['end'], $date['period']); // amount transferred /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->setCategory($category) + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->setCategory($category) ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $transferred = Steam::positive($collector->getJournals()->sum('transaction_amount')); @@ -469,11 +471,9 @@ class CategoryController extends Controller 'earned' => $earned, 'sum' => bcadd($earned, $spent), 'transferred' => $transferred, - 'date' => clone $end, + 'date' => clone $date['end'], ] ); - $end = app('navigation')->subtractPeriod($end, $range, 1); - ++$count; } $cache->store($entries); diff --git a/resources/views/categories/no-category.twig b/resources/views/categories/no-category.twig index 5eee40e9f6..caefb483b1 100644 --- a/resources/views/categories/no-category.twig +++ b/resources/views/categories/no-category.twig @@ -42,7 +42,7 @@
{% for period in periods %} {% if period.count > 0 %} -
+

{{ period.name }}

diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index f2e8092a71..e456ed03c4 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -88,7 +88,7 @@
{% for period in periods %} {% if period.spent != 0 or period.earned != 0 or period.sum != 0 %} -