Compare commits

..

12 Commits

Author SHA1 Message Date
github-actions[bot]
b956b463c2 Merge pull request #10515 from firefly-iii/release-1751095523
🤖 Automatically merge the PR into the develop branch.
2025-06-28 09:25:30 +02:00
JC5
43603c4990 🤖 Auto commit for release 'develop' on 2025-06-28 2025-06-28 09:25:23 +02:00
github-actions[bot]
196e738f60 Merge pull request #10514 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-06-28 08:53:36 +02:00
github-actions[bot]
59e2ea357a Merge pull request #10513 from firefly-iii/release-1751093606
🤖 Automatically merge the PR into the develop branch.
2025-06-28 08:53:32 +02:00
JC5
5e9d942069 🤖 Auto commit for release 'v6.2.19' on 2025-06-28 2025-06-28 08:53:26 +02:00
James Cole
53d5bedd85 Update changelog and config. 2025-06-28 08:48:53 +02:00
James Cole
49c68af07b Fix #10510 2025-06-27 20:59:47 +02:00
James Cole
c84c8e1aef Fix #10507 2025-06-27 11:10:41 +02:00
James Cole
a8d43d7174 Add donation text. 2025-06-26 17:32:06 +02:00
James Cole
1087278890 Make sure phpcs and rector agree on styles. 2025-06-26 11:57:15 +02:00
James Cole
ae5912ab52 Remove some logs. 2025-06-26 11:45:31 +02:00
github-actions[bot]
c298aced01 Merge pull request #10479 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-06-20 06:45:28 +02:00
29 changed files with 157 additions and 116 deletions

View File

@@ -19,26 +19,24 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use PhpCsFixer\Runner\Parallel\ParallelConfigFactory;
$current = __DIR__;
$paths = [
$current . '/../../app',
$current . '/../../config',
$current . '/../../database',
$current . '/../../routes',
$current . '/../../tests',
$current . '/../../resources/lang/en_US',
];
$finder = PhpCsFixer\Finder::create()
->in($paths);
$config = new PhpCsFixer\Config();
$config->setParallelConfig(ParallelConfigFactory::detect());
$config = (new PhpCsFixer\Config())
->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect())
;
return $config->setRules(
[
// rule sets
'@PHP83Migration' => true,
@@ -53,9 +51,6 @@ return $config->setRules(
'statement_indentation' => true,
'void_return' => true,
// about importing statements
'global_namespace_import' => ['import_classes' => true, 'import_constants' => true, 'import_functions' => true],
// disabled rules
'native_function_invocation' => false, // annoying
'php_unit_data_provider_name' => false, // bloody annoying long test names
@@ -64,9 +59,15 @@ return $config->setRules(
'comment_to_phpdoc' => false, // breaks phpstan lines in combination with PHPStorm.
'type_declaration_spaces' => false,
'cast_spaces' => false,
'phpdoc_to_comment' => false, // do not overrule single line comment style, breaks phpstan.
// enabled rules
'global_namespace_import' => true, // matches with rector.
// complex rules
'phpdoc_to_comment' => ['ignored_tags' => ['var']],
'php_unit_test_case_static_method_calls' => [
'call_type' => 'this',
],
'array_syntax' => ['syntax' => 'short'],
'binary_operator_spaces' => [
'default' => 'at_least_single_space',
@@ -76,5 +77,7 @@ return $config->setRules(
'??=' => 'align_single_space_minimal_by_scope',
],
],
])
]
)
->setFinder($finder);

View File

@@ -28,7 +28,8 @@ composer update --quiet
rm -f .php-cs-fixer.cache
PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix \
--config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \
--format=txt -v \
--format=txt \
-v \
--allow-risky=yes
EXIT_CODE=$?

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
use Rector\Config\RectorConfig;
use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector;
use Rector\Php80\Rector\ClassMethod\AddParamBasedOnParentClassMethodRector;
use Rector\Transform\Rector\String_\StringToClassConstantRector;
use RectorLaravel\Set\LaravelLevelSetList;
@@ -32,6 +33,7 @@ use RectorLaravel\Set\LaravelLevelSetList;
return RectorConfig::configure()
->withSkip([
ChangeOrIfContinueToMultiContinueRector::class,
AddParamBasedOnParentClassMethodRector::class,
StringToClassConstantRector::class => [
__DIR__ . '/../app/Http/Controllers/Auth/LoginController.php',
],

View File

@@ -259,6 +259,12 @@ jobs:
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
echo "" >> output.txt
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
# donations!
echo '' >> output.txt
echo '### Support Firefly III' >> output.txt
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
echo '' >> output.txt
fi
# describe a branch release
if [[ "$version" == branch* ]]; then
@@ -299,6 +305,11 @@ jobs:
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
# donations!
echo '' >> output.txt
echo '### Support Firefly III' >> output.txt
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
echo '' >> output.txt
fi
# describe alpha release

View File

@@ -1094,6 +1094,10 @@ class GroupCollector implements GroupCollectorInterface
->whereNull('transaction_groups.deleted_at')
->whereNull('transaction_journals.deleted_at')
->whereNull('source.deleted_at')
// #10507 ignore opening balance.
->where('transaction_types.type', '!=', TransactionTypeEnum::OPENING_BALANCE->value)
->whereNotNull('transaction_groups.id')
->whereNull('destination.deleted_at')
->orderBy('transaction_journals.date', 'DESC')

View File

@@ -82,7 +82,7 @@ class NetWorth implements NetWorthInterface
/** @var Account $account */
foreach ($accounts as $account) {
Log::debug(sprintf('Now at account #%d ("%s")', $account->id, $account->name));
// Log::debug(sprintf('Now at account #%d ("%s")', $account->id, $account->name));
$currency = $this->accountRepository->getAccountCurrency($account) ?? $default;
$useNative = $convertToNative && $default->id !== $currency->id;
$currency = $useNative ? $default : $currency;
@@ -93,12 +93,12 @@ class NetWorth implements NetWorthInterface
$balance = $balances[$account->id]['balance'] ?? '0';
$nativeBalance = $balances[$account->id]['native_balance'] ?? '0';
}
Log::debug(sprintf('Balance is %s, native balance is %s', $balance, $nativeBalance));
// Log::debug(sprintf('Balance is %s, native balance is %s', $balance, $nativeBalance));
// always subtract virtual balance again.
$balance = '' !== (string) $account->virtual_balance ? bcsub($balance, (string) $account->virtual_balance) : $balance;
$nativeBalance = '' !== (string) $account->native_virtual_balance ? bcsub($nativeBalance, (string) $account->native_virtual_balance) : $nativeBalance;
$amountToUse = $useNative ? $nativeBalance : $balance;
Log::debug(sprintf('Will use %s %s', $currencyCode, $amountToUse));
// Log::debug(sprintf('Will use %s %s', $currencyCode, $amountToUse));
$netWorth[$currencyCode] ??= [
'balance' => '0',

View File

@@ -106,7 +106,7 @@ trait AugumentData
{
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
$accounts = $repository->getAccountsByType([AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::CASH->value]);
$accounts = $repository->getAccountsByType([AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::CASH->value]);
$grouped = $accounts->groupBy('id')->toArray();
$return = [];
foreach ($accountIds as $combinedId) {

View File

@@ -71,12 +71,12 @@ class TransactionSummarizer
$foreignCurrencyDecimalPlaces = null;
if ($this->convertToNative) {
Log::debug('convertToNative is true.');
// Log::debug('convertToNative is true.');
// if convert to native, use the native amount yes or no?
$useNative = $this->default->id !== (int) $journal['currency_id'];
$useForeign = $this->default->id === (int) $journal['foreign_currency_id'];
if ($useNative) {
Log::debug(sprintf('Journal #%d switches to native amount (original is %s)', $journal['transaction_journal_id'], $journal['currency_code']));
// Log::debug(sprintf('Journal #%d switches to native amount (original is %s)', $journal['transaction_journal_id'], $journal['currency_code']));
$field = 'native_amount';
$currencyId = $this->default->id;
$currencyName = $this->default->name;
@@ -85,7 +85,7 @@ class TransactionSummarizer
$currencyDecimalPlaces = $this->default->decimal_places;
}
if ($useForeign) {
Log::debug(sprintf('Journal #%d switches to foreign amount (foreign is %s)', $journal['transaction_journal_id'], $journal['foreign_currency_code']));
// Log::debug(sprintf('Journal #%d switches to foreign amount (foreign is %s)', $journal['transaction_journal_id'], $journal['foreign_currency_code']));
$field = 'foreign_amount';
$currencyId = (int) $journal['foreign_currency_id'];
$currencyName = $journal['foreign_currency_name'];
@@ -95,7 +95,7 @@ class TransactionSummarizer
}
}
if (!$this->convertToNative) {
Log::debug('convertToNative is false.');
// Log::debug('convertToNative is false.');
// use foreign amount?
$foreignCurrencyId = (int) $journal['foreign_currency_id'];
if (0 !== $foreignCurrencyId) {

View File

@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## 6.2.19 - 2025-06-29
### Changed
- Currency seeder adds "CNY" again, because it turns out "RMB" is not the official, ISO 4217 code for the Chinese Yuan.
- The "period overview" next to the transaction lists (withdrawals, deposits and transfers) is limited to 10 entries because it uses a lot of memory. I still have to fix this.
### Removed
- Support for ntfy, since the underlying library is no longer maintained. Will be replaced in the future.
### Fixed
- Running balance calculation also triggers on edit.
- [Issue 10489](https://github.com/firefly-iii/firefly-iii/issues/10489) (Cannot create personal access token if using remote guard auth in latest version) reported by @Palomox
- [Issue 10493](https://github.com/firefly-iii/firefly-iii/issues/10493) (Reports First Graph Wrong) reported by @nicolopozzato
- [Issue 10499](https://github.com/firefly-iii/firefly-iii/issues/10499) (Password change results in error 500 (Class "Hash" not found)) reported by @willermo
- [Issue 10507](https://github.com/firefly-iii/firefly-iii/issues/10507) (Opening balance transactions includes in `has_no_category` filter) reported by @lompi
- [Issue 10510](https://github.com/firefly-iii/firefly-iii/issues/10510) (Liability accounts show as 'no name' on budget transaction report pie chart.) reported by @slackspace-io
## 6.2.18 - 2025-06-20
### Changed

12
composer.lock generated
View File

@@ -11549,16 +11549,16 @@
},
{
"name": "phpunit/phpunit",
"version": "12.2.3",
"version": "12.2.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "60a8ea2d8b2f070000051b56778009e11576e7d1"
"reference": "b71849b29f7a8d7574e4401873cb8b539896613f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60a8ea2d8b2f070000051b56778009e11576e7d1",
"reference": "60a8ea2d8b2f070000051b56778009e11576e7d1",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b71849b29f7a8d7574e4401873cb8b539896613f",
"reference": "b71849b29f7a8d7574e4401873cb8b539896613f",
"shasum": ""
},
"require": {
@@ -11626,7 +11626,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.3"
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.5"
},
"funding": [
{
@@ -11650,7 +11650,7 @@
"type": "tidelift"
}
],
"time": "2025-06-20T11:33:06+00:00"
"time": "2025-06-27T04:37:55+00:00"
},
{
"name": "rector/rector",

View File

@@ -78,7 +78,7 @@ return [
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
// see cer.php for exchange rates feature flag.
],
'version' => 'develop/2025-06-26',
'version' => 'develop/2025-06-28',
'api_version' => '2.1.0', // field is no longer used.
'db_version' => 25,

View File

@@ -26,7 +26,7 @@ return [
'channels' => [
'email' => ['enabled' => true, 'ui_configurable' => 0],
'slack' => ['enabled' => true, 'ui_configurable' => 1],
'ntfy' => ['enabled' => false, 'ui_configurable' => 1],
// 'ntfy' => ['enabled' => false, 'ui_configurable' => 1],
'pushover' => ['enabled' => true, 'ui_configurable' => 1],
// 'gotify' => ['enabled' => false, 'ui_configurable' => 0],
// 'pushbullet' => ['enabled' => false, 'ui_configurable' => 0],

View File

@@ -260,8 +260,6 @@ return [
'destination_balance_lt' => ['alias' => false, 'needs_context' => true],
'destination_balance_is' => ['alias' => false, 'needs_context' => true],
],
/**
* Which query parser to use - 'new' or 'legacy'
*/
// Which query parser to use - 'new' or 'legacy'
'query_parser' => env('QUERY_PARSER_IMPLEMENTATION', 'legacy'),
];

130
package-lock.json generated
View File

@@ -43,9 +43,9 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
"integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz",
"integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -53,22 +53,22 @@
}
},
"node_modules/@babel/core": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
"integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz",
"integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.27.3",
"@babel/generator": "^7.27.5",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.27.3",
"@babel/helpers": "^7.27.4",
"@babel/parser": "^7.27.4",
"@babel/helpers": "^7.27.6",
"@babel/parser": "^7.27.7",
"@babel/template": "^7.27.2",
"@babel/traverse": "^7.27.4",
"@babel/types": "^7.27.3",
"@babel/traverse": "^7.27.7",
"@babel/types": "^7.27.7",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -211,17 +211,17 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz",
"integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==",
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
"integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
"@babel/helper-plugin-utils": "^7.22.5",
"debug": "^4.1.1",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-plugin-utils": "^7.27.1",
"debug": "^4.4.1",
"lodash.debounce": "^4.0.8",
"resolve": "^1.14.2"
"resolve": "^1.22.10"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -406,13 +406,13 @@
}
},
"node_modules/@babel/parser": {
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
"integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz",
"integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
"@babel/types": "^7.27.7"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -733,17 +733,17 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz",
"integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.7.tgz",
"integrity": "sha512-CuLkokN1PEZ0Fsjtq+001aog/C2drDK9nTfK/NRK0n6rBin6cBrvM+zfQjDE+UllhR6/J4a6w8Xq9i4yi3mQrw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-annotate-as-pure": "^7.27.3",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/helper-replace-supers": "^7.27.1",
"@babel/traverse": "^7.27.1",
"@babel/traverse": "^7.27.7",
"globals": "^11.1.0"
},
"engines": {
@@ -771,13 +771,14 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz",
"integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.7.tgz",
"integrity": "sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/traverse": "^7.27.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1119,16 +1120,17 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz",
"integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.7.tgz",
"integrity": "sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/plugin-transform-destructuring": "^7.27.3",
"@babel/plugin-transform-parameters": "^7.27.1"
"@babel/plugin-transform-destructuring": "^7.27.7",
"@babel/plugin-transform-parameters": "^7.27.7",
"@babel/traverse": "^7.27.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1188,9 +1190,9 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz",
"integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
"integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1616,17 +1618,17 @@
}
},
"node_modules/@babel/traverse": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz",
"integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.27.3",
"@babel/parser": "^7.27.4",
"@babel/generator": "^7.27.5",
"@babel/parser": "^7.27.7",
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.3",
"@babel/types": "^7.27.7",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1635,9 +1637,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
"integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"version": "7.27.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz",
"integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3108,9 +3110,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "24.0.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz",
"integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==",
"version": "24.0.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.6.tgz",
"integrity": "sha512-ZOyn+gOs749xU7ovp+Ibj0g1o3dFRqsfPnT22C2t5JzcRvgsEDpGawPbCISGKLudJk9Y0wiu9sYd6kUh0pc9TA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3917,14 +3919,14 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.13",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz",
"integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==",
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
"integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.22.6",
"@babel/helper-define-polyfill-provider": "^0.6.4",
"@babel/compat-data": "^7.27.7",
"@babel/helper-define-polyfill-provider": "^0.6.5",
"semver": "^6.3.1"
},
"peerDependencies": {
@@ -3956,13 +3958,13 @@
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz",
"integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==",
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
"integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.6.4"
"@babel/helper-define-polyfill-provider": "^0.6.5"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -5648,9 +5650,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.175",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.175.tgz",
"integrity": "sha512-Nqpef9mOVo7pZfl9NIUhj7tgtRTsMzCzRTJDP1ccim4Wb4YHOz3Le87uxeZq68OCNwau2iQ/X7UwdAZ3ReOkmg==",
"version": "1.5.177",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz",
"integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==",
"dev": true,
"license": "ISC"
},

View File

@@ -2,7 +2,7 @@
"firefly": {
"administrations_page_title": "\u8d22\u52a1\u7ba1\u7406",
"administrations_index_menu": "\u8d22\u52a1\u7ba1\u7406",
"expires_at": "Expires at",
"expires_at": "\u8fc7\u671f\u4e8e",
"temp_administrations_introduction": "Firefly III \u4e0d\u4e45\u5c06\u80fd\u591f\u7ba1\u7406\u591a\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002 \u73b0\u5728\uff0c\u4f60\u53ea\u80fd\u6709\u4e00\u4e2a\u8d22\u52a1\u7ba1\u7406\u3002\u4f60\u53ef\u4ee5\u8bbe\u7f6e\u8fd9\u4e2a\u8d22\u52a1\u7ba1\u7406\u7684\u6807\u9898\u53ca\u5176\u5f53\u5730\u8d27\u5e01\u3002 \u8fd9\u5c06\u53d6\u4ee3\u60a8\u5148\u524d\u8bbe\u7f6e\u7684\u201c\u9ed8\u8ba4\u8d27\u5e01\u201d\u3002 \u8fd9\u79cd\u8bbe\u7f6e\u73b0\u5728\u4e0e\u8d22\u52a1\u7ba1\u7406\u6302\u94a9\uff0c\u6bcf\u4e2a\u7ba1\u7406\u53ef\u4ee5\u6709\u4e0d\u540c\u7684\u8bbe\u7f6e\u3002",
"administration_currency_form_help": "\u5982\u679c\u60a8\u66f4\u6539\u672c\u5730\u8d27\u5e01\uff0c\u9875\u9762\u52a0\u8f7d\u53ef\u80fd\u9700\u8981\u5f88\u957f\u65f6\u95f4\uff0c\u56e0\u4e3a\u4ea4\u6613\u53ef\u80fd\u9700\u8981\u8f6c\u6362\u4e3a\u60a8\u7684(\u65b0)\u672c\u5730\u8d27\u5e01\u3002",
"administrations_page_edit_sub_title_js": "\u7f16\u8f91\u8d22\u52a1\u7ba1\u7406{title}",

View File

@@ -133,7 +133,7 @@ return [
'expenses_by_budget' => 'Expenses by budget',
'income_by_category' => 'Income by category',
'expenses_by_asset_account' => 'Expenses by asset account',
'expenses_by_expense_account' => 'Expenses by expense account',
'expenses_by_expense_account' => 'Expenses by destination account',
'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.',
'sum_of_expenses' => 'Sum of expenses',
'sum_of_income' => 'Sum of income',

View File

@@ -56,7 +56,7 @@ final class BillDateCalculatorTest extends TestCase
public function testGivenSomeDataItWorks(Carbon $earliest, Carbon $latest, Carbon $billStart, string $period, int $skip, ?Carbon $lastPaid, array $expected): void
{
$result = $this->calculator->getPayDates($earliest, $latest, $billStart, $period, $skip, $lastPaid);
self::assertSame($expected, $result);
$this->assertSame($expected, $result);
}
public static function provideDates(): Iterator

View File

@@ -45,6 +45,6 @@ final class NavigationCustomEndOfPeriodTest extends TestCase
$navigation = new Navigation();
$period = $navigation->endOfPeriod($from, 'custom');
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
}

View File

@@ -73,7 +73,7 @@ final class CalculatorTest extends TestCase
{
$calculator = new Calculator();
$period = $calculator->nextDateByInterval($provider->epoch(), $provider->periodicity);
self::assertSame($provider->expected()->toDateString(), $period->toDateString());
$this->assertSame($provider->expected()->toDateString(), $period->toDateString());
}
public static function provideAllPeriodicity(): iterable
@@ -102,7 +102,7 @@ final class CalculatorTest extends TestCase
{
$calculator = new Calculator();
$period = $calculator->nextDateByInterval($provider->epoch(), $provider->periodicity, $provider->skip);
self::assertSame($provider->expected()->toDateString(), $period->toDateString());
$this->assertSame($provider->expected()->toDateString(), $period->toDateString());
}
public static function provideSkippedIntervals(): iterable

View File

@@ -36,7 +36,7 @@ abstract class IntervalTestCase extends TestCase
public function testGivenAnEpochWhenCallTheNextDateThenReturnsTheExpectedDateSuccessful(IntervalProvider $provider): void
{
$period = static::factory()->nextDate($provider->epoch);
self::assertSame($provider->expected->toDateString(), $period->toDateString());
$this->assertSame($provider->expected->toDateString(), $period->toDateString());
}
public static function provider(): iterable

View File

@@ -56,7 +56,7 @@ final class NavigationAddPeriodTest extends TestCase
public function testGivenAFrequencyAndSkipIntervalWhenCalculateTheDateThenReturnsTheSkippedDateSuccessful(int $skip, string $frequency, Carbon $from, Carbon $expected): void
{
$period = $this->navigation->addPeriod($from, $frequency, $skip);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function providePeriodsWithSkippingParam(): iterable
@@ -108,7 +108,7 @@ final class NavigationAddPeriodTest extends TestCase
public function testGivenAFrequencyWhenCalculateTheDateThenReturnsTheExpectedDateSuccessful(string $frequency, Carbon $from, Carbon $expected): void
{
$period = $this->navigation->addPeriod($from, $frequency, 0);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function providePeriods(): Iterator
@@ -158,7 +158,7 @@ final class NavigationAddPeriodTest extends TestCase
public function testGivenAIntervalWhenCallTheNextDateByIntervalMethodThenReturnsTheExpectedDateSuccessful(Periodicity $periodicity, Carbon $from, Carbon $expected): void
{
$period = $this->navigation->nextDateByInterval($from, $periodicity);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function provideFrequencies(): Iterator
@@ -212,7 +212,7 @@ final class NavigationAddPeriodTest extends TestCase
public function testGivenAMonthFrequencyWhenCalculateTheDateThenReturnsTheLastDayOfMonthSuccessful(string $frequency, Carbon $from, Carbon $expected): void
{
$period = $this->navigation->addPeriod($from, $frequency, 0);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function provideMonthPeriods(): Iterator

View File

@@ -55,7 +55,7 @@ final class NavigationEndOfPeriodTest extends TestCase
public function testGivenADateAndFrequencyWhenCalculateTheDateThenReturnsTheExpectedDateSuccessful(string $frequency, Carbon $from, Carbon $expected): void
{
$period = clone $this->navigation->endOfPeriod($from, $frequency);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function provideDates(): Iterator
@@ -116,7 +116,7 @@ final class NavigationEndOfPeriodTest extends TestCase
Log::spy();
$period = $this->navigation->endOfPeriod($from, $frequency);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
$expectedMessage = sprintf('Cannot do endOfPeriod for $repeat_freq "%s"', $frequency);
Log::shouldHaveReceived('error', [$expectedMessage]);

View File

@@ -54,7 +54,7 @@ final class NavigationPreferredCarbonFormatByPeriodTest extends TestCase
public function testGivenAPeriodWhenCallPreferredCarbonFormatByPeriodThenReturnsExpectedFormat(string $period, string $expected): void
{
$formatPeriod = $this->navigation->preferredCarbonFormatByPeriod($period);
self::assertSame($expected, $formatPeriod);
$this->assertSame($expected, $formatPeriod);
}
public static function providePeriods(): Iterator

View File

@@ -55,7 +55,7 @@ final class NavigationPreferredCarbonFormatTest extends TestCase
public function testGivenStartAndEndDatesWhenCallPreferredCarbonFormatThenReturnsTheExpectedFormatSuccessful(Carbon $start, Carbon $end, string $expected): void
{
$carbonFormat = $this->navigation->preferredCarbonFormat($start, $end);
self::assertSame($expected, $carbonFormat);
$this->assertSame($expected, $carbonFormat);
}
public static function providePeriods(): Iterator

View File

@@ -55,7 +55,7 @@ final class NavigationPreferredEndOfPeriodTest extends TestCase
public function testGivenStartAndEndDatesWhenCallPreferredEndOfPeriodThenReturnsTheExpectedFormatSuccessful(Carbon $start, Carbon $end, string $expected): void
{
$formatPeriod = $this->navigation->preferredEndOfPeriod($start, $end);
self::assertSame($expected, $formatPeriod);
$this->assertSame($expected, $formatPeriod);
}
public static function providePeriods(): Iterator

View File

@@ -55,7 +55,7 @@ final class NavigationPreferredRangeFormatTest extends TestCase
public function testGivenStartAndEndDatesWhenCallPreferredRangeFormatThenReturnsTheExpectedFormatSuccessful(Carbon $start, Carbon $end, string $expected): void
{
$formatPeriod = $this->navigation->preferredRangeFormat($start, $end);
self::assertSame($expected, $formatPeriod);
$this->assertSame($expected, $formatPeriod);
}
public static function providePeriods(): Iterator

View File

@@ -55,7 +55,7 @@ final class NavigationPreferredSqlFormatTest extends TestCase
public function testGivenStartAndEndDatesWhenCallPreferredSqlFormatThenReturnsTheExpectedFormatSuccessful(Carbon $start, Carbon $end, string $expected): void
{
$formatPeriod = $this->navigation->preferredSqlFormat($start, $end);
self::assertSame($expected, $formatPeriod);
$this->assertSame($expected, $formatPeriod);
}
public static function provideDates(): Iterator

View File

@@ -56,7 +56,7 @@ final class NavigationStartOfPeriodTest extends TestCase
public function testGivenADateAndFrequencyWhenCalculateTheDateThenReturnsTheExpectedDateSuccessful(string $frequency, Carbon $from, Carbon $expected): void
{
$period = $this->navigation->startOfPeriod($from, $frequency);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function provideDates(): Iterator
@@ -121,7 +121,7 @@ final class NavigationStartOfPeriodTest extends TestCase
;
$period = $this->navigation->startOfPeriod($from, $frequency);
self::assertSame($expected->toDateString(), $period->toDateString());
$this->assertSame($expected->toDateString(), $period->toDateString());
}
public static function provideUnknownFrequencies(): Iterator

View File

@@ -26,7 +26,7 @@ abstract class AbstractQueryParserInterfaceParseQueryTester extends TestCase
{
$actual = $this->createParser()->parse($query);
self::assertObjectEquals($expected, $actual);
$this->assertObjectEquals($expected, $actual);
}