. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Json; use Amount; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\PiggyBank; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; /** * Class AutoCompleteController. * * TODO autocomplete for transaction types. * */ class AutoCompleteController extends Controller { /** * Searches in the titles of all transaction journals. * The result is limited to the top 15 unique results. * * @param Request $request * * @return JsonResponse */ public function allJournals(Request $request): JsonResponse { $search = (string) $request->get('search'); /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepositoryInterface::class); $result = $repository->searchJournalDescriptions($search); // limit and unique $filtered = $result->unique('description'); $limited = $filtered->slice(0, 15); $array = $limited->toArray(); // duplicate 'description' value into 'name': $array = array_map( static function (array $journal) { $journal['name'] = $journal['description']; return $journal; }, $array ); return response()->json(array_values($array)); } /** * Searches in the titles of all transaction journals. * The result is limited to the top 15 unique results. * * If the query is numeric, it will append the journal with that particular ID. * * @param Request $request * * @return JsonResponse */ public function allJournalsWithID(Request $request): JsonResponse { $search = (string) $request->get('search'); /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepositoryInterface::class); /** @var TransactionGroupRepositoryInterface $groupRepos */ $groupRepos = app(TransactionGroupRepositoryInterface::class); $result = $repository->searchJournalDescriptions($search); $array = []; if (is_numeric($search)) { // search for group, not journal. $firstResult = $groupRepos->find((int) $search); if (null !== $firstResult) { // group may contain multiple journals, each a result: foreach ($firstResult->transactionJournals as $journal) { $array[] = $journal->toArray(); } } } // if not numeric, search ahead! // limit and unique $limited = $result->slice(0, 15); $array = array_merge($array, $limited->toArray()); foreach ($array as $index => $item) { // give another key for consistency $array[$index]['name'] = sprintf('#%d: %s', $item['transaction_group_id'], $item['description']); } return response()->json($array); } /** * @return JsonResponse * @codeCoverageIgnore */ public function piggyBanks(): JsonResponse { /** @var PiggyBankRepositoryInterface $repository */ $repository = app(PiggyBankRepositoryInterface::class); /** @var AccountRepositoryInterface $accountRepos */ $accountRepos = app(AccountRepositoryInterface::class); $piggies = $repository->getPiggyBanks(); $defaultCurrency = Amount::getDefaultCurrency(); $response = []; /** @var PiggyBank $piggy */ foreach ($piggies as $piggy) { $currency = $accountRepos->getAccountCurrency($piggy->account) ?? $defaultCurrency; $currentAmount = $repository->getRepetition($piggy)->currentamount ?? '0'; $piggy->objectGroup = $piggy->objectGroups->first(); $piggy->name_with_amount = sprintf( '%s (%s / %s)', $piggy->name, app('amount')->formatAnything($currency, $currentAmount, false), app('amount')->formatAnything($currency, $piggy->targetamount, false), ); $response[] = $piggy->toArray(); } return response()->json($response); } /** * @param Request $request * * @return JsonResponse * @codeCoverageIgnore */ public function tags(Request $request): JsonResponse { $search = (string) $request->get('search'); /** @var TagRepositoryInterface $repository */ $repository = app(TagRepositoryInterface::class); $result = $repository->searchTags($search); $array = $result->toArray(); foreach ($array as $index => $item) { // rename field for consistency. $array[$index]['name'] = $item['tag']; } return response()->json($array); } /** * @param Request $request * * @return JsonResponse * @codeCoverageIgnore */ public function transactionTypes(Request $request): JsonResponse { $query = (string) $request->get('search'); /** @var TransactionTypeRepositoryInterface $repository */ $repository = app(TransactionTypeRepositoryInterface::class); $array = $repository->searchTypes($query)->toArray(); foreach ($array as $index => $item) { // different key for consistency. $array[$index]['name'] = $item['type']; } return response()->json($array); } }