diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionController.php b/app/Api/V1/Controllers/Autocomplete/TransactionController.php index 15a3215a87..79b0687100 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionController.php @@ -54,7 +54,7 @@ class TransactionController extends Controller function ($request, $next) { /** @var User $user */ $user = auth()->user(); - $userGroup = $this->validateUserGroup($request); + $userGroup = $this->validateUserGroup($request); $this->repository = app(JournalRepositoryInterface::class); $this->groupRepository = app(TransactionGroupRepositoryInterface::class); $this->repository->setUser($user); diff --git a/app/Api/V1/Controllers/Models/Transaction/StoreController.php b/app/Api/V1/Controllers/Models/Transaction/StoreController.php index 3858687025..933154037b 100644 --- a/app/Api/V1/Controllers/Models/Transaction/StoreController.php +++ b/app/Api/V1/Controllers/Models/Transaction/StoreController.php @@ -62,8 +62,8 @@ class StoreController extends Controller $this->middleware( function ($request, $next) { /** @var User $admin */ - $admin = auth()->user(); - $userGroup = $this->validateUserGroup($request); + $admin = auth()->user(); + $userGroup = $this->validateUserGroup($request); $this->groupRepository = app(TransactionGroupRepositoryInterface::class); $this->groupRepository->setUser($admin); @@ -107,35 +107,36 @@ class StoreController extends Controller throw new ValidationException($validator); } app('preferences')->mark(); - $applyRules = $data['apply_rules'] ?? true; - $fireWebhooks = $data['fire_webhooks'] ?? true; + $applyRules = $data['apply_rules'] ?? true; + $fireWebhooks = $data['fire_webhooks'] ?? true; event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks)); - $manager = $this->getManager(); + $manager = $this->getManager(); /** @var User $admin */ - $admin = auth()->user(); + $admin = auth()->user(); // use new group collector: /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); + $collector = app(GroupCollectorInterface::class); $collector ->setUser($admin) ->setUserGroup($this->userGroup) // filter on transaction group. ->setTransactionGroup($transactionGroup) // all info needed for the API: - ->withAPIInformation(); + ->withAPIInformation() + ; - $selectedGroup = $collector->getGroups()->first(); + $selectedGroup = $collector->getGroups()->first(); if (null === $selectedGroup) { throw new FireflyException('200032: Cannot find transaction. Possibly, a rule deleted this transaction after its creation.'); } /** @var TransactionGroupTransformer $transformer */ - $transformer = app(TransactionGroupTransformer::class); + $transformer = app(TransactionGroupTransformer::class); $transformer->setParameters($this->parameters); - $resource = new Item($selectedGroup, $transformer, 'transactions'); + $resource = new Item($selectedGroup, $transformer, 'transactions'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } diff --git a/app/Api/V2/Controllers/Autocomplete/AccountController.php b/app/Api/V2/Controllers/Autocomplete/AccountController.php index 5752b2f69a..946828aafb 100644 --- a/app/Api/V2/Controllers/Autocomplete/AccountController.php +++ b/app/Api/V2/Controllers/Autocomplete/AccountController.php @@ -32,7 +32,6 @@ use FireflyIII\Models\AccountBalance; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface; use FireflyIII\Support\Http\Api\ExchangeRateConverter; -use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Log; diff --git a/app/Factory/TagFactory.php b/app/Factory/TagFactory.php index f1ec639ea5..3cdb46d2c3 100644 --- a/app/Factory/TagFactory.php +++ b/app/Factory/TagFactory.php @@ -103,7 +103,7 @@ class TagFactory public function setUser(User $user): void { - $this->user = $user; + $this->user = $user; $this->userGroup = $user->userGroup; } diff --git a/app/Factory/TransactionFactory.php b/app/Factory/TransactionFactory.php index 4238aac71c..6fe9dbb539 100644 --- a/app/Factory/TransactionFactory.php +++ b/app/Factory/TransactionFactory.php @@ -29,10 +29,8 @@ use FireflyIII\Models\Account; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; -use FireflyIII\Models\UserGroup; use FireflyIII\Rules\UniqueIban; use FireflyIII\Services\Internal\Update\AccountUpdateService; -use FireflyIII\User; use Illuminate\Database\QueryException; /** @@ -164,7 +162,7 @@ class TransactionFactory } app('log')->debug('Will update account with IBAN information.'); - $service = app(AccountUpdateService::class); + $service = app(AccountUpdateService::class); $service->update($this->account, ['iban' => $this->accountInformation['iban']]); } diff --git a/app/Factory/TransactionGroupFactory.php b/app/Factory/TransactionGroupFactory.php index 4d894a0aea..3ddf9d37f6 100644 --- a/app/Factory/TransactionGroupFactory.php +++ b/app/Factory/TransactionGroupFactory.php @@ -96,7 +96,8 @@ class TransactionGroupFactory $this->user = $user; } - public function setUserGroup(UserGroup $userGroup): void { + public function setUserGroup(UserGroup $userGroup): void + { $this->userGroup = $userGroup; } } diff --git a/app/Factory/TransactionJournalFactory.php b/app/Factory/TransactionJournalFactory.php index 0f8e95a8ec..f8d3cc363a 100644 --- a/app/Factory/TransactionJournalFactory.php +++ b/app/Factory/TransactionJournalFactory.php @@ -178,6 +178,7 @@ class TransactionJournalFactory if (true === FireflyConfig::get('utc', false)->data) { $carbon->setTimezone('UTC'); } + try { // validate source and destination using a new Validator. $this->validateAccounts($row); @@ -402,7 +403,7 @@ class TransactionJournalFactory */ public function setUser(User $user): void { - $this->user = $user; + $this->user = $user; $this->userGroup = $user->userGroup; $this->currencyRepository->setUser($this->user); $this->tagFactory->setUser($user); @@ -413,7 +414,8 @@ class TransactionJournalFactory $this->accountRepository->setUser($this->user); } - public function setUserGroup(UserGroup $userGroup): void { + public function setUserGroup(UserGroup $userGroup): void + { $this->userGroup = $userGroup; $this->currencyRepository->setUserGroup($userGroup); $this->tagFactory->setUserGroup($userGroup); diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index f5b492b4f1..57728ffe9b 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -54,7 +54,6 @@ class AccountRepository implements AccountRepositoryInterface { use UserGroupTrait; - /** * Moved here from account CRUD. */ diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index 20e1fafb16..3878423227 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -149,6 +149,7 @@ interface AccountRepositoryInterface public function searchAccountNr(string $query, array $types, int $limit): Collection; public function setUser(null|Authenticatable|User $user): void; + public function setUserGroup(UserGroup $userGroup): void; public function store(array $data): Account; diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index 25471b2397..3d0299071d 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -39,8 +39,6 @@ use FireflyIII\Services\Internal\Update\BillUpdateService; use FireflyIII\Support\CacheProperties; use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; -use FireflyIII\User; -use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Database\Query\JoinClause; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; diff --git a/app/Repositories/Bill/BillRepositoryInterface.php b/app/Repositories/Bill/BillRepositoryInterface.php index 2e50edca39..25553941d0 100644 --- a/app/Repositories/Bill/BillRepositoryInterface.php +++ b/app/Repositories/Bill/BillRepositoryInterface.php @@ -40,6 +40,7 @@ interface BillRepositoryInterface public function billEndsWith(string $query, int $limit): Collection; public function billStartsWith(string $query, int $limit): Collection; + public function setUserGroup(UserGroup $userGroup): void; /** diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 6b19e6eced..3e7426ec0a 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -42,8 +42,6 @@ use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface; use FireflyIII\Services\Internal\Destroy\BudgetDestroyService; use FireflyIII\Support\Http\Api\ExchangeRateConverter; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; -use FireflyIII\User; -use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Database\QueryException; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 918ba2273f..89e0c44ed3 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -40,6 +40,7 @@ interface BudgetRepositoryInterface public function budgetEndsWith(string $query, int $limit): Collection; public function budgetStartsWith(string $query, int $limit): Collection; + public function setUserGroup(UserGroup $userGroup): void; /** diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php index f5e7a6b995..5f59f1ce5e 100644 --- a/app/Repositories/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -88,6 +88,7 @@ interface CategoryRepositoryInterface public function searchCategory(string $query, int $limit): Collection; public function setUser(null|Authenticatable|User $user): void; + public function setUserGroup(UserGroup $userGroup): void; /** diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index aaecbf30da..7f1b1239c0 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -51,7 +51,6 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface use UserGroupTrait; - public function destroyAll(): void { Log::channel('audit')->info('Delete all piggy banks through destroyAll'); diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php index 12551ef4e7..ac8509d6e1 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php +++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php @@ -137,6 +137,7 @@ interface PiggyBankRepositoryInterface public function setOrder(PiggyBank $piggyBank, int $newOrder): bool; public function setUser(null|Authenticatable|User $user): void; + public function setUserGroup(UserGroup $userGroup): void; /** diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepository.php b/app/Repositories/TransactionGroup/TransactionGroupRepository.php index 3fad4bb248..b533d19296 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepository.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepository.php @@ -44,8 +44,6 @@ use FireflyIII\Services\Internal\Destroy\TransactionGroupDestroyService; use FireflyIII\Services\Internal\Update\GroupUpdateService; use FireflyIII\Support\NullArrayObject; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; -use FireflyIII\User; -use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php b/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php index c0bc7c35f8..10da55ec14 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php @@ -99,6 +99,7 @@ interface TransactionGroupRepositoryInterface public function getTags(int $journalId): array; public function setUser(null|Authenticatable|User $user): void; + public function setUserGroup(UserGroup $userGroup): void; /** diff --git a/app/Support/Http/Api/ValidatesUserGroupTrait.php b/app/Support/Http/Api/ValidatesUserGroupTrait.php index 244d77ae6b..88b1704af4 100644 --- a/app/Support/Http/Api/ValidatesUserGroupTrait.php +++ b/app/Support/Http/Api/ValidatesUserGroupTrait.php @@ -39,6 +39,7 @@ use Illuminate\Support\Facades\Log; trait ValidatesUserGroupTrait { protected ?UserGroup $userGroup = null; + /** * An "undocumented" filter * @@ -100,6 +101,7 @@ trait ValidatesUserGroupTrait if ($user->hasRoleInGroupOrOwner($group, $role)) { Log::debug(sprintf('validateUserGroup: User has role "%s" in group #%d, return the group.', $role->value, $groupId)); $this->userGroup = $group; + return $group; } Log::debug(sprintf('validateUserGroup: User does NOT have role "%s" in group #%d, continue searching.', $role->value, $groupId)); diff --git a/app/Support/Repositories/UserGroup/UserGroupTrait.php b/app/Support/Repositories/UserGroup/UserGroupTrait.php index 58029d00d5..4027867e1c 100644 --- a/app/Support/Repositories/UserGroup/UserGroupTrait.php +++ b/app/Support/Repositories/UserGroup/UserGroupTrait.php @@ -48,11 +48,13 @@ trait UserGroupTrait public function checkUserGroupAccess(UserRoleEnum $role): bool { $result = $this->user->hasRoleInGroupOrOwner($this->userGroup, $role); - if($result) { + if ($result) { Log::debug(sprintf('User #%d has role %s in group #%d or is owner/full.', $this->user->id, $role->value, $this->userGroup->id)); + return true; } Log::warning(sprintf('User #%d DOES NOT have role %s in group #%d.', $this->user->id, $role->value, $this->userGroup->id)); + return false; } @@ -62,7 +64,7 @@ trait UserGroupTrait public function setUserGroup(UserGroup $userGroup): void { if (null === $this->user) { - Log::warning(sprintf('User is not set in repository %s', get_class($this))); + Log::warning(sprintf('User is not set in repository %s', static::class)); } $this->userGroup = $userGroup; } @@ -70,16 +72,18 @@ trait UserGroupTrait /** * @throws FireflyException */ - public function setUser(null | Authenticatable | User $user): void + public function setUser(null|Authenticatable|User $user): void { if ($user instanceof User) { - $this->user = $user; + $this->user = $user; if (null === $user->userGroup) { throw new FireflyException(sprintf('User #%d has no user group.', $user->id)); } $this->userGroup = $user->userGroup; + return; } + throw new FireflyException(sprintf('Object is of class %s, not User.', get_class($user))); } @@ -89,14 +93,15 @@ trait UserGroupTrait public function setUserGroupById(int $userGroupId): void { $memberships = GroupMembership::where('user_id', $this->user->id) - ->where('user_group_id', $userGroupId) - ->count(); + ->where('user_group_id', $userGroupId) + ->count() + ; if (0 === $memberships) { throw new FireflyException(sprintf('User #%d has no access to administration #%d', $this->user->id, $userGroupId)); } /** @var null|UserGroup $userGroup */ - $userGroup = UserGroup::find($userGroupId); + $userGroup = UserGroup::find($userGroupId); if (null === $userGroup) { throw new FireflyException(sprintf('Cannot find administration for user #%d', $this->user->id)); } diff --git a/config/firefly.php b/config/firefly.php index f703c74238..314e74bc47 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -81,7 +81,7 @@ return [ 'running_balance_column' => env('USE_RUNNING_BALANCE', false), // see cer.php for exchange rates feature flag. ], - 'version' => 'develop/2025-02-09', + 'version' => 'develop/2025-02-10', 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 25, diff --git a/resources/assets/v1/src/locales/fr.json b/resources/assets/v1/src/locales/fr.json index 773a1a8048..f6e1e2a03d 100644 --- a/resources/assets/v1/src/locales/fr.json +++ b/resources/assets/v1/src/locales/fr.json @@ -18,8 +18,8 @@ "is_reconciled": "Est rapproch\u00e9", "split": "S\u00e9paration", "single_split": "S\u00e9paration unique", - "not_enough_currencies": "Not enough currencies", - "not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.", + "not_enough_currencies": "Pas assez de devises", + "not_enough_currencies_enabled": "Si vous n'avez qu'une seule devise activ\u00e9e, il n'y a pas besoin d'ajouter des taux de change.", "transaction_stored_link": "L'op\u00e9ration n\u00b0{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9e.", "webhook_stored_link": "Le Webhook #{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9.", "webhook_updated_link": "Le webhook #{ID}<\/a> (\"{title}\") a \u00e9t\u00e9 mis \u00e0 jour.",