diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index af0fd7b24f..42eec4e59b 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -75,12 +75,9 @@ class AccountController extends Controller $defaultCurrency = Amount::getDefaultCurrency(); $subTitleIcon = config('firefly.subIconsByIdentifier.' . $what); $subTitle = trans('firefly.make_new_' . $what . '_account'); - Session::flash( - 'preFilled', - [ - 'currency_id' => $defaultCurrency->id, - ] - ); + + // pre fill some data + Session::flash('preFilled', ['currency_id' => $defaultCurrency->id,]); // put previous url in session if not redirect from store (not "create another"). if (session('accounts.create.fromStore') !== true) { @@ -248,6 +245,7 @@ class AccountController extends Controller $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); $chartUri = route('chart.account.single', [$account->id]); + $accountType = $account->accountType->type; // grab those journals: $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->setLimit($pageSize)->setPage($page); @@ -257,7 +255,7 @@ class AccountController extends Controller // generate entries for each period (and cache those) $entries = $this->periodEntries($account); - return view('accounts.show', compact('account', 'entries', 'subTitleIcon', 'journals', 'subTitle', 'start', 'end', 'chartUri')); + return view('accounts.show', compact('account', 'accountType', 'entries', 'subTitleIcon', 'journals', 'subTitle', 'start', 'end', 'chartUri')); } /** @@ -298,14 +296,15 @@ class AccountController extends Controller */ public function showByDate(Request $request, Account $account, string $date) { - $carbon = new Carbon($date); - $range = Preferences::get('viewRange', '1M')->data; - $start = Navigation::startOfPeriod($carbon, $range); - $end = Navigation::endOfPeriod($carbon, $range); - $subTitle = $account->name . ' (' . Navigation::periodShow($start, $range) . ')'; - $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); - $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); - $chartUri = route('chart.account.period', [$account->id, $carbon->format('Y-m-d')]); + $carbon = new Carbon($date); + $range = Preferences::get('viewRange', '1M')->data; + $start = Navigation::startOfPeriod($carbon, $range); + $end = Navigation::endOfPeriod($carbon, $range); + $subTitle = $account->name . ' (' . Navigation::periodShow($start, $range) . ')'; + $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + $chartUri = route('chart.account.period', [$account->id, $carbon->format('Y-m-d')]); + $accountType = $account->accountType->type; // replace with journal collector: /** @var JournalCollectorInterface $collector */ @@ -314,8 +313,11 @@ class AccountController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('accounts/show/' . $account->id . '/' . $date); + // generate entries for each period (and cache those) + $entries = $this->periodEntries($account); + // same call, except "entries". - return view('accounts.show', compact('account', 'subTitleIcon', 'journals', 'subTitle', 'start', 'end', 'chartUri')); + return view('accounts.show', compact('account', 'accountType', 'entries', 'subTitleIcon', 'journals', 'subTitle', 'start', 'end', 'chartUri')); } /** @@ -442,7 +444,7 @@ class AccountController extends Controller $earned = $tasker->amountInInPeriod(new Collection([$account]), $assets, $end, $currentEnd); $dateStr = $end->format('Y-m-d'); $dateName = Navigation::periodShow($end, $range); - $entries->push([$dateStr, $dateName, $spent, $earned]); + $entries->push([$dateStr, $dateName, $spent, $earned, clone $end]); $end = Navigation::subtractPeriod($end, $range, 1); } diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index fce86e46a1..d9b5cc2a27 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -24,6 +24,7 @@ use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Preferences; @@ -64,20 +65,19 @@ class BudgetController extends Controller } /** - * @param Request $request - * @param BudgetRepositoryInterface $repository - * @param Budget $budget + * @param Request $request + * @param Budget $budget * * @return \Illuminate\Http\JsonResponse */ - public function amount(Request $request, BudgetRepositoryInterface $repository, Budget $budget) + public function amount(Request $request, Budget $budget) { $amount = intval($request->get('amount')); /** @var Carbon $start */ $start = session('start', Carbon::now()->startOfMonth()); /** @var Carbon $end */ $end = session('end', Carbon::now()->endOfMonth()); - $budgetLimit = $repository->updateLimitAmount($budget, $start, $end, $amount); + $budgetLimit = $this->repository->updateLimitAmount($budget, $start, $end, $amount); if ($amount == 0) { $budgetLimit = null; } @@ -122,17 +122,16 @@ class BudgetController extends Controller } /** - * @param Budget $budget - * @param BudgetRepositoryInterface $repository + * @param Budget $budget * * @return \Illuminate\Http\RedirectResponse */ - public function destroy(Budget $budget, BudgetRepositoryInterface $repository) + public function destroy(Budget $budget) { $name = $budget->name; $budgetId = $budget->id; - $repository->destroy($budget); + $this->repository->destroy($budget); Session::flash('success', strval(trans('firefly.deleted_budget', ['name' => e($name)]))); @@ -238,21 +237,19 @@ class BudgetController extends Controller } /** - * @param Request $request - * @param BudgetRepositoryInterface $repository - * @param AccountRepositoryInterface $accountRepository - * @param Budget $budget + * @param Request $request + * @param Budget $budget * * @return View */ - public function show(Request $request, BudgetRepositoryInterface $repository, AccountRepositoryInterface $accountRepository, Budget $budget) + public function show(Request $request, Budget $budget) { /** @var Carbon $start */ $start = session('first', Carbon::create()->startOfYear()); $end = new Carbon; $page = intval($request->get('page')) == 0 ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); + $limits = $this->getLimits($budget, $start, $end); $repetition = null; // collector: /** @var JournalCollectorInterface $collector */ @@ -262,15 +259,7 @@ class BudgetController extends Controller $journals->setPath('/budgets/show/' . $budget->id); - $set = $repository->getBudgetLimits($budget, $start, $end); $subTitle = e($budget->name); - $limits = new Collection(); - - /** @var BudgetLimit $entry */ - foreach ($set as $entry) { - $entry->spent = $repository->spentInPeriod(new Collection([$budget]), $accounts, $entry->start_date, $entry->end_date); - $limits->push($entry); - } return view('budgets.show', compact('limits', 'budget', 'repetition', 'journals', 'subTitle')); } @@ -289,8 +278,6 @@ class BudgetController extends Controller throw new FireflyException('This budget limit is not part of this budget.'); } - /** @var BudgetRepositoryInterface $repository */ - $repository = app(BudgetRepositoryInterface::class); /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); $page = intval($request->get('page')) == 0 ? 1 : intval($request->get('page')); @@ -313,23 +300,23 @@ class BudgetController extends Controller $journals->setPath('/budgets/show/' . $budget->id . '/' . $budgetLimit->id); - $budgetLimit->spent = $repository->spentInPeriod(new Collection([$budget]), $accounts, $budgetLimit->start_date, $budgetLimit->end_date); - $limits = new Collection([$budgetLimit]); + $start = session('first', Carbon::create()->startOfYear()); + $end = new Carbon; + $limits = $this->getLimits($budget, $start, $end); return view('budgets.show', compact('limits', 'budget', 'budgetLimit', 'journals', 'subTitle')); } /** - * @param BudgetFormRequest $request - * @param BudgetRepositoryInterface $repository + * @param BudgetFormRequest $request * * @return \Illuminate\Http\RedirectResponse */ - public function store(BudgetFormRequest $request, BudgetRepositoryInterface $repository) + public function store(BudgetFormRequest $request) { $data = $request->getBudgetData(); - $budget = $repository->store($data); + $budget = $this->repository->store($data); Session::flash('success', strval(trans('firefly.stored_new_budget', ['name' => e($budget->name)]))); Preferences::mark(); @@ -347,16 +334,15 @@ class BudgetController extends Controller } /** - * @param BudgetFormRequest $request - * @param BudgetRepositoryInterface $repository - * @param Budget $budget + * @param BudgetFormRequest $request + * @param Budget $budget * * @return \Illuminate\Http\RedirectResponse */ - public function update(BudgetFormRequest $request, BudgetRepositoryInterface $repository, Budget $budget) + public function update(BudgetFormRequest $request, Budget $budget) { $data = $request->getBudgetData(); - $repository->update($budget, $data); + $this->repository->update($budget, $data); Session::flash('success', strval(trans('firefly.updated_budget', ['name' => e($budget->name)]))); Preferences::mark(); @@ -430,4 +416,41 @@ class BudgetController extends Controller return $return; } + + /** + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return Collection + */ + private function getLimits(Budget $budget, Carbon $start, Carbon $end): Collection + { + // properties for cache + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty($budget->id); + $cache->addProperty('get-limits'); + + if ($cache->has()) { + return $cache->get(); + } + + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); + $set = $this->repository->getBudgetLimits($budget, $start, $end); + $limits = new Collection(); + + /** @var BudgetLimit $entry */ + foreach ($set as $entry) { + $entry->spent = $this->repository->spentInPeriod(new Collection([$budget]), $accounts, $entry->start_date, $entry->end_date); + $limits->push($entry); + } + $cache->store($limits); + + return $set; + } + } diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 3eac58d095..2a52505818 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -193,14 +193,16 @@ class CategoryController extends Controller $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); $subTitle = $category->name; $subTitleIcon = 'fa-bar-chart'; + $entries = $this->getGroupedEntries($category); + $method = 'default'; + // get journals $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category)->withBudgetInformation(); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id); - $entries = $this->getGroupedEntries($category); - return view('categories.show', compact('category', 'journals', 'entries', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); + return view('categories.show', compact('category', 'method', 'journals', 'entries', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); } /** @@ -223,7 +225,7 @@ class CategoryController extends Controller $hideCategory = true; // used in list. $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); - $showAll = true; + $method = 'all'; /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); @@ -231,7 +233,7 @@ class CategoryController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/all'); - return view('categories.show', compact('category', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end', 'showAll')); + return view('categories.show', compact('category', 'method', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); } /** @@ -252,6 +254,8 @@ class CategoryController extends Controller $hideCategory = true; // used in list. $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + $entries = $this->getGroupedEntries($category); + $method = 'date'; /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); @@ -259,7 +263,7 @@ class CategoryController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/' . $date); - return view('categories.show', compact('category', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); + return view('categories.show', compact('category', 'method', 'entries', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); } /** @@ -320,7 +324,7 @@ class CategoryController extends Controller private function getGroupedEntries(Category $category): Collection { /** @var CategoryRepositoryInterface $repository */ - $repository = app(CategoryRepositoryInterface::class); + $repository = app(CategoryRepositoryInterface::class); /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); @@ -350,7 +354,7 @@ class CategoryController extends Controller $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); $dateStr = $end->format('Y-m-d'); $dateName = Navigation::periodShow($end, $range); - $entries->push([$dateStr, $dateName, $spent, $earned]); + $entries->push([$dateStr, $dateName, $spent, $earned, clone $end]); $end = Navigation::subtractPeriod($end, $range, 1); } $cache->store($entries); diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index e1f7cc7e20..4d9d3444a8 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -67,6 +67,13 @@ +{% if entries %} +
{{ 'spent'|_ }} | {{ entry[2]|formatAmount }} | ||||||
{{ 'earned'|_ }} | {{ entry[3]|formatAmount }} | @@ -121,8 +129,8 @@ {% endif %} - {% endfor %} + {% endif %} diff --git a/resources/views/budgets/show.twig b/resources/views/budgets/show.twig index fc7e71c7b5..e1750adff8 100644 --- a/resources/views/budgets/show.twig +++ b/resources/views/budgets/show.twig @@ -6,7 +6,7 @@ {% block content %}
{{ 'amount'|_ }} | +{{ limit.amount|formatAmount }} | +
{{ 'spent'|_ }} | +{{ limit.spent|formatAmount }} | +
+ {% set overspent = limit.amount + limit.spent < 0 %}
- {% if overspent %}
- {% set pct = (limit.spent != 0 ? (limit.amount / (limit.spent*-1))*100 : 0) %}
-
-
-
-
- {% else %}
- {% set pct = (limit.amount != 0 ? (((limit.spent*-1) / limit.amount)*100) : 0) %}
-
-
-
- {% endif %}
-
-
+ {% if overspent %}
+ {% set pct = (limit.spent != 0 ? (limit.amount / (limit.spent*-1))*100 : 0) %}
+
+
+
+
+ {% else %}
+ {% set pct = (limit.amount != 0 ? (((limit.spent*-1) / limit.amount)*100) : 0) %}
+
+
+
+ {% endif %}
+ |
+