From 8576877072ddcd625edf788af1d543d2cb7a10d2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 20 Jun 2025 07:45:41 +0200 Subject: [PATCH 01/18] Reverse currency change. --- database/seeders/TransactionCurrencySeeder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/seeders/TransactionCurrencySeeder.php b/database/seeders/TransactionCurrencySeeder.php index c20aacc1e0..3ae775dca4 100644 --- a/database/seeders/TransactionCurrencySeeder.php +++ b/database/seeders/TransactionCurrencySeeder.php @@ -66,8 +66,8 @@ class TransactionCurrencySeeder extends Seeder // asian currencies $currencies[] = ['code' => 'JPY', 'name' => 'Japanese yen', 'symbol' => '¥', 'decimal_places' => 0]; - // $currencies[] = ['code' => 'CNY', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; - $currencies[] = ['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; + $currencies[] = ['code' => 'CNY', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; +// $currencies[] = ['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; $currencies[] = ['code' => 'RUB', 'name' => 'Russian ruble', 'symbol' => '₽', 'decimal_places' => 2]; $currencies[] = ['code' => 'INR', 'name' => 'Indian rupee', 'symbol' => '₹', 'decimal_places' => 2]; From b1fbe4e909c7a2a1e037c56800b0f2f562c9aabb Mon Sep 17 00:00:00 2001 From: JC5 Date: Mon, 23 Jun 2025 05:33:57 +0200 Subject: [PATCH 02/18] =?UTF-8?q?=F0=9F=A4=96=20Auto=20commit=20for=20rele?= =?UTF-8?q?ase=20'develop'=20on=202025-06-23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.lock | 50 ++--- config/firefly.php | 2 +- .../seeders/TransactionCurrencySeeder.php | 4 +- package-lock.json | 193 ++++++++++++++++-- resources/assets/v1/src/locales/ca.json | 12 +- 5 files changed, 213 insertions(+), 48 deletions(-) diff --git a/composer.lock b/composer.lock index 23d1c0ae2e..1898f26627 100644 --- a/composer.lock +++ b/composer.lock @@ -3711,16 +3711,16 @@ }, { "name": "nesbot/carbon", - "version": "3.10.0", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "c1397390dd0a7e0f11660f0ae20f753d88c1f3d9" + "reference": "1fd1935b2d90aef2f093c5e35f7ae1257c448d00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/c1397390dd0a7e0f11660f0ae20f753d88c1f3d9", - "reference": "c1397390dd0a7e0f11660f0ae20f753d88c1f3d9", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/1fd1935b2d90aef2f093c5e35f7ae1257c448d00", + "reference": "1fd1935b2d90aef2f093c5e35f7ae1257c448d00", "shasum": "" }, "require": { @@ -3812,7 +3812,7 @@ "type": "tidelift" } ], - "time": "2025-06-12T10:24:28+00:00" + "time": "2025-06-21T15:19:35+00:00" }, { "name": "nette/schema", @@ -4805,16 +4805,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.44", + "version": "3.0.45", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "1d0b5e7e1434678411787c5a0535e68907cf82d9" + "reference": "bd81b90d5963c6b9d87de50357585375223f4dd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/1d0b5e7e1434678411787c5a0535e68907cf82d9", - "reference": "1d0b5e7e1434678411787c5a0535e68907cf82d9", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/bd81b90d5963c6b9d87de50357585375223f4dd8", + "reference": "bd81b90d5963c6b9d87de50357585375223f4dd8", "shasum": "" }, "require": { @@ -4895,7 +4895,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.44" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.45" }, "funding": [ { @@ -4911,7 +4911,7 @@ "type": "tidelift" } ], - "time": "2025-06-15T09:59:26+00:00" + "time": "2025-06-22T22:54:43+00:00" }, { "name": "pragmarx/google2fa", @@ -10472,16 +10472,16 @@ }, { "name": "larastan/larastan", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "36706736a0c51d3337478fab9c919d78d2e03404" + "reference": "e8ccd73008487ba91da9877b373f8c447743f1ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/36706736a0c51d3337478fab9c919d78d2e03404", - "reference": "36706736a0c51d3337478fab9c919d78d2e03404", + "url": "https://api.github.com/repos/larastan/larastan/zipball/e8ccd73008487ba91da9877b373f8c447743f1ce", + "reference": "e8ccd73008487ba91da9877b373f8c447743f1ce", "shasum": "" }, "require": { @@ -10549,7 +10549,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v3.4.2" + "source": "https://github.com/larastan/larastan/tree/v3.5.0" }, "funding": [ { @@ -10557,7 +10557,7 @@ "type": "github" } ], - "time": "2025-06-10T09:34:58+00:00" + "time": "2025-06-19T22:41:50+00:00" }, { "name": "laravel-json-api/testing", @@ -11550,16 +11550,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.2.2", + "version": "12.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "19e25c2da3f8071a683ee1e445b0e24bba25de61" + "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/19e25c2da3f8071a683ee1e445b0e24bba25de61", - "reference": "19e25c2da3f8071a683ee1e445b0e24bba25de61", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60a8ea2d8b2f070000051b56778009e11576e7d1", + "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1", "shasum": "" }, "require": { @@ -11573,13 +11573,13 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.3.0", + "phpunit/php-code-coverage": "^12.3.1", "phpunit/php-file-iterator": "^6.0.0", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.0.0", - "sebastian/comparator": "^7.0.1", + "sebastian/comparator": "^7.1.0", "sebastian/diff": "^7.0.0", "sebastian/environment": "^8.0.2", "sebastian/exporter": "^7.0.0", @@ -11627,7 +11627,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.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.3" }, "funding": [ { @@ -11651,7 +11651,7 @@ "type": "tidelift" } ], - "time": "2025-06-13T05:49:28+00:00" + "time": "2025-06-20T11:33:06+00:00" }, { "name": "rector/rector", diff --git a/config/firefly.php b/config/firefly.php index 48ee40f924..1dc2ee5a51 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -78,7 +78,7 @@ return [ 'running_balance_column' => env('USE_RUNNING_BALANCE', false), // see cer.php for exchange rates feature flag. ], - 'version' => '6.2.18', + 'version' => 'develop/2025-06-23', 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 25, diff --git a/database/seeders/TransactionCurrencySeeder.php b/database/seeders/TransactionCurrencySeeder.php index 3ae775dca4..a3b83c23e2 100644 --- a/database/seeders/TransactionCurrencySeeder.php +++ b/database/seeders/TransactionCurrencySeeder.php @@ -66,8 +66,8 @@ class TransactionCurrencySeeder extends Seeder // asian currencies $currencies[] = ['code' => 'JPY', 'name' => 'Japanese yen', 'symbol' => '¥', 'decimal_places' => 0]; - $currencies[] = ['code' => 'CNY', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; -// $currencies[] = ['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; + $currencies[] = ['code' => 'CNY', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; + // $currencies[] = ['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '¥', 'decimal_places' => 2]; $currencies[] = ['code' => 'RUB', 'name' => 'Russian ruble', 'symbol' => '₽', 'decimal_places' => 2]; $currencies[] = ['code' => 'INR', 'name' => 'Indian rupee', 'symbol' => '₹', 'decimal_places' => 2]; diff --git a/package-lock.json b/package-lock.json index ac30a04256..d58195c445 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3613,9 +3613,9 @@ } }, "node_modules/admin-lte": { - "version": "4.0.0-beta3", - "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-4.0.0-beta3.tgz", - "integrity": "sha512-q2VoAOu1DtZ7z41M2gQ05VMNYkFCAMxFU+j/HUMwCOlr/e3VhO+qww2SGJw4OxBw5nZQ7YV78+wK2RiB7ConzQ==", + "version": "4.0.0-rc2", + "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-4.0.0-rc2.tgz", + "integrity": "sha512-VMi9+Fl/Eu/XFFH3V86jcIgiKs/VqKStKvDxZbdEcgEwXgjV/d2MP76UEnanVIjnC3lxqXESzmzu1iAhnNtlzg==", "license": "MIT" }, "node_modules/ajv": { @@ -3868,6 +3868,22 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", @@ -6321,6 +6337,22 @@ "node": ">=0.10.3" } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/form-data": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", @@ -7263,6 +7295,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -7377,6 +7422,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8797,22 +8858,57 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", "dev": true, "license": "MIT", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" }, "engines": { "node": ">=0.12" } }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8856,6 +8952,16 @@ "vue": "^2.5.18" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -11061,6 +11167,28 @@ "dev": true, "license": "MIT" }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11118,6 +11246,21 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/uiv": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/uiv/-/uiv-1.4.3.tgz", @@ -12082,9 +12225,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz", - "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", "engines": { @@ -12161,6 +12304,28 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/resources/assets/v1/src/locales/ca.json b/resources/assets/v1/src/locales/ca.json index 5743119b09..2b79ef92b0 100644 --- a/resources/assets/v1/src/locales/ca.json +++ b/resources/assets/v1/src/locales/ca.json @@ -1,11 +1,11 @@ { "firefly": { - "administrations_page_title": "Financial administrations", - "administrations_index_menu": "Financial administrations", + "administrations_page_title": "Administracions financeres", + "administrations_index_menu": "Administracions financeres", "expires_at": "Expires at", - "temp_administrations_introduction": "Firefly III will soon get the ability to manage multiple financial administrations. Right now, you only have the one. You can set the title of this administration and its native currency. This replaces the previous setting where you would set your \"default currency\". This setting is now tied to the financial administration and can be different per administration.", + "temp_administrations_introduction": "Firefly III aviat podr\u00e0 gestionar diverses administracions financeres. Ara mateix, nom\u00e9s en teniu una. Podeu definir el t\u00edtol d'aquesta administraci\u00f3 i la seva moneda nativa. Aix\u00f2 substitueix la configuraci\u00f3 anterior on definiu la vostra \"moneda predeterminada\". Aquesta configuraci\u00f3 ara est\u00e0 vinculada a l'administraci\u00f3 financera i pot ser diferent per a cada administraci\u00f3.", "administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.", - "administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"", + "administrations_page_edit_sub_title_js": "Edita l'administraci\u00f3 financera \"{title}\"", "table": "Taula", "welcome_back": "Qu\u00e8 est\u00e0 passant?", "flash_error": "Error!", @@ -20,7 +20,7 @@ "split": "Dividir", "single_split": "Divisi\u00f3", "not_enough_currencies": "Not enough currencies", - "not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.", + "not_enough_currencies_enabled": "Si tens nom\u00e9s una divisa habilitada, no cal afegir tipus de canvi.", "transaction_stored_link": "La Transacci\u00f3 #{ID} (\"{title}\")<\/a> s'ha desat.", "webhook_stored_link": "S'ha desat el Webook #{ID} (\"{title}\")<\/a> correctament.", "webhook_updated_link": "S'ha actualitzat el Webook #{ID}<\/a> (\"{title}\").", @@ -31,7 +31,7 @@ "apply_rules_checkbox": "Aplicar regles", "fire_webhooks_checkbox": "Disparar webhooks", "no_budget_pointer": "Sembla que encara no tens cap pressupost. N'hauries de crear alguns a la p\u00e0gina de pressuposts<\/a>. Els pressupostos et poden ajudar a fer el seguiment de les teves despeses.", - "no_bill_pointer": "You seem to have no subscription yet. You should create some on the subscription<\/a>-page. Subscriptions can help you keep track of expenses.", + "no_bill_pointer": "Sembla que encara no tens cap subscripci\u00f3. N'hauries de crear alguns a la p\u00e0gina de subscripcions<\/a>. Les subscripcions et poden ajudar a fer el seguiment de les teves despeses.", "source_account": "Compte d'origen", "hidden_fields_preferences": "Pots habilitar m\u00e9s opcions de transacci\u00f3 a la configuraci\u00f3<\/a>.", "destination_account": "Compte de dest\u00ed", From 8f9c35fbe82078e7c43fb0bdd98d85f24feb020f Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 23 Jun 2025 20:45:00 +0200 Subject: [PATCH 03/18] Experimental fix for #10489 --- app/Http/Kernel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 7b6815dadd..139547582c 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -178,7 +178,7 @@ class Kernel extends HttpKernel 'api' => [ AcceptHeaders::class, EnsureFrontendRequestsAreStateful::class, - 'auth:api', + 'auth:api,sanctum', 'bindings', ], // do only bindings, no auth From ae126e83223c38fc95adfe7a35a190f0dc3057cc Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 24 Jun 2025 13:14:31 +0200 Subject: [PATCH 04/18] Fix #10493 --- app/Support/Navigation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index 0b336ed8bc..2549fbba95 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -582,7 +582,7 @@ class Navigation */ public function preferredEndOfPeriod(Carbon $start, Carbon $end): string { - if ((int) $start->diffInMonths($end, true) > 1) { + if ((int) $start->diffInMonths($end, true) > 1 && (int) $start->diffInMonths($end, true) <= 12) { return 'endOfMonth'; } From e0c76695eec604ff298320f04c4c05a4ed66b3ad Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 24 Jun 2025 13:25:03 +0200 Subject: [PATCH 05/18] Fix tests --- app/Support/Navigation.php | 4 ++-- tests/integration/Api/Autocomplete/AccountControllerTest.php | 2 +- tests/integration/Api/Autocomplete/BillControllerTest.php | 2 +- tests/integration/Api/Autocomplete/BudgetControllerTest.php | 2 +- tests/integration/Api/Autocomplete/CategoryControllerTest.php | 2 +- tests/integration/Api/Autocomplete/CurrencyControllerTest.php | 2 +- .../Api/Autocomplete/ObjectGroupControllerTest.php | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index 2549fbba95..7b607be819 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -599,7 +599,7 @@ class Navigation */ public function preferredRangeFormat(Carbon $start, Carbon $end): string { - if ((int) $start->diffInMonths($end, true) > 1) { + if ((int) $start->diffInMonths($end, true) > 1 && (int) $start->diffInMonths($end, true) <= 12) { return '1M'; } @@ -616,7 +616,7 @@ class Navigation */ public function preferredSqlFormat(Carbon $start, Carbon $end): string { - if ((int) $start->diffInMonths($end, true) > 1) { + if ((int) $start->diffInMonths($end, true) > 1 && (int) $start->diffInMonths($end, true) <= 12) { return '%Y-%m'; } diff --git a/tests/integration/Api/Autocomplete/AccountControllerTest.php b/tests/integration/Api/Autocomplete/AccountControllerTest.php index 22cbe5a117..eb4b56ce37 100644 --- a/tests/integration/Api/Autocomplete/AccountControllerTest.php +++ b/tests/integration/Api/Autocomplete/AccountControllerTest.php @@ -44,6 +44,6 @@ final class AccountControllerTest extends TestCase $response = $this->get(route('api.v1.autocomplete.accounts'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); - $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); } } diff --git a/tests/integration/Api/Autocomplete/BillControllerTest.php b/tests/integration/Api/Autocomplete/BillControllerTest.php index f94daa714a..7dc6b950b7 100644 --- a/tests/integration/Api/Autocomplete/BillControllerTest.php +++ b/tests/integration/Api/Autocomplete/BillControllerTest.php @@ -84,7 +84,7 @@ final class BillControllerTest extends TestCase $response = $this->get(route('api.v1.autocomplete.bills'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); - $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); } public function testGivenAuthenticatedRequestWhenCallingTheBillsEndpointThenReturns200HttpCode(): void diff --git a/tests/integration/Api/Autocomplete/BudgetControllerTest.php b/tests/integration/Api/Autocomplete/BudgetControllerTest.php index 8e27714807..e137f5d262 100644 --- a/tests/integration/Api/Autocomplete/BudgetControllerTest.php +++ b/tests/integration/Api/Autocomplete/BudgetControllerTest.php @@ -78,7 +78,7 @@ final class BudgetControllerTest extends TestCase $response = $this->get(route('api.v1.autocomplete.budgets'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); - $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); } public function testGivenAuthenticatedRequestWhenCallingTheBudgetsEndpointThenReturns200HttpCode(): void diff --git a/tests/integration/Api/Autocomplete/CategoryControllerTest.php b/tests/integration/Api/Autocomplete/CategoryControllerTest.php index 492b103669..9456cf4001 100644 --- a/tests/integration/Api/Autocomplete/CategoryControllerTest.php +++ b/tests/integration/Api/Autocomplete/CategoryControllerTest.php @@ -77,7 +77,7 @@ final class CategoryControllerTest extends TestCase $response = $this->get(route('api.v1.autocomplete.categories'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); - $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); } public function testGivenAuthenticatedRequestWhenCallingTheCategoriesEndpointThenReturns200HttpCode(): void diff --git a/tests/integration/Api/Autocomplete/CurrencyControllerTest.php b/tests/integration/Api/Autocomplete/CurrencyControllerTest.php index 80f92f7079..efdd02a866 100644 --- a/tests/integration/Api/Autocomplete/CurrencyControllerTest.php +++ b/tests/integration/Api/Autocomplete/CurrencyControllerTest.php @@ -80,7 +80,7 @@ final class CurrencyControllerTest extends TestCase $response = $this->get(route('api.v1.autocomplete.currencies'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); - $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); } public function testGivenAuthenticatedRequestWhenCallingTheCurrenciesEndpointThenReturns200HttpCode(): void diff --git a/tests/integration/Api/Autocomplete/ObjectGroupControllerTest.php b/tests/integration/Api/Autocomplete/ObjectGroupControllerTest.php index 051492f6bc..e6a089b7ec 100644 --- a/tests/integration/Api/Autocomplete/ObjectGroupControllerTest.php +++ b/tests/integration/Api/Autocomplete/ObjectGroupControllerTest.php @@ -78,7 +78,7 @@ final class ObjectGroupControllerTest extends TestCase $response = $this->get(route('api.v1.autocomplete.object-groups'), ['Accept' => 'application/json']); $response->assertStatus(401); $response->assertHeader('Content-Type', 'application/json'); - $response->assertContent('{"message":"Unauthenticated","exception":"AuthenticationException"}'); + $response->assertContent('{"message":"Unauthenticated.","exception":"AuthenticationException"}'); } public function testGivenAuthenticatedRequestWhenCallingTheObjectGroupsEndpointThenReturns200HttpCode(): void From ff222795cf0eb615dbe865f90614b5393be56ea9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 25 Jun 2025 19:43:03 +0200 Subject: [PATCH 06/18] Add date to compare hash. --- .../TransactionGroup/TransactionGroupRepository.php | 1 + app/Support/Cronjobs/AutoBudgetCronjob.php | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepository.php b/app/Repositories/TransactionGroup/TransactionGroupRepository.php index fe56ce3ac3..6e4b1a69b5 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepository.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepository.php @@ -440,6 +440,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface, /** @var TransactionJournal $journal */ foreach ($group->transactionJournals as $journal) { + $names = sprintf('%s%s', $names, $journal->date->format('Y-m-d-H:i:s')); /** @var Transaction $transaction */ foreach ($journal->transactions as $transaction) { if (-1 === bccomp('0', (string)$transaction->amount)) { diff --git a/app/Support/Cronjobs/AutoBudgetCronjob.php b/app/Support/Cronjobs/AutoBudgetCronjob.php index 3d88f51fd2..148f8a3e27 100644 --- a/app/Support/Cronjobs/AutoBudgetCronjob.php +++ b/app/Support/Cronjobs/AutoBudgetCronjob.php @@ -27,6 +27,7 @@ namespace FireflyIII\Support\Cronjobs; use Carbon\Carbon; use FireflyIII\Jobs\CreateAutoBudgetLimits; use FireflyIII\Models\Configuration; +use FireflyIII\Support\Facades\FireflyConfig; /** * Class AutoBudgetCronjob @@ -36,7 +37,7 @@ class AutoBudgetCronjob extends AbstractCronjob public function fire(): void { /** @var Configuration $config */ - $config = app('fireflyconfig')->get('last_ab_job', 0); + $config = FireflyConfig::get('last_ab_job', 0); $lastTime = (int) $config->data; $diff = Carbon::now()->getTimestamp() - $lastTime; $diffForHumans = today(config('app.timezone'))->diffForHumans(Carbon::createFromTimestamp($lastTime), null, true); @@ -78,7 +79,7 @@ class AutoBudgetCronjob extends AbstractCronjob $this->jobSucceeded = true; $this->message = 'Auto-budget cron job fired successfully.'; - app('fireflyconfig')->set('last_ab_job', (int) $this->date->format('U')); + FireflyConfig::set('last_ab_job', (int) $this->date->format('U')); app('log')->info('Done with auto budget cron job task.'); } } From 0c4ee9f043703bc3f0114703e06db7c36c8c2d9a Mon Sep 17 00:00:00 2001 From: JC5 Date: Wed, 25 Jun 2025 19:47:23 +0200 Subject: [PATCH 07/18] =?UTF-8?q?=F0=9F=A4=96=20Auto=20commit=20for=20rele?= =?UTF-8?q?ase=20'develop'=20on=202025-06-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TransactionGroupRepository.php | 1 + composer.lock | 71 ++++++++++--------- config/firefly.php | 2 +- package-lock.json | 34 ++++----- 4 files changed, 55 insertions(+), 53 deletions(-) diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepository.php b/app/Repositories/TransactionGroup/TransactionGroupRepository.php index 6e4b1a69b5..97e4c6ef09 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepository.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepository.php @@ -441,6 +441,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface, /** @var TransactionJournal $journal */ foreach ($group->transactionJournals as $journal) { $names = sprintf('%s%s', $names, $journal->date->format('Y-m-d-H:i:s')); + /** @var Transaction $transaction */ foreach ($journal->transactions as $transaction) { if (-1 === bccomp('0', (string)$transaction->amount)) { diff --git a/composer.lock b/composer.lock index 1898f26627..2e239e12f6 100644 --- a/composer.lock +++ b/composer.lock @@ -2808,16 +2808,16 @@ }, { "name": "league/csv", - "version": "9.23.0", + "version": "9.24.1", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "774008ad8a634448e4f8e288905e070e8b317ff3" + "reference": "e0221a3f16aa2a823047d59fab5809d552e29bc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/774008ad8a634448e4f8e288905e070e8b317ff3", - "reference": "774008ad8a634448e4f8e288905e070e8b317ff3", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/e0221a3f16aa2a823047d59fab5809d552e29bc8", + "reference": "e0221a3f16aa2a823047d59fab5809d552e29bc8", "shasum": "" }, "require": { @@ -2827,14 +2827,14 @@ "require-dev": { "ext-dom": "*", "ext-xdebug": "*", - "friendsofphp/php-cs-fixer": "^3.69.0", - "phpbench/phpbench": "^1.4.0", - "phpstan/phpstan": "^1.12.18", + "friendsofphp/php-cs-fixer": "^3.75.0", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^1.12.27", "phpstan/phpstan-deprecation-rules": "^1.2.1", "phpstan/phpstan-phpunit": "^1.4.2", "phpstan/phpstan-strict-rules": "^1.6.2", - "phpunit/phpunit": "^10.5.16 || ^11.5.7", - "symfony/var-dumper": "^6.4.8 || ^7.2.3" + "phpunit/phpunit": "^10.5.16 || ^11.5.22", + "symfony/var-dumper": "^6.4.8 || ^7.3.0" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -2895,7 +2895,7 @@ "type": "github" } ], - "time": "2025-03-28T06:52:04+00:00" + "time": "2025-06-25T14:53:51+00:00" }, { "name": "league/event", @@ -2953,16 +2953,16 @@ }, { "name": "league/flysystem", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { @@ -2986,13 +2986,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", + "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -3030,22 +3030,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "time": "2024-10-08T08:58:34+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-local", - "version": "3.29.0", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", "shasum": "" }, "require": { @@ -3079,9 +3079,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/fractal", @@ -3964,16 +3964,16 @@ }, { "name": "nunomaduro/collision", - "version": "v8.8.1", + "version": "v8.8.2", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "44ccb82e3e21efb5446748d2a3c81a030ac22bd5" + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/44ccb82e3e21efb5446748d2a3c81a030ac22bd5", - "reference": "44ccb82e3e21efb5446748d2a3c81a030ac22bd5", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", "shasum": "" }, "require": { @@ -4059,7 +4059,7 @@ "type": "patreon" } ], - "time": "2025-06-11T01:04:21+00:00" + "time": "2025-06-25T02:12:12+00:00" }, { "name": "nunomaduro/termwind", @@ -11655,16 +11655,16 @@ }, { "name": "rector/rector", - "version": "2.0.18", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "be3a452085b524a04056e3dfe72d861948711062" + "reference": "d513dea45a94394b660e15c155d1fa27826f8e30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/be3a452085b524a04056e3dfe72d861948711062", - "reference": "be3a452085b524a04056e3dfe72d861948711062", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/d513dea45a94394b660e15c155d1fa27826f8e30", + "reference": "d513dea45a94394b660e15c155d1fa27826f8e30", "shasum": "" }, "require": { @@ -11694,6 +11694,7 @@ "MIT" ], "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "homepage": "https://getrector.com/", "keywords": [ "automation", "dev", @@ -11702,7 +11703,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.0.18" + "source": "https://github.com/rectorphp/rector/tree/2.1.0" }, "funding": [ { @@ -11710,7 +11711,7 @@ "type": "github" } ], - "time": "2025-06-11T11:19:37+00:00" + "time": "2025-06-24T20:26:57+00:00" }, { "name": "sebastian/cli-parser", diff --git a/config/firefly.php b/config/firefly.php index 1dc2ee5a51..501335d1f8 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -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-23', + 'version' => 'develop/2025-06-25', 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 25, diff --git a/package-lock.json b/package-lock.json index d58195c445..f9d1a90e3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3108,9 +3108,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "version": "24.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz", + "integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==", "dev": true, "license": "MIT", "dependencies": { @@ -4273,9 +4273,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -4293,8 +4293,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -4433,9 +4433,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001724", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true, "funding": [ { @@ -5648,9 +5648,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.171", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", - "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "version": "1.5.174", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.174.tgz", + "integrity": "sha512-HE43yYdUUiJVjewV2A9EP8o89Kb4AqMKplMQP2IxEPUws1Etu/ZkdsgUDabUZ/WmbP4ZbvJDOcunvbBUPPIfmw==", "dev": true, "license": "ISC" }, @@ -5705,9 +5705,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, "license": "MIT", "dependencies": { From 34bcfcfe9b42962b3cf047336d02fddaee2a9d89 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 25 Jun 2025 21:35:52 +0200 Subject: [PATCH 08/18] Fix #10499 --- app/Support/Http/Controllers/RequestInformation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Support/Http/Controllers/RequestInformation.php b/app/Support/Http/Controllers/RequestInformation.php index dd6badda30..6c7731b68f 100644 --- a/app/Support/Http/Controllers/RequestInformation.php +++ b/app/Support/Http/Controllers/RequestInformation.php @@ -34,7 +34,7 @@ use Illuminate\Contracts\Validation\Validator as ValidatorContract; use Illuminate\Routing\Route; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Route as RouteFacade; -use Hash; +use Illuminate\Support\Facades\Hash; use function Safe\parse_url; From 4607466fb6b95795de2fb5717e031070207843a9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 26 Jun 2025 06:36:15 +0200 Subject: [PATCH 09/18] Remove some debug logging. --- app/Support/Steam.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Support/Steam.php b/app/Support/Steam.php index 40f51114cb..d3254f7bbb 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -342,7 +342,7 @@ class Steam return $cache->get(); } - Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); + //Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); if (null === $convertToNative) { $convertToNative = Amount::convertToNative($account->user); } @@ -401,7 +401,7 @@ class Steam // Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['balance'])); } $final = array_merge($return, $others); - Log::debug('Final balance is', $final); + //Log::debug('Final balance is', $final); $cache->store($final); return $final; From 5706666bb6233aae8c61827629d6f10810fae478 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 26 Jun 2025 06:40:00 +0200 Subject: [PATCH 10/18] Fewer loops. --- .../Http/Controllers/PeriodOverview.php | 48 ++++++++++++------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php index 1fae6214dd..5218dc8e38 100644 --- a/app/Support/Http/Controllers/PeriodOverview.php +++ b/app/Support/Http/Controllers/PeriodOverview.php @@ -70,7 +70,7 @@ trait PeriodOverview protected JournalRepositoryInterface $journalRepos; /** - * This method returns "period entries", so nov-2015, dec-2015, etc etc (this depends on the users session range) + * This method returns "period entries", so nov-2015, dec-2015, etc. (this depends on the users session range) * and for each period, the amount of money spent and earned. This is a complex operation which is cached for * performance reasons. * @@ -97,18 +97,26 @@ trait PeriodOverview /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); $entries = []; + $spent= []; + $earned = []; + $transferredAway = []; + $transferredIn = []; // run a custom query because doing this with the collector is MEGA slow. $transactions = $this->accountRepository->periodCollection($account, $start, $end); // loop dates Log::debug(sprintf('Count of loops: %d', count($dates))); + $loops = 0; + // stop after 10 loops for memory reasons. foreach ($dates as $currentDate) { $title = app('navigation')->periodShow($currentDate['start'], $currentDate['period']); - [$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']); - [$transactions, $earned] = $this->filterTransactionsByType(TransactionTypeEnum::DEPOSIT, $transactions, $currentDate['start'], $currentDate['end']); - [$transactions, $transferredAway] = $this->filterTransfers('away', $transactions, $currentDate['start'], $currentDate['end']); - [$transactions, $transferredIn] = $this->filterTransfers('in', $transactions, $currentDate['start'], $currentDate['end']); + if($loops < 10) { + [$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']); + [$transactions, $earned] = $this->filterTransactionsByType(TransactionTypeEnum::DEPOSIT, $transactions, $currentDate['start'], $currentDate['end']); + [$transactions, $transferredAway] = $this->filterTransfers('away', $transactions, $currentDate['start'], $currentDate['end']); + [$transactions, $transferredIn] = $this->filterTransfers('in', $transactions, $currentDate['start'], $currentDate['end']); + } $entries[] = [ 'title' => $title, @@ -119,6 +127,7 @@ trait PeriodOverview 'transferred_away' => $this->groupByCurrency($transferredAway), 'transferred_in' => $this->groupByCurrency($transferredIn), ]; + $loops++; } $cache->store($entries); Timer::stop('account-period-total'); @@ -548,27 +557,29 @@ trait PeriodOverview /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); $entries = []; - + $spent = []; + $earned = []; + $transferred = []; // collect all journals in this period (regardless of type) $collector = app(GroupCollectorInterface::class); $collector->setTypes($types)->setRange($start, $end); $genericSet = $collector->getExtractedJournals(); + $loops = 0; foreach ($dates as $currentDate) { - $spent = []; - $earned = []; - $transferred = []; $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); - // set to correct array - if ('expenses' === $transactionType || 'withdrawal' === $transactionType) { - $spent = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); - } - if ('revenue' === $transactionType || 'deposit' === $transactionType) { - $earned = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); - } - if ('transfer' === $transactionType || 'transfers' === $transactionType) { - $transferred = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); + if($loops < 10) { + // set to correct array + if ('expenses' === $transactionType || 'withdrawal' === $transactionType) { + $spent = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); + } + if ('revenue' === $transactionType || 'deposit' === $transactionType) { + $earned = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); + } + if ('transfer' === $transactionType || 'transfers' === $transactionType) { + $transferred = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); + } } $entries[] = [ @@ -579,6 +590,7 @@ trait PeriodOverview 'earned' => $this->groupByCurrency($earned), 'transferred' => $this->groupByCurrency($transferred), ]; + $loops++; } return $entries; From 7283c616a0a2061ae4dd645e524fde2b6c054ef0 Mon Sep 17 00:00:00 2001 From: JC5 Date: Thu, 26 Jun 2025 06:43:37 +0200 Subject: [PATCH 11/18] =?UTF-8?q?=F0=9F=A4=96=20Auto=20commit=20for=20rele?= =?UTF-8?q?ase=20'develop'=20on=202025-06-26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/PeriodOverview.php | 32 ++-- app/Support/Steam.php | 4 +- composer.lock | 13 +- config/firefly.php | 2 +- package-lock.json | 172 +++++++++--------- 5 files changed, 111 insertions(+), 112 deletions(-) diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php index 5218dc8e38..cd6b07967a 100644 --- a/app/Support/Http/Controllers/PeriodOverview.php +++ b/app/Support/Http/Controllers/PeriodOverview.php @@ -97,25 +97,25 @@ trait PeriodOverview /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); $entries = []; - $spent= []; - $earned = []; - $transferredAway = []; - $transferredIn = []; + $spent = []; + $earned = []; + $transferredAway = []; + $transferredIn = []; // run a custom query because doing this with the collector is MEGA slow. $transactions = $this->accountRepository->periodCollection($account, $start, $end); // loop dates Log::debug(sprintf('Count of loops: %d', count($dates))); - $loops = 0; + $loops = 0; // stop after 10 loops for memory reasons. foreach ($dates as $currentDate) { $title = app('navigation')->periodShow($currentDate['start'], $currentDate['period']); - if($loops < 10) { - [$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']); - [$transactions, $earned] = $this->filterTransactionsByType(TransactionTypeEnum::DEPOSIT, $transactions, $currentDate['start'], $currentDate['end']); + if ($loops < 10) { + [$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']); + [$transactions, $earned] = $this->filterTransactionsByType(TransactionTypeEnum::DEPOSIT, $transactions, $currentDate['start'], $currentDate['end']); [$transactions, $transferredAway] = $this->filterTransfers('away', $transactions, $currentDate['start'], $currentDate['end']); - [$transactions, $transferredIn] = $this->filterTransfers('in', $transactions, $currentDate['start'], $currentDate['end']); + [$transactions, $transferredIn] = $this->filterTransfers('in', $transactions, $currentDate['start'], $currentDate['end']); } $entries[] = [ @@ -127,7 +127,7 @@ trait PeriodOverview 'transferred_away' => $this->groupByCurrency($transferredAway), 'transferred_in' => $this->groupByCurrency($transferredIn), ]; - $loops++; + ++$loops; } $cache->store($entries); Timer::stop('account-period-total'); @@ -557,19 +557,19 @@ trait PeriodOverview /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); $entries = []; - $spent = []; - $earned = []; - $transferred = []; + $spent = []; + $earned = []; + $transferred = []; // collect all journals in this period (regardless of type) $collector = app(GroupCollectorInterface::class); $collector->setTypes($types)->setRange($start, $end); $genericSet = $collector->getExtractedJournals(); - $loops = 0; + $loops = 0; foreach ($dates as $currentDate) { $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); - if($loops < 10) { + if ($loops < 10) { // set to correct array if ('expenses' === $transactionType || 'withdrawal' === $transactionType) { $spent = $this->filterJournalsByDate($genericSet, $currentDate['start'], $currentDate['end']); @@ -590,7 +590,7 @@ trait PeriodOverview 'earned' => $this->groupByCurrency($earned), 'transferred' => $this->groupByCurrency($transferred), ]; - $loops++; + ++$loops; } return $entries; diff --git a/app/Support/Steam.php b/app/Support/Steam.php index d3254f7bbb..aa025fbe5d 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -342,7 +342,7 @@ class Steam return $cache->get(); } - //Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); + // Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); if (null === $convertToNative) { $convertToNative = Amount::convertToNative($account->user); } @@ -401,7 +401,7 @@ class Steam // Log::debug(sprintf('Virtual balance makes the (native) total %s', $return['balance'])); } $final = array_merge($return, $others); - //Log::debug('Final balance is', $final); + // Log::debug('Final balance is', $final); $cache->store($final); return $final; diff --git a/composer.lock b/composer.lock index 2e239e12f6..aa66c58d68 100644 --- a/composer.lock +++ b/composer.lock @@ -5745,21 +5745,20 @@ }, { "name": "ramsey/uuid", - "version": "4.8.1", + "version": "4.9.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28" + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28", - "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", - "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -5818,9 +5817,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.8.1" + "source": "https://github.com/ramsey/uuid/tree/4.9.0" }, - "time": "2025-06-01T06:28:46+00:00" + "time": "2025-06-25T14:20:11+00:00" }, { "name": "rcrowe/twigbridge", diff --git a/config/firefly.php b/config/firefly.php index 501335d1f8..3c2562f971 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -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-25', + 'version' => 'develop/2025-06-26', 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 25, diff --git a/package-lock.json b/package-lock.json index f9d1a90e3a..805958c1eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2552,9 +2552,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", - "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", "cpu": [ "arm" ], @@ -2566,9 +2566,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", - "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", "cpu": [ "arm64" ], @@ -2580,9 +2580,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", - "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", "cpu": [ "arm64" ], @@ -2594,9 +2594,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", - "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", "cpu": [ "x64" ], @@ -2608,9 +2608,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", - "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", "cpu": [ "arm64" ], @@ -2622,9 +2622,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", - "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", "cpu": [ "x64" ], @@ -2636,9 +2636,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", - "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", "cpu": [ "arm" ], @@ -2650,9 +2650,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", - "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", "cpu": [ "arm" ], @@ -2664,9 +2664,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", - "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", "cpu": [ "arm64" ], @@ -2678,9 +2678,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", - "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", "cpu": [ "arm64" ], @@ -2692,9 +2692,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", - "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", "cpu": [ "loong64" ], @@ -2706,9 +2706,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", - "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", "cpu": [ "ppc64" ], @@ -2720,9 +2720,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", - "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", "cpu": [ "riscv64" ], @@ -2734,9 +2734,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", - "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", "cpu": [ "riscv64" ], @@ -2748,9 +2748,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", - "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", "cpu": [ "s390x" ], @@ -2762,9 +2762,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", - "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", "cpu": [ "x64" ], @@ -2776,9 +2776,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", - "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", "cpu": [ "x64" ], @@ -2790,9 +2790,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", - "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", "cpu": [ "arm64" ], @@ -2804,9 +2804,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", - "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", "cpu": [ "ia32" ], @@ -2818,9 +2818,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", - "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -5648,9 +5648,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.174", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.174.tgz", - "integrity": "sha512-HE43yYdUUiJVjewV2A9EP8o89Kb4AqMKplMQP2IxEPUws1Etu/ZkdsgUDabUZ/WmbP4ZbvJDOcunvbBUPPIfmw==", + "version": "1.5.175", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.175.tgz", + "integrity": "sha512-Nqpef9mOVo7pZfl9NIUhj7tgtRTsMzCzRTJDP1ccim4Wb4YHOz3Le87uxeZq68OCNwau2iQ/X7UwdAZ3ReOkmg==", "dev": true, "license": "ISC" }, @@ -10080,9 +10080,9 @@ } }, "node_modules/rollup": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", - "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "dev": true, "license": "MIT", "dependencies": { @@ -10096,26 +10096,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.0", - "@rollup/rollup-android-arm64": "4.44.0", - "@rollup/rollup-darwin-arm64": "4.44.0", - "@rollup/rollup-darwin-x64": "4.44.0", - "@rollup/rollup-freebsd-arm64": "4.44.0", - "@rollup/rollup-freebsd-x64": "4.44.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", - "@rollup/rollup-linux-arm-musleabihf": "4.44.0", - "@rollup/rollup-linux-arm64-gnu": "4.44.0", - "@rollup/rollup-linux-arm64-musl": "4.44.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", - "@rollup/rollup-linux-riscv64-gnu": "4.44.0", - "@rollup/rollup-linux-riscv64-musl": "4.44.0", - "@rollup/rollup-linux-s390x-gnu": "4.44.0", - "@rollup/rollup-linux-x64-gnu": "4.44.0", - "@rollup/rollup-linux-x64-musl": "4.44.0", - "@rollup/rollup-win32-arm64-msvc": "4.44.0", - "@rollup/rollup-win32-ia32-msvc": "4.44.0", - "@rollup/rollup-win32-x64-msvc": "4.44.0", + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" } }, From ae5912ab52ec5d5ead9f8d44bd7c8496be68cd80 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 26 Jun 2025 11:45:31 +0200 Subject: [PATCH 12/18] Remove some logs. --- .ci/php-cs-fixer/.php-cs-fixer.php | 24 ++++++++++--------- app/Helpers/Report/NetWorth.php | 6 ++--- .../Summarizer/TransactionSummarizer.php | 8 +++---- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.ci/php-cs-fixer/.php-cs-fixer.php b/.ci/php-cs-fixer/.php-cs-fixer.php index 51e31775a7..14e3802470 100644 --- a/.ci/php-cs-fixer/.php-cs-fixer.php +++ b/.ci/php-cs-fixer/.php-cs-fixer.php @@ -19,26 +19,24 @@ * along with this program. If not, see . */ -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,14 @@ 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 + 'php_unit_test_case_static_method_calls' => [ + 'call_type' => 'this', + ], 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'default' => 'at_least_single_space', @@ -76,5 +76,7 @@ return $config->setRules( '??=' => 'align_single_space_minimal_by_scope', ], ], - ]) + ] + +) ->setFinder($finder); diff --git a/app/Helpers/Report/NetWorth.php b/app/Helpers/Report/NetWorth.php index f917fad788..675bcea2d5 100644 --- a/app/Helpers/Report/NetWorth.php +++ b/app/Helpers/Report/NetWorth.php @@ -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', diff --git a/app/Support/Report/Summarizer/TransactionSummarizer.php b/app/Support/Report/Summarizer/TransactionSummarizer.php index 25196bb19a..02d54b5659 100644 --- a/app/Support/Report/Summarizer/TransactionSummarizer.php +++ b/app/Support/Report/Summarizer/TransactionSummarizer.php @@ -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) { From 108727889078fbddc62e2bf64327dd4da3f103a1 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 26 Jun 2025 11:57:15 +0200 Subject: [PATCH 13/18] Make sure phpcs and rector agree on styles. --- .ci/php-cs-fixer/.php-cs-fixer.php | 1 + .ci/phpcs.sh | 3 ++- .ci/rector.php | 2 ++ app/Helpers/Report/NetWorth.php | 6 +++--- app/Support/Report/Summarizer/TransactionSummarizer.php | 8 ++++---- config/search.php | 4 +--- .../integration/Support/Models/BillDateCalculatorTest.php | 2 +- .../Support/NavigationCustomEndOfPeriodTest.php | 2 +- tests/unit/Support/Calendar/CalculatorTest.php | 4 ++-- .../Support/Calendar/Periodicity/IntervalTestCase.php | 2 +- tests/unit/Support/NavigationAddPeriodTest.php | 8 ++++---- tests/unit/Support/NavigationEndOfPeriodTest.php | 4 ++-- .../NavigationPreferredCarbonFormatByPeriodTest.php | 2 +- .../unit/Support/NavigationPreferredCarbonFormatTest.php | 2 +- tests/unit/Support/NavigationPreferredEndOfPeriodTest.php | 2 +- tests/unit/Support/NavigationPreferredRangeFormatTest.php | 2 +- tests/unit/Support/NavigationPreferredSqlFormatTest.php | 2 +- tests/unit/Support/NavigationStartOfPeriodTest.php | 4 ++-- .../AbstractQueryParserInterfaceParseQueryTester.php | 2 +- 19 files changed, 32 insertions(+), 30 deletions(-) diff --git a/.ci/php-cs-fixer/.php-cs-fixer.php b/.ci/php-cs-fixer/.php-cs-fixer.php index 14e3802470..2117f674a1 100644 --- a/.ci/php-cs-fixer/.php-cs-fixer.php +++ b/.ci/php-cs-fixer/.php-cs-fixer.php @@ -64,6 +64,7 @@ return $config->setRules( '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', ], diff --git a/.ci/phpcs.sh b/.ci/phpcs.sh index 3d6dc02c62..607e40de90 100755 --- a/.ci/phpcs.sh +++ b/.ci/phpcs.sh @@ -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=$? diff --git a/.ci/rector.php b/.ci/rector.php index 1a6971352b..79d475e59a 100644 --- a/.ci/rector.php +++ b/.ci/rector.php @@ -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', ], diff --git a/app/Helpers/Report/NetWorth.php b/app/Helpers/Report/NetWorth.php index 675bcea2d5..2fca6d115a 100644 --- a/app/Helpers/Report/NetWorth.php +++ b/app/Helpers/Report/NetWorth.php @@ -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', diff --git a/app/Support/Report/Summarizer/TransactionSummarizer.php b/app/Support/Report/Summarizer/TransactionSummarizer.php index 02d54b5659..59a0f1e223 100644 --- a/app/Support/Report/Summarizer/TransactionSummarizer.php +++ b/app/Support/Report/Summarizer/TransactionSummarizer.php @@ -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) { diff --git a/config/search.php b/config/search.php index ea7a39cdcb..6e8f80abb6 100644 --- a/config/search.php +++ b/config/search.php @@ -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'), ]; diff --git a/tests/integration/Support/Models/BillDateCalculatorTest.php b/tests/integration/Support/Models/BillDateCalculatorTest.php index 1164fce606..d8206c714a 100644 --- a/tests/integration/Support/Models/BillDateCalculatorTest.php +++ b/tests/integration/Support/Models/BillDateCalculatorTest.php @@ -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 diff --git a/tests/integration/Support/NavigationCustomEndOfPeriodTest.php b/tests/integration/Support/NavigationCustomEndOfPeriodTest.php index 18a4166646..16102bc7fc 100644 --- a/tests/integration/Support/NavigationCustomEndOfPeriodTest.php +++ b/tests/integration/Support/NavigationCustomEndOfPeriodTest.php @@ -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()); } } diff --git a/tests/unit/Support/Calendar/CalculatorTest.php b/tests/unit/Support/Calendar/CalculatorTest.php index ec2be998c9..d6d9677361 100644 --- a/tests/unit/Support/Calendar/CalculatorTest.php +++ b/tests/unit/Support/Calendar/CalculatorTest.php @@ -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 diff --git a/tests/unit/Support/Calendar/Periodicity/IntervalTestCase.php b/tests/unit/Support/Calendar/Periodicity/IntervalTestCase.php index 7a67095366..0654ab3247 100644 --- a/tests/unit/Support/Calendar/Periodicity/IntervalTestCase.php +++ b/tests/unit/Support/Calendar/Periodicity/IntervalTestCase.php @@ -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 diff --git a/tests/unit/Support/NavigationAddPeriodTest.php b/tests/unit/Support/NavigationAddPeriodTest.php index e492584c50..1c13a557b4 100644 --- a/tests/unit/Support/NavigationAddPeriodTest.php +++ b/tests/unit/Support/NavigationAddPeriodTest.php @@ -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 diff --git a/tests/unit/Support/NavigationEndOfPeriodTest.php b/tests/unit/Support/NavigationEndOfPeriodTest.php index f76bb84be9..4e8ccea578 100644 --- a/tests/unit/Support/NavigationEndOfPeriodTest.php +++ b/tests/unit/Support/NavigationEndOfPeriodTest.php @@ -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]); diff --git a/tests/unit/Support/NavigationPreferredCarbonFormatByPeriodTest.php b/tests/unit/Support/NavigationPreferredCarbonFormatByPeriodTest.php index 6f25d44beb..76a8dc54ba 100644 --- a/tests/unit/Support/NavigationPreferredCarbonFormatByPeriodTest.php +++ b/tests/unit/Support/NavigationPreferredCarbonFormatByPeriodTest.php @@ -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 diff --git a/tests/unit/Support/NavigationPreferredCarbonFormatTest.php b/tests/unit/Support/NavigationPreferredCarbonFormatTest.php index 01f06aad2b..3584a98c2a 100644 --- a/tests/unit/Support/NavigationPreferredCarbonFormatTest.php +++ b/tests/unit/Support/NavigationPreferredCarbonFormatTest.php @@ -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 diff --git a/tests/unit/Support/NavigationPreferredEndOfPeriodTest.php b/tests/unit/Support/NavigationPreferredEndOfPeriodTest.php index 95bf81b575..4d0f22e3e7 100644 --- a/tests/unit/Support/NavigationPreferredEndOfPeriodTest.php +++ b/tests/unit/Support/NavigationPreferredEndOfPeriodTest.php @@ -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 diff --git a/tests/unit/Support/NavigationPreferredRangeFormatTest.php b/tests/unit/Support/NavigationPreferredRangeFormatTest.php index 6c0eff7d07..7218e59db2 100644 --- a/tests/unit/Support/NavigationPreferredRangeFormatTest.php +++ b/tests/unit/Support/NavigationPreferredRangeFormatTest.php @@ -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 diff --git a/tests/unit/Support/NavigationPreferredSqlFormatTest.php b/tests/unit/Support/NavigationPreferredSqlFormatTest.php index fa44b76178..4a8fa37420 100644 --- a/tests/unit/Support/NavigationPreferredSqlFormatTest.php +++ b/tests/unit/Support/NavigationPreferredSqlFormatTest.php @@ -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 diff --git a/tests/unit/Support/NavigationStartOfPeriodTest.php b/tests/unit/Support/NavigationStartOfPeriodTest.php index ffe2514683..288aa7ecc4 100644 --- a/tests/unit/Support/NavigationStartOfPeriodTest.php +++ b/tests/unit/Support/NavigationStartOfPeriodTest.php @@ -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 diff --git a/tests/unit/Support/Search/QueryParser/AbstractQueryParserInterfaceParseQueryTester.php b/tests/unit/Support/Search/QueryParser/AbstractQueryParserInterfaceParseQueryTester.php index 311e745586..33946565c4 100644 --- a/tests/unit/Support/Search/QueryParser/AbstractQueryParserInterfaceParseQueryTester.php +++ b/tests/unit/Support/Search/QueryParser/AbstractQueryParserInterfaceParseQueryTester.php @@ -26,7 +26,7 @@ abstract class AbstractQueryParserInterfaceParseQueryTester extends TestCase { $actual = $this->createParser()->parse($query); - self::assertObjectEquals($expected, $actual); + $this->assertObjectEquals($expected, $actual); } From a8d43d717488548267632f0c81e397a74e0c489b Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 26 Jun 2025 17:32:06 +0200 Subject: [PATCH 14/18] Add donation text. --- .github/workflows/release.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf25b6bc84..494617402d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 From c84c8e1aef9802d6d65f2dbc5917064aec0b539d Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 27 Jun 2025 11:10:41 +0200 Subject: [PATCH 15/18] Fix #10507 --- app/Helpers/Collector/GroupCollector.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Helpers/Collector/GroupCollector.php b/app/Helpers/Collector/GroupCollector.php index ce96edf102..4089a5e1bc 100644 --- a/app/Helpers/Collector/GroupCollector.php +++ b/app/Helpers/Collector/GroupCollector.php @@ -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') From 49c68af07b0bcba31d05d340f212523edf132001 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 27 Jun 2025 20:59:47 +0200 Subject: [PATCH 16/18] Fix #10510 --- app/Support/Http/Controllers/AugumentData.php | 2 +- resources/lang/en_US/firefly.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Support/Http/Controllers/AugumentData.php b/app/Support/Http/Controllers/AugumentData.php index 487446d6d1..60dda59c3b 100644 --- a/app/Support/Http/Controllers/AugumentData.php +++ b/app/Support/Http/Controllers/AugumentData.php @@ -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) { diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 44ef268444..5c75d64b44 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -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', From 53d5bedd8507cad9ddff3e18ff4e6e3ed1031f12 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 28 Jun 2025 08:48:53 +0200 Subject: [PATCH 17/18] Update changelog and config. --- changelog.md | 20 ++++++++++++++++++++ config/notifications.php | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index c44e0520b3..b021df2340 100644 --- a/changelog.md +++ b/changelog.md @@ -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. +- #10489 +- #10493 +- #10499 +- #10507 +- #10510 + ## 6.2.18 - 2025-06-20 ### Changed diff --git a/config/notifications.php b/config/notifications.php index 164e6e339f..21b7b5603c 100644 --- a/config/notifications.php +++ b/config/notifications.php @@ -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], From 5e9d942069a9b9b5d92e42ed3b60de42c85a75d9 Mon Sep 17 00:00:00 2001 From: JC5 Date: Sat, 28 Jun 2025 08:53:26 +0200 Subject: [PATCH 18/18] =?UTF-8?q?=F0=9F=A4=96=20Auto=20commit=20for=20rele?= =?UTF-8?q?ase=20'v6.2.19'=20on=202025-06-28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 10 +- composer.lock | 12 +- config/firefly.php | 2 +- package-lock.json | 130 +++++++++++---------- resources/assets/v1/src/locales/zh-cn.json | 2 +- 5 files changed, 79 insertions(+), 77 deletions(-) diff --git a/changelog.md b/changelog.md index b021df2340..34827566ca 100644 --- a/changelog.md +++ b/changelog.md @@ -17,11 +17,11 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Running balance calculation also triggers on edit. -- #10489 -- #10493 -- #10499 -- #10507 -- #10510 +- [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 diff --git a/composer.lock b/composer.lock index aa66c58d68..fc34e67d23 100644 --- a/composer.lock +++ b/composer.lock @@ -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", diff --git a/config/firefly.php b/config/firefly.php index 3c2562f971..fb5d7949a5 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -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' => '6.2.19', 'api_version' => '2.1.0', // field is no longer used. 'db_version' => 25, diff --git a/package-lock.json b/package-lock.json index 805958c1eb..5e9dd2dae3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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" }, diff --git a/resources/assets/v1/src/locales/zh-cn.json b/resources/assets/v1/src/locales/zh-cn.json index 36e796f402..30a3070c9d 100644 --- a/resources/assets/v1/src/locales/zh-cn.json +++ b/resources/assets/v1/src/locales/zh-cn.json @@ -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}",