diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php index e5046e54ed..6f6827b3db 100644 --- a/app/Http/Controllers/Json/AutoCompleteController.php +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -33,6 +33,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; 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; @@ -96,73 +97,12 @@ class AutoCompleteController extends Controller return response()->json($return); } - /** - * An auto-complete specifically for revenue accounts, used when converting transactions mostly. - * @param Request $request - * - * @return JsonResponse - */ - public function revenueAccounts(Request $request): JsonResponse - { - $search = $request->get('search'); - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - - // filter the account types: - $allowedAccountTypes = [AccountType::REVENUE]; - Log::debug('Now in revenueAccounts(). Filtering results.', $allowedAccountTypes); - - $return = []; - $result = $repository->searchAccount((string)$search, $allowedAccountTypes); - - /** @var Account $account */ - foreach ($result as $account) { - $return[] = [ - 'id' => $account->id, - 'name' => $account->name, - 'type' => $account->accountType->type, - ]; - } - - return response()->json($return); - } - - /** - * An auto-complete specifically for expense accounts, used when mass updating mostly. - * @param Request $request - * - * @return JsonResponse - */ - public function expenseAccounts(Request $request): JsonResponse - { - $search = $request->get('search'); - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - - // filter the account types: - $allowedAccountTypes = [AccountType::EXPENSE]; - Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes); - - $return = []; - $result = $repository->searchAccount((string)$search, $allowedAccountTypes); - - /** @var Account $account */ - foreach ($result as $account) { - $return[] = [ - 'id' => $account->id, - 'name' => $account->name, - 'type' => $account->accountType->type, - ]; - } - - return response()->json($return); - } - /** * 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 @@ -176,6 +116,7 @@ class AutoCompleteController extends Controller $filtered = $result->unique('description'); $limited = $filtered->slice(0, 15); $array = $limited->toArray(); + return response()->json(array_values($array)); } @@ -186,6 +127,7 @@ class AutoCompleteController extends Controller * 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 @@ -193,19 +135,27 @@ class AutoCompleteController extends Controller $search = (string)$request->get('search'); /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepositoryInterface::class); - $result = $repository->searchJournalDescriptions($search); - $array = []; + + /** @var TransactionGroupRepositoryInterface $groupRepos */ + $groupRepos = app(TransactionGroupRepositoryInterface::class); + + $result = $repository->searchJournalDescriptions($search); + $array = []; if (is_numeric($search)) { - $firstResult = $repository->findNull((int)$search); + // search for group, not journal. + $firstResult = $groupRepos->find((int)$search); if (null !== $firstResult) { - $array[] = $firstResult->toArray(); + // 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()); + $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']); @@ -217,6 +167,7 @@ class AutoCompleteController extends Controller /** * @param Request $request + * * @return JsonResponse * @codeCoverageIgnore */ @@ -246,45 +197,6 @@ class AutoCompleteController extends Controller return response()->json($result->toArray()); } - /** - * @param Request $request - * @return JsonResponse - * @codeCoverageIgnore - */ - public function currencyNames(Request $request): JsonResponse - { - $query = (string)$request->get('search'); - /** @var CurrencyRepositoryInterface $repository */ - $repository = app(CurrencyRepositoryInterface::class); - $result = $repository->searchCurrency($query)->toArray(); - foreach ($result as $index => $item) { - $result[$index]['name'] = sprintf('%s (%s)', $item['name'], $item['code']); - } - - return response()->json($result); - } - - /** - * @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); - } - /** * @return JsonResponse * @codeCoverageIgnore @@ -311,6 +223,57 @@ class AutoCompleteController extends Controller return response()->json($return); } + /** + * @param Request $request + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function currencyNames(Request $request): JsonResponse + { + $query = (string)$request->get('search'); + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + $result = $repository->searchCurrency($query)->toArray(); + foreach ($result as $index => $item) { + $result[$index]['name'] = sprintf('%s (%s)', $item['name'], $item['code']); + } + + return response()->json($result); + } + + /** + * An auto-complete specifically for expense accounts, used when mass updating mostly. + * + * @param Request $request + * + * @return JsonResponse + */ + public function expenseAccounts(Request $request): JsonResponse + { + $search = $request->get('search'); + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); + + // filter the account types: + $allowedAccountTypes = [AccountType::EXPENSE]; + Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes); + + $return = []; + $result = $repository->searchAccount((string)$search, $allowedAccountTypes); + + /** @var Account $account */ + foreach ($result as $account) { + $return[] = [ + 'id' => $account->id, + 'name' => $account->name, + 'type' => $account->accountType->type, + ]; + } + + return response()->json($return); + } + /** * @return JsonResponse * @codeCoverageIgnore @@ -324,7 +287,40 @@ class AutoCompleteController extends Controller } /** + * An auto-complete specifically for revenue accounts, used when converting transactions mostly. + * * @param Request $request + * + * @return JsonResponse + */ + public function revenueAccounts(Request $request): JsonResponse + { + $search = $request->get('search'); + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); + + // filter the account types: + $allowedAccountTypes = [AccountType::REVENUE]; + Log::debug('Now in revenueAccounts(). Filtering results.', $allowedAccountTypes); + + $return = []; + $result = $repository->searchAccount((string)$search, $allowedAccountTypes); + + /** @var Account $account */ + foreach ($result as $account) { + $return[] = [ + 'id' => $account->id, + 'name' => $account->name, + 'type' => $account->accountType->type, + ]; + } + + return response()->json($return); + } + + /** + * @param Request $request + * * @return JsonResponse * @codeCoverageIgnore */ @@ -343,4 +339,25 @@ class AutoCompleteController extends Controller 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); + } + } diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepository.php b/app/Repositories/TransactionGroup/TransactionGroupRepository.php index 78ae1eb5ea..5870bcea5b 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepository.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepository.php @@ -42,13 +42,15 @@ use FireflyIII\Models\TransactionType; use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService; use FireflyIII\Services\Internal\Update\GroupUpdateService; use FireflyIII\Support\NullArrayObject; +use FireflyIII\User; use Illuminate\Database\Eloquent\Builder; /** * Class TransactionGroupRepository */ -class TransactionGroupRepository implements TransactionGroupRepositoryInterface +class TransactionGroupRepository implements TransactionGroupRepositoryInterface { + /** @var User */ private $user; /** @@ -61,6 +63,28 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac } } + /** + * @param TransactionGroup $group + */ + public function destroy(TransactionGroup $group): void + { + /** @var TransactionGroupDestroyService $service */ + $service = new TransactionGroupDestroyService; + $service->destroy($group); + } + + /** + * Find a transaction group by its ID. + * + * @param int $groupId + * + * @return TransactionGroup|null + */ + public function find(int $groupId): ?TransactionGroup + { + return $this->user->transactionGroups()->where('id', $groupId)->first(); + } + /** * Return all attachments for all journals in the group. * @@ -148,7 +172,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac /** * Return object with all found meta field things as Carbon objects. * - * @param int $journalId + * @param int $journalId * @param array $fields * * @return NullArrayObject @@ -174,7 +198,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac /** * Return object with all found meta field things. * - * @param int $journalId + * @param int $journalId * @param array $fields * * @return NullArrayObject @@ -278,9 +302,9 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac } /** - * @param mixed $user + * @param User $user */ - public function setUser($user): void + public function setUser(User $user): void { $this->user = $user; } @@ -301,7 +325,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac /** * @param TransactionGroup $transactionGroup - * @param array $data + * @param array $data * * @return TransactionGroup * @@ -310,7 +334,8 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac public function update(TransactionGroup $transactionGroup, array $data): TransactionGroup { /** @var GroupUpdateService $service */ - $service = app(GroupUpdateService::class); + $service = app(GroupUpdateService::class); + return $service->update($transactionGroup, $data); } @@ -363,14 +388,4 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterfac return $return; } - - /** - * @param TransactionGroup $group - */ - public function destroy(TransactionGroup $group): void - { - /** @var TransactionGroupDestroyService $service */ - $service = new TransactionGroupDestroyService; - $service->destroy($group); - } } diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php b/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php index 2055726702..d39a45a98e 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Repositories\TransactionGroup; use FireflyIII\Models\TransactionGroup; -use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService; use FireflyIII\Support\NullArrayObject; use FireflyIII\User; @@ -34,6 +33,20 @@ use FireflyIII\User; interface TransactionGroupRepositoryInterface { + /** + * @param TransactionGroup $group + */ + public function destroy(TransactionGroup $group): void; + + /** + * Find a transaction group by its ID. + * + * @param int $groupId + * + * @return TransactionGroup|null + */ + public function find(int $groupId): ?TransactionGroup; + /** * Return all attachments for all journals in the group. * @@ -43,11 +56,6 @@ interface TransactionGroupRepositoryInterface */ public function getAttachments(TransactionGroup $group): array; - /** - * @param TransactionGroup $group - */ - public function destroy(TransactionGroup $group): void; - /** * Return all journal links for all journals in the group. *