Expand view of report and make multi currency

This commit is contained in:
James Cole
2019-09-01 15:23:33 +02:00
parent 1e9f354a81
commit ce06fb73b1
13 changed files with 124 additions and 147 deletions

View File

@@ -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);
}

View File

@@ -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.

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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]);

View File

@@ -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;