diff --git a/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php b/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php index 095e636a76..c2835525cc 100644 --- a/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php +++ b/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php @@ -25,11 +25,102 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Models\PiggyBank; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; +use FireflyIII\User; +use Illuminate\Http\JsonResponse; /** * Class PiggyBankController */ class PiggyBankController extends Controller { + private PiggyBankRepositoryInterface $piggyRepository; + private AccountRepositoryInterface $accountRepository; + + /** + * PiggyBankController constructor. + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->piggyRepository = app(PiggyBankRepositoryInterface::class); + $this->accountRepository = app(AccountRepositoryInterface::class); + $this->piggyRepository->setUser($user); + $this->accountRepository->setUser($user); + + return $next($request); + } + ); + } + + /** + * @param AutocompleteRequest $request + * + * @return JsonResponse + */ + public function piggyBanks(AutocompleteRequest $request): JsonResponse + { + $data = $request->getData(); + $piggies = $this->piggyRepository->searchPiggyBank($data['query'], $data['limit']); + $defaultCurrency = app('amount')->getDefaultCurrency(); + $response = []; + /** @var PiggyBank $piggy */ + foreach ($piggies as $piggy) { + $currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; + $piggy->objectGroup = $piggy->objectGroups->first(); + $piggy->name_with_amount + = $response[] = [ + 'id' => $piggy->id, + 'name' => $piggy->name, + 'currency_id' => $currency->id, + 'currency_name' => $currency->name, + 'currency_code' => $currency->code, + 'currency_decimal_places' => $currency->decimal_places, + ]; + } + + return response()->json($response); + } + + /** + * @param AutocompleteRequest $request + * + * @return JsonResponse + */ + public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse + { + $data = $request->getData(); + $piggies = $this->piggyRepository->searchPiggyBank($data['query'], $data['limit']); + $defaultCurrency = app('amount')->getDefaultCurrency(); + $response = []; + /** @var PiggyBank $piggy */ + foreach ($piggies as $piggy) { + $currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; + $currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0'; + $piggy->objectGroup = $piggy->objectGroups->first(); + $piggy->name_with_amount + = $response[] = [ + 'id' => $piggy->id, + 'name' => $piggy->name, + 'name_with_balance' => sprintf( + '%s (%s / %s)', $piggy->name, app('amount')->formatAnything($currency, $currentAmount, false), + app('amount')->formatAnything($currency, $piggy->targetamount, false), + ), + 'currency_id' => $currency->id, + 'currency_name' => $currency->name, + 'currency_code' => $currency->code, + 'currency_decimal_places' => $currency->decimal_places, + ]; + } + + return response()->json($response); + } } diff --git a/app/Api/V1/Controllers/Autocomplete/RuleController.php b/app/Api/V1/Controllers/Autocomplete/RuleController.php index 8486a3181a..fd7453d05a 100644 --- a/app/Api/V1/Controllers/Autocomplete/RuleController.php +++ b/app/Api/V1/Controllers/Autocomplete/RuleController.php @@ -26,6 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; +/** + * Class RuleController + */ class RuleController extends Controller { diff --git a/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php b/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php index a67035a098..bbc598e40b 100644 --- a/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php +++ b/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php @@ -26,6 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; +/** + * Class RuleGroupController + */ class RuleGroupController extends Controller { diff --git a/app/Http/Controllers/Report/CategoryController.php b/app/Http/Controllers/Report/CategoryController.php index 8219a43d44..c3e633f188 100644 --- a/app/Http/Controllers/Report/CategoryController.php +++ b/app/Http/Controllers/Report/CategoryController.php @@ -677,12 +677,9 @@ class CategoryController extends Controller $cache->addProperty('category-report'); $cache->addProperty($accounts->pluck('id')->toArray()); if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore + // return $cache->get(); // @codeCoverageIgnore } - /** @var CategoryRepositoryInterface $repository */ - $repository = app(CategoryRepositoryInterface::class); - /** @var OperationsRepositoryInterface $opsRepository */ $opsRepository = app(OperationsRepositoryInterface::class); diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 4ec0ca2351..f11bdc356a 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -403,4 +403,19 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface { $this->user->piggyBanks()->delete(); } + + /** + * @inheritDoc + */ + public function searchPiggyBank(string $query, int $limit): Collection + { + $search = $this->user->piggyBanks(); + if ('' !== $query) { + $search->where('piggy_banks.name', 'LIKE', sprintf('%%%s%%', $query)); + } + $search->orderBy('piggy_banks.order', 'ASC') + ->orderBy('piggy_banks.name', 'ASC')->where('piggy_banks.active', 1); + + return $search->take($limit)->get(); + } } diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php index 942e104f18..e8848c6912 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php +++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php @@ -145,6 +145,16 @@ interface PiggyBankRepositoryInterface */ public function findByName(string $name): ?PiggyBank; + /** + * Search for piggy banks. + * + * @param string $query + * @param int $limit + * + * @return Collection + */ + public function searchPiggyBank(string $query, int $limit): Collection; + /** * @param int $piggyBankId * diff --git a/routes/api.php b/routes/api.php index 551b2597c1..20877a8aff 100644 --- a/routes/api.php +++ b/routes/api.php @@ -66,8 +66,10 @@ Route::group( Route::get('budgets', ['uses' => 'BudgetController@budgets', 'as' => 'budgets']); Route::get('categories', ['uses' => 'CategoryController@categories', 'as' => 'categories']); Route::get('currencies', ['uses' => 'CurrencyController@currencies', 'as' => 'currencies']); - Route::get('currencies-with-code', ['uses' => 'CurrencyController@currenciesWithCode', 'as' => 'currenciesWithCode']); + Route::get('currencies-with-code', ['uses' => 'CurrencyController@currenciesWithCode', 'as' => 'currencies-with-code']); Route::get('object-groups', ['uses' => 'ObjectGroupController@objectGroups', 'as' => 'object-groups']); + Route::get('piggy-banks', ['uses' => 'PiggyBankController@piggyBanks', 'as' => 'piggy-banks']); + Route::get('piggy-banks-with-balance', ['uses' => 'PiggyBankController@piggyBanksWithBalance', 'as' => 'piggy-banks-with-balance']); } );