diff --git a/.ci/php-cs-fixer/composer.lock b/.ci/php-cs-fixer/composer.lock index 4ecdfd468f..651a3c4ad5 100644 --- a/.ci/php-cs-fixer/composer.lock +++ b/.ci/php-cs-fixer/composer.lock @@ -226,16 +226,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.56.0", + "version": "v3.56.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "4429303e62a4ce583ddfe64ff5c34c76bcf74931" + "reference": "69c6168ae8bc96dc656c7f6c7271120a68ae5903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4429303e62a4ce583ddfe64ff5c34c76bcf74931", - "reference": "4429303e62a4ce583ddfe64ff5c34c76bcf74931", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/69c6168ae8bc96dc656c7f6c7271120a68ae5903", + "reference": "69c6168ae8bc96dc656c7f6c7271120a68ae5903", "shasum": "" }, "require": { @@ -307,7 +307,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.56.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.56.1" }, "funding": [ { @@ -315,7 +315,7 @@ "type": "github" } ], - "time": "2024-05-07T15:50:05+00:00" + "time": "2024-05-10T11:31:15+00:00" }, { "name": "psr/container", diff --git a/app/Api/V2/Controllers/Autocomplete/AccountController.php b/app/Api/V2/Controllers/Autocomplete/AccountController.php index 3063850113..79ac9c969a 100644 --- a/app/Api/V2/Controllers/Autocomplete/AccountController.php +++ b/app/Api/V2/Controllers/Autocomplete/AccountController.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Api\V2\Controllers\Autocomplete; -use Carbon\Carbon; use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest; use FireflyIII\Exceptions\FireflyException; @@ -41,14 +40,13 @@ use Illuminate\Http\JsonResponse; */ class AccountController extends Controller { - // use AccountFilter; private AdminAccountRepositoryInterface $adminRepository; private TransactionCurrency $default; private ExchangeRateConverter $converter; -// private array $balanceTypes; -// private AccountRepositoryInterface $repository; + // private array $balanceTypes; + // private AccountRepositoryInterface $repository; /** * AccountController constructor. @@ -62,16 +60,16 @@ class AccountController extends Controller $userGroup = $this->validateUserGroup($request); $this->adminRepository = app(AdminAccountRepositoryInterface::class); $this->adminRepository->setUserGroup($userGroup); - $this->default = app('amount')->getDefaultCurrency(); - $this->converter = app(ExchangeRateConverter::class); + $this->default = app('amount')->getDefaultCurrency(); + $this->converter = app(ExchangeRateConverter::class); -// $this->repository = app(AccountRepositoryInterface::class); + // $this->repository = app(AccountRepositoryInterface::class); // $this->adminRepository->setUserGroup($this->validateUserGroup($request)); return $next($request); } ); -// $this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]; + // $this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]; } /** @@ -102,6 +100,7 @@ class AccountController extends Controller private function parseAccount(Account $account): array { $currency = $this->adminRepository->getAccountCurrency($account); + return [ 'id' => (string) $account->id, 'title' => $account->name, @@ -120,21 +119,19 @@ class AccountController extends Controller { $return = []; $balances = $this->adminRepository->getAccountBalances($account); + /** @var AccountBalance $balance */ foreach ($balances as $balance) { $return[] = $this->parseAccountBalance($balance); } + return $return; } - /** - * @param AccountBalance $balance - * - * @return array - */ private function parseAccountBalance(AccountBalance $balance): array { $currency = $balance->transactionCurrency; + return [ 'title' => $balance->title, 'native_amount' => $this->converter->convert($currency, $this->default, today(), $balance->balance), @@ -147,8 +144,6 @@ class AccountController extends Controller 'native_currency_code' => $this->default->code, 'native_currency_symbol' => $this->default->symbol, 'native_currency_decimal' => $this->default->decimal_places, - ]; - } } diff --git a/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php b/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php index 4d2f353b16..d37d01b6ee 100644 --- a/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php +++ b/app/Api/V2/Request/Autocomplete/AutocompleteRequest.php @@ -35,29 +35,29 @@ use Illuminate\Foundation\Http\FormRequest; use LaravelJsonApi\Core\Query\QueryParameters; use LaravelJsonApi\Validation\Rule as JsonApiRule; use Illuminate\Support\Facades\Log; + /** * Class AutocompleteRequest */ class AutocompleteRequest extends FormRequest { + use AccountFilter; use ChecksLogin; use ConvertsDataTypes; - use AccountFilter; /** * Loops over all possible query parameters (these are shared over ALL auto complete requests) * and returns a validated array of parameters. * * The advantage is a single class. But you may also submit "account types" to an endpoint that doesn't use these. - * - * @return array */ public function getParameters(): array { $queryParameters = QueryParameters::cast($this->all()); + try { $date = Carbon::createFromFormat('Y-m-d', $queryParameters->filter()?->value('date', date('Y-m-d')), config('app.timezone')); - } catch(InvalidFormatException $e) { + } catch (InvalidFormatException $e) { Log::debug(sprintf('Invalid date format in autocomplete request. Using today: %s', $e->getMessage())); $date = today(); } @@ -65,20 +65,16 @@ class AutocompleteRequest extends FormRequest $size = (int) ($queryParameters->page()['size'] ?? 50); $accountTypes = $this->getAccountTypeParameter($queryParameters->filter()?->value('account_types', '') ?? ''); - return [ 'date' => $date, 'query' => $query, 'size' => $size, 'account_types' => $accountTypes, ]; - } public function getData(): array { - - return []; $types = $this->convertString('types'); $array = []; @@ -101,12 +97,11 @@ class AutocompleteRequest extends FormRequest public function rules(): array { - return [ 'fields' => JsonApiRule::notSupported(), - 'filter' => ['nullable', 'array', new IsValidFilter(['query', 'date', 'account_types']),], + 'filter' => ['nullable', 'array', new IsValidFilter(['query', 'date', 'account_types'])], 'include' => JsonApiRule::notSupported(), - 'page' => ['nullable', 'array', new IsValidPage(['size']),], + 'page' => ['nullable', 'array', new IsValidPage(['size'])], 'sort' => JsonApiRule::notSupported(), ]; } @@ -123,6 +118,7 @@ class AutocompleteRequest extends FormRequest foreach ($types as $type) { $return = array_merge($return, $this->mapAccountTypes($type)); } + return array_unique($return); } } diff --git a/app/Console/Commands/Correction/CorrectAccountBalance.php b/app/Console/Commands/Correction/CorrectAccountBalance.php index 483e6c3b94..0c3e4185c2 100644 --- a/app/Console/Commands/Correction/CorrectAccountBalance.php +++ b/app/Console/Commands/Correction/CorrectAccountBalance.php @@ -1,44 +1,38 @@ correctBalanceAmounts(); - return 0; } private function correctBalanceAmounts(): void { AccountBalanceCalculator::recalculate(null, null); - foreach(TransactionJournal::all() as $journal) { + foreach (TransactionJournal::all() as $journal) { Log::debug(sprintf('Recalculating account balances for journal #%d', $journal->id)); - foreach($journal->transactions as $transaction) { + foreach ($journal->transactions as $transaction) { AccountBalanceCalculator::recalculate($transaction->account, $journal); } } diff --git a/app/Entities/AccountBalance.php b/app/Entities/AccountBalance.php index 3d63e600a1..181a00b366 100644 --- a/app/Entities/AccountBalance.php +++ b/app/Entities/AccountBalance.php @@ -33,17 +33,17 @@ class AccountBalance public static function fromArray(): self { - $balance = new self; + $balance = new self(); $balance->id = (string) random_int(1, 1000); - $balance->name = (string) random_int(1, 1000); + $balance->name = (string) random_int(1, 1000); $balance->amount = (string) random_int(1, 1000); $balance->currencyId = '1'; return $balance; } - public function getAccount():Account { + public function getAccount(): Account + { return Account::inRandomOrder()->first(); } - } diff --git a/app/Handlers/Observer/TransactionJournalObserver.php b/app/Handlers/Observer/TransactionJournalObserver.php index 24bf335dac..3bb106783e 100644 --- a/app/Handlers/Observer/TransactionJournalObserver.php +++ b/app/Handlers/Observer/TransactionJournalObserver.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Observer; use FireflyIII\Models\TransactionJournal; -use Illuminate\Support\Facades\Log; /** * Class TransactionJournalObserver @@ -49,5 +48,4 @@ class TransactionJournalObserver $transactionJournal->destJournalLinks()->delete(); $transactionJournal->auditLogEntries()->delete(); } - } diff --git a/app/Handlers/Observer/TransactionObserver.php b/app/Handlers/Observer/TransactionObserver.php index 029cbb01e4..6413a4b3f4 100644 --- a/app/Handlers/Observer/TransactionObserver.php +++ b/app/Handlers/Observer/TransactionObserver.php @@ -23,11 +23,8 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Observer; -use DB; -use FireflyIII\Models\AccountBalance; use FireflyIII\Models\Transaction; use FireflyIII\Support\Models\AccountBalanceCalculator; -use stdClass; /** * Class TransactionObserver @@ -44,15 +41,16 @@ class TransactionObserver { app('log')->debug('Observe "updated" of a transaction.'); AccountBalanceCalculator::recalculate($transaction->account, null); - if((float)$transaction->amount > 0) { + if ((float)$transaction->amount > 0) { AccountBalanceCalculator::recalculateByJournal($transaction->transactionJournal); } } + public function created(Transaction $transaction): void { app('log')->debug('Observe "created" of a transaction.'); AccountBalanceCalculator::recalculate($transaction->account, null); - if((float)$transaction->amount > 0) { + if ((float)$transaction->amount > 0) { AccountBalanceCalculator::recalculateByJournal($transaction->transactionJournal); } } diff --git a/app/Http/Controllers/Api/V3/Controllers/AccountController.php b/app/Http/Controllers/Api/V3/Controllers/AccountController.php index fd5df19545..6051904899 100644 --- a/app/Http/Controllers/Api/V3/Controllers/AccountController.php +++ b/app/Http/Controllers/Api/V3/Controllers/AccountController.php @@ -1,5 +1,7 @@ queryAll() ->withRequest($query) ->withAccount($account) - ->get(); + ->get() + ; return DataResponse::make($models); } diff --git a/app/JsonApi/Rules/IsValidFilter.php b/app/JsonApi/Rules/IsValidFilter.php index ff82c36958..065d346508 100644 --- a/app/JsonApi/Rules/IsValidFilter.php +++ b/app/JsonApi/Rules/IsValidFilter.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\JsonApi\Rules; -use Closure; use Illuminate\Contracts\Validation\ValidationRule; class IsValidFilter implements ValidationRule @@ -35,10 +34,8 @@ class IsValidFilter implements ValidationRule $this->allowed = $keys; } - /** - * @inheritDoc - */ - #[\Override] public function validate(string $attribute, mixed $value, Closure $fail): void + #[\Override] + public function validate(string $attribute, mixed $value, \Closure $fail): void { if ('filter' !== $attribute) { $fail('validation.bad_api_filter')->translate(); diff --git a/app/JsonApi/Rules/IsValidPage.php b/app/JsonApi/Rules/IsValidPage.php index b29b52478c..1bc93a7dfa 100644 --- a/app/JsonApi/Rules/IsValidPage.php +++ b/app/JsonApi/Rules/IsValidPage.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\JsonApi\Rules; -use Closure; use Illuminate\Contracts\Validation\ValidationRule; class IsValidPage implements ValidationRule @@ -35,10 +34,8 @@ class IsValidPage implements ValidationRule $this->allowed = $keys; } - /** - * @inheritDoc - */ - #[\Override] public function validate(string $attribute, mixed $value, Closure $fail): void + #[\Override] + public function validate(string $attribute, mixed $value, \Closure $fail): void { if ('page' !== $attribute) { $fail('validation.bad_api_filter')->translate(); diff --git a/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php b/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php index fba9fe46b2..f5fa8c0193 100644 --- a/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php +++ b/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php @@ -29,23 +29,17 @@ use LaravelJsonApi\NonEloquent\AbstractRepository; class AccountBalanceRepository extends AbstractRepository implements QueriesAll { - - /** - * @inheritDoc - */ - #[\Override] public function find(string $resourceId): ?object + #[\Override] + public function find(string $resourceId): ?object { return AccountBalance::fromArray(); } - - /** - * @inheritDoc - */ public function queryAll(): Capabilities\AccountBalanceQuery { return Capabilities\AccountBalanceQuery::make() - ->withServer($this->server) - ->withSchema($this->schema); + ->withServer($this->server) + ->withSchema($this->schema) + ; } } diff --git a/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php b/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php index cbb453f544..15d12d9152 100644 --- a/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php +++ b/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php @@ -1,5 +1,7 @@ relation('account')->withData($this->resource->getAccount()), ]; } - } diff --git a/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php b/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php index 3ae5cbebd3..6e4b4573cf 100644 --- a/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php +++ b/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php @@ -1,5 +1,7 @@ withServer($this->server) - ->withSchema($this); + ->withServer($this->server) + ->withSchema($this) + ; } } diff --git a/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php b/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php index dd178675ab..6221948d4f 100644 --- a/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php +++ b/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php @@ -39,9 +39,6 @@ class AccountBalanceQuery extends QueryAll parent::__construct(); } - /** - * @inheritDoc - */ public function get(): iterable { return [ @@ -55,7 +52,7 @@ class AccountBalanceQuery extends QueryAll public function withAccount(Account $account): self { $this->account = $account; + return $this; } - } diff --git a/app/JsonApi/V3/Accounts/AccountRepository.php b/app/JsonApi/V3/Accounts/AccountRepository.php index abe23dbb87..1c4415756d 100644 --- a/app/JsonApi/V3/Accounts/AccountRepository.php +++ b/app/JsonApi/V3/Accounts/AccountRepository.php @@ -27,8 +27,6 @@ use FireflyIII\Models\Account; use FireflyIII\Support\JsonApi\Concerns\UsergroupAware; use LaravelJsonApi\Contracts\Store\QueriesAll; use LaravelJsonApi\NonEloquent\AbstractRepository; -use LaravelJsonApi\NonEloquent\Concerns\HasCrudCapability; - class AccountRepository extends AbstractRepository implements QueriesAll { @@ -36,25 +34,20 @@ class AccountRepository extends AbstractRepository implements QueriesAll /** * SiteRepository constructor. - * */ public function __construct() {} - /** - * @inheritDoc - */ public function find(string $resourceId): ?object { - return Account::find((int) $resourceId); } public function queryAll(): Capabilities\AccountQuery { return Capabilities\AccountQuery::make() - ->withUserGroup($this->userGroup) - ->withServer($this->server) - ->withSchema($this->schema); + ->withUserGroup($this->userGroup) + ->withServer($this->server) + ->withSchema($this->schema) + ; } - } diff --git a/app/JsonApi/V3/Accounts/AccountResource.php b/app/JsonApi/V3/Accounts/AccountResource.php index 4f00e1d594..2d4d0525c9 100644 --- a/app/JsonApi/V3/Accounts/AccountResource.php +++ b/app/JsonApi/V3/Accounts/AccountResource.php @@ -1,10 +1,11 @@ $this->resource->type, 'account_role' => $this->resource->account_role, - - - - - // 'virtual_balance' => $this->resource->virtual_balance, // 'native_balance' => $this->resource->native_balance, - //'user' => $this->resource->user_array, -// 'balances' => [] -// + // 'user' => $this->resource->user_array, + // 'balances' => [] + // // currency -// 'currency_id' => $this->resource->currency_id, -// 'currency_code' => $this->resource->currency_code, -// 'currency_symbol' => $this->resource->currency_symbol, -// 'currency_decimal_places' => $this->resource->currency_decimal_places, + // 'currency_id' => $this->resource->currency_id, + // 'currency_code' => $this->resource->currency_code, + // 'currency_symbol' => $this->resource->currency_symbol, + // 'currency_decimal_places' => $this->resource->currency_decimal_places, // balance (in currency, on date) -// 'current_balance' => $this->resource->current_balance, - + // 'current_balance' => $this->resource->current_balance, // 'current_balance' => app('steam')->bcround(app('steam')->balance($account, $date), $decimalPlaces), // 'current_balance_date' => $date->toAtomString(), @@ -125,9 +117,7 @@ class AccountResource extends JsonApiResource /** * Get the resource's relationships. * - * @param Request|null $request - * - * @return iterable + * @param null|Request $request */ public function relationships($request): iterable { @@ -136,5 +126,4 @@ class AccountResource extends JsonApiResource $this->relation('account_balances')->withData($this->resource->balances), ]; } - } diff --git a/app/JsonApi/V3/Accounts/AccountSchema.php b/app/JsonApi/V3/Accounts/AccountSchema.php index 6a6a1d3fed..12aefffe11 100644 --- a/app/JsonApi/V3/Accounts/AccountSchema.php +++ b/app/JsonApi/V3/Accounts/AccountSchema.php @@ -1,5 +1,7 @@ queryParameters->filter(); $sort = $this->queryParameters->sortFields(); $pagination = $this->filtersPagination($this->queryParameters->page()); @@ -57,8 +54,8 @@ class AccountQuery extends QueryAll implements HasPagination if (!$needsAll) { $query = $this->addPagination($query, $pagination); } - $query = $this->addSortParams($query, $sort); - $query = $this->addFilterParams('account', $query, $filters); + $query = $this->addSortParams($query, $sort); + $query = $this->addFilterParams('account', $query, $filters); $collection = $query->get(['accounts.*']); @@ -66,16 +63,11 @@ class AccountQuery extends QueryAll implements HasPagination $enrichment = new AccountEnrichment(); $collection = $enrichment->enrich($collection); - // add filters after the query // add sort after the query - $collection = $this->sortCollection($collection, $sort); - - - return $collection; - -// var_dump($filters->value('name')); -// exit; + return $this->sortCollection($collection, $sort); + // var_dump($filters->value('name')); + // exit; } } diff --git a/app/JsonApi/V3/Server.php b/app/JsonApi/V3/Server.php index 5eade8d9e0..6ab65c5e51 100644 --- a/app/JsonApi/V3/Server.php +++ b/app/JsonApi/V3/Server.php @@ -1,5 +1,7 @@ check() && $user->id === $account->user_id; } - - /** * Everybody can do this, but selection should limit to user. * @@ -53,6 +46,7 @@ class AccountPolicy public function viewAny(): bool { return true; + return auth()->check(); } diff --git a/app/Policies/BalancePolicy.php b/app/Policies/BalancePolicy.php index 3571a0e870..29fac17de1 100644 --- a/app/Policies/BalancePolicy.php +++ b/app/Policies/BalancePolicy.php @@ -30,11 +30,6 @@ class BalancePolicy { /** * TODO needs better authentication. - * - * @param User $user - * @param Account $account - * - * @return bool */ public function view(User $user, Account $account): bool { diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 58135f6496..19c1cd60c3 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -23,22 +23,17 @@ declare(strict_types=1); namespace FireflyIII\Policies; -use FireflyIII\Models\Account; use FireflyIII\User; class UserPolicy { /** * TODO needs better authentication. - * - * @param User $user - * @param Account $account - * - * @return bool */ public function view(User $user, User $user1): bool { return true; + return auth()->check() && $user->id === $account->user_id; } @@ -50,11 +45,14 @@ class UserPolicy public function viewAny(): bool { return true; + return auth()->check(); } + public function viewAccounts(User $user): bool { return true; + return auth()->check(); } } diff --git a/app/Repositories/UserGroups/Account/AccountRepository.php b/app/Repositories/UserGroups/Account/AccountRepository.php index d5e322b5c5..3494cad207 100644 --- a/app/Repositories/UserGroups/Account/AccountRepository.php +++ b/app/Repositories/UserGroups/Account/AccountRepository.php @@ -386,7 +386,8 @@ class AccountRepository implements AccountRepositoryInterface return $return; } - #[\Override] public function getAccountBalances(Account $account): Collection + #[\Override] + public function getAccountBalances(Account $account): Collection { return $account->accountBalances; } diff --git a/app/Support/JsonApi/Concerns/UsergroupAware.php b/app/Support/JsonApi/Concerns/UsergroupAware.php index 04369bf967..8326d7f53b 100644 --- a/app/Support/JsonApi/Concerns/UsergroupAware.php +++ b/app/Support/JsonApi/Concerns/UsergroupAware.php @@ -27,7 +27,6 @@ use FireflyIII\Models\UserGroup; trait UsergroupAware { - protected UserGroup $userGroup; public function getUserGroup(): UserGroup @@ -40,9 +39,10 @@ trait UsergroupAware $this->userGroup = $userGroup; } - public function withUserGroup(UserGroup $userGroup): self { + public function withUserGroup(UserGroup $userGroup): self + { $this->userGroup = $userGroup; + return $this; } - } diff --git a/app/Support/JsonApi/Enrichments/AccountEnrichment.php b/app/Support/JsonApi/Enrichments/AccountEnrichment.php index cfc4fd0b97..68e996f50c 100644 --- a/app/Support/JsonApi/Enrichments/AccountEnrichment.php +++ b/app/Support/JsonApi/Enrichments/AccountEnrichment.php @@ -34,28 +34,28 @@ use Illuminate\Support\Facades\Log; class AccountEnrichment implements EnrichmentInterface { - private Collection $collection; private array $currencies; - - #[\Override] public function enrich(Collection $collection): Collection + #[\Override] + public function enrich(Collection $collection): Collection { $this->collection = $collection; $this->currencies = []; // do everything here: $this->getLastActivity(); - //$this->getMetaBalances(); + // $this->getMetaBalances(); $this->collectAccountTypes(); $this->collectMetaData(); $this->collection->transform(function (Account $account) { - $account->user_array = ['id' => 1,'bla bla' => 'bla']; - $account->balances = collect([ - ['balance_id' => 1,'balance' => 5], - ['balance_id' => 2,'balance' => 5], - ['balance_id' => 3,'balance' => 5], - ]); + $account->user_array = ['id' => 1, 'bla bla' => 'bla']; + $account->balances = collect([ + ['balance_id' => 1, 'balance' => 5], + ['balance_id' => 2, 'balance' => 5], + ['balance_id' => 3, 'balance' => 5], + ]); + return $account; }); @@ -64,8 +64,6 @@ class AccountEnrichment implements EnrichmentInterface /** * TODO this method refers to a single-use method inside Steam that could be moved here. - * - * @return void */ private function getLastActivity(): void { @@ -74,14 +72,11 @@ class AccountEnrichment implements EnrichmentInterface $lastActivity = $accountRepository->getLastActivity($this->collection); foreach ($lastActivity as $row) { $this->collection->where('id', $row['account_id'])->first()->last_activity = Carbon::parse($row['date_max'], config('app.timezone')); - } } /** * TODO this method refers to a single-use method inside Steam that could be moved here. - * - * @return void */ private function getMetaBalances(): void { @@ -89,6 +84,7 @@ class AccountEnrichment implements EnrichmentInterface $array = app('steam')->balancesByAccountsConverted($this->collection, today()); } catch (FireflyException $e) { Log::error(sprintf('Could not load balances: %s', $e->getMessage())); + return; } foreach ($array as $accountId => $row) { @@ -99,8 +95,6 @@ class AccountEnrichment implements EnrichmentInterface /** * TODO this method refers to a single-use method inside Steam that could be moved here. - * - * @return void */ private function collectAccountTypes(): void { @@ -115,6 +109,7 @@ class AccountEnrichment implements EnrichmentInterface } $this->collection->transform(function (Account $account) use ($types) { $account->type = $types[$account->id]; + return $account; }); } @@ -123,19 +118,19 @@ class AccountEnrichment implements EnrichmentInterface { /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); + /** @var CurrencyRepositoryInterface $repository */ - $repository = app(CurrencyRepositoryInterface::class); + $repository = app(CurrencyRepositoryInterface::class); - $metaFields = $accountRepository->getMetaValues($this->collection, ['currency_id', 'account_role', 'account_number', 'liability_direction', 'interest', 'interest_period', 'current_debt']); - $currencyIds = $metaFields->where('name', 'currency_id')->pluck('data')->toArray(); + $metaFields = $accountRepository->getMetaValues($this->collection, ['currency_id', 'account_role', 'account_number', 'liability_direction', 'interest', 'interest_period', 'current_debt']); + $currencyIds = $metaFields->where('name', 'currency_id')->pluck('data')->toArray(); - $currencies = []; + $currencies = []; foreach ($repository->getByIds($currencyIds) as $currency) { $id = $currency->id; $currencies[$id] = $currency; } - $this->collection->transform(function (Account $account) use ($metaFields, $currencies) { $set = $metaFields->where('account_id', $account->id); foreach ($set as $entry) { @@ -147,6 +142,7 @@ class AccountEnrichment implements EnrichmentInterface $account->currency_decimal_places = $currencies[$id]?->decimal_places; } } + return $account; }); } diff --git a/app/Support/JsonApi/Enrichments/EnrichmentInterface.php b/app/Support/JsonApi/Enrichments/EnrichmentInterface.php index ecd409b8c5..827a62b453 100644 --- a/app/Support/JsonApi/Enrichments/EnrichmentInterface.php +++ b/app/Support/JsonApi/Enrichments/EnrichmentInterface.php @@ -28,5 +28,4 @@ use Illuminate\Support\Collection; interface EnrichmentInterface { public function enrich(Collection $collection): Collection; - } diff --git a/app/Support/JsonApi/ExpandsQuery.php b/app/Support/JsonApi/ExpandsQuery.php index d364bb901b..e633fdb908 100644 --- a/app/Support/JsonApi/ExpandsQuery.php +++ b/app/Support/JsonApi/ExpandsQuery.php @@ -35,6 +35,7 @@ trait ExpandsQuery final protected function addPagination(Builder $query, array $pagination): Builder { $skip = ($pagination['number'] - 1) * $pagination['size']; + return $query->skip($skip)->take($pagination['size']); } @@ -46,6 +47,7 @@ trait ExpandsQuery foreach ($sort->all() as $sortField) { $query->orderBy($sortField->name(), $sortField->isAscending() ? 'ASC' : 'DESC'); } + return $query; } @@ -54,11 +56,11 @@ trait ExpandsQuery if (null === $filters) { return $query; } - $config = config(sprintf('firefly.valid_query_filters.%s', $class)) ?? []; - if (count($filters->all()) === 0) { + $config = config(sprintf('firefly.valid_query_filters.%s', $class)) ?? []; + if (0 === count($filters->all())) { return $query; } - $query->where(function (Builder $q) use ($config, $filters) { + $query->where(function (Builder $q) use ($config, $filters): void { foreach ($filters->all() as $filter) { if (in_array($filter->key(), $config, true)) { foreach ($filter->value() as $value) { @@ -80,5 +82,4 @@ trait ExpandsQuery return $query; } - } diff --git a/app/Support/JsonApi/FiltersPagination.php b/app/Support/JsonApi/FiltersPagination.php index 612b6e3b09..c77bd7fb4b 100644 --- a/app/Support/JsonApi/FiltersPagination.php +++ b/app/Support/JsonApi/FiltersPagination.php @@ -25,7 +25,6 @@ namespace FireflyIII\Support\JsonApi; trait FiltersPagination { - protected function filtersPagination(?array $pagination): array { if (null === $pagination) { @@ -39,8 +38,8 @@ trait FiltersPagination $pagination['number'] = min(65536, max($pagination['number'], 1)); // clean up page size - $pagination['size'] = (int) ($pagination['size'] ?? $this->getPageSize()); - $pagination['size'] = min(1337, max($pagination['size'], 1)); + $pagination['size'] = (int) ($pagination['size'] ?? $this->getPageSize()); + $pagination['size'] = min(1337, max($pagination['size'], 1)); return $pagination; } @@ -50,6 +49,7 @@ trait FiltersPagination if (auth()->check()) { return (int) app('preferences')->get('listPageSize', 50)->data; } + return 50; } } diff --git a/app/Support/JsonApi/SortsCollection.php b/app/Support/JsonApi/SortsCollection.php index 28ec985448..c943922d4a 100644 --- a/app/Support/JsonApi/SortsCollection.php +++ b/app/Support/JsonApi/SortsCollection.php @@ -28,16 +28,15 @@ use LaravelJsonApi\Core\Query\SortFields; trait SortsCollection { - protected function sortCollection(Collection $collection, ?SortFields $sortFields): Collection { - - if(null === $sortFields) { + protected function sortCollection(Collection $collection, ?SortFields $sortFields): Collection + { + if (null === $sortFields) { return $collection; } - foreach($sortFields->all() as $sortField) { - $collection = $sortField->isAscending() ? $collection->sortBy($sortField->name()) : $collection->sortByDesc($sortField->name()); + foreach ($sortFields->all() as $sortField) { + $collection = $sortField->isAscending() ? $collection->sortBy($sortField->name()) : $collection->sortByDesc($sortField->name()); } return $collection; } - } diff --git a/app/Support/JsonApi/ValidateSortParameters.php b/app/Support/JsonApi/ValidateSortParameters.php index 0fd2b55e1e..272e858d13 100644 --- a/app/Support/JsonApi/ValidateSortParameters.php +++ b/app/Support/JsonApi/ValidateSortParameters.php @@ -27,21 +27,20 @@ use LaravelJsonApi\Core\Query\SortFields; trait ValidateSortParameters { - function validateParams(string $class, ?SortFields $params): bool + public function validateParams(string $class, ?SortFields $params): bool { - if(null === $params) { + if (null === $params) { return false; } $config = config(sprintf('firefly.full_data_set.%s', $class)) ?? []; - foreach ($params->all() as $field) { if (in_array($field->name(), $config, true)) { return true; } } + return false; } - } diff --git a/app/Support/Models/AccountBalanceCalculator.php b/app/Support/Models/AccountBalanceCalculator.php index 97585bc288..d06adfdd48 100644 --- a/app/Support/Models/AccountBalanceCalculator.php +++ b/app/Support/Models/AccountBalanceCalculator.php @@ -23,13 +23,11 @@ declare(strict_types=1); namespace FireflyIII\Support\Models; -use DB; use FireflyIII\Models\Account; use FireflyIII\Models\AccountBalance; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use Illuminate\Support\Facades\Log; -use stdClass; class AccountBalanceCalculator { @@ -38,8 +36,8 @@ class AccountBalanceCalculator // first collect normal amounts (in whatever currency), and set them. // select account_id, transaction_currency_id, foreign_currency_id, sum(amount), sum(foreign_amount) from transactions group by account_id, transaction_currency_id, foreign_currency_id - $query = Transaction::groupBy(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id']); - $title = 'balance'; + $query = Transaction::groupBy(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id']); + $title = 'balance'; if (null !== $account) { $query->where('transactions.account_id', $account->id); } @@ -49,18 +47,18 @@ class AccountBalanceCalculator $title = 'balance_after_journal'; } - $result = $query->get(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id', DB::raw('SUM(transactions.amount) as sum_amount'), DB::raw('SUM(transactions.foreign_amount) as sum_foreign_amount')]); + $result = $query->get(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.foreign_currency_id', \DB::raw('SUM(transactions.amount) as sum_amount'), \DB::raw('SUM(transactions.foreign_amount) as sum_foreign_amount')]); // reset account balances: self::resetAccountBalances($title, $account, $transactionJournal); - /** @var stdClass $row */ + /** @var \stdClass $row */ foreach ($result as $row) { - $account = (int) $row->account_id; - $transactionCurrency = (int) $row->transaction_currency_id; - $foreignCurrency = (int) $row->foreign_currency_id; - $sumAmount = $row->sum_amount; - $sumForeignAmount = $row->sum_foreign_amount; + $account = (int) $row->account_id; + $transactionCurrency = (int) $row->transaction_currency_id; + $foreignCurrency = (int) $row->foreign_currency_id; + $sumAmount = $row->sum_amount; + $sumForeignAmount = $row->sum_foreign_amount; // first create for normal currency: $entry = self::getBalance($title, $account, $transactionCurrency, $transactionJournal?->id); @@ -78,23 +76,23 @@ class AccountBalanceCalculator Log::debug(sprintf('Set balance entry "%s" #%d to amount %s', $title, $entry->id, $entry->balance)); } } - return; } private static function getBalance(string $title, int $account, int $currency, ?int $journal): AccountBalance { - $query = AccountBalance::where('title', $title)->where('account_id', $account)->where('transaction_currency_id', $currency); + $query = AccountBalance::where('title', $title)->where('account_id', $account)->where('transaction_currency_id', $currency); if (null !== $journal) { $query->where('transaction_journal_id', $journal); } - $entry = $query->first(); + $entry = $query->first(); if (null !== $entry) { Log::debug(sprintf('Found account balance "%s" for account #%d and currency #%d: %s', $title, $account, $currency, $entry->balance)); + return $entry; } - $entry = new AccountBalance; + $entry = new AccountBalance(); $entry->title = $title; $entry->account_id = $account; $entry->transaction_currency_id = $currency; @@ -102,6 +100,7 @@ class AccountBalanceCalculator $entry->balance = '0'; $entry->save(); Log::debug(sprintf('Created new account balance for account #%d and currency #%d: %s', $account, $currency, $entry->balance)); + return $entry; } @@ -110,20 +109,20 @@ class AccountBalanceCalculator if (null === $account && null === $transactionJournal) { AccountBalance::whereNotNull('updated_at')->where('title', $title)->update(['balance' => '0']); Log::debug('Set ALL balances to zero.'); + return; } - if(null !== $account && null === $transactionJournal) { + if (null !== $account && null === $transactionJournal) { AccountBalance::where('account_id', $account->id)->where('title', $title)->update(['balance' => '0']); Log::debug(sprintf('Set balances of account #%d to zero.', $account->id)); + return; } AccountBalance::where('account_id', $account->id)->where('transaction_journal_id', $transactionJournal->id)->where('title', $title)->update(['balance' => '0']); Log::debug(sprintf('Set balances of account #%d + journal #%d to zero.', $account->id, $transactionJournal->id)); - - } - public static function recalculateByJournal(TransactionJournal $transactionJournal) + public static function recalculateByJournal(TransactionJournal $transactionJournal): void { Log::debug(sprintf('Recalculate balance after journal #%d', $transactionJournal->id)); // update both account balances, but limit to this transaction or earlier. @@ -131,6 +130,4 @@ class AccountBalanceCalculator self::recalculate($transaction->account, $transactionJournal); } } - - } diff --git a/composer.lock b/composer.lock index d092e5e040..7163adfe6e 100644 --- a/composer.lock +++ b/composer.lock @@ -5296,20 +5296,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -5333,7 +5333,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -5345,9 +5345,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", diff --git a/config/firefly.php b/config/firefly.php index 36ad5509f0..c5c7f33fff 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -117,7 +117,7 @@ return [ 'expression_engine' => false, // see cer.php for exchange rates feature flag. ], - 'version' => 'develop/2024-05-09', + 'version' => 'develop/2024-05-13', 'api_version' => '2.0.14', 'db_version' => 24, @@ -436,7 +436,7 @@ return [ 'transfers' => 'fa-exchange', ], - 'bindables' => [ + 'bindables' => [ // models 'account' => Account::class, 'attachment' => Attachment::class, @@ -494,7 +494,7 @@ return [ 'userGroupBill' => UserGroupBill::class, 'userGroup' => UserGroup::class, ], - 'rule-actions' => [ + 'rule-actions' => [ 'set_category' => SetCategory::class, 'clear_category' => ClearCategory::class, 'set_budget' => SetBudget::class, @@ -528,7 +528,7 @@ return [ // 'set_foreign_amount' => SetForeignAmount::class, // 'set_foreign_currency' => SetForeignCurrency::class, ], - 'context-rule-actions' => [ + 'context-rule-actions' => [ 'set_category', 'set_budget', 'add_tag', @@ -547,13 +547,13 @@ return [ 'convert_transfer', ], - 'test-triggers' => [ + 'test-triggers' => [ 'limit' => 10, 'range' => 200, ], // expected source types for each transaction type, in order of preference. - 'expected_source_types' => [ + 'expected_source_types' => [ 'source' => [ TransactionTypeModel::WITHDRAWAL => [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], TransactionTypeEnum::DEPOSIT->value => [AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE, AccountType::REVENUE, AccountType::CASH], @@ -598,7 +598,7 @@ return [ TransactionTypeModel::LIABILITY_CREDIT => [AccountType::LIABILITY_CREDIT, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], ], ], - 'allowed_opposing_types' => [ + 'allowed_opposing_types' => [ 'source' => [ AccountType::ASSET => [ AccountType::ASSET, @@ -688,7 +688,7 @@ return [ ], ], // depending on the account type, return the allowed transaction types: - 'allowed_transaction_types' => [ + 'allowed_transaction_types' => [ 'source' => [ AccountType::ASSET => [ TransactionTypeModel::WITHDRAWAL, @@ -757,7 +757,7 @@ return [ ], // having the source + dest will tell you the transaction type. - 'account_to_transaction' => [ + 'account_to_transaction' => [ AccountType::ASSET => [ AccountType::ASSET => TransactionTypeModel::TRANSFER, AccountType::CASH => TransactionTypeModel::WITHDRAWAL, @@ -822,7 +822,7 @@ return [ ], // allowed source -> destination accounts. - 'source_dests' => [ + 'source_dests' => [ TransactionTypeModel::WITHDRAWAL => [ AccountType::ASSET => [AccountType::EXPENSE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE, AccountType::CASH], AccountType::LOAN => [AccountType::EXPENSE, AccountType::CASH], @@ -861,7 +861,7 @@ return [ ], ], // if you add fields to this array, don't forget to update the export routine (ExportDataGenerator). - 'journal_meta_fields' => [ + 'journal_meta_fields' => [ // sepa 'sepa_cc', 'sepa_ct_op', @@ -895,33 +895,33 @@ return [ 'recurrence_count', 'recurrence_date', ], - 'webhooks' => [ + 'webhooks' => [ 'max_attempts' => env('WEBHOOK_MAX_ATTEMPTS', 3), ], - 'can_have_virtual_amounts' => [AccountType::ASSET], - 'can_have_opening_balance' => [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], - 'dynamic_creation_allowed' => [ + 'can_have_virtual_amounts' => [AccountType::ASSET], + 'can_have_opening_balance' => [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], + 'dynamic_creation_allowed' => [ AccountType::EXPENSE, AccountType::REVENUE, AccountType::INITIAL_BALANCE, AccountType::RECONCILIATION, AccountType::LIABILITY_CREDIT, ], - 'valid_asset_fields' => ['account_role', 'account_number', 'currency_id', 'BIC', 'include_net_worth'], - 'valid_cc_fields' => ['account_role', 'cc_monthly_payment_date', 'cc_type', 'account_number', 'currency_id', 'BIC', 'include_net_worth'], - 'valid_account_fields' => ['account_number', 'currency_id', 'BIC', 'interest', 'interest_period', 'include_net_worth', 'liability_direction'], + 'valid_asset_fields' => ['account_role', 'account_number', 'currency_id', 'BIC', 'include_net_worth'], + 'valid_cc_fields' => ['account_role', 'cc_monthly_payment_date', 'cc_type', 'account_number', 'currency_id', 'BIC', 'include_net_worth'], + 'valid_account_fields' => ['account_number', 'currency_id', 'BIC', 'interest', 'interest_period', 'include_net_worth', 'liability_direction'], // dynamic date ranges are as follows: - 'dynamic_date_ranges' => ['last7', 'last30', 'last90', 'last365', 'MTD', 'QTD', 'YTD'], + 'dynamic_date_ranges' => ['last7', 'last30', 'last90', 'last365', 'MTD', 'QTD', 'YTD'], // only used in v1 - 'allowed_sort_parameters' => ['order', 'name', 'iban'], + 'allowed_sort_parameters' => ['order', 'name', 'iban'], // preselected account lists possibilities: - 'preselected_accounts' => ['all', 'assets', 'liabilities'], + 'preselected_accounts' => ['all', 'assets', 'liabilities'], // allowed filters (search) for APIs - 'filters' => [ + 'filters' => [ 'allowed' => [ 'accounts' => [ 'name' => 'string', @@ -935,16 +935,16 @@ return [ ], // allowed sort columns for APIs - 'sorting' => [ + 'sorting' => [ 'allowed' => [ 'transactions' => ['description', 'amount'], 'accounts' => ['name', 'active', 'iban', 'balance', 'last_activity', 'balance_difference', 'current_debt'], ], ], - 'full_data_set' => [ + 'full_data_set' => [ 'account' => ['last_activity', 'balance_difference', 'current_balance', 'current_debt'], ], - 'valid_query_filters' => [ + 'valid_query_filters' => [ 'account' => ['name', 'iban', 'active'], ], ]; diff --git a/config/jsonapi.php b/config/jsonapi.php index e06569dc2e..498c1545a2 100644 --- a/config/jsonapi.php +++ b/config/jsonapi.php @@ -1,9 +1,10 @@ id(); $table->timestamps(); $table->string('title', 100)->nullable(); @@ -24,8 +26,7 @@ return new class extends Migration { $table->foreign('transaction_journal_id')->references('id')->on('transaction_journals')->onDelete('cascade'); $table->foreign('transaction_currency_id')->references('id')->on('transaction_currencies')->onDelete('cascade'); - - $table->unique(['account_id', 'transaction_currency_id', 'transaction_journal_id','date', 'title'], 'unique_account_currency'); + $table->unique(['account_id', 'transaction_currency_id', 'transaction_journal_id', 'date', 'title'], 'unique_account_currency'); }); } } diff --git a/package-lock.json b/package-lock.json index 963aa87f97..aabf8e65b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4163,9 +4163,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", - "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -5095,9 +5095,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.760", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.760.tgz", - "integrity": "sha512-xF6AWMVM/QGQseTPgXjUewfNjCW2fgUcV/z5cSG0r+SiYcgtvcmRAL3oH/MSZwHBBD+fyKTXdQ4qGENJMSedEQ==", + "version": "1.4.763", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", + "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", "dev": true }, "node_modules/elliptic": { @@ -6275,9 +6275,9 @@ } }, "node_modules/i18next": { - "version": "23.11.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.3.tgz", - "integrity": "sha512-Pq/aSKowir7JM0rj+Wa23Kb6KKDUGno/HjG+wRQu0PxoTbpQ4N89MAT0rFGvXmLkRLNMb1BbBOKGozl01dabzg==", + "version": "23.11.4", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.4.tgz", + "integrity": "sha512-CCUjtd5TfaCl+mLUzAA0uPSN+AVn4fP/kWCYt/hocPUwusTpMVczdrRyOBUwk6N05iH40qiKx6q1DoNJtBIwdg==", "funding": [ { "type": "individual", @@ -9074,9 +9074,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", - "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", + "version": "1.77.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz", + "integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -9128,9 +9128,9 @@ } }, "node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { "semver": "bin/semver.js" diff --git a/public/v2/i18n/pt.json b/public/v2/i18n/pt.json index 35aca3c117..fb3308e27e 100644 --- a/public/v2/i18n/pt.json +++ b/public/v2/i18n/pt.json @@ -10,16 +10,16 @@ "title": "T\u00edtulo" }, "list": { - "drag_and_drop": "Drag and drop", + "drag_and_drop": "Arrastar e soltar", "active": "Esta ativo?", "name": "Nome", "type": "Tipo", - "number": "Account number", + "number": "N\u00famero de conta", "liability_type": "Tipo de responsabilidade", - "current_balance": "Current balance", - "last_activity": "Last activity", - "amount_due": "Amount due", - "balance_difference": "Balance difference", + "current_balance": "Saldo atual", + "last_activity": "\u00daltima atividade", + "amount_due": "Valor a pagar", + "balance_difference": "Diferen\u00e7a de saldo", "menu": "Menu" }, "validation": { diff --git a/public/v2/i18n/pt_PT.json b/public/v2/i18n/pt_PT.json index 35aca3c117..fb3308e27e 100644 --- a/public/v2/i18n/pt_PT.json +++ b/public/v2/i18n/pt_PT.json @@ -10,16 +10,16 @@ "title": "T\u00edtulo" }, "list": { - "drag_and_drop": "Drag and drop", + "drag_and_drop": "Arrastar e soltar", "active": "Esta ativo?", "name": "Nome", "type": "Tipo", - "number": "Account number", + "number": "N\u00famero de conta", "liability_type": "Tipo de responsabilidade", - "current_balance": "Current balance", - "last_activity": "Last activity", - "amount_due": "Amount due", - "balance_difference": "Balance difference", + "current_balance": "Saldo atual", + "last_activity": "\u00daltima atividade", + "amount_due": "Valor a pagar", + "balance_difference": "Diferen\u00e7a de saldo", "menu": "Menu" }, "validation": { diff --git a/resources/lang/pt_PT/email.php b/resources/lang/pt_PT/email.php index 6f805f2d12..97141b5b0e 100644 --- a/resources/lang/pt_PT/email.php +++ b/resources/lang/pt_PT/email.php @@ -138,7 +138,8 @@ return [ 'error_ip' => 'O endereço de IP associado a este erro é: :ip', 'error_url' => 'O URL é: :url', 'error_user_agent' => 'Agente de utilizador: :userAgent', - 'error_stacktrace' => 'The full stacktrace is below. If you think this is a bug in Firefly III, you can forward this message to james@firefly-iii.org. This can help fix the bug you just encountered.', + 'error_stacktrace' => 'O stacktrace completo encontra-se abaixo. Se julga ser um erro no Firefly III, pode reencaminhar este email para james@firefly-iii.org. +Isto pode ajudar a corrigir o erro que acabou de encontrar.', 'error_github_html' => 'Se preferir, pode também abrir uma nova questão no GitHub.', 'error_github_text' => 'Se preferir, pode também abrir uma nova questão em https://github.com/firefly-iii/firefly-iii/issues.', 'error_stacktrace_below' => 'O rastreamento da pilha completo é:', diff --git a/resources/lang/pt_PT/errors.php b/resources/lang/pt_PT/errors.php index 0bbcbcc48d..6092493adf 100644 --- a/resources/lang/pt_PT/errors.php +++ b/resources/lang/pt_PT/errors.php @@ -42,7 +42,7 @@ return [ 'fatal_error' => 'Aconteceu um erro fatal. Por favor, verifique os ficheiros de log em "storage/logs" ou use "docker logs -f [container]" para verificar o que se passa.', 'maintenance_mode' => 'O Firefly III está em modo de manutenção.', 'be_right_back' => 'Volto já!', - 'check_back' => 'Firefly III is down for some necessary maintenance. Please check back in a second. If you happen to see this message on the demo site, just wait a few minutes. The database is reset every few hours.', + 'check_back' => 'Firefly III encontra-se desligado para alguma manutenção necessária. Volte a tentar daqui a uns segundos. Se acontecer de ver esta mensagem no site de demonstração, espere alguns minutos. A base de dados é reiniciada a cada algumas horas.', 'error_occurred' => 'Oops! Ocorreu um erro.', 'db_error_occurred' => 'Oops! Ocorreu um erro na base de dados.', 'error_not_recoverable' => 'Infelizmente, este erro não era recuperável :(. Firefly III avariou. O erro é:', diff --git a/resources/lang/pt_PT/form.php b/resources/lang/pt_PT/form.php index b65cac8668..7f1e1e7302 100644 --- a/resources/lang/pt_PT/form.php +++ b/resources/lang/pt_PT/form.php @@ -37,7 +37,7 @@ return [ // new user: 'bank_name' => 'Nome do banco', 'bank_balance' => 'Saldo', - 'current_balance' => 'Current balance', + 'current_balance' => 'Saldo atual', 'savings_balance' => 'Saldo nas poupanças', 'credit_card_limit' => 'Limite do cartão de crédito', 'automatch' => 'Corresponder automaticamente', diff --git a/resources/lang/pt_PT/list.php b/resources/lang/pt_PT/list.php index 9ffb259b6a..e9fa2e375f 100644 --- a/resources/lang/pt_PT/list.php +++ b/resources/lang/pt_PT/list.php @@ -67,12 +67,12 @@ return [ 'source' => 'Origem', 'next_expected_match' => 'Próxima correspondência esperada', 'automatch' => 'Auto correspondência?', - 'drag_and_drop' => 'Drag and drop', - 'number' => 'Account number', - 'current_balance' => 'Current balance', - 'last_activity' => 'Last activity', - 'amount_due' => 'Amount due', - 'balance_difference' => 'Balance difference', + 'drag_and_drop' => 'Arrastar e soltar', + 'number' => 'Número de conta', + 'current_balance' => 'Saldo atual', + 'last_activity' => 'Última atividade', + 'amount_due' => 'Valor a pagar', + 'balance_difference' => 'Diferença de saldo', 'menu' => 'Menu', /* diff --git a/resources/lang/pt_PT/rules.php b/resources/lang/pt_PT/rules.php index 7b0052d70e..8256cdb062 100644 --- a/resources/lang/pt_PT/rules.php +++ b/resources/lang/pt_PT/rules.php @@ -27,7 +27,7 @@ return [ 'find_or_create_tag_failed' => 'Não foi possível encontrar ou criar a etiqueta ":tag"', 'tag_already_added' => 'A etiqueta ":tag" já está vinculada a esta transação', 'inspect_transaction' => 'Inspecionar transação ":title" @ Firefly III', - 'inspect_rule' => 'Inspect rule ":title" @ Firefly III', + 'inspect_rule' => 'Inspecionar regra ":title" @ Firefly III', 'journal_other_user' => 'Esta transação não pertence ao utilizador', 'no_such_journal' => 'Esta transação não existe', 'journal_already_no_budget' => 'Esta transação não tem orçamento, então não pode ser removido', @@ -47,28 +47,28 @@ return [ 'unsupported_transaction_type_transfer' => 'Firefly III não pode converter um ":type" para uma transferência', 'already_has_source_asset' => 'Esta transação já tem ":name" como a conta do ativo de origem', 'already_has_destination_asset' => 'Esta transação já tem ":name" como a conta de ativo de destino', - 'already_has_destination' => 'This transaction already has ":name" as the destination account', - 'already_has_source' => 'This transaction already has ":name" as the source account', - 'already_linked_to_subscription' => 'The transaction is already linked to subscription ":name"', - 'already_linked_to_category' => 'The transaction is already linked to category ":name"', - 'already_linked_to_budget' => 'The transaction is already linked to budget ":name"', - 'cannot_find_subscription' => 'Firefly III can\'t find subscription ":name"', - 'no_notes_to_move' => 'The transaction has no notes to move to the description field', - 'no_tags_to_remove' => 'The transaction has no tags to remove', - 'not_withdrawal' => 'The transaction is not a withdrawal', - 'not_deposit' => 'The transaction is not a deposit', - 'cannot_find_tag' => 'Firefly III can\'t find tag ":tag"', - 'cannot_find_asset' => 'Firefly III can\'t find asset account ":name"', - 'cannot_find_accounts' => 'Firefly III can\'t find the source or destination account', - 'cannot_find_source_transaction' => 'Firefly III can\'t find the source transaction', - 'cannot_find_destination_transaction' => 'Firefly III can\'t find the destination transaction', - 'cannot_find_source_transaction_account' => 'Firefly III can\'t find the source transaction account', - 'cannot_find_destination_transaction_account' => 'Firefly III can\'t find the destination transaction account', - 'cannot_find_piggy' => 'Firefly III can\'t find a piggy bank named ":name"', - 'no_link_piggy' => 'This transaction\'s accounts are not linked to the piggy bank, so no action will be taken', - 'cannot_unlink_tag' => 'Tag ":tag" isn\'t linked to this transaction', - 'cannot_find_budget' => 'Firefly III can\'t find budget ":name"', - 'cannot_find_category' => 'Firefly III can\'t find category ":name"', - 'cannot_set_budget' => 'Firefly III can\'t set budget ":name" to a transaction of type ":type"', - 'journal_invalid_amount' => 'Firefly III can\'t set amount ":amount" because it is not a valid number.', + 'already_has_destination' => 'Esta transação já tem ":name" como conta de destino', + 'already_has_source' => 'Esta transação já tem ":name" como a conta de origem', + 'already_linked_to_subscription' => 'A transação já está vinculada à subscrição ":name"', + 'already_linked_to_category' => 'A transação já está vinculada à categoria ":name"', + 'already_linked_to_budget' => 'A transação já está vinculada ao orçamento ":name"', + 'cannot_find_subscription' => 'Firefly III não consegue encontrar a subscrição ":name"', + 'no_notes_to_move' => 'A transação não tem notas para mover para o campo de descrição', + 'no_tags_to_remove' => 'A transação não tem etiquetas para remover', + 'not_withdrawal' => 'A transação não é um levantamento', + 'not_deposit' => 'A transação não é um depósito', + 'cannot_find_tag' => 'Firefly III não consegue encontrar a etiqueta ":tag"', + 'cannot_find_asset' => 'Firefly III não consegue encontrar a conta de ativos ":name"', + 'cannot_find_accounts' => 'Firefly III não conseguiu encontrar a conta de origem ou de destino', + 'cannot_find_source_transaction' => 'Firefly III não conseguiu encontrar a transação de origem', + 'cannot_find_destination_transaction' => 'Firefly III não conseguiu encontrar a transação de destino', + 'cannot_find_source_transaction_account' => 'Firefly III não conseguiu encontrar a conta de origem da transação', + 'cannot_find_destination_transaction_account' => 'Firefly III não conseguiu encontrar a conta de destino da transação', + 'cannot_find_piggy' => 'Firefly III não conseguiu encontrar nenhum mealheiro chamado ":name"', + 'no_link_piggy' => 'As contas desta transação não estão ligadas ao mealheiro, logo nenhuma ação será tomada', + 'cannot_unlink_tag' => 'Etiqueta ":tag" não está vinculada a esta transação', + 'cannot_find_budget' => 'Firefly III não consegue encontrar o orçamento ":name"', + 'cannot_find_category' => 'Firefly III não consegue encontrar a categoria ":name"', + 'cannot_set_budget' => 'Firefly III não pode definir o orçamento ":name" para uma transação do tipo ":type"', + 'journal_invalid_amount' => 'Firefly III não pode definir a quantidade ":amount" porque não é um número válido.', ]; diff --git a/routes/api.php b/routes/api.php index 4122a92422..a29522b67e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -29,9 +29,7 @@ use LaravelJsonApi\Laravel\Routing\ActionRegistrar; use LaravelJsonApi\Laravel\Routing\Relationships; use LaravelJsonApi\Laravel\Routing\ResourceRegistrar; -/** - * V2 auto complete controller(s) - */ +// V2 auto complete controller(s) Route::group( [ 'namespace' => 'FireflyIII\Api\V2\Controllers\Autocomplete', @@ -47,11 +45,7 @@ Route::group( } ); - - - - -//JsonApiRoute::server('v3') +// JsonApiRoute::server('v3') // ->prefix('v3') // ->resources(function (ResourceRegistrar $server) { // $server->resource('accounts', AccountController::class)->readOnly()->relationships(function (Relationships $relations) { @@ -67,8 +61,6 @@ Route::group( // $server->resource('account-balances', JsonApiController::class); // }); - - // V2 API route for Summary boxes // BASIC Route::group( @@ -102,7 +94,6 @@ Route::group( // V2 API routes for auto complete - // V2 API route for net worth endpoint(s); Route::group( [