diff --git a/app/Api/V2/Controllers/Model/Budget/ListController.php b/app/Api/V2/Controllers/Model/Budget/ListController.php index 8218695ebc..2d84fb5b58 100644 --- a/app/Api/V2/Controllers/Model/Budget/ListController.php +++ b/app/Api/V2/Controllers/Model/Budget/ListController.php @@ -22,20 +22,38 @@ namespace FireflyIII\Api\V2\Controllers\Model\Budget; use FireflyIII\Api\V2\Controllers\Controller; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Transformers\V2\BudgetTransformer; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; class ListController extends Controller { + private BudgetRepositoryInterface $repository; + + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->repository = app(BudgetRepositoryInterface::class); + return $next($request); + } + ); + } + /** * @return JsonResponse */ - public function index(): JsonResponse + public function index(Request $request): JsonResponse { - $collection = new Collection; - $paginator = new LengthAwarePaginator($collection, 0, 50, 1); + $collection = $this->repository->getActiveBudgets(); + $total = $collection->count(); + $collection->slice($this->pageSize * $this->parameters->get('page'), $this->pageSize); + + $paginator = new LengthAwarePaginator($collection, $total, $this->pageSize, $this->parameters->get('page')); $transformer = new BudgetTransformer(); return response() ->api($this->jsonApiList('budgets', $paginator, $transformer)) diff --git a/app/Api/V2/Controllers/Model/BudgetLimit/ListController.php b/app/Api/V2/Controllers/Model/BudgetLimit/ListController.php new file mode 100644 index 0000000000..f1ac18dba7 --- /dev/null +++ b/app/Api/V2/Controllers/Model/BudgetLimit/ListController.php @@ -0,0 +1,64 @@ +. + */ + +namespace FireflyIII\Api\V2\Controllers\Model\BudgetLimit; + +use FireflyIII\Api\V2\Controllers\Controller; +use FireflyIII\Api\V2\Request\Generic\DateRequest; +use FireflyIII\Models\Budget; +use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; +use FireflyIII\Transformers\V2\BudgetLimitTransformer; +use Illuminate\Http\JsonResponse; +use Illuminate\Pagination\LengthAwarePaginator; + +class ListController extends Controller +{ + private BudgetLimitRepositoryInterface $repository; + + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->repository = app(BudgetLimitRepositoryInterface::class); + return $next($request); + } + ); + } + + /** + * @return JsonResponse + */ + public function index(DateRequest $request, Budget $budget): JsonResponse + { + $dates = $request->getAll(); + $collection = $this->repository->getBudgetLimits($budget,$dates['start'], $dates['end']); + $total = $collection->count(); + $collection->slice($this->pageSize * $this->parameters->get('page'), $this->pageSize); + + $paginator = new LengthAwarePaginator($collection, $total, $this->pageSize, $this->parameters->get('page')); + $transformer = new BudgetLimitTransformer(); + return response() + ->api($this->jsonApiList('budget_limits', $paginator, $transformer)) + ->header('Content-Type', self::CONTENT_TYPE); + } + +} diff --git a/app/Transformers/V2/BudgetLimitTransformer.php b/app/Transformers/V2/BudgetLimitTransformer.php new file mode 100644 index 0000000000..97f9a58a77 --- /dev/null +++ b/app/Transformers/V2/BudgetLimitTransformer.php @@ -0,0 +1,116 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Transformers\V2; + +use FireflyIII\Models\BudgetLimit; +use FireflyIII\Repositories\Budget\OperationsRepository; +use Illuminate\Support\Collection; +use League\Fractal\Resource\Item; + +/** + * Class BudgetLimitTransformer + */ +class BudgetLimitTransformer extends AbstractTransformer +{ + /** @var string[] */ + protected array $availableIncludes + = [ + 'budget', + ]; + + /** + * Include Budget + * + * @param BudgetLimit $limit + * + * @return Item + */ + public function includeBudget(BudgetLimit $limit) + { + return $this->item($limit->budget, new BudgetTransformer, 'budgets'); + } + + /** + * Transform the note. + * + * @param BudgetLimit $budgetLimit + * + * @return array + */ + public function transform(BudgetLimit $budgetLimit): array + { +// $repository = app(OperationsRepository::class); +// $repository->setUser($budgetLimit->budget->user); +// $expenses = $repository->sumExpenses( +// $budgetLimit->start_date, $budgetLimit->end_date, null, new Collection([$budgetLimit->budget]), $budgetLimit->transactionCurrency +// ); + $currency = $budgetLimit->transactionCurrency; + $amount = $budgetLimit->amount; + $currencyDecimalPlaces = 2; + $currencyId = null; + $currencyName = null; + $currencyCode = null; + $currencySymbol = null; + if (null !== $currency) { + $amount = $budgetLimit->amount; + $currencyId = (int) $currency->id; + $currencyName = $currency->name; + $currencyCode = $currency->code; + $currencySymbol = $currency->symbol; + $currencyDecimalPlaces = $currency->decimal_places; + } + $amount = number_format((float) $amount, $currencyDecimalPlaces, '.', ''); + + return [ + 'id' => (string) $budgetLimit->id, + 'created_at' => $budgetLimit->created_at->toAtomString(), + 'updated_at' => $budgetLimit->updated_at->toAtomString(), + 'start' => $budgetLimit->start_date->toAtomString(), + 'end' => $budgetLimit->end_date->endOfDay()->toAtomString(), + 'budget_id' => (string) $budgetLimit->budget_id, + 'currency_id' => (string) $currencyId, + 'currency_code' => $currencyCode, + 'currency_name' => $currencyName, + 'currency_decimal_places' => $currencyDecimalPlaces, + 'currency_symbol' => $currencySymbol, + 'amount' => $amount, + 'period' => $budgetLimit->period, + //'spent' => $expenses[$currencyId]['sum'] ?? '0', + 'links' => [ + [ + 'rel' => 'self', + 'uri' => sprintf('/budget-limits/%d', $budgetLimit->id), + ], + ], + ]; + } + + /** + * @inheritDoc + */ + public function collectMetaData(Collection $objects): void + { + // TODO: Implement collectMetaData() method. + } +} diff --git a/app/Transformers/V2/BudgetTransformer.php b/app/Transformers/V2/BudgetTransformer.php index 9f38d43a30..e9df826dba 100644 --- a/app/Transformers/V2/BudgetTransformer.php +++ b/app/Transformers/V2/BudgetTransformer.php @@ -25,6 +25,7 @@ namespace FireflyIII\Transformers\V2; use FireflyIII\Models\Budget; use Illuminate\Support\Collection; +use Symfony\Component\HttpFoundation\ParameterBag; /** * Class BudgetTransformer @@ -43,7 +44,7 @@ class BudgetTransformer extends AbstractTransformer { //$this->opsRepository = app(OperationsRepositoryInterface::class); //$this->repository = app(BudgetRepositoryInterface::class); - //$this->parameters = new ParameterBag(); + $this->parameters = new ParameterBag(); } /** diff --git a/frontend/src/api/v2/budget-limits/list.js b/frontend/src/api/v2/budget-limits/list.js new file mode 100644 index 0000000000..ebfd951302 --- /dev/null +++ b/frontend/src/api/v2/budget-limits/list.js @@ -0,0 +1,31 @@ +/* + * list.js + * Copyright (c) 2022 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {api} from "boot/axios"; +import {format} from "date-fns"; + +export default class List { + list(budget, start, end, page) { + let url = '/api/v2/budgets/' + budget + '/limits'; + let startStr = format(start, 'y-MM-dd'); + let endStr = format(end, 'y-MM-dd'); + return api.get(url, {params: {page: page, start: startStr, end: endStr}}); + } +} diff --git a/frontend/src/components/dashboard/BudgetBox.vue b/frontend/src/components/dashboard/BudgetBox.vue index 8c743a4438..0abd099862 100644 --- a/frontend/src/components/dashboard/BudgetBox.vue +++ b/frontend/src/components/dashboard/BudgetBox.vue @@ -30,30 +30,31 @@ - - - I am budget + + + + + {{ budget.name }} + + + + + + + {{ limit.amount }} + {{ limit.start }} + {{ limit.end }} + + + I am bar + + + - I am range - - - I am bar - - - - - I am range - - - I am bar - - - - - I am budget + I am no budget @@ -65,6 +66,7 @@