diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index 9079921991..548f8a6cef 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -24,16 +24,27 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Location; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface AccountRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface AccountRepositoryInterface { diff --git a/app/Repositories/Account/AccountTaskerInterface.php b/app/Repositories/Account/AccountTaskerInterface.php index cb05d48a32..46bfce56bd 100644 --- a/app/Repositories/Account/AccountTaskerInterface.php +++ b/app/Repositories/Account/AccountTaskerInterface.php @@ -24,10 +24,21 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface AccountTaskerInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface AccountTaskerInterface { diff --git a/app/Repositories/Account/OperationsRepositoryInterface.php b/app/Repositories/Account/OperationsRepositoryInterface.php index 3a0dc10db5..3d8b973a6a 100644 --- a/app/Repositories/Account/OperationsRepositoryInterface.php +++ b/app/Repositories/Account/OperationsRepositoryInterface.php @@ -25,11 +25,22 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface OperationsRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface OperationsRepositoryInterface { diff --git a/app/Repositories/Attachment/AttachmentRepositoryInterface.php b/app/Repositories/Attachment/AttachmentRepositoryInterface.php index 831a72c456..01f43cdb3b 100644 --- a/app/Repositories/Attachment/AttachmentRepositoryInterface.php +++ b/app/Repositories/Attachment/AttachmentRepositoryInterface.php @@ -23,12 +23,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Attachment; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Attachment; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface AttachmentRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface AttachmentRepositoryInterface { diff --git a/app/Repositories/AuditLogEntry/ALERepositoryInterface.php b/app/Repositories/AuditLogEntry/ALERepositoryInterface.php index 84b48b8ad9..ff4353d5ca 100644 --- a/app/Repositories/AuditLogEntry/ALERepositoryInterface.php +++ b/app/Repositories/AuditLogEntry/ALERepositoryInterface.php @@ -24,12 +24,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\AuditLogEntry; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\AuditLogEntry; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Collection; /** * Interface ALERepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface ALERepositoryInterface { diff --git a/app/Repositories/Bill/BillRepositoryInterface.php b/app/Repositories/Bill/BillRepositoryInterface.php index 08cc1e4e4c..f39c1bf84a 100644 --- a/app/Repositories/Bill/BillRepositoryInterface.php +++ b/app/Repositories/Bill/BillRepositoryInterface.php @@ -24,13 +24,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Bill; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Bill; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; /** * Interface BillRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface BillRepositoryInterface { diff --git a/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php b/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php index a76b1b8d73..9889f72c50 100644 --- a/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php +++ b/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php @@ -25,12 +25,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface AvailableBudgetRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface AvailableBudgetRepositoryInterface { diff --git a/app/Repositories/Budget/BudgetLimitRepositoryInterface.php b/app/Repositories/Budget/BudgetLimitRepositoryInterface.php index 0c752c213f..c56093ef61 100644 --- a/app/Repositories/Budget/BudgetLimitRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetLimitRepositoryInterface.php @@ -25,13 +25,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface BudgetLimitRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface BudgetLimitRepositoryInterface { diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index dcdf30581d..70b65e2245 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -24,13 +24,25 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\AutoBudget; use FireflyIII\Models\Budget; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface BudgetRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface BudgetRepositoryInterface { diff --git a/app/Repositories/Budget/NoBudgetRepositoryInterface.php b/app/Repositories/Budget/NoBudgetRepositoryInterface.php index 00ad60b41d..b9d42d769d 100644 --- a/app/Repositories/Budget/NoBudgetRepositoryInterface.php +++ b/app/Repositories/Budget/NoBudgetRepositoryInterface.php @@ -25,11 +25,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface NoBudgetRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface NoBudgetRepositoryInterface { diff --git a/app/Repositories/Budget/OperationsRepositoryInterface.php b/app/Repositories/Budget/OperationsRepositoryInterface.php index d4685070af..decf5de365 100644 --- a/app/Repositories/Budget/OperationsRepositoryInterface.php +++ b/app/Repositories/Budget/OperationsRepositoryInterface.php @@ -25,12 +25,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Budget; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface OperationsRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface OperationsRepositoryInterface { diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php index e181475879..3500bf632e 100644 --- a/app/Repositories/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -24,12 +24,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Category; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Category; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface CategoryRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface CategoryRepositoryInterface { diff --git a/app/Repositories/Category/NoCategoryRepositoryInterface.php b/app/Repositories/Category/NoCategoryRepositoryInterface.php index 41b5f2a3e5..5ebcc50d28 100644 --- a/app/Repositories/Category/NoCategoryRepositoryInterface.php +++ b/app/Repositories/Category/NoCategoryRepositoryInterface.php @@ -25,10 +25,22 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Category; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface NoCategoryRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface NoCategoryRepositoryInterface { diff --git a/app/Repositories/Category/OperationsRepositoryInterface.php b/app/Repositories/Category/OperationsRepositoryInterface.php index 12531923df..c7ecc886eb 100644 --- a/app/Repositories/Category/OperationsRepositoryInterface.php +++ b/app/Repositories/Category/OperationsRepositoryInterface.php @@ -25,10 +25,22 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Category; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface OperationsRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface OperationsRepositoryInterface { diff --git a/app/Repositories/Currency/CurrencyRepository.php b/app/Repositories/Currency/CurrencyRepository.php index 138b5a25b2..db51f1f0dd 100644 --- a/app/Repositories/Currency/CurrencyRepository.php +++ b/app/Repositories/Currency/CurrencyRepository.php @@ -24,12 +24,25 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Currency; use Carbon\Carbon; +use FireflyIII\Events\Preferences\UserGroupChangedDefaultCurrency; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Factory\TransactionCurrencyFactory; +use FireflyIII\Models\AccountMeta; +use FireflyIII\Models\AvailableBudget; +use FireflyIII\Models\Bill; +use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\CurrencyExchangeRate; +use FireflyIII\Models\RecurrenceTransaction; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Repositories\User\UserRepositoryInterface; +use FireflyIII\Services\Internal\Destroy\CurrencyDestroyService; +use FireflyIII\Services\Internal\Update\CurrencyUpdateService; use FireflyIII\Support\Repositories\UserGroup\UserGroupInterface; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use FireflyIII\User; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Log; /** * Class CurrencyRepository. @@ -38,6 +51,243 @@ class CurrencyRepository implements CurrencyRepositoryInterface, UserGroupInterf { use UserGroupTrait; + /** + * @throws FireflyException + */ + public function currencyInUse(TransactionCurrency $currency): bool + { + $result = $this->currencyInUseAt($currency); + + return null !== $result; + } + public function disable(TransactionCurrency $currency): void + { + $this->userGroup->currencies()->detach($currency->id); + $currency->enabled = false; + $currency->save(); + } + public function enable(TransactionCurrency $currency): void + { + $this->userGroup->currencies()->syncWithoutDetaching([$currency->id]); + $currency->enabled = false; + $currency->save(); + } + + public function update(TransactionCurrency $currency, array $data): TransactionCurrency + { + app('log')->debug('Now in update()'); + // can be true, false, null + $enabled = array_key_exists('enabled', $data) ? $data['enabled'] : null; + // can be true, false, but method only responds to "true". + $default = array_key_exists('default', $data) ? $data['default'] : false; + + // remove illegal combo's: + if (false === $enabled && true === $default) { + $enabled = true; + } + + // update currency with current user specific settings + $currency->refreshForUser($this->user); + + // currency is enabled, must be disabled. + if (false === $enabled) { + app('log')->debug(sprintf('Disabled currency %s for user #%d', $currency->code, $this->userGroup->id)); + $this->userGroup->currencies()->detach($currency->id); + } + // currency must be enabled + if (true === $enabled) { + app('log')->debug(sprintf('Enabled currency %s for user #%d', $currency->code, $this->userGroup->id)); + $this->userGroup->currencies()->detach($currency->id); + $this->userGroup->currencies()->syncWithoutDetaching([$currency->id => ['group_default' => false]]); + } + + // currency must be made default. + if (true === $default) { + $this->makeDefault($currency); + } + + /** @var CurrencyUpdateService $service */ + $service = app(CurrencyUpdateService::class); + + return $service->update($currency, $data); + } + public function destroy(TransactionCurrency $currency): bool + { + /** @var UserRepositoryInterface $repository */ + $repository = app(UserRepositoryInterface::class); + if ($repository->hasRole($this->user, 'owner')) { + /** @var CurrencyDestroyService $service */ + $service = app(CurrencyDestroyService::class); + $service->destroy($currency); + } + + return true; + } + /** + * @throws FireflyException + */ + public function store(array $data): TransactionCurrency + { + /** @var TransactionCurrencyFactory $factory */ + $factory = app(TransactionCurrencyFactory::class); + $result = $factory->create($data); + + if (true === $data['enabled']) { + $this->userGroup->currencies()->attach($result->id); + } + + return $result; + } + public function makeDefault(TransactionCurrency $currency): void + { + $current = app('amount')->getNativeCurrencyByUserGroup($this->userGroup); + app('log')->debug(sprintf('Enabled + made default currency %s for user #%d', $currency->code, $this->userGroup->id)); + $this->userGroup->currencies()->detach($currency->id); + foreach ($this->userGroup->currencies()->get() as $item) { + $this->userGroup->currencies()->updateExistingPivot($item->id, ['group_default' => false]); + } + $this->userGroup->currencies()->syncWithoutDetaching([$currency->id => ['group_default' => true]]); + if ($current->id !== $currency->id) { + Log::debug('Trigger on a different default currency.'); + // clear all native amounts through an event. + event(new UserGroupChangedDefaultCurrency($this->userGroup)); + } + } + public function isFallbackCurrency(TransactionCurrency $currency): bool + { + return $currency->code === config('firefly.default_currency', 'EUR'); + } + /** + * Returns ALL currencies, regardless of whether they are enabled or not. + */ + public function getAll(): Collection + { + $all = TransactionCurrency::orderBy('code', 'ASC')->get(); + $local = $this->get(); + + return $all->map(static function (TransactionCurrency $current) use ($local) { + $hasId = $local->contains(static function (TransactionCurrency $entry) use ($current) { + return $entry->id === $current->id; + }); + $isNative = $local->contains(static function (TransactionCurrency $entry) use ($current) { + return 1 === (int) $entry->pivot->group_default && $entry->id === $current->id; + }); + $current->userGroupEnabled = $hasId; + $current->userGroupNative = $isNative; + + return $current; + }); + } + + private function countJournals(TransactionCurrency $currency): int + { + $count = $currency->transactions()->whereNull('deleted_at')->count() + $currency->transactionJournals()->whereNull('deleted_at')->count(); + + // also count foreign: + return $count + Transaction::where('foreign_currency_id', $currency->id)->count(); + } + /** + * @throws FireflyException + */ + public function currencyInUseAt(TransactionCurrency $currency): ?string + { + app('log')->debug(sprintf('Now in currencyInUse() for #%d ("%s")', $currency->id, $currency->code)); + $countJournals = $this->countJournals($currency); + if ($countJournals > 0) { + app('log')->info(sprintf('Count journals is %d, return true.', $countJournals)); + + return 'journals'; + } + + // is the only currency left + if (1 === $this->getAll()->count()) { + app('log')->info('Is the last currency in the system, return true. '); + + return 'last_left'; + } + + // is being used in accounts: + $meta = AccountMeta::where('name', 'currency_id')->where('data', json_encode((string) $currency->id))->count(); + if ($meta > 0) { + app('log')->info(sprintf('Used in %d accounts as currency_id, return true. ', $meta)); + + return 'account_meta'; + } + + // second search using integer check. + $meta = AccountMeta::where('name', 'currency_id')->where('data', json_encode((int) $currency->id))->count(); + if ($meta > 0) { + app('log')->info(sprintf('Used in %d accounts as currency_id, return true. ', $meta)); + + return 'account_meta'; + } + + // is being used in bills: + $bills = Bill::where('transaction_currency_id', $currency->id)->count(); + if ($bills > 0) { + app('log')->info(sprintf('Used in %d bills as currency, return true. ', $bills)); + + return 'bills'; + } + + // is being used in recurring transactions + $recurringAmount = RecurrenceTransaction::where('transaction_currency_id', $currency->id)->count(); + $recurringForeign = RecurrenceTransaction::where('foreign_currency_id', $currency->id)->count(); + + if ($recurringAmount > 0 || $recurringForeign > 0) { + app('log')->info(sprintf('Used in %d recurring transactions as (foreign) currency id, return true. ', $recurringAmount + $recurringForeign)); + + return 'recurring'; + } + + // is being used in accounts (as integer) + $meta = AccountMeta::leftJoin('accounts', 'accounts.id', '=', 'account_meta.account_id') + ->whereNull('accounts.deleted_at') + ->where('account_meta.name', 'currency_id')->where('account_meta.data', json_encode($currency->id))->count() + ; + if ($meta > 0) { + app('log')->info(sprintf('Used in %d accounts as currency_id, return true. ', $meta)); + + return 'account_meta'; + } + + // is being used in available budgets + $availableBudgets = AvailableBudget::where('transaction_currency_id', $currency->id)->count(); + if ($availableBudgets > 0) { + app('log')->info(sprintf('Used in %d available budgets as currency, return true. ', $availableBudgets)); + + return 'available_budgets'; + } + + // is being used in budget limits + $budgetLimit = BudgetLimit::where('transaction_currency_id', $currency->id)->count(); + if ($budgetLimit > 0) { + app('log')->info(sprintf('Used in %d budget limits as currency, return true. ', $budgetLimit)); + + return 'budget_limits'; + } + + // is the default currency for the user or the system + $count = $this->userGroup->currencies()->where('transaction_currencies.id', $currency->id)->wherePivot('group_default', 1)->count(); + if ($count > 0) { + app('log')->info('Is the default currency of the user, return true.'); + + return 'current_default'; + } + + // is the default currency for the user or the system + $count = $this->userGroup->currencies()->where('transaction_currencies.id', $currency->id)->wherePivot('group_default', 1)->count(); + if ($count > 0) { + app('log')->info('Is the default currency of the user group, return true.'); + + return 'current_default'; + } + + app('log')->debug('Currency is not used, return false.'); + + return null; + } + public function searchCurrency(string $search, int $limit): Collection { $query = TransactionCurrency::where('enabled', true); diff --git a/app/Repositories/Currency/CurrencyRepositoryInterface.php b/app/Repositories/Currency/CurrencyRepositoryInterface.php index 2af04ab9ee..2c36d54ad4 100644 --- a/app/Repositories/Currency/CurrencyRepositoryInterface.php +++ b/app/Repositories/Currency/CurrencyRepositoryInterface.php @@ -24,17 +24,47 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Currency; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface CurrencyRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface CurrencyRepositoryInterface { public function find(int $currencyId): ?TransactionCurrency; public function searchCurrency(string $search, int $limit): Collection; + public function isFallbackCurrency(TransactionCurrency $currency): bool; + public function getAll(): Collection; + public function store(array $data): TransactionCurrency; + public function makeDefault(TransactionCurrency $currency): void; + public function destroy(TransactionCurrency $currency): bool; + public function enable(TransactionCurrency $currency): void; + public function disable(TransactionCurrency $currency): void; + public function update(TransactionCurrency $currency, array $data): TransactionCurrency; + + /** + * @throws FireflyException + */ + public function currencyInUse(TransactionCurrency $currency); + /** + * @throws FireflyException + */ + public function currencyInUseAt(TransactionCurrency $currency): ?string; /** * Find by currency code, return NULL if unfound. diff --git a/app/Repositories/ExchangeRate/ExchangeRateRepositoryInterface.php b/app/Repositories/ExchangeRate/ExchangeRateRepositoryInterface.php index fdb1f1c8d0..21d3ee030f 100644 --- a/app/Repositories/ExchangeRate/ExchangeRateRepositoryInterface.php +++ b/app/Repositories/ExchangeRate/ExchangeRateRepositoryInterface.php @@ -24,10 +24,25 @@ declare(strict_types=1); namespace FireflyIII\Repositories\ExchangeRate; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; + +/** + * Interface ExchangeRateRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + */ interface ExchangeRateRepositoryInterface { public function deleteRate(CurrencyExchangeRate $rate): void; diff --git a/app/Repositories/Journal/JournalAPIRepositoryInterface.php b/app/Repositories/Journal/JournalAPIRepositoryInterface.php index 03c84a6eba..fe85b3c481 100644 --- a/app/Repositories/Journal/JournalAPIRepositoryInterface.php +++ b/app/Repositories/Journal/JournalAPIRepositoryInterface.php @@ -24,12 +24,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface JournalAPIRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface JournalAPIRepositoryInterface { diff --git a/app/Repositories/Journal/JournalCLIRepositoryInterface.php b/app/Repositories/Journal/JournalCLIRepositoryInterface.php index 80d582c547..4a43340142 100644 --- a/app/Repositories/Journal/JournalCLIRepositoryInterface.php +++ b/app/Repositories/Journal/JournalCLIRepositoryInterface.php @@ -25,11 +25,22 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface JournalCLIRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) */ interface JournalCLIRepositoryInterface { diff --git a/app/Repositories/Journal/JournalRepositoryInterface.php b/app/Repositories/Journal/JournalRepositoryInterface.php index f9187b4dbb..91023da448 100644 --- a/app/Repositories/Journal/JournalRepositoryInterface.php +++ b/app/Repositories/Journal/JournalRepositoryInterface.php @@ -24,15 +24,27 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalLink; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** - * Interface JournalRepositoryInterface. + * Interface JournalRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface JournalRepositoryInterface { diff --git a/app/Repositories/LinkType/LinkTypeRepositoryInterface.php b/app/Repositories/LinkType/LinkTypeRepositoryInterface.php index 7586243925..86608faef4 100644 --- a/app/Repositories/LinkType/LinkTypeRepositoryInterface.php +++ b/app/Repositories/LinkType/LinkTypeRepositoryInterface.php @@ -23,13 +23,25 @@ declare(strict_types=1); namespace FireflyIII\Repositories\LinkType; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\LinkType; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalLink; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface LinkTypeRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface LinkTypeRepositoryInterface { diff --git a/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php b/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php index 7c83b41bce..dc6944becd 100644 --- a/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php +++ b/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php @@ -24,11 +24,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\ObjectGroup; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\ObjectGroup; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface ObjectGroupRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface ObjectGroupRepositoryInterface { diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php index 215e1514d7..af418b2c0b 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php +++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php @@ -24,15 +24,27 @@ declare(strict_types=1); namespace FireflyIII\Repositories\PiggyBank; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankRepetition; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface PiggyBankRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface PiggyBankRepositoryInterface { diff --git a/app/Repositories/Recurring/RecurringRepositoryInterface.php b/app/Repositories/Recurring/RecurringRepositoryInterface.php index caa8debe4d..3db8ffe890 100644 --- a/app/Repositories/Recurring/RecurringRepositoryInterface.php +++ b/app/Repositories/Recurring/RecurringRepositoryInterface.php @@ -25,15 +25,27 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Recurring; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Recurrence; use FireflyIII\Models\RecurrenceRepetition; use FireflyIII\Models\RecurrenceTransaction; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; /** * Interface RecurringRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface RecurringRepositoryInterface { diff --git a/app/Repositories/Rule/RuleRepositoryInterface.php b/app/Repositories/Rule/RuleRepositoryInterface.php index 24e060f64b..6748b33d89 100644 --- a/app/Repositories/Rule/RuleRepositoryInterface.php +++ b/app/Repositories/Rule/RuleRepositoryInterface.php @@ -23,14 +23,26 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Rule; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleAction; use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleTrigger; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface RuleRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface RuleRepositoryInterface { diff --git a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php index d924a588ca..b488ef25c3 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php +++ b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php @@ -23,11 +23,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\RuleGroup; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\RuleGroup; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface RuleGroupRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface RuleGroupRepositoryInterface { diff --git a/app/Repositories/Tag/OperationsRepositoryInterface.php b/app/Repositories/Tag/OperationsRepositoryInterface.php index 61f6f46429..04ed347f7c 100644 --- a/app/Repositories/Tag/OperationsRepositoryInterface.php +++ b/app/Repositories/Tag/OperationsRepositoryInterface.php @@ -25,10 +25,22 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Tag; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface OperationsRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface OperationsRepositoryInterface { diff --git a/app/Repositories/Tag/TagRepositoryInterface.php b/app/Repositories/Tag/TagRepositoryInterface.php index 6937f42bcb..18d7cc0681 100644 --- a/app/Repositories/Tag/TagRepositoryInterface.php +++ b/app/Repositories/Tag/TagRepositoryInterface.php @@ -24,12 +24,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Tag; use Carbon\Carbon; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Location; use FireflyIII\Models\Tag; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface TagRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface TagRepositoryInterface { diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php b/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php index a2f50a9b0d..a1d903e4a2 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepositoryInterface.php @@ -24,15 +24,27 @@ declare(strict_types=1); namespace FireflyIII\Repositories\TransactionGroup; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\DuplicateTransactionException; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Location; use FireflyIII\Models\TransactionGroup; +use FireflyIII\Models\UserGroup; use FireflyIII\Support\NullArrayObject; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface TransactionGroupRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface TransactionGroupRepositoryInterface { diff --git a/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php b/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php index c61d5f28a0..753624e8db 100644 --- a/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php +++ b/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php @@ -24,11 +24,23 @@ declare(strict_types=1); namespace FireflyIII\Repositories\TransactionType; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\TransactionType; +use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface TransactionTypeRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface TransactionTypeRepositoryInterface { diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php index 48124fedc8..50c84ecb12 100644 --- a/app/Repositories/User/UserRepositoryInterface.php +++ b/app/Repositories/User/UserRepositoryInterface.php @@ -23,14 +23,24 @@ declare(strict_types=1); namespace FireflyIII\Repositories\User; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\InvitedUser; use FireflyIII\Models\Role; +use FireflyIII\Models\UserGroup; use FireflyIII\User; use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface UserRepositoryInterface. + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface UserRepositoryInterface { diff --git a/app/Repositories/UserGroup/UserGroupRepositoryInterface.php b/app/Repositories/UserGroup/UserGroupRepositoryInterface.php index 7db436290f..5b2e72685a 100644 --- a/app/Repositories/UserGroup/UserGroupRepositoryInterface.php +++ b/app/Repositories/UserGroup/UserGroupRepositoryInterface.php @@ -24,11 +24,22 @@ declare(strict_types=1); namespace FireflyIII\Repositories\UserGroup; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\UserGroup; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface UserGroupRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface UserGroupRepositoryInterface { diff --git a/app/Repositories/UserGroups/Currency/CurrencyRepositoryInterface.php b/app/Repositories/UserGroups/Currency/CurrencyRepositoryInterface.php index c49b3b4fb8..4402332170 100644 --- a/app/Repositories/UserGroups/Currency/CurrencyRepositoryInterface.php +++ b/app/Repositories/UserGroups/Currency/CurrencyRepositoryInterface.php @@ -88,8 +88,6 @@ interface CurrencyRepositoryInterface public function getByIds(array $ids): Collection; - public function getUserGroup(): UserGroup; - public function isFallbackCurrency(TransactionCurrency $currency): bool; public function makeDefault(TransactionCurrency $currency): void; diff --git a/app/Repositories/Webhook/WebhookRepositoryInterface.php b/app/Repositories/Webhook/WebhookRepositoryInterface.php index 928889f3c9..c1b8073b05 100644 --- a/app/Repositories/Webhook/WebhookRepositoryInterface.php +++ b/app/Repositories/Webhook/WebhookRepositoryInterface.php @@ -24,13 +24,25 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Webhook; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Models\UserGroup; use FireflyIII\Models\Webhook; use FireflyIII\Models\WebhookAttempt; use FireflyIII\Models\WebhookMessage; +use FireflyIII\User; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Collection; /** * Interface WebhookRepositoryInterface + * + * @method setUserGroup(UserGroup $group) + * @method getUserGroup() + * @method getUser() + * @method checkUserGroupAccess(UserRoleEnum $role) + * @method setUser(null|Authenticatable|User $user) + * @method setUserGroupById(int $userGroupId) + * */ interface WebhookRepositoryInterface {