From ef428a0226f08a35586d3bbd0a21c19ee1731716 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 4 Nov 2023 07:18:03 +0100 Subject: [PATCH] Fix various phpstan issues. --- .../Models/Recurrence/StoreRequest.php | 2 +- .../Models/Recurrence/UpdateRequest.php | 6 ++-- app/Models/Recurrence.php | 4 +-- .../Journal/JournalRepository.php | 6 ++-- .../PiggyBank/PiggyBankRepository.php | 8 ++--- .../Recurring/RecurringRepository.php | 15 ++------- app/Repositories/Tag/TagRepository.php | 2 +- app/Repositories/User/UserRepository.php | 2 +- .../UserGroup/UserGroupRepository.php | 8 +++-- .../UserGroups/Account/AccountRepository.php | 2 +- .../Currency/CurrencyRepository.php | 5 +-- app/Rules/IsDateOrTime.php | 6 ++-- app/Rules/ValidRecurrenceRepetitionValue.php | 2 +- .../Internal/Support/AccountServiceTrait.php | 6 ++-- .../Support/CreditRecalculateService.php | 3 +- .../Internal/Update/AccountUpdateService.php | 2 -- .../Internal/Update/JournalUpdateService.php | 2 +- .../Update/RecurrenceUpdateService.php | 8 +++-- app/Support/Amount.php | 16 ---------- .../Authentication/RemoteUserGuard.php | 2 +- app/Support/Binder/BudgetList.php | 2 +- app/Support/Binder/CategoryList.php | 2 +- app/Support/Binder/Date.php | 2 +- app/Support/Binder/JournalList.php | 2 +- app/Support/Binder/TagList.php | 2 +- app/Support/Request/ConvertsDataTypes.php | 6 ++-- app/Support/Steam.php | 24 +++++++------- .../Actions/AppendNotesToDescription.php | 2 +- .../Actions/ConvertToTransfer.php | 31 +++++++++---------- .../Actions/ConvertToWithdrawal.php | 27 +++++++--------- .../Actions/MoveDescriptionToNotes.php | 3 +- .../Actions/MoveNotesToDescription.php | 2 +- .../Actions/SwitchAccounts.php | 4 +-- app/Transformers/V2/BillTransformer.php | 24 ++++---------- app/Transformers/V2/BudgetTransformer.php | 15 --------- app/Transformers/WebhookTransformer.php | 2 -- .../Account/LiabilityValidation.php | 2 +- app/Validation/AccountValidator.php | 4 --- .../AutoBudget/ValidatesAutoBudgetRequest.php | 2 +- app/Validation/FireflyValidator.php | 2 +- app/Validation/GroupValidation.php | 2 +- app/Validation/RecurrenceValidation.php | 9 +----- 42 files changed, 104 insertions(+), 174 deletions(-) diff --git a/app/Api/V1/Requests/Models/Recurrence/StoreRequest.php b/app/Api/V1/Requests/Models/Recurrence/StoreRequest.php index bfd273969d..8bbb327886 100644 --- a/app/Api/V1/Requests/Models/Recurrence/StoreRequest.php +++ b/app/Api/V1/Requests/Models/Recurrence/StoreRequest.php @@ -77,7 +77,7 @@ class StoreRequest extends FormRequest * Returns the transaction data as it is found in the submitted data. It's a complex method according to code * standards but it just has a lot of ??-statements because of the fields that may or may not exist. * - * @return array + * @return array|null */ private function getTransactionData(): array { diff --git a/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php b/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php index 8d5f790c4c..dc30dbaf1b 100644 --- a/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php @@ -125,16 +125,16 @@ class UpdateRequest extends FormRequest * Returns the transaction data as it is found in the submitted data. It's a complex method according to code * standards but it just has a lot of ??-statements because of the fields that may or may not exist. * - * @return array|null + * @return array */ - private function getTransactionData(): ?array + private function getTransactionData(): array { $return = []; // transaction data: /** @var array|null $transactions */ $transactions = $this->get('transactions'); if (null === $transactions) { - return null; + return []; } /** @var array $transaction */ foreach ($transactions as $transaction) { diff --git a/app/Models/Recurrence.php b/app/Models/Recurrence.php index 5e7f61e926..f269480bcf 100644 --- a/app/Models/Recurrence.php +++ b/app/Models/Recurrence.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Models; +use Carbon\Carbon; use Eloquent; use FireflyIII\User; use Illuminate\Database\Eloquent\Collection; @@ -32,7 +33,6 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Query\Builder; -use Carbon\Carbon; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** @@ -46,7 +46,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property int $transaction_type_id * @property string $title * @property string $description - * @property Carbon $first_date + * @property Carbon|null $first_date * @property Carbon|null $repeat_until * @property Carbon|null $latest_date * @property int $repetitions diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index 7cd0667ea5..3693dfff13 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -198,7 +198,7 @@ class JournalRepository implements JournalRepositoryInterface */ public function getSourceAccount(TransactionJournal $journal): Account { - /** @var Transaction $transaction */ + /** @var Transaction|null $transaction */ $transaction = $journal->transactions()->with('account')->where('amount', '<', 0)->first(); if (null === $transaction) { throw new FireflyException(sprintf('Your administration is broken. Transaction journal #%d has no source transaction.', $journal->id)); @@ -212,7 +212,7 @@ class JournalRepository implements JournalRepositoryInterface */ public function reconcileById(int $journalId): void { - /** @var TransactionJournal $journal */ + /** @var TransactionJournal|null $journal */ $journal = $this->user->transactionJournals()->find($journalId); $journal?->transactions()->update(['reconciled' => true]); } @@ -263,7 +263,7 @@ class JournalRepository implements JournalRepositoryInterface */ public function unreconcileById(int $journalId): void { - /** @var TransactionJournal $journal */ + /** @var TransactionJournal|null $journal */ $journal = $this->user->transactionJournals()->find($journalId); $journal?->transactions()->update(['reconciled' => false]); } diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 8ddadbba88..32c2bcd55f 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -300,13 +300,9 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface */ public function getNoteText(PiggyBank $piggyBank): string { - /** @var Note $note */ + /** @var Note|null $note */ $note = $piggyBank->notes()->first(); - if (null === $note) { - return ''; - } - - return $note->text; + return (string)$note?->text; } /** diff --git a/app/Repositories/Recurring/RecurringRepository.php b/app/Repositories/Recurring/RecurringRepository.php index 22977319ab..606e4eaeaf 100644 --- a/app/Repositories/Recurring/RecurringRepository.php +++ b/app/Repositories/Recurring/RecurringRepository.php @@ -266,13 +266,9 @@ class RecurringRepository implements RecurringRepositoryInterface */ public function getNoteText(Recurrence $recurrence): string { - /** @var Note $note */ + /** @var Note|null $note */ $note = $recurrence->notes()->first(); - if (null !== $note) { - return (string)$note->text; - } - - return ''; + return (string)$note?->text; } /** @@ -573,12 +569,7 @@ class RecurringRepository implements RecurringRepositoryInterface /** @var RecurrenceFactory $factory */ $factory = app(RecurrenceFactory::class); $factory->setUser($this->user); - $result = $factory->create($data); - if (null === $result) { - throw new FireflyException($factory->getErrors()->first()); - } - - return $result; + return $factory->create($data); } /** diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index fefa4f9135..c9ad7e71c5 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -161,7 +161,7 @@ class TagRepository implements TagRepositoryInterface return $set->each( static function (Attachment $attachment) use ($disk) { - /** @var Note $note */ + /** @var Note|null $note */ $note = $attachment->notes()->first(); // only used in v1 view of tags $attachment->file_exists = $disk->exists($attachment->fileName()); diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index 60242e6edf..08be427390 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -226,7 +226,7 @@ class UserRepository implements UserRepositoryInterface */ public function getRolesInGroup(User $user, int $groupId): array { - /** @var UserGroup $group */ + /** @var UserGroup|null $group */ $group = UserGroup::find($groupId); if (null === $group) { throw new FireflyException(sprintf('Could not find group #%d', $groupId)); diff --git a/app/Repositories/UserGroup/UserGroupRepository.php b/app/Repositories/UserGroup/UserGroupRepository.php index 4cf7559b9f..3a03563ae1 100644 --- a/app/Repositories/UserGroup/UserGroupRepository.php +++ b/app/Repositories/UserGroup/UserGroupRepository.php @@ -52,7 +52,7 @@ class UserGroupRepository implements UserGroupRepositoryInterface $memberships = $userGroup->groupMemberships()->get(); /** @var GroupMembership $membership */ foreach ($memberships as $membership) { - /** @var User $user */ + /** @var User|null $user */ $user = $membership->user()->first(); if (null === $user) { continue; @@ -242,7 +242,11 @@ class UserGroupRepository implements UserGroupRepositoryInterface ->where('user_role_id', $owner->id) ->where('user_id', '!=', $user->id)->count(); // if there are no other owners and the current users does not get or keep the owner role, refuse. - if (0 === $ownerCount && (0 === count($data['roles']) || (count($data['roles']) > 0 && !in_array(UserRoleEnum::OWNER->value, $data['roles'], true)))) { + if ( + 0 === $ownerCount && + (0 === count($data['roles']) || + (count($data['roles']) > 0 && // @phpstan-ignore-line + !in_array(UserRoleEnum::OWNER->value, $data['roles'], true)))) { app('log')->debug('User needs to keep owner role in this group, refuse to act'); throw new FireflyException('The last owner in this user group must keep the "owner" role.'); } diff --git a/app/Repositories/UserGroups/Account/AccountRepository.php b/app/Repositories/UserGroups/Account/AccountRepository.php index 7a37ee273a..968bb5519a 100644 --- a/app/Repositories/UserGroups/Account/AccountRepository.php +++ b/app/Repositories/UserGroups/Account/AccountRepository.php @@ -53,7 +53,7 @@ class AccountRepository implements AccountRepositoryInterface app('log')->debug(sprintf('Searching for account named "%s" (of user #%d) of the following type(s)', $name, $this->user->id), ['types' => $types]); $query->where('accounts.name', $name); - /** @var Account $account */ + /** @var Account|null $account */ $account = $query->first(['accounts.*']); if (null === $account) { app('log')->debug(sprintf('There is no account with name "%s" of types', $name), $types); diff --git a/app/Repositories/UserGroups/Currency/CurrencyRepository.php b/app/Repositories/UserGroups/Currency/CurrencyRepository.php index e4a84b94e9..7f25a5fa0a 100644 --- a/app/Repositories/UserGroups/Currency/CurrencyRepository.php +++ b/app/Repositories/UserGroups/Currency/CurrencyRepository.php @@ -262,13 +262,10 @@ class CurrencyRepository implements CurrencyRepositoryInterface if (null === $result) { app('log')->debug('Grabbing default currency for this user...'); + /** @var TransactionCurrency|null $result */ $result = app('amount')->getDefaultCurrencyByUserGroup($this->user->userGroup); } - if (null === $result) { - app('log')->debug('Grabbing EUR as fallback.'); - $result = $this->findByCode('EUR'); - } app('log')->debug(sprintf('Final result: %s', $result->code)); if (false === $result->enabled) { app('log')->debug(sprintf('Also enabled currency %s', $result->code)); diff --git a/app/Rules/IsDateOrTime.php b/app/Rules/IsDateOrTime.php index b595cc1005..8de0a1ffd7 100644 --- a/app/Rules/IsDateOrTime.php +++ b/app/Rules/IsDateOrTime.php @@ -54,12 +54,12 @@ class IsDateOrTime implements ValidationRule // probably a date format. try { Carbon::createFromFormat('Y-m-d', $value); - } catch (InvalidDateException $e) { + } catch (InvalidDateException $e) { // @phpstan-ignore-line app('log')->error(sprintf('"%s" is not a valid date: %s', $value, $e->getMessage())); $fail('validation.date_or_time')->translate();; return; - } catch (InvalidFormatException $e) { + } catch (InvalidFormatException $e) { // @phpstan-ignore-line app('log')->error(sprintf('"%s" is of an invalid format: %s', $value, $e->getMessage())); $fail('validation.date_or_time')->translate();; @@ -71,7 +71,7 @@ class IsDateOrTime implements ValidationRule // is an atom string, I hope? try { Carbon::parse($value); - } catch (InvalidDateException $e) { + } catch (InvalidDateException $e) { // @phpstan-ignore-line app('log')->error(sprintf('"%s" is not a valid date or time: %s', $value, $e->getMessage())); $fail('validation.date_or_time')->translate();; diff --git a/app/Rules/ValidRecurrenceRepetitionValue.php b/app/Rules/ValidRecurrenceRepetitionValue.php index 32566ba3dc..04a9077d9e 100644 --- a/app/Rules/ValidRecurrenceRepetitionValue.php +++ b/app/Rules/ValidRecurrenceRepetitionValue.php @@ -129,7 +129,7 @@ class ValidRecurrenceRepetitionValue implements ValidationRule $dateString = substr($value, 7); try { Carbon::createFromFormat('Y-m-d', $dateString); - } catch (InvalidArgumentException $e) { + } catch (InvalidArgumentException $e) { // @phpstan-ignore-line app('log')->debug(sprintf('Could not parse date %s: %s', $dateString, $e->getMessage())); return false; diff --git a/app/Services/Internal/Support/AccountServiceTrait.php b/app/Services/Internal/Support/AccountServiceTrait.php index f56b263cb7..053a41e70d 100644 --- a/app/Services/Internal/Support/AccountServiceTrait.php +++ b/app/Services/Internal/Support/AccountServiceTrait.php @@ -560,7 +560,7 @@ trait AccountServiceTrait */ private function getObJournal(TransactionGroup $group): TransactionJournal { - /** @var TransactionJournal $journal */ + /** @var TransactionJournal|null $journal */ $journal = $group->transactionJournals()->first(); if (null === $journal) { throw new FireflyException(sprintf('Group #%d has no OB journal', $group->id)); @@ -580,7 +580,7 @@ trait AccountServiceTrait */ private function getOBTransaction(TransactionJournal $journal, Account $account): Transaction { - /** @var Transaction $transaction */ + /** @var Transaction|null $transaction */ $transaction = $journal->transactions()->where('account_id', '!=', $account->id)->first(); if (null === $transaction) { throw new FireflyException(sprintf('Could not get OB transaction for journal #%d', $journal->id)); @@ -598,7 +598,7 @@ trait AccountServiceTrait */ private function getNotOBTransaction(TransactionJournal $journal, Account $account): Transaction { - /** @var Transaction $transaction */ + /** @var Transaction|null $transaction */ $transaction = $journal->transactions()->where('account_id', $account->id)->first(); if (null === $transaction) { throw new FireflyException(sprintf('Could not get non-OB transaction for journal #%d', $journal->id)); diff --git a/app/Services/Internal/Support/CreditRecalculateService.php b/app/Services/Internal/Support/CreditRecalculateService.php index 716f77a709..7ee64b67c8 100644 --- a/app/Services/Internal/Support/CreditRecalculateService.php +++ b/app/Services/Internal/Support/CreditRecalculateService.php @@ -130,11 +130,12 @@ class CreditRecalculateService */ private function getAccountByDirection(TransactionJournal $journal, string $direction): Account { - /** @var Transaction $transaction */ + /** @var Transaction|null $transaction */ $transaction = $journal->transactions()->where('amount', $direction, '0')->first(); if (null === $transaction) { throw new FireflyException(sprintf('Cannot find "%s"-transaction of journal #%d', $direction, $journal->id)); } + /** @var Account|null $foundAccount */ $foundAccount = $transaction->account; if (null === $foundAccount) { throw new FireflyException(sprintf('Cannot find "%s"-account of transaction #%d of journal #%d', $direction, $transaction->id, $journal->id)); diff --git a/app/Services/Internal/Update/AccountUpdateService.php b/app/Services/Internal/Update/AccountUpdateService.php index eafe2b6d3a..13788b490a 100644 --- a/app/Services/Internal/Update/AccountUpdateService.php +++ b/app/Services/Internal/Update/AccountUpdateService.php @@ -46,7 +46,6 @@ class AccountUpdateService protected array $validCCFields; protected array $validFields; private array $canHaveOpeningBalance; - private array $canHaveVirtual; private User $user; /** @@ -54,7 +53,6 @@ class AccountUpdateService */ public function __construct() { - $this->canHaveVirtual = config('firefly.can_have_virtual_amounts'); $this->canHaveOpeningBalance = config('firefly.can_have_opening_balance'); $this->validAssetFields = config('firefly.valid_asset_fields'); $this->validCCFields = config('firefly.valid_cc_fields'); diff --git a/app/Services/Internal/Update/JournalUpdateService.php b/app/Services/Internal/Update/JournalUpdateService.php index 413a23fdf1..a314b79a13 100644 --- a/app/Services/Internal/Update/JournalUpdateService.php +++ b/app/Services/Internal/Update/JournalUpdateService.php @@ -662,7 +662,7 @@ class JournalUpdateService if ($this->hasFields([$field])) { try { $value = '' === (string)$this->data[$field] ? null : new Carbon($this->data[$field]); - } catch (InvalidDateException $e) { + } catch (InvalidDateException $e) { // @phpstan-ignore-line app('log')->debug(sprintf('%s is not a valid date value: %s', $this->data[$field], $e->getMessage())); return; diff --git a/app/Services/Internal/Update/RecurrenceUpdateService.php b/app/Services/Internal/Update/RecurrenceUpdateService.php index 948ee72517..b66ef92be2 100644 --- a/app/Services/Internal/Update/RecurrenceUpdateService.php +++ b/app/Services/Internal/Update/RecurrenceUpdateService.php @@ -291,7 +291,9 @@ class RecurrenceUpdateService $currency = null; $foreignCurrency = null; if (array_key_exists('currency_id', $submitted) || array_key_exists('currency_code', $submitted)) { - $currency = $currencyFactory->find($submitted['currency_id'] ?? null, $currency['currency_code'] ?? null); + $currency = $currencyFactory->find( + array_key_exists('currency_id', $submitted) ? (int)$submitted['currency_id'] : null, + array_key_exists('currency_code', $submitted) ? $submitted['currency_code'] : null); } if (null === $currency) { unset($submitted['currency_id'], $submitted['currency_code']); @@ -300,7 +302,9 @@ class RecurrenceUpdateService $submitted['currency_id'] = (int)$currency->id; } if (array_key_exists('foreign_currency_id', $submitted) || array_key_exists('foreign_currency_code', $submitted)) { - $foreignCurrency = $currencyFactory->find($submitted['foreign_currency_id'] ?? null, $currency['foreign_currency_code'] ?? null); + $foreignCurrency = $currencyFactory->find( + array_key_exists('foreign_currency_id', $submitted) ? (int)$submitted['foreign_currency_id'] : null, + array_key_exists('foreign_currency_code', $submitted) ? $submitted['foreign_currency_code'] : null); } if (null === $foreignCurrency) { unset($submitted['foreign_currency_id'], $currency['foreign_currency_code']); diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 8b13ae0fee..805a3ab3e0 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -305,20 +305,4 @@ class Amount return $format; } - - /** - * @param string $value - * - * @return string - */ - private function tryDecrypt(string $value): string - { - try { - $value = Crypt::decrypt($value); // verified - } catch (DecryptException $e) { - // @ignoreException - } - - return $value; - } } diff --git a/app/Support/Authentication/RemoteUserGuard.php b/app/Support/Authentication/RemoteUserGuard.php index 255a154d75..07422754b8 100644 --- a/app/Support/Authentication/RemoteUserGuard.php +++ b/app/Support/Authentication/RemoteUserGuard.php @@ -54,7 +54,7 @@ class RemoteUserGuard implements Guard */ public function __construct(UserProvider $provider, Application $app) { - /** @var Request $request */ + /** @var Request|null $request */ $request = $app->get('request'); app('log')->debug(sprintf('Created RemoteUserGuard for %s "%s"', $request?->getMethod(), $request?->getRequestUri())); $this->application = $app; diff --git a/app/Support/Binder/BudgetList.php b/app/Support/Binder/BudgetList.php index 8545171385..df1130b80d 100644 --- a/app/Support/Binder/BudgetList.php +++ b/app/Support/Binder/BudgetList.php @@ -54,7 +54,7 @@ class BudgetList implements BinderInterface $list = array_unique(array_map('\intval', explode(',', $value))); - if (0 === count($list)) { + if (0 === count($list)) { // @phpstan-ignore-line app('log')->warning('Budget list count is zero, return 404.'); throw new NotFoundHttpException(); } diff --git a/app/Support/Binder/CategoryList.php b/app/Support/Binder/CategoryList.php index f140cc7607..8722688763 100644 --- a/app/Support/Binder/CategoryList.php +++ b/app/Support/Binder/CategoryList.php @@ -51,7 +51,7 @@ class CategoryList implements BinderInterface } $list = array_unique(array_map('\intval', explode(',', $value))); - if (0 === count($list)) { + if (0 === count($list)) { // @phpstan-ignore-line throw new NotFoundHttpException(); } diff --git a/app/Support/Binder/Date.php b/app/Support/Binder/Date.php index 079941d6c4..11f65ee027 100644 --- a/app/Support/Binder/Date.php +++ b/app/Support/Binder/Date.php @@ -71,7 +71,7 @@ class Date implements BinderInterface try { $result = new Carbon($value); - } catch (InvalidDateException $e) { + } catch (InvalidDateException $e) { // @phpstan-ignore-line $message = sprintf('Could not parse date "%s" for user #%d: %s', $value, auth()->user()->id, $e->getMessage()); app('log')->error($message); throw new NotFoundHttpException($message, $e); diff --git a/app/Support/Binder/JournalList.php b/app/Support/Binder/JournalList.php index a65f91df28..b2594dbb87 100644 --- a/app/Support/Binder/JournalList.php +++ b/app/Support/Binder/JournalList.php @@ -70,7 +70,7 @@ class JournalList implements BinderInterface protected static function parseList(string $value): array { $list = array_unique(array_map('\intval', explode(',', $value))); - if (0 === count($list)) { + if (0 === count($list)) { // @phpstan-ignore-line throw new NotFoundHttpException(); } diff --git a/app/Support/Binder/TagList.php b/app/Support/Binder/TagList.php index 1f03cf0257..d2c2988883 100644 --- a/app/Support/Binder/TagList.php +++ b/app/Support/Binder/TagList.php @@ -52,7 +52,7 @@ class TagList implements BinderInterface $list = array_unique(array_map('\strtolower', explode(',', $value))); app('log')->debug('List of tags is', $list); - if (0 === count($list)) { + if (0 === count($list)) { // @phpstan-ignore-line app('log')->error('Tag list is empty.'); throw new NotFoundHttpException(); } diff --git a/app/Support/Request/ConvertsDataTypes.php b/app/Support/Request/ConvertsDataTypes.php index fc6779ccad..6f8d62ecf1 100644 --- a/app/Support/Request/ConvertsDataTypes.php +++ b/app/Support/Request/ConvertsDataTypes.php @@ -266,10 +266,10 @@ trait ConvertsDataTypes // probably a date format. try { $carbon = Carbon::createFromFormat('Y-m-d', $value); - } catch (InvalidDateException $e) { + } catch (InvalidDateException $e) { // @phpstan-ignore-line app('log')->error(sprintf('[1] "%s" is not a valid date: %s', $value, $e->getMessage())); return null; - } catch (InvalidFormatException $e) { + } catch (InvalidFormatException $e) { // @phpstan-ignore-line app('log')->error(sprintf('[2] "%s" is of an invalid format: %s', $value, $e->getMessage())); return null; @@ -279,7 +279,7 @@ trait ConvertsDataTypes // is an atom string, I hope? try { $carbon = Carbon::parse($value); - } catch (InvalidDateException $e) { + } catch (InvalidDateException $e) { // @phpstan-ignore-line app('log')->error(sprintf('[3] "%s" is not a valid date or time: %s', $value, $e->getMessage())); return null; diff --git a/app/Support/Steam.php b/app/Support/Steam.php index 942315c691..609ee56836 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -312,9 +312,9 @@ class Steam continue; } // otherwise, convert 'amount' to the necessary currency: - $currencyId = (int)$transaction['transaction_currency_id']; - $currency = $currencies[$currencyId] ?? TransactionCurrency::find($currencyId); - + $currencyId = (int)$transaction['transaction_currency_id']; + $currency = $currencies[$currencyId] ?? TransactionCurrency::find($currencyId); + $currencies[$currencyId] = $currency; $rate = $converter->getCurrencyRate($currency, $native, $day); $convertedAmount = bcmul($transaction['amount'], $rate); @@ -322,15 +322,15 @@ class Steam $balances[$format] = $currentBalance; app('log')->debug(sprintf( - '%s: transaction in %s(!). Conversion rate is %s. %s %s = %s %s', - $format, - $currency->code, - $rate, - $currency->code, - $transaction['amount'], - $native->code, - $convertedAmount - )); + '%s: transaction in %s(!). Conversion rate is %s. %s %s = %s %s', + $format, + $currency->code, + $rate, + $currency->code, + $transaction['amount'], + $native->code, + $convertedAmount + )); } diff --git a/app/TransactionRules/Actions/AppendNotesToDescription.php b/app/TransactionRules/Actions/AppendNotesToDescription.php index 988f9dd301..6c657f3531 100644 --- a/app/TransactionRules/Actions/AppendNotesToDescription.php +++ b/app/TransactionRules/Actions/AppendNotesToDescription.php @@ -56,7 +56,7 @@ class AppendNotesToDescription implements ActionInterface public function actOnArray(array $journal): bool { app('log')->debug('Now in AppendNotesToDescription'); - /** @var TransactionJournal $object */ + /** @var TransactionJournal|null $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { app('log')->error(sprintf('No journal #%d belongs to user #%d.', $journal['transaction_journal_id'], $journal['user_id'])); diff --git a/app/TransactionRules/Actions/ConvertToTransfer.php b/app/TransactionRules/Actions/ConvertToTransfer.php index 12349f65be..fe371a2788 100644 --- a/app/TransactionRules/Actions/ConvertToTransfer.php +++ b/app/TransactionRules/Actions/ConvertToTransfer.php @@ -134,23 +134,20 @@ class ConvertToTransfer implements ActionInterface } return $res; } - if (TransactionType::DEPOSIT === $type) { - app('log')->debug('Going to transform a deposit to a transfer.'); - try { - $res = $this->convertDepositArray($object, $opposing); - } catch (FireflyException $e) { - app('log')->debug('Could not convert deposit to transfer.'); - app('log')->error($e->getMessage()); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); - return false; - } - if (false !== $res) { - event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::DEPOSIT, TransactionType::TRANSFER)); - } - return $res; + // can only be a deposit at this point. + app('log')->debug('Going to transform a deposit to a transfer.'); + try { + $res = $this->convertDepositArray($object, $opposing); + } catch (FireflyException $e) { + app('log')->debug('Could not convert deposit to transfer.'); + app('log')->error($e->getMessage()); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); + return false; } - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_transfer', ['type' => $type]))); - return false; + if (false !== $res) { + event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::DEPOSIT, TransactionType::TRANSFER)); + } + return $res; } /** @@ -176,7 +173,7 @@ class ConvertToTransfer implements ActionInterface */ private function getDestinationType(int $journalId): string { - /** @var TransactionJournal $journal */ + /** @var TransactionJournal|null $journal */ $journal = TransactionJournal::find($journalId); if (null === $journal) { app('log')->error(sprintf('Journal #%d does not exist. Cannot convert to transfer.', $journalId)); diff --git a/app/TransactionRules/Actions/ConvertToWithdrawal.php b/app/TransactionRules/Actions/ConvertToWithdrawal.php index eee8fb40aa..cfd82072a4 100644 --- a/app/TransactionRules/Actions/ConvertToWithdrawal.php +++ b/app/TransactionRules/Actions/ConvertToWithdrawal.php @@ -99,23 +99,20 @@ class ConvertToWithdrawal implements ActionInterface return $res; } - if (TransactionType::TRANSFER === $type) { - app('log')->debug('Going to transform a transfer to a withdrawal.'); + // can only be transfer at this point. + app('log')->debug('Going to transform a transfer to a withdrawal.'); - try { - $res = $this->convertTransferArray($object); - } catch (JsonException | FireflyException $e) { - app('log')->debug('Could not convert transfer to deposit.'); - app('log')->error($e->getMessage()); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); - return false; - } - event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::TRANSFER, TransactionType::WITHDRAWAL)); - - return $res; + try { + $res = $this->convertTransferArray($object); + } catch (JsonException | FireflyException $e) { + app('log')->debug('Could not convert transfer to deposit.'); + app('log')->error($e->getMessage()); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); + return false; } - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_withdrawal', ['type' => $type]))); - return false; + event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::TRANSFER, TransactionType::WITHDRAWAL)); + + return $res; } /** diff --git a/app/TransactionRules/Actions/MoveDescriptionToNotes.php b/app/TransactionRules/Actions/MoveDescriptionToNotes.php index 06afa19885..b064e3c314 100644 --- a/app/TransactionRules/Actions/MoveDescriptionToNotes.php +++ b/app/TransactionRules/Actions/MoveDescriptionToNotes.php @@ -53,13 +53,14 @@ class MoveDescriptionToNotes implements ActionInterface */ public function actOnArray(array $journal): bool { - /** @var TransactionJournal $object */ + /** @var TransactionJournal|null $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { app('log')->error(sprintf('No journal #%d belongs to user #%d.', $journal['transaction_journal_id'], $journal['user_id'])); event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.journal_other_user'))); return false; } + /** @var Note|null $note */ $note = $object->notes()->first(); if (null === $note) { $note = new Note(); diff --git a/app/TransactionRules/Actions/MoveNotesToDescription.php b/app/TransactionRules/Actions/MoveNotesToDescription.php index fb44802d64..96f3eb4c2c 100644 --- a/app/TransactionRules/Actions/MoveNotesToDescription.php +++ b/app/TransactionRules/Actions/MoveNotesToDescription.php @@ -59,7 +59,7 @@ class MoveNotesToDescription implements ActionInterface */ public function actOnArray(array $journal): bool { - /** @var TransactionJournal $object */ + /** @var TransactionJournal|null $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { app('log')->error(sprintf('No journal #%d belongs to user #%d.', $journal['transaction_journal_id'], $journal['user_id'])); diff --git a/app/TransactionRules/Actions/SwitchAccounts.php b/app/TransactionRules/Actions/SwitchAccounts.php index 79615c3138..eba4fb37cd 100644 --- a/app/TransactionRules/Actions/SwitchAccounts.php +++ b/app/TransactionRules/Actions/SwitchAccounts.php @@ -75,9 +75,9 @@ class SwitchAccounts implements ActionInterface return false; } - /** @var Transaction $sourceTransaction */ + /** @var Transaction|null $sourceTransaction */ $sourceTransaction = $object->transactions()->where('amount', '<', 0)->first(); - /** @var Transaction $destTransaction */ + /** @var Transaction|null $destTransaction */ $destTransaction = $object->transactions()->where('amount', '>', 0)->first(); if (null === $sourceTransaction || null === $destTransaction) { app('log')->error(sprintf('Journal #%d has no source or destination transaction (rule #%d), cannot switch accounts.', $journal['transaction_journal_id'], $this->action->rule_id)); diff --git a/app/Transformers/V2/BillTransformer.php b/app/Transformers/V2/BillTransformer.php index 2a9fa405f7..965eb2137e 100644 --- a/app/Transformers/V2/BillTransformer.php +++ b/app/Transformers/V2/BillTransformer.php @@ -31,7 +31,6 @@ use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; -use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Support\Http\Api\ExchangeRateConverter; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; @@ -41,23 +40,12 @@ use Illuminate\Support\Facades\DB; */ class BillTransformer extends AbstractTransformer { - private ExchangeRateConverter $converter; - private array $currencies; - private TransactionCurrency $default; - private array $groups; - private array $notes; - private array $paidDates; - private BillRepositoryInterface $repository; - - /** - * BillTransformer constructor. - * - - */ - public function __construct() - { - $this->repository = app(BillRepositoryInterface::class); - } + private ExchangeRateConverter $converter; + private array $currencies; + private TransactionCurrency $default; + private array $groups; + private array $notes; + private array $paidDates; /** * @inheritDoc diff --git a/app/Transformers/V2/BudgetTransformer.php b/app/Transformers/V2/BudgetTransformer.php index 8d25a2628d..146799e32e 100644 --- a/app/Transformers/V2/BudgetTransformer.php +++ b/app/Transformers/V2/BudgetTransformer.php @@ -116,19 +116,4 @@ class BudgetTransformer extends AbstractTransformer ]; } - /** - * @param array $array - * - * @return array - */ - private function beautify(array $array): array - { - $return = []; - foreach ($array as $data) { - $data['sum'] = number_format((float)$data['sum'], (int)$data['currency_decimal_places'], '.', ''); - $return[] = $data; - } - - return $return; - } } diff --git a/app/Transformers/WebhookTransformer.php b/app/Transformers/WebhookTransformer.php index c39e015f58..ecc41c1878 100644 --- a/app/Transformers/WebhookTransformer.php +++ b/app/Transformers/WebhookTransformer.php @@ -34,8 +34,6 @@ use FireflyIII\Models\Webhook; */ class WebhookTransformer extends AbstractTransformer { - private array $enums; - /** * WebhookTransformer constructor. */ diff --git a/app/Validation/Account/LiabilityValidation.php b/app/Validation/Account/LiabilityValidation.php index 93566e8777..f1920d13ee 100644 --- a/app/Validation/Account/LiabilityValidation.php +++ b/app/Validation/Account/LiabilityValidation.php @@ -48,7 +48,7 @@ trait LiabilityValidation // if the ID is not null the source account should be a dummy account of the type liability credit. // the ID of the destination must belong to a liability. if (null !== $accountId) { - if (AccountType::LIABILITY_CREDIT !== $this?->source?->accountType?->type) { + if (AccountType::LIABILITY_CREDIT !== $this->source?->accountType?->type) { app('log')->error('Source account is not a liability.'); return false; } diff --git a/app/Validation/AccountValidator.php b/app/Validation/AccountValidator.php index b0c61fc9ff..62376016f5 100644 --- a/app/Validation/AccountValidator.php +++ b/app/Validation/AccountValidator.php @@ -58,8 +58,6 @@ class AccountValidator private array $combinations; private string $transactionType; private bool $useUserGroupRepository = false; - private User $user; - private UserGroup $userGroup; private UserGroupAccountRepositoryInterface $userGroupAccountRepository; /** @@ -127,7 +125,6 @@ class AccountValidator */ public function setUser(User $user): void { - $this->user = $user; $this->accountRepository->setUser($user); $this->useUserGroupRepository = false; } @@ -139,7 +136,6 @@ class AccountValidator */ public function setUserGroup(UserGroup $userGroup): void { - $this->userGroup = $userGroup; $this->userGroupAccountRepository->setUserGroup($userGroup); $this->useUserGroupRepository = true; } diff --git a/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php b/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php index e641f9a406..ca5cf1db76 100644 --- a/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php +++ b/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php @@ -54,7 +54,7 @@ trait ValidatesAutoBudgetRequest return; } - if ('' === $amount) { + if ('' === (string) $amount) { $validator->errors()->add('auto_budget_amount', (string)trans('validation.amount_required_for_auto_budget')); } if (1 !== bccomp((string)$amount, '0')) { diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index 7bb8f72f6f..22a603d6c7 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -226,7 +226,7 @@ class FireflyValidator extends Validator } try { $checksum = bcmod($iban, '97'); - } catch (ValueError $e) { + } catch (ValueError $e) { // @phpstan-ignore-line $message = sprintf('Could not validate IBAN check value "%s" (IBAN "%s")', $iban, $value); app('log')->error($message); app('log')->error($e->getTraceAsString()); diff --git a/app/Validation/GroupValidation.php b/app/Validation/GroupValidation.php index 4d608b3b9e..dd5fe2ee81 100644 --- a/app/Validation/GroupValidation.php +++ b/app/Validation/GroupValidation.php @@ -229,7 +229,7 @@ trait GroupValidation } $journalId = (int)$journalId; $count = $transactionGroup->transactionJournals()->where('transaction_journals.id', $journalId)->count(); - if (null === $journalId || 0 === $count) { + if (0 === $journalId || 0 === $count) { app('log')->warning(sprintf('Transaction group #%d has %d journals with ID %d', $transactionGroup->id, $count, $journalId)); app('log')->warning('Invalid submission: Each split must have transaction_journal_id (either valid ID or 0).'); $validator->errors()->add(sprintf('transactions.%d.source_name', $index), (string)trans('validation.need_id_in_edit')); diff --git a/app/Validation/RecurrenceValidation.php b/app/Validation/RecurrenceValidation.php index d667ac8737..1e85e391e5 100644 --- a/app/Validation/RecurrenceValidation.php +++ b/app/Validation/RecurrenceValidation.php @@ -212,7 +212,6 @@ trait RecurrenceValidation if (null === $repetition['moment']) { $repetition['moment'] = ''; } - $repetition['moment'] = $repetition['moment'] ?? 'invalid'; switch ($repetition['type'] ?? 'empty') { default: @@ -319,7 +318,7 @@ trait RecurrenceValidation { try { Carbon::createFromFormat('Y-m-d', $moment); - } catch (InvalidArgumentException $e) { + } catch (InvalidArgumentException $e) { // @phpstan-ignore-line app('log')->debug(sprintf('Invalid argument for Carbon: %s', $e->getMessage())); $validator->errors()->add(sprintf('repetitions.%d.moment', $index), (string)trans('validation.valid_recurrence_rep_moment')); } @@ -337,12 +336,6 @@ trait RecurrenceValidation $transactions = $this->getTransactionData(); $submittedTrCount = count($transactions); - //$recurrence = $validator->get - if (null === $transactions) { - app('log')->warning('[a] User submitted no transactions.'); - $validator->errors()->add('transactions', (string)trans('validation.at_least_one_transaction')); - return; - } if (0 === $submittedTrCount) { app('log')->warning('[b] User submitted no transactions.'); $validator->errors()->add('transactions', (string)trans('validation.at_least_one_transaction'));