From 0cb0a628e3aad52df0955b7bd97a11cf6923652c Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 5 Mar 2021 16:28:59 +0100 Subject: [PATCH] Added new API routes. --- .../Insight/Expense/AccountController.php | 150 ++++-------- .../Insight/Expense/BudgetController.php | 59 +++-- .../Insight/Expense/CategoryController.php | 107 +++++++++ .../Insight/Expense/PeriodController.php | 19 +- .../V1/Requests/Insight/ExpenseRequest.php | 213 ++++++++++++++++++ .../Account/OperationsRepository.php | 77 ++++++- .../Account/OperationsRepositoryInterface.php | 11 +- routes/api.php | 30 ++- 8 files changed, 509 insertions(+), 157 deletions(-) create mode 100644 app/Api/V1/Controllers/Insight/Expense/CategoryController.php create mode 100644 app/Api/V1/Requests/Insight/ExpenseRequest.php diff --git a/app/Api/V1/Controllers/Insight/Expense/AccountController.php b/app/Api/V1/Controllers/Insight/Expense/AccountController.php index 214ea2cb26..83d532c12e 100644 --- a/app/Api/V1/Controllers/Insight/Expense/AccountController.php +++ b/app/Api/V1/Controllers/Insight/Expense/AccountController.php @@ -24,14 +24,12 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Insight\Expense; -use Carbon\Carbon; use FireflyIII\Api\V1\Controllers\Controller; -use FireflyIII\Api\V1\Requests\DateRequest; -use FireflyIII\Models\AccountType; +use FireflyIII\Api\V1\Requests\Insight\ExpenseRequest; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Account\OperationsRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Support\Http\Api\ApiSupport; -use FireflyIII\User; use Illuminate\Http\JsonResponse; /** @@ -45,12 +43,6 @@ use Illuminate\Http\JsonResponse; * Shows expense information grouped or limited by date. * Ie. all expenses grouped by account + currency. * - * /api/v1/insight/expenses/expense - * Expenses grouped by expense account. Can be limited by date and by asset account. - * /api/v1/insight/expenses/asset - * Expenses grouped by asset account. Can be limited by date and by asset account. - * /api/v1/insight/expenses/total - * Expenses, total (no filter). Can be limited by date and by asset account. * /api/v1/insight/expenses/budget * Expenses per budget or no budget. Can be limited by date and by asset account. * /api/v1/insight/expenses/budget @@ -65,8 +57,9 @@ class AccountController extends Controller { use ApiSupport; - private CurrencyRepositoryInterface $currencyRepository; - private AccountRepositoryInterface $repository; + private CurrencyRepositoryInterface $currencyRepository; + private AccountRepositoryInterface $repository; + private OperationsRepositoryInterface $opsRepository; /** * AccountController constructor. @@ -78,7 +71,6 @@ class AccountController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ $user = auth()->user(); $this->repository = app(AccountRepositoryInterface::class); $this->repository->setUser($user); @@ -86,127 +78,63 @@ class AccountController extends Controller $this->currencyRepository = app(CurrencyRepositoryInterface::class); $this->currencyRepository->setUser($user); + $this->opsRepository = app(OperationsRepositoryInterface::class); + $this->opsRepository->setUser($user); + return $next($request); } ); } /** - * @param DateRequest $request + * @param ExpenseRequest $request * * @return JsonResponse */ - public function expense(DateRequest $request): JsonResponse + public function expense(ExpenseRequest $request): JsonResponse { - $dates = $request->getAll(); - /** @var Carbon $start */ - $start = $dates['start']; - /** @var Carbon $end */ - $end = $dates['end']; + $start = $request->getStart(); + $end = $request->getEnd(); + $assetAccounts = $request->getAssetAccounts(); + $expenseAccounts = $request->getExpenseAccounts(); + $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, $expenseAccounts); - $start->subDay(); - - // prep some vars: - $currencies = []; - $tempData = []; - - // grab all accounts and names - $accounts = $this->repository->getAccountsByType([AccountType::EXPENSE]); - $accountNames = $this->extractNames($accounts); - $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); - $endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); - - // loop the end balances. This is an array for each account ($expenses) - foreach ($endBalances as $accountId => $expenses) { - $accountId = (int)$accountId; - // loop each expense entry (each entry can be a different currency). - foreach ($expenses as $currencyId => $endAmount) { - $currencyId = (int)$currencyId; - - // see if there is an accompanying start amount. - // grab the difference and find the currency. - $startAmount = $startBalances[$accountId][$currencyId] ?? '0'; - $diff = bcsub($endAmount, $startAmount); - $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); - if (0 !== bccomp($diff, '0')) { - // store the values in a temporary array. - $tempData[] = [ - 'id' => $accountId, - 'name' => $accountNames[$accountId], - 'difference' => bcmul($diff, '-1'), - 'difference_float' => ((float)$diff) * -1, - 'currency_id' => (string) $currencyId, - 'currency_code' => $currencies[$currencyId]->code, - ]; - } - } + /** @var array $expense */ + foreach ($expenses as $expense) { + $result[] = [ + 'difference' => $expense['sum'], + 'difference_float' => (float)$expense['sum'], + 'currency_id' => (string)$expense['currency_id'], + 'currency_code' => $expense['currency_code'], + ]; } - - // sort temp array by amount. - $amounts = array_column($tempData, 'difference_float'); - array_multisort($amounts, SORT_ASC, $tempData); - - return response()->json($tempData); + return response()->json($result); } /** - * @param DateRequest $request + * @param ExpenseRequest $request * * @return JsonResponse */ - public function asset(DateRequest $request): JsonResponse + public function asset(ExpenseRequest $request): JsonResponse { - $dates = $request->getAll(); - /** @var Carbon $start */ - $start = $dates['start']; - /** @var Carbon $end */ - $end = $dates['end']; + $start = $request->getStart(); + $end = $request->getEnd(); + $assetAccounts = $request->getAssetAccounts(); + $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts); - $start->subDay(); - - // prep some vars: - $currencies = []; - $tempData = []; - - // grab all accounts and names - $accounts = $this->repository->getAccountsByType([AccountType::ASSET]); - $accountNames = $this->extractNames($accounts); - $startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start); - $endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end); - - // loop the end balances. This is an array for each account ($expenses) - foreach ($endBalances as $accountId => $expenses) { - $accountId = (int)$accountId; - // loop each expense entry (each entry can be a different currency). - foreach ($expenses as $currencyId => $endAmount) { - $currencyId = (int)$currencyId; - - // see if there is an accompanying start amount. - // grab the difference and find the currency. - $startAmount = $startBalances[$accountId][$currencyId] ?? '0'; - $diff = bcsub($endAmount, $startAmount); - $currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId); - if (0 !== bccomp($diff, '0')) { - // store the values in a temporary array. - $tempData[] = [ - 'id' => $accountId, - 'name' => $accountNames[$accountId], - 'difference' => bcmul($diff, '-1'), - 'difference_float' => ((float)$diff) * -1, - 'currency_id' => (string) $currencyId, - 'currency_code' => $currencies[$currencyId]->code, - ]; - } - } + /** @var array $expense */ + foreach ($expenses as $expense) { + $result[] = [ + 'difference' => $expense['sum'], + 'difference_float' => (float)$expense['sum'], + 'currency_id' => (string)$expense['currency_id'], + 'currency_code' => $expense['currency_code'], + ]; } - - // sort temp array by amount. - $amounts = array_column($tempData, 'difference_float'); - array_multisort($amounts, SORT_ASC, $tempData); - - return response()->json($tempData); + return response()->json($result); } } diff --git a/app/Api/V1/Controllers/Insight/Expense/BudgetController.php b/app/Api/V1/Controllers/Insight/Expense/BudgetController.php index 34a48645cb..cc8fd850ce 100644 --- a/app/Api/V1/Controllers/Insight/Expense/BudgetController.php +++ b/app/Api/V1/Controllers/Insight/Expense/BudgetController.php @@ -22,11 +22,11 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Expense; -use Carbon\Carbon; use FireflyIII\Api\V1\Controllers\Controller; -use FireflyIII\Api\V1\Requests\DateRequest; +use FireflyIII\Api\V1\Requests\Insight\ExpenseRequest; use FireflyIII\Models\Budget; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Budget\NoBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; @@ -38,6 +38,7 @@ class BudgetController extends Controller { private OperationsRepositoryInterface $opsRepository; private BudgetRepositoryInterface $repository; + private NoBudgetRepositoryInterface $noRepository; /** * AccountController constructor. @@ -51,8 +52,11 @@ class BudgetController extends Controller function ($request, $next) { $this->opsRepository = app(OperationsRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class); - $this->opsRepository->setUser(auth()->user()); - $this->repository->setUser(auth()->user()); + $this->noRepository = app(NoBudgetRepositoryInterface::class); + $user = auth()->user(); + $this->opsRepository->setUser($user); + $this->repository->setUser($user); + $this->noRepository->setUser($user); return $next($request); } @@ -60,22 +64,23 @@ class BudgetController extends Controller } /** - * @param DateRequest $request + * @param ExpenseRequest $request * * @return JsonResponse */ - public function budget(DateRequest $request): JsonResponse + public function budget(ExpenseRequest $request): JsonResponse { - $dates = $request->getAll(); - /** @var Carbon $start */ - $start = $dates['start']; - /** @var Carbon $end */ - $end = $dates['end']; - $result = []; - $budgets = $this->repository->getActiveBudgets(); + $start = $request->getStart(); + $end = $request->getEnd(); + $budgets = $request->getBudgets(); + $assetAccounts = $request->getAssetAccounts(); + $result = []; + if (0 === $budgets->count()) { + $budgets = $this->repository->getActiveBudgets(); + } /** @var Budget $budget */ foreach ($budgets as $budget) { - $expenses = $this->opsRepository->sumExpenses($start, $end, null, new Collection([$budget]), null); + $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$budget]), null); /** @var array $expense */ foreach ($expenses as $expense) { $result[] = [ @@ -92,4 +97,30 @@ class BudgetController extends Controller return response()->json($result); } + /** + * @param ExpenseRequest $request + * + * @return JsonResponse + */ + public function noBudget(ExpenseRequest $request): JsonResponse + { + $start = $request->getStart(); + $end = $request->getEnd(); + $assetAccounts = $request->getAssetAccounts(); + $result = []; + $expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts, null); + /** @var array $expense */ + foreach ($expenses as $expense) { + $result[] = [ + 'difference' => $expense['sum'], + 'difference_float' => (float)$expense['sum'], + 'currency_id' => (string)$expense['currency_id'], + 'currency_code' => $expense['currency_code'], + ]; + } + + return response()->json($result); + + } + } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Insight/Expense/CategoryController.php b/app/Api/V1/Controllers/Insight/Expense/CategoryController.php new file mode 100644 index 0000000000..1b654f66cd --- /dev/null +++ b/app/Api/V1/Controllers/Insight/Expense/CategoryController.php @@ -0,0 +1,107 @@ +middleware( + function ($request, $next) { + $this->opsRepository = app(OperationsRepositoryInterface::class); + $this->repository = app(CategoryRepositoryInterface::class); + $this->noRepository = app(NoCategoryRepositoryInterface::class); + $user = auth()->user(); + $this->opsRepository->setUser($user); + $this->repository->setUser($user); + $this->noRepository->setUser($user); + + return $next($request); + } + ); + } + + /** + * @param ExpenseRequest $request + * + * @return JsonResponse + */ + public function category(ExpenseRequest $request): JsonResponse + { + $start = $request->getStart(); + $end = $request->getEnd(); + $categories = $request->getCategories(); + $assetAccounts = $request->getAssetAccounts(); + $result = []; + if (0 === $categories->count()) { + $categories = $this->repository->getCategories(); + } + /** @var Category $category */ + foreach ($categories as $category) { + $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$category])); + /** @var array $expense */ + foreach ($expenses as $expense) { + $result[] = [ + 'id' => (string)$category->id, + 'name' => $category->name, + 'difference' => $expense['sum'], + 'difference_float' => (float)$expense['sum'], + 'currency_id' => (string)$expense['currency_id'], + 'currency_code' => $expense['currency_code'], + ]; + } + } + + return response()->json($result); + } + + /** + * @param ExpenseRequest $request + * + * @return JsonResponse + */ + public function noCategory(ExpenseRequest $request): JsonResponse + { + $start = $request->getStart(); + $end = $request->getEnd(); + $assetAccounts = $request->getAssetAccounts(); + $result = []; + $expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts); + /** @var array $expense */ + foreach ($expenses as $expense) { + $result[] = [ + 'difference' => $expense['sum'], + 'difference_float' => (float)$expense['sum'], + 'currency_id' => (string)$expense['currency_id'], + 'currency_code' => $expense['currency_code'], + ]; + } + + return response()->json($result); + + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Insight/Expense/PeriodController.php b/app/Api/V1/Controllers/Insight/Expense/PeriodController.php index 30e2291266..6dc909cf59 100644 --- a/app/Api/V1/Controllers/Insight/Expense/PeriodController.php +++ b/app/Api/V1/Controllers/Insight/Expense/PeriodController.php @@ -22,9 +22,8 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Expense; -use Carbon\Carbon; use FireflyIII\Api\V1\Controllers\Controller; -use FireflyIII\Api\V1\Requests\DateRequest; +use FireflyIII\Api\V1\Requests\Insight\ExpenseRequest; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\TransactionType; use Illuminate\Http\JsonResponse; @@ -36,22 +35,20 @@ class PeriodController extends Controller { /** - * @param DateRequest $request + * @param ExpenseRequest $request * * @return JsonResponse */ - public function total(DateRequest $request): JsonResponse + public function total(ExpenseRequest $request): JsonResponse { - $dates = $request->getAll(); - /** @var Carbon $start */ - $start = $dates['start']; - /** @var Carbon $end */ - $end = $dates['end']; + $accounts = $request->getAssetAccounts(); + $start = $request->getStart(); + $end = $request->getEnd(); $response = []; // collect all expenses in this period (regardless of type) $collector = app(GroupCollectorInterface::class); - $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end); + $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); $genericSet = $collector->getExtractedJournals(); foreach ($genericSet as $journal) { $currencyId = (int)$journal['currency_id']; @@ -68,7 +65,7 @@ class PeriodController extends Controller $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; } if (0 !== $foreignCurrencyId) { - $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ + $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ 'difference' => '0', 'difference_float' => 0, 'currency_id' => (string)$foreignCurrencyId, diff --git a/app/Api/V1/Requests/Insight/ExpenseRequest.php b/app/Api/V1/Requests/Insight/ExpenseRequest.php new file mode 100644 index 0000000000..e6005e7ef7 --- /dev/null +++ b/app/Api/V1/Requests/Insight/ExpenseRequest.php @@ -0,0 +1,213 @@ +date('start'); + $date->startOfDay(); + + return $date; + } + + /** + * @return Carbon + */ + public function getEnd(): Carbon + { + $date = $this->date('end'); + $date->endOfDay(); + + return $date; + } + + /** + * + */ + private function parseAccounts(): void + { + if (null === $this->accounts) { + $this->accounts = new Collection; + } + if (0 !== $this->accounts->count()) { + return; + } + $repository = app(AccountRepositoryInterface::class); + $repository->setUser(auth()->user()); + $array = $this->get('accounts'); + if (is_array($array)) { + foreach ($array as $accountId) { + $accountId = (int)$accountId; + $account = $repository->findNull($accountId); + if (null !== $account) { + $this->accounts->push($account); + } + } + } + } + + /** + * + */ + private function parseBudgets(): void + { + if (null === $this->budgets) { + $this->budgets = new Collection; + } + if (0 !== $this->budgets->count()) { + return; + } + $repository = app(BudgetRepositoryInterface::class); + $repository->setUser(auth()->user()); + $array = $this->get('budgets'); + if (is_array($array)) { + foreach ($array as $budgetId) { + $budgetId = (int)$budgetId; + $budget = $repository->findNull($budgetId); + if (null !== $budgetId) { + $this->budgets->push($budget); + } + } + } + } + + /** + * @return Collection + */ + public function getBudgets(): Collection + { + $this->parseBudgets(); + + return $this->budgets; + } + + /** + * @return Collection + */ + public function getCategories(): Collection + { + $this->parseCategories(); + + return $this->categories; + } + + + /** + * @return Collection + */ + public function getAssetAccounts(): Collection + { + $this->parseAccounts(); + $return = new Collection; + /** @var Account $account */ + foreach ($this->accounts as $account) { + $type = $account->accountType->type; + if (in_array($type, [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE])) { + $return->push($account); + } + } + + return $return; + } + + /** + * @return Collection + */ + public function getExpenseAccounts(): Collection + { + $this->parseAccounts(); + $return = new Collection; + /** @var Account $account */ + foreach ($this->accounts as $account) { + $type = $account->accountType->type; + if (in_array($type, [AccountType::EXPENSE])) { + $return->push($account); + } + } + + return $return; + } + + /** + * Get all data from the request. + * + * @return array + */ + public function getAll(): array + { + return [ + 'start' => $this->date('start'), + 'end' => $this->date('end'), + ]; + } + + /** + * The rules that the incoming request must be matched against. + * + * @return array + */ + public function rules(): array + { + // this is cheating but it works: + $this->accounts = new Collection; + $this->budgets = new Collection; + $this->categories = new Collection; + + return [ + 'start' => 'required|date', + 'end' => 'required|date|after:start', + ]; + } + + /** + * + */ + private function parseCategories(): void + { + if (null === $this->categories) { + $this->categories = new Collection; + } + if (0 !== $this->categories->count()) { + return; + } + $repository = app(CategoryRepositoryInterface::class); + $repository->setUser(auth()->user()); + $array = $this->get('categories'); + if (is_array($array)) { + foreach ($array as $categoryId) { + $categoryId = (int)$categoryId; + $category = $repository->findNull($categoryId); + if (null !== $categoryId) { + $this->categories->push($category); + } + } + } + } +} \ No newline at end of file diff --git a/app/Repositories/Account/OperationsRepository.php b/app/Repositories/Account/OperationsRepository.php index 1c39fe31d5..5019b146df 100644 --- a/app/Repositories/Account/OperationsRepository.php +++ b/app/Repositories/Account/OperationsRepository.php @@ -26,6 +26,7 @@ namespace FireflyIII\Repositories\Account; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\GroupCollectorInterface; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Support\Collection; @@ -161,17 +162,75 @@ class OperationsRepository implements OperationsRepositoryInterface } /** - * Sum of withdrawal journals in period for a set of accounts, grouped per currency. Amounts are always negative. - * - * @param Carbon $start - * @param Carbon $end - * @param Collection|null $accounts - * - * @return array + * @inheritDoc */ - public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null): array + public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null, ?Collection $expense = null, ?TransactionCurrency $currency = null): array { - throw new FireflyException(sprintf('%s is not yet implemented', __METHOD__)); + $start->startOfDay(); + $end->endOfDay(); + + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + $collector + ->setUser($this->user) + ->setRange($start, $end) + ->setTypes([TransactionType::WITHDRAWAL]); + + if (null !== $accounts) { + $collector->setSourceAccounts($accounts); + } + if(null !== $expense) { + $collector->setDestinationAccounts($expense); + } + if (null !== $currency) { + $collector->setCurrency($currency); + } + $journals = $collector->getExtractedJournals(); + + // same but for foreign currencies: + if (null !== $currency) { + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + $collector->setUser($this->user)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]) + ->setForeignCurrency($currency)->setBudgets($budgets); + + if (null !== $accounts) { + $collector->setAccounts($accounts); + } + $result = $collector->getExtractedJournals(); + + // do not use array_merge because you want keys to overwrite (otherwise you get double results): + $journals = $result + $journals; + } + $array = []; + + foreach ($journals as $journal) { + $currencyId = (int)$journal['currency_id']; + $array[$currencyId] = $array[$currencyId] ?? [ + 'sum' => '0', + 'currency_id' => $currencyId, + 'currency_name' => $journal['currency_name'], + 'currency_symbol' => $journal['currency_symbol'], + 'currency_code' => $journal['currency_code'], + 'currency_decimal_places' => $journal['currency_decimal_places'], + ]; + $array[$currencyId]['sum'] = bcadd($array[$currencyId]['sum'], app('steam')->negative($journal['amount'])); + + // also do foreign amount: + $foreignId = (int)$journal['foreign_currency_id']; + if (0 !== $foreignId) { + $array[$foreignId] = $array[$foreignId] ?? [ + 'sum' => '0', + 'currency_id' => $foreignId, + 'currency_name' => $journal['foreign_currency_name'], + 'currency_symbol' => $journal['foreign_currency_symbol'], + 'currency_code' => $journal['foreign_currency_code'], + 'currency_decimal_places' => $journal['foreign_currency_decimal_places'], + ]; + $array[$foreignId]['sum'] = bcadd($array[$foreignId]['sum'], app('steam')->negative($journal['foreign_amount'])); + } + } + return $array; } /** diff --git a/app/Repositories/Account/OperationsRepositoryInterface.php b/app/Repositories/Account/OperationsRepositoryInterface.php index 04a5c214f9..b8404113aa 100644 --- a/app/Repositories/Account/OperationsRepositoryInterface.php +++ b/app/Repositories/Account/OperationsRepositoryInterface.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\User; use Illuminate\Support\Collection; @@ -66,13 +67,15 @@ interface OperationsRepositoryInterface /** * Sum of withdrawal journals in period for a set of accounts, grouped per currency. Amounts are always negative. * - * @param Carbon $start - * @param Carbon $end - * @param Collection|null $accounts + * @param Carbon $start + * @param Carbon $end + * @param Collection|null $accounts + * @param Collection|null $expense + * @param TransactionCurrency|null $currency * * @return array */ - public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null): array; + public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null, ?Collection $expense = null, ?TransactionCurrency $currency = null): array; /** * Sum of income journals in period for a set of accounts, grouped per currency. Amounts are always positive. diff --git a/routes/api.php b/routes/api.php index 820281bf15..e9415e9502 100644 --- a/routes/api.php +++ b/routes/api.php @@ -93,22 +93,33 @@ Route::group( ['namespace' => 'FireflyIII\Api\V1\Controllers\Insight\Expense', 'prefix' => 'insight/expense', 'as' => 'api.v1.insight.expense.',], static function () { - // Insight in expenses. + // Insight in expenses per account: Route::get('expense', ['uses' => 'AccountController@expense', 'as' => 'expense']); Route::get('asset', ['uses' => 'AccountController@asset', 'as' => 'asset']); Route::get('total', ['uses' => 'PeriodController@total', 'as' => 'total']); + + // TODO bill and no bill + asset account. + Route::get('bill', ['uses' => 'BillController@bill', 'as' => 'bill']); + Route::get('no-bill', ['uses' => 'BillController@noBill', 'as' => 'no-bill']); + Route::get('budget', ['uses' => 'BudgetController@budget', 'as' => 'budget']); - - // TODO Budget/no budget and budget limit Route::get('no-budget', ['uses' => 'BudgetController@noBudget', 'as' => 'no-budget']); - - // TODO category and no category Route::get('category', ['uses' => 'CategoryController@category', 'as' => 'category']); Route::get('no-category', ['uses' => 'CategoryController@noCategory', 'as' => 'no-category']); - // TODO bill and no bill - Route::get('bill', ['uses' => 'BillController@bill', 'as' => 'bill']); - Route::get('no-bill', ['uses' => 'BillController@noBill', 'as' => 'no-bill']); + // TODO per tag + asset account + Route::get('tag', ['uses' => 'TagController@tag', 'as' => 'tag']); + Route::get('no-tag', ['uses' => 'TagController@noTag', 'as' => 'no-tag']); + + + // TODO per budget limit? + // TODO per object group? + // TODO per recurrence? + + + + + } ); @@ -134,6 +145,9 @@ Route::group( ); +// Insight in transfers +// TODO transfers per piggy? +