diff --git a/app/Helpers/Report/PopupReport.php b/app/Helpers/Report/PopupReport.php index 397db5941e..8c7d36ca53 100644 --- a/app/Helpers/Report/PopupReport.php +++ b/app/Helpers/Report/PopupReport.php @@ -81,6 +81,16 @@ class PopupReport implements PopupReportInterface */ public function balanceForNoBudget(Account $account, array $attributes): array { + // filter by currency, if set. + $currencyId = $attributes['currencyId'] ?? null; + $currency = null; + if (null !== $currencyId) { + /** @var CurrencyRepositoryInterface $repos */ + $repos = app(CurrencyRepositoryInterface::class); + $currency = $repos->find((int)$currencyId); + } + + /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector @@ -91,6 +101,10 @@ class PopupReport implements PopupReportInterface ->setRange($attributes['startDate'], $attributes['endDate']) ->withoutBudget(); + if (null !== $currency) { + $collector->setCurrency($currency); + } + return $collector->getExtractedJournals(); } @@ -139,12 +153,12 @@ class PopupReport implements PopupReportInterface /** * Collect journals by a category. * - * @param Category $category + * @param Category|null $category * @param array $attributes * * @return array */ - public function byCategory(Category $category, array $attributes): array + public function byCategory(?Category $category, array $attributes): array { // filter by currency, if set. $currencyId = $attributes['currencyId'] ?? null; @@ -163,8 +177,15 @@ class PopupReport implements PopupReportInterface ->withAccountInformation() ->withBudgetInformation() ->withCategoryInformation() - ->setRange($attributes['startDate'], $attributes['endDate'])->withAccountInformation() - ->setCategory($category); + ->setRange($attributes['startDate'], $attributes['endDate'])->withAccountInformation(); + + if(null!== $category) { + $collector->setCategory($category); + } + if(null === $category) { + $collector->withoutCategory(); + } + if (null !== $currency) { $collector->setCurrency($currency); } diff --git a/app/Helpers/Report/PopupReportInterface.php b/app/Helpers/Report/PopupReportInterface.php index d8b05f093c..c24f5d12bc 100644 --- a/app/Helpers/Report/PopupReportInterface.php +++ b/app/Helpers/Report/PopupReportInterface.php @@ -32,6 +32,7 @@ use Illuminate\Support\Collection; */ interface PopupReportInterface { + /** * Get balances for budget. * @@ -66,12 +67,12 @@ interface PopupReportInterface /** * Group by category. * - * @param Category $category + * @param Category|null $category * @param array $attributes * * @return array */ - public function byCategory(Category $category, array $attributes): array; + public function byCategory(?Category $category, array $attributes): array; /** * Do something with expense. Sorry, I am not very inspirational here. diff --git a/app/Http/Controllers/Budget/AvailableBudgetController.php b/app/Http/Controllers/Budget/AvailableBudgetController.php index c6c3f60ddc..bdfb94c125 100644 --- a/app/Http/Controllers/Budget/AvailableBudgetController.php +++ b/app/Http/Controllers/Budget/AvailableBudgetController.php @@ -30,9 +30,6 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; -use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; -use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use Illuminate\Http\Request; use Log; @@ -46,14 +43,8 @@ class AvailableBudgetController extends Controller /** @var AvailableBudgetRepositoryInterface */ private $abRepository; - /** @var BudgetLimitRepositoryInterface */ - private $blRepository; /** @var CurrencyRepositoryInterface */ private $currencyRepos; - /** @var OperationsRepositoryInterface */ - private $opsRepository; - /** @var BudgetRepositoryInterface The budget repository */ - private $repository; /** * AmountController constructor. @@ -68,10 +59,7 @@ class AvailableBudgetController extends Controller function ($request, $next) { app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('mainTitleIcon', 'fa-tasks'); - $this->repository = app(BudgetRepositoryInterface::class); - $this->opsRepository = app(OperationsRepositoryInterface::class); $this->abRepository = app(AvailableBudgetRepositoryInterface::class); - $this->blRepository = app(BudgetLimitRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class); return $next($request); @@ -83,6 +71,13 @@ class AvailableBudgetController extends Controller * Create will always assume the user's default currency, if it's not set. * * This method will check if there is no AB, and refuse to continue if it exists. + * + * @param Request $request + * @param Carbon $start + * @param Carbon $end + * @param TransactionCurrency|null $currency + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View */ public function create(Request $request, Carbon $start, Carbon $end, ?TransactionCurrency $currency = null) { @@ -106,10 +101,16 @@ class AvailableBudgetController extends Controller /** * createAlternative will show a list of enabled currencies so the user can pick one. + * + * @param Request $request + * @param Carbon $start + * @param Carbon $end + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function createAlternative(Request $request, Carbon $start, Carbon $end) { - $currencies = $this->currencyRepos->getEnabled(); + $currencies = $this->currencyRepos->getEnabled(); $availableBudgets = $this->abRepository->get($start, $end); // remove already budgeted currencies: @@ -121,12 +122,14 @@ class AvailableBudgetController extends Controller return false; } } + return true; } ); - $page = (int)($request->get('page') ?? 1); + $page = (int)($request->get('page') ?? 1); + return view('budgets.available-budgets.create-alternative', compact('start', 'end', 'page', 'currencies')); } @@ -145,6 +148,8 @@ class AvailableBudgetController extends Controller /** * @param AvailableBudget $availableBudget + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function edit(AvailableBudget $availableBudget) { @@ -153,6 +158,8 @@ class AvailableBudgetController extends Controller /** * @param Request $request + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function store(Request $request) { @@ -197,6 +204,8 @@ class AvailableBudgetController extends Controller /** * @param Request $request * @param AvailableBudget $availableBudget + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function update(Request $request, AvailableBudget $availableBudget) { diff --git a/app/Http/Controllers/Budget/BudgetLimitController.php b/app/Http/Controllers/Budget/BudgetLimitController.php index 2333e952e8..85411c6252 100644 --- a/app/Http/Controllers/Budget/BudgetLimitController.php +++ b/app/Http/Controllers/Budget/BudgetLimitController.php @@ -31,7 +31,6 @@ use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\TransactionCurrency; -use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; @@ -50,8 +49,6 @@ class BudgetLimitController extends Controller { use DateCalculation; - /** @var AvailableBudgetRepositoryInterface */ - private $abRepository; /** @var BudgetLimitRepositoryInterface */ private $blRepository; /** @var CurrencyRepositoryInterface */ @@ -73,7 +70,6 @@ class BudgetLimitController extends Controller app('view')->share('mainTitleIcon', 'fa-tasks'); $this->repository = app(BudgetRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class); - $this->abRepository = app(AvailableBudgetRepositoryInterface::class); $this->blRepository = app(BudgetLimitRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class); diff --git a/app/Http/Controllers/Popup/ReportController.php b/app/Http/Controllers/Popup/ReportController.php index 69405f6d00..6915a6581e 100644 --- a/app/Http/Controllers/Popup/ReportController.php +++ b/app/Http/Controllers/Popup/ReportController.php @@ -68,6 +68,9 @@ class ReportController extends Controller case 'category-entry': $html = $this->categoryEntry($attributes); break; + case 'budget-entry': + $html = $this->budgetEntry($attributes); + break; } return response()->json(['html' => $html]); diff --git a/app/Support/Http/Controllers/RenderPartialViews.php b/app/Support/Http/Controllers/RenderPartialViews.php index b97ce71663..9678c8e2c0 100644 --- a/app/Support/Http/Controllers/RenderPartialViews.php +++ b/app/Support/Http/Controllers/RenderPartialViews.php @@ -75,6 +75,38 @@ trait RenderPartialViews return $result; } + /** + * View for transactions in a budget for an account. + * + * @param array $attributes + * + * @return string + */ + protected function budgetEntry(array $attributes): string // generate view for report. + { + /** @var PopupReportInterface $popupHelper */ + $popupHelper = app(PopupReportInterface::class); + + /** @var BudgetRepositoryInterface $budgetRepository */ + $budgetRepository = app(BudgetRepositoryInterface::class); + $budget = $budgetRepository->findNull((int)$attributes['budgetId']); + + $accountRepos = app(AccountRepositoryInterface::class); + $account = $accountRepos->findNull((int)$attributes['accountId']); + + $journals = $popupHelper->balanceForBudget($budget, $account, $attributes); + // @codeCoverageIgnoreStart + try { + $view = view('popup.report.balance-amount', compact('journals', 'budget','account'))->render(); + } catch (Throwable $e) { + Log::error(sprintf('Could not render: %s', $e->getMessage())); + $view = 'Firefly III could not render the view. Please see the log files.'; + } + + // @codeCoverageIgnoreEnd + + return $view; + } /** * Get options for budget report. @@ -126,6 +158,7 @@ trait RenderPartialViews Log::error(sprintf('Could not render: %s', $e->getMessage())); $view = 'Firefly III could not render the view. Please see the log files.'; } + // @codeCoverageIgnoreEnd return $view; @@ -146,12 +179,7 @@ trait RenderPartialViews /** @var CategoryRepositoryInterface $categoryRepository */ $categoryRepository = app(CategoryRepositoryInterface::class); $category = $categoryRepository->findNull((int)$attributes['categoryId']); - - if (null === $category) { - return 'This is an unknown category. Apologies.'; - } - - $journals = $popupHelper->byCategory($category, $attributes); + $journals = $popupHelper->byCategory($category, $attributes); // @codeCoverageIgnoreStart try { $view = view('popup.report.category-entry', compact('journals', 'category'))->render(); @@ -159,6 +187,7 @@ trait RenderPartialViews Log::error(sprintf('Could not render: %s', $e->getMessage())); $view = 'Firefly III could not render the view. Please see the log files.'; } + // @codeCoverageIgnoreEnd return $view; @@ -216,6 +245,7 @@ trait RenderPartialViews Log::error(sprintf('Could not render: %s', $e->getMessage())); $view = 'Firefly III could not render the view. Please see the log files.'; } + // @codeCoverageIgnoreEnd return $view; @@ -314,7 +344,7 @@ trait RenderPartialViews /** @var PopupReportInterface $popupHelper */ $popupHelper = app(PopupReportInterface::class); - $account = $accountRepository->findNull((int)$attributes['accountId']); + $account = $accountRepository->findNull((int)$attributes['accountId']); if (null === $account) { return 'This is an unknown category. Apologies.'; @@ -328,6 +358,7 @@ trait RenderPartialViews Log::error(sprintf('Could not render: %s', $e->getMessage())); $view = 'Firefly III could not render the view. Please see the log files.'; } + // @codeCoverageIgnoreEnd return $view; diff --git a/resources/views/v1/budgets/income.twig b/resources/views/v1/budgets/income.twig deleted file mode 100644 index 8f173205b4..0000000000 --- a/resources/views/v1/budgets/income.twig +++ /dev/null @@ -1,31 +0,0 @@ -