Compare commits

..

99 Commits

Author SHA1 Message Date
github-actions[bot]
fc371e27b7 Merge pull request #11466 from firefly-iii/release-1767729927
🤖 Automatically merge the PR into the develop branch.
2026-01-06 21:05:36 +01:00
JC5
52b14b46a2 🤖 Auto commit for release 'v6.4.15' on 2026-01-06 2026-01-06 21:05:27 +01:00
James Cole
5260b770bb Clean up changelog. 2026-01-06 21:01:07 +01:00
github-actions[bot]
226c4c8f8e Merge pull request #11464 from firefly-iii/release-1767729551
🤖 Automatically merge the PR into the develop branch.
2026-01-06 20:59:17 +01:00
JC5
9ebafe64f1 🤖 Auto commit for release 'develop' on 2026-01-06 2026-01-06 20:59:11 +01:00
James Cole
ffa618101d Update changelog. 2026-01-06 20:55:08 +01:00
James Cole
280e531a76 Fix #11396 2026-01-06 20:43:11 +01:00
James Cole
f542a3fd88 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-06 20:38:46 +01:00
James Cole
581d67a92c Fix #11399 2026-01-06 20:38:41 +01:00
github-actions[bot]
a00e8b976c Merge pull request #11458 from firefly-iii/release-1767598313
🤖 Automatically merge the PR into the develop branch.
2026-01-05 08:32:02 +01:00
JC5
e5b3c3e6bd 🤖 Auto commit for release 'develop' on 2026-01-05 2026-01-05 08:31:53 +01:00
James Cole
4d7f63273e Fix #11449 2026-01-04 20:21:41 +01:00
James Cole
04553f6fc5 Fix #11443 2026-01-03 14:46:39 +01:00
James Cole
54676715c0 Create new request for search. 2026-01-02 16:38:46 +01:00
github-actions[bot]
23246e8f5a Merge pull request #11434 from firefly-iii/release-1767337981
🤖 Automatically merge the PR into the develop branch.
2026-01-02 08:13:10 +01:00
JC5
4ccd65b4d7 🤖 Auto commit for release 'develop' on 2026-01-02 2026-01-02 08:13:01 +01:00
James Cole
2209087b94 Previous year, fixes #11433 2026-01-02 07:59:29 +01:00
github-actions[bot]
f655dcbcf8 Merge pull request #11429 from firefly-iii/release-1767278452
🤖 Automatically merge the PR into the develop branch.
2026-01-01 15:40:59 +01:00
JC5
13bb064734 🤖 Auto commit for release 'develop' on 2026-01-01 2026-01-01 15:40:52 +01:00
James Cole
5a3edbe68f Be less strict about bills. 2026-01-01 15:37:09 +01:00
github-actions[bot]
76657b5519 Merge pull request #11428 from firefly-iii/release-1767271388
🤖 Automatically merge the PR into the develop branch.
2026-01-01 13:43:16 +01:00
JC5
775deb2142 🤖 Auto commit for release 'develop' on 2026-01-01 2026-01-01 13:43:08 +01:00
James Cole
8220d491f9 Fix popup in report helper 2026-01-01 13:39:16 +01:00
github-actions[bot]
6dd2627a6a Merge pull request #11424 from firefly-iii/release-1767125383
🤖 Automatically merge the PR into the develop branch.
2025-12-30 21:09:52 +01:00
JC5
22074568ae 🤖 Auto commit for release 'develop' on 2025-12-30 2025-12-30 21:09:43 +01:00
James Cole
df03899588 Fix whoopsie. 2025-12-30 21:05:50 +01:00
github-actions[bot]
7f4f95097b Merge pull request #11423 from firefly-iii/release-1767124577
🤖 Automatically merge the PR into the develop branch.
2025-12-30 20:56:26 +01:00
JC5
c96ada053f 🤖 Auto commit for release 'develop' on 2025-12-30 2025-12-30 20:56:17 +01:00
James Cole
523ec7c0a1 Expand settings, make accounts not mandatory. 2025-12-30 20:51:56 +01:00
James Cole
61444e9660 New variables for updates. 2025-12-30 16:39:46 +01:00
github-actions[bot]
8235c24c13 Merge pull request #11421 from firefly-iii/release-1767107945
🤖 Automatically merge the PR into the develop branch.
2025-12-30 16:19:14 +01:00
JC5
7ca96a766f 🤖 Auto commit for release 'develop' on 2025-12-30 2025-12-30 16:19:05 +01:00
James Cole
27586a7ec2 Allow transactions to be moved to the future and still have the running balance calculated correctly. 2025-12-30 16:13:28 +01:00
James Cole
dc3c3bb092 Add setting for anonymous amounts in preferences. 2025-12-30 07:24:14 +01:00
github-actions[bot]
7287c29778 Merge pull request #11419 from firefly-iii/release-1767020049
🤖 Automatically merge the PR into the develop branch.
2025-12-29 15:54:17 +01:00
JC5
7d374b22f9 🤖 Auto commit for release 'develop' on 2025-12-29 2025-12-29 15:54:09 +01:00
James Cole
e0542f1270 Fix end of quarter issue. 2025-12-29 11:10:28 +01:00
James Cole
73a9be0605 Fix #11410 2025-12-29 11:05:48 +01:00
github-actions[bot]
1f343bda1a Merge pull request #11416 from firefly-iii/release-1766995950
🤖 Automatically merge the PR into the develop branch.
2025-12-29 09:12:40 +01:00
JC5
1c8eaf93a6 🤖 Auto commit for release 'develop' on 2025-12-29 2025-12-29 09:12:30 +01:00
James Cole
ccfee25000 Merge pull request #11414 from oboxodo/develop
Add Uruguayan Peso to currency seeder
2025-12-29 09:11:25 +01:00
Diego Algorta
07c6dac766 Add Uruguayan Peso to currency seeder 2025-12-28 12:06:08 -03:00
github-actions[bot]
b0b2e5b752 Merge pull request #11411 from firefly-iii/release-1766901579
🤖 Automatically merge the PR into the develop branch.
2025-12-28 06:59:46 +01:00
JC5
ff3a935e9d 🤖 Auto commit for release 'develop' on 2025-12-28 2025-12-28 06:59:39 +01:00
James Cole
f0e2f09da7 Fix some end of period stuff. 2025-12-28 06:54:03 +01:00
github-actions[bot]
f3fbebb9a4 Merge pull request #11409 from firefly-iii/release-1766836192
🤖 Automatically merge the PR into the develop branch.
2025-12-27 12:49:59 +01:00
JC5
6e6e42dab6 🤖 Auto commit for release 'develop' on 2025-12-27 2025-12-27 12:49:53 +01:00
James Cole
d9efd63fad Add debug details. 2025-12-27 12:45:46 +01:00
github-actions[bot]
bc273ada39 Merge pull request #11406 from firefly-iii/release-1766776026
🤖 Automatically merge the PR into the develop branch.
2025-12-26 20:07:14 +01:00
JC5
75c76bb6dd 🤖 Auto commit for release 'develop' on 2025-12-26 2025-12-26 20:07:06 +01:00
James Cole
4d2dd1d8f7 Fix view of running balance column 2025-12-26 20:02:09 +01:00
James Cole
456e73ac16 Fix #11403 2025-12-26 07:09:04 +01:00
James Cole
86f1d8a1bc Fix ALE amount logging. 2025-12-24 07:45:03 +01:00
James Cole
7dac164556 Remove maxlength 2025-12-22 15:39:41 +01:00
James Cole
532df54f10 Merge pull request #11394 from firefly-iii/dependabot/composer/develop/mailersend/laravel-driver-2.12.0 2025-12-22 05:20:33 +01:00
mergify[bot]
daa76d01ca Merge branch 'develop' into dependabot/composer/develop/mailersend/laravel-driver-2.12.0 2025-12-22 03:37:04 +00:00
github-actions[bot]
aa3a435022 Merge pull request #11395 from firefly-iii/release-1766374574
🤖 Automatically merge the PR into the develop branch.
2025-12-22 04:36:21 +01:00
JC5
bc4018481f 🤖 Auto commit for release 'develop' on 2025-12-22 2025-12-22 04:36:14 +01:00
dependabot[bot]
6b7aed7658 Bump mailersend/laravel-driver from 2.9.1 to 2.12.0
Bumps [mailersend/laravel-driver](https://github.com/mailersend/mailersend-laravel-driver) from 2.9.1 to 2.12.0.
- [Release notes](https://github.com/mailersend/mailersend-laravel-driver/releases)
- [Commits](https://github.com/mailersend/mailersend-laravel-driver/compare/v2.9.1...v2.12.0)

---
updated-dependencies:
- dependency-name: mailersend/laravel-driver
  dependency-version: 2.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 03:01:04 +00:00
James Cole
92a535c644 Only update amount when it's actually changed. 2025-12-20 20:12:07 +01:00
James Cole
340540bd5a Replace calls to Amount facade. 2025-12-20 08:21:05 +01:00
James Cole
c63f4a941b Expand debug info for currency search. 2025-12-20 08:08:57 +01:00
James Cole
7491cb5f58 Merge branches 'develop' and 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-12-20 08:08:30 +01:00
James Cole
31c1e28c76 Add message. 2025-12-20 08:08:20 +01:00
github-actions[bot]
0ece35feca Merge pull request #11393 from firefly-iii/release-1766210807
🤖 Automatically merge the PR into the develop branch.
2025-12-20 07:06:54 +01:00
JC5
3b8caba37c 🤖 Auto commit for release 'develop' on 2025-12-20 2025-12-20 07:06:47 +01:00
James Cole
8e729d6bbf Replace references to hard coded config with variables. 2025-12-20 07:00:53 +01:00
James Cole
0f0cdb8e96 Replace config calls. 2025-12-20 06:42:11 +01:00
James Cole
b0cc5f3a46 Remove entries from .env file. 2025-12-20 06:39:58 +01:00
James Cole
71c5bdb198 Move settings to the settings page, out of the .env file. 2025-12-20 06:39:05 +01:00
James Cole
be9078fe99 Remove unused settings. 2025-12-20 06:10:51 +01:00
github-actions[bot]
d235e32c34 Merge pull request #11391 from firefly-iii/release-1766164682
🤖 Automatically merge the PR into the develop branch.
2025-12-19 18:18:09 +01:00
JC5
e34b89da08 🤖 Auto commit for release 'develop' on 2025-12-19 2025-12-19 18:18:02 +01:00
James Cole
f5428595d5 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Console/Commands/Correction/CorrectsAmounts.php
2025-12-19 18:13:58 +01:00
James Cole
87cb1e1a2b Fix #11378 2025-12-19 18:13:04 +01:00
github-actions[bot]
22448a825b Merge pull request #11390 from firefly-iii/release-1766158480
🤖 Automatically merge the PR into the develop branch.
2025-12-19 16:34:48 +01:00
JC5
476a9ac6e4 🤖 Auto commit for release 'develop' on 2025-12-19 2025-12-19 16:34:41 +01:00
James Cole
0acd07405b Fix #11388 2025-12-19 16:30:39 +01:00
James Cole
1daacb80b1 Fix #11383 2025-12-17 19:27:59 +01:00
github-actions[bot]
2bf841627a Merge pull request #11382 from firefly-iii/release-1765957651
🤖 Automatically merge the PR into the develop branch.
2025-12-17 08:47:38 +01:00
JC5
012df6bb24 🤖 Auto commit for release 'develop' on 2025-12-17 2025-12-17 08:47:31 +01:00
Sander Dorigo
486e0d5ed5 Update reference to Steam 2025-12-17 08:43:39 +01:00
James Cole
e8fe9db181 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-12-17 06:04:23 +01:00
James Cole
05f0cb26f8 Remove sentry. 2025-12-17 06:04:17 +01:00
github-actions[bot]
bdaed65207 Merge pull request #11375 from firefly-iii/release-1765863733
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:42:20 +01:00
JC5
62a9195acc 🤖 Auto commit for release 'v6.4.14' on 2025-12-16 2025-12-16 06:42:13 +01:00
James Cole
40d1e36ba8 Fix changelog. 2025-12-16 06:38:14 +01:00
James Cole
61a8525d26 Merge branch 'main' into develop 2025-12-16 06:36:32 +01:00
James Cole
ef01fbe5f4 Update changelog. 2025-12-16 06:36:17 +01:00
James Cole
9413f49c84 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-12-16 06:36:12 +01:00
github-actions[bot]
d9ae99b5fe Merge pull request #11374 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-16 06:35:19 +01:00
github-actions[bot]
45d2d86bba Merge pull request #11373 from firefly-iii/release-1765863308
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:35:15 +01:00
JC5
e21d5e5d01 🤖 Auto commit for release 'v6.4.13' on 2025-12-16 2025-12-16 06:35:08 +01:00
James Cole
8781e2a870 Fix #11368 2025-12-16 06:31:19 +01:00
github-actions[bot]
9e4bfd9d1a Merge pull request #11372 from firefly-iii/release-1765862987
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:29:55 +01:00
JC5
d61d6aa2e2 🤖 Auto commit for release 'develop' on 2025-12-16 2025-12-16 06:29:47 +01:00
github-actions[bot]
230a3a0180 Merge pull request #11371 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-16 06:25:04 +01:00
github-actions[bot]
002454b995 Merge pull request #11370 from firefly-iii/release-1765862692
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:24:59 +01:00
JC5
e6d9c2e218 🤖 Auto commit for release 'v6.4.12' on 2025-12-16 2025-12-16 06:24:52 +01:00
192 changed files with 1859 additions and 1450 deletions

View File

@@ -402,16 +402,16 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.92.1", "version": "v3.92.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "ed33ad03313a019533ba065eba6c86af0a382873" "reference": "9e7488b19403423e02e8403cc1eb596baf4673b0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ed33ad03313a019533ba065eba6c86af0a382873", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/9e7488b19403423e02e8403cc1eb596baf4673b0",
"reference": "ed33ad03313a019533ba065eba6c86af0a382873", "reference": "9e7488b19403423e02e8403cc1eb596baf4673b0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -443,17 +443,17 @@
}, },
"require-dev": { "require-dev": {
"facile-it/paraunit": "^1.3.1 || ^2.7", "facile-it/paraunit": "^1.3.1 || ^2.7",
"infection/infection": "^0.31.0", "infection/infection": "^0.31",
"justinrainbow/json-schema": "^6.5", "justinrainbow/json-schema": "^6.6",
"keradus/cli-executor": "^2.2", "keradus/cli-executor": "^2.3",
"mikey179/vfsstream": "^1.6.12", "mikey179/vfsstream": "^1.6.12",
"php-coveralls/php-coveralls": "^2.9", "php-coveralls/php-coveralls": "^2.9",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
"phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", "phpunit/phpunit": "^9.6.31 || ^10.5.60 || ^11.5.46",
"symfony/polyfill-php85": "^1.33", "symfony/polyfill-php85": "^1.33",
"symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0", "symfony/var-dumper": "^5.4.48 || ^6.4.26 || ^7.4.0 || ^8.0",
"symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0" "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0"
}, },
"suggest": { "suggest": {
"ext-dom": "For handling output formats in XML", "ext-dom": "For handling output formats in XML",
@@ -494,7 +494,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.1" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.4"
}, },
"funding": [ "funding": [
{ {
@@ -502,7 +502,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-12-15T23:09:01+00:00" "time": "2026-01-04T00:38:52+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@@ -731,16 +731,16 @@
}, },
{ {
"name": "react/child-process", "name": "react/child-process",
"version": "v0.6.6", "version": "v0.6.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/child-process.git", "url": "https://github.com/reactphp/child-process.git",
"reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3",
"reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -794,7 +794,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/reactphp/child-process/issues", "issues": "https://github.com/reactphp/child-process/issues",
"source": "https://github.com/reactphp/child-process/tree/v0.6.6" "source": "https://github.com/reactphp/child-process/tree/v0.6.7"
}, },
"funding": [ "funding": [
{ {
@@ -802,7 +802,7 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2025-01-01T16:37:48+00:00" "time": "2025-12-23T15:25:20+00:00"
}, },
{ {
"name": "react/dns", "name": "react/dns",
@@ -1252,16 +1252,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v8.0.1", "version": "v8.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "fcb73f69d655b48fcb894a262f074218df08bd58" "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/fcb73f69d655b48fcb894a262f074218df08bd58", "url": "https://api.github.com/repos/symfony/console/zipball/6145b304a5c1ea0bdbd0b04d297a5864f9a7d587",
"reference": "fcb73f69d655b48fcb894a262f074218df08bd58", "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1318,7 +1318,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v8.0.1" "source": "https://github.com/symfony/console/tree/v8.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -1338,7 +1338,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-12-05T15:25:33+00:00" "time": "2025-12-23T14:52:06+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@@ -1640,16 +1640,16 @@
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v8.0.0", "version": "v8.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291" "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/7598dd5770580fa3517ec83e8da0c9b9e01f4291", "url": "https://api.github.com/repos/symfony/finder/zipball/dd3a2953570a283a2ba4e17063bb98c734cf5b12",
"reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291", "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1684,7 +1684,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v8.0.0" "source": "https://github.com/symfony/finder/tree/v8.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -1704,7 +1704,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-11-05T14:36:47+00:00" "time": "2025-12-23T14:52:06+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
@@ -2358,16 +2358,16 @@
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v8.0.0", "version": "v8.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/process.git",
"reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149" "reference": "0cbbd88ec836f8757641c651bb995335846abb78"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/a0a750500c4ce900d69ba4e9faf16f82c10ee149", "url": "https://api.github.com/repos/symfony/process/zipball/0cbbd88ec836f8757641c651bb995335846abb78",
"reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149", "reference": "0cbbd88ec836f8757641c651bb995335846abb78",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2399,7 +2399,7 @@
"description": "Executes commands in sub-processes", "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/process/tree/v8.0.0" "source": "https://github.com/symfony/process/tree/v8.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -2419,7 +2419,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-10-16T16:25:44+00:00" "time": "2025-12-19T10:01:18+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",

View File

@@ -188,39 +188,11 @@ MAILERSEND_API_KEY=
# Firefly III can send you the following messages. # Firefly III can send you the following messages.
SEND_ERROR_MESSAGE=true SEND_ERROR_MESSAGE=true
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set this value to true if you want to set the location of certain things, like transactions.
# Since this involves an external service, it's optional and disabled by default.
ENABLE_EXTERNAL_MAP=false
#
# Enable or disable exchange rate conversion.
#
ENABLE_EXCHANGE_RATES=false
# Set this value to true if you want Firefly III to download currency exchange rates
# from the internet. These rates are hosted by the creator of Firefly III inside
# an Azure Storage Container.
# Not all currencies may be available. Rates may be wrong.
ENABLE_EXTERNAL_RATES=false
# The map will default to this location: # The map will default to this location:
MAP_DEFAULT_LAT=51.983333 MAP_DEFAULT_LAT=51.983333
MAP_DEFAULT_LONG=5.916667 MAP_DEFAULT_LONG=5.916667
MAP_DEFAULT_ZOOM=6 MAP_DEFAULT_ZOOM=6
#
# Some objects have room for an URL, like transactions and webhooks.
# By default, the following protocols are allowed:
# http, https, ftp, ftps, mailto
#
# To change this, set your preferred comma separated set below.
# Be sure to include http, https and other default ones if you need to.
#
VALID_URL_PROTOCOLS=
# #
# Firefly III authentication settings # Firefly III authentication settings
# #
@@ -275,21 +247,6 @@ DISABLE_CSP_HEADER=false
TRACKER_SITE_ID= TRACKER_SITE_ID=
TRACKER_URL= TRACKER_URL=
#
# You can automatically submit errors to the Firefly III developer using sentry.io
#
# This is entirely optional of course. If you run into errors, I will gladly accept GitHub
# issues or a forwared email message.
#
# If you set this to true, your installation will try to contact sentry.io when it runs into errors.
#
REPORT_ERRORS_ONLINE=false
#
# Firefly III supports webhooks. These are security sensitive and must be enabled manually first.
#
ALLOW_WEBHOOKS=false
# #
# The static cron job token can be useful when you use Docker and wish to manage cron jobs. # The static cron job token can be useful when you use Docker and wish to manage cron jobs.
# 1. Set this token to any 32-character value (this is important!). # 1. Set this token to any 32-character value (this is important!).
@@ -323,25 +280,12 @@ PUSHER_ID=
DEMO_USERNAME= DEMO_USERNAME=
DEMO_PASSWORD= DEMO_PASSWORD=
#
# Disable or enable the running balance column data.
# If you enable this, please also run "php artisan firefly-iii:correct-database"
# This will take some time the first run.
#
USE_RUNNING_BALANCE=false
# #
# The v2 layout is very experimental. If it breaks you get to keep both parts. # The v2 layout is very experimental. If it breaks you get to keep both parts.
# Be wary of data loss. # Be wary of data loss.
# #
FIREFLY_III_LAYOUT=v1 FIREFLY_III_LAYOUT=v1
#
# Which Query Parser implementation to use for the search engine and rules
# 'new' is experimental, 'legacy' is the classic one
#
QUERY_PARSER_IMPLEMENTATION=new
# #
# Please make sure this URL matches the external URL of your Firefly III installation. # Please make sure this URL matches the external URL of your Firefly III installation.
# It is used to validate specific requests and to generate URLs in emails. # It is used to validate specific requests and to generate URLs in emails.

View File

@@ -4,6 +4,7 @@ Over time, many people have contributed to Firefly III. Their efforts are not al
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution. Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
## 2025 ## 2025
- Diego Algorta
- Jihad - Jihad
- jreyesr - jreyesr
- codearena-bot - codearena-bot

View File

@@ -42,6 +42,7 @@ use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class BudgetController * Class BudgetController
@@ -286,7 +287,7 @@ class BudgetController extends Controller
} }
if (null !== $limit && $this->convertToPrimary) { if (null !== $limit && $this->convertToPrimary) {
// convert and add all amounts. // convert and add all amounts.
$limit->amount = app('steam')->positive($amount); $limit->amount = Steam::positive($amount);
Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount)); Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount));
} }

View File

@@ -25,11 +25,11 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Search; namespace FireflyIII\Api\V1\Controllers\Search;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Search\TransactionSearchRequest;
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
use FireflyIII\Support\Search\SearchInterface; use FireflyIII\Support\Search\SearchInterface;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection; use League\Fractal\Resource\Collection;
@@ -42,12 +42,12 @@ class TransactionController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/search/searchTransactions * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/search/searchTransactions
*/ */
public function search(Request $request, SearchInterface $searcher): JsonResponse public function search(TransactionSearchRequest $request, SearchInterface $searcher): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$fullQuery = (string) $request->get('query'); $fullQuery = (string) $request->attributes->get('query');
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); $page = $request->attributes->get('page');
$pageSize = $this->parameters->get('limit'); $pageSize = $request->attributes->get('limit');
$searcher->parseQuery($fullQuery); $searcher->parseQuery($fullQuery);
$searcher->setPage($page); $searcher->setPage($page);
$searcher->setLimit($pageSize); $searcher->setLimit($pageSize);

View File

@@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\System\CronRequest;
use FireflyIII\Support\Http\Controllers\CronRunner; use FireflyIII\Support\Http\Controllers\CronRunner;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class CronController * Class CronController
@@ -50,7 +51,7 @@ class CronController extends Controller
$return = []; $return = [];
$return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']); $return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']);
$return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']); $return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']);
if (true === config('cer.download_enabled')) { if (true === FireflyConfig::get('enable_external_rates', config('cer.download_enabled'))->data) {
$return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']); $return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']);
} }
$return['bill_notifications'] = $this->billWarningCronJob($config['force'], $config['date']); $return['bill_notifications'] = $this->billWarningCronJob($config['force'], $config['date']);

View File

@@ -38,6 +38,7 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class AttemptController * Class AttemptController
@@ -71,7 +72,7 @@ class AttemptController extends Controller
if ($message->webhook_id !== $webhook->id) { if ($message->webhook_id !== $webhook->id) {
throw new FireflyException('200040: Webhook and webhook message are no match'); throw new FireflyException('200040: Webhook and webhook message are no match');
} }
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User lists webhook attempts of webhook #%d and message #%d, but webhooks are DISABLED.', $webhook->id, $message->id)); Log::channel('audit')->warning(sprintf('User lists webhook attempts of webhook #%d and message #%d, but webhooks are DISABLED.', $webhook->id, $message->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -115,7 +116,7 @@ class AttemptController extends Controller
throw new FireflyException('200041: Webhook message and webhook attempt are no match'); throw new FireflyException('200041: Webhook message and webhook attempt are no match');
} }
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User views single webhook attempt #%d of webhook #%d and message #%d, but webhooks are DISABLED', $attempt->id, $webhook->id, $message->id)); Log::channel('audit')->warning(sprintf('User views single webhook attempt #%d of webhook #%d and message #%d, but webhooks are DISABLED', $attempt->id, $webhook->id, $message->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -34,6 +34,7 @@ use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class DestroyController * Class DestroyController
@@ -63,7 +64,7 @@ class DestroyController extends Controller
*/ */
public function destroy(Webhook $webhook): JsonResponse public function destroy(Webhook $webhook): JsonResponse
{ {
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d. but webhooks are DISABLED.', $webhook->id)); Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d. but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -93,7 +94,7 @@ class DestroyController extends Controller
throw new FireflyException('200041: Webhook message and webhook attempt are no match'); throw new FireflyException('200041: Webhook message and webhook attempt are no match');
} }
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d, message #%d, attempt #%d, but webhooks are DISABLED.', $webhook->id, $message->id, $attempt->id)); Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d, message #%d, attempt #%d, but webhooks are DISABLED.', $webhook->id, $message->id, $attempt->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -121,7 +122,7 @@ class DestroyController extends Controller
throw new FireflyException('200040: Webhook and webhook message are no match'); throw new FireflyException('200040: Webhook and webhook message are no match');
} }
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d, message #%d, but webhooks are DISABLED.', $webhook->id, $message->id)); Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d, message #%d, but webhooks are DISABLED.', $webhook->id, $message->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -37,6 +37,7 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class MessageController * Class MessageController
@@ -65,7 +66,7 @@ class MessageController extends Controller
*/ */
public function index(Webhook $webhook): JsonResponse public function index(Webhook $webhook): JsonResponse
{ {
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to view messages of webhook #%d, but webhooks are DISABLED.', $webhook->id)); Log::channel('audit')->warning(sprintf('User tries to view messages of webhook #%d, but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -105,7 +106,7 @@ class MessageController extends Controller
if ($message->webhook_id !== $webhook->id) { if ($message->webhook_id !== $webhook->id) {
throw new FireflyException('200040: Webhook and webhook message are no match'); throw new FireflyException('200040: Webhook and webhook message are no match');
} }
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to view message #%d of webhook #%d, but webhooks are DISABLED.', $message->id, $webhook->id)); Log::channel('audit')->warning(sprintf('User tries to view message #%d of webhook #%d, but webhooks are DISABLED.', $message->id, $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -42,6 +42,7 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class ShowController * Class ShowController
@@ -72,7 +73,7 @@ class ShowController extends Controller
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info('User tries to view all webhooks, but webhooks are DISABLED.'); Log::channel('audit')->info('User tries to view all webhooks, but webhooks are DISABLED.');
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -114,7 +115,7 @@ class ShowController extends Controller
*/ */
public function show(Webhook $webhook): JsonResponse public function show(Webhook $webhook): JsonResponse
{ {
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf('User tries to view webhook #%d, but webhooks are DISABLED.', $webhook->id)); Log::channel('audit')->info(sprintf('User tries to view webhook #%d, but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -146,7 +147,7 @@ class ShowController extends Controller
*/ */
public function triggerTransaction(Webhook $webhook, TransactionGroup $group): JsonResponse public function triggerTransaction(Webhook $webhook, TransactionGroup $group): JsonResponse
{ {
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf('User tries to trigger webhook #%d on transaction group #%d, but webhooks are DISABLED.', $webhook->id, $group->id)); Log::channel('audit')->info(sprintf('User tries to trigger webhook #%d on transaction group #%d, but webhooks are DISABLED.', $webhook->id, $group->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -34,6 +34,7 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class StoreController * Class StoreController
@@ -63,7 +64,7 @@ class StoreController extends Controller
public function store(CreateRequest $request): JsonResponse public function store(CreateRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info('User tries to store new webhook, but webhooks are DISABLED.', $data); Log::channel('audit')->info('User tries to store new webhook, but webhooks are DISABLED.', $data);
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Jobs\SendWebhookMessage; use FireflyIII\Jobs\SendWebhookMessage;
use FireflyIII\Models\Webhook; use FireflyIII\Models\Webhook;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface; use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -58,7 +59,7 @@ class SubmitController extends Controller
*/ */
public function submit(Webhook $webhook): JsonResponse public function submit(Webhook $webhook): JsonResponse
{ {
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf('User tries to submit webhook #%d, but webhooks are DISABLED.', $webhook->id)); Log::channel('audit')->info(sprintf('User tries to submit webhook #%d, but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -35,6 +35,7 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class UpdateController * Class UpdateController
@@ -63,7 +64,7 @@ class UpdateController extends Controller
public function update(Webhook $webhook, UpdateRequest $request): JsonResponse public function update(Webhook $webhook, UpdateRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
if (false === config('firefly.allow_webhooks')) { if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf('User tries to update webhook #%d, but webhooks are DISABLED.', $webhook->id), $data); Log::channel('audit')->info(sprintf('User tries to update webhook #%d, but webhooks are DISABLED.', $webhook->id), $data);
throw new NotFoundHttpException('Webhooks are not enabled.'); throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -79,8 +79,8 @@ class UpdateRequest extends FormRequest
'start_date' => 'date|nullable', 'start_date' => 'date|nullable',
'target_date' => 'date|nullable|after:start_date', 'target_date' => 'date|nullable|after:start_date',
'notes' => 'max:65000', 'notes' => 'max:65000',
'accounts' => 'required', 'accounts' => 'array',
'accounts.*' => 'array|required', 'accounts.*' => 'array',
'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'], 'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'],
'accounts.*.current_amount' => ['numeric', 'nullable', new IsValidZeroOrMoreAmount(true)], 'accounts.*.current_amount' => ['numeric', 'nullable', new IsValidZeroOrMoreAmount(true)],
'object_group_id' => 'numeric|belongsToUser:object_groups,id', 'object_group_id' => 'numeric|belongsToUser:object_groups,id',

View File

@@ -40,6 +40,7 @@ use FireflyIII\Validation\GroupValidation;
use FireflyIII\Validation\TransactionValidation; use FireflyIII\Validation\TransactionValidation;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class StoreRequest * Class StoreRequest
@@ -176,7 +177,7 @@ class StoreRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
Log::debug('Collect rules of TransactionStoreRequest'); Log::debug('Collect rules of TransactionStoreRequest');
$validProtocols = config('firefly.valid_url_protocols'); $validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
$locationRules = Location::requestRules([]); $locationRules = Location::requestRules([]);
return [ return [

View File

@@ -38,6 +38,7 @@ use FireflyIII\Validation\GroupValidation;
use FireflyIII\Validation\TransactionValidation; use FireflyIII\Validation\TransactionValidation;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class UpdateRequest * Class UpdateRequest
@@ -248,7 +249,7 @@ class UpdateRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
Log::debug(sprintf('Now in %s', __METHOD__)); Log::debug(sprintf('Now in %s', __METHOD__));
$validProtocols = config('firefly.valid_url_protocols'); $validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
return [ return [
// basic fields for group: // basic fields for group:

View File

@@ -31,6 +31,7 @@ use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\ValidatesWebhooks; use FireflyIII\Support\Request\ValidatesWebhooks;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class CreateRequest * Class CreateRequest
@@ -73,7 +74,7 @@ class CreateRequest extends FormRequest
$triggers = implode(',', array_values(Webhook::getTriggers())); $triggers = implode(',', array_values(Webhook::getTriggers()));
$responses = implode(',', array_values(Webhook::getResponses())); $responses = implode(',', array_values(Webhook::getResponses()));
$deliveries = implode(',', array_values(Webhook::getDeliveries())); $deliveries = implode(',', array_values(Webhook::getDeliveries()));
$validProtocols = config('firefly.valid_url_protocols'); $validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
return [ return [
'title' => 'required|min:1|max:255|uniqueObjectForUser:webhooks,title', 'title' => 'required|min:1|max:255|uniqueObjectForUser:webhooks,title',

View File

@@ -31,6 +31,7 @@ use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\ValidatesWebhooks; use FireflyIII\Support\Request\ValidatesWebhooks;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class UpdateRequest * Class UpdateRequest
@@ -73,7 +74,7 @@ class UpdateRequest extends FormRequest
$triggers = implode(',', array_values(Webhook::getTriggers())); $triggers = implode(',', array_values(Webhook::getTriggers()));
$responses = implode(',', array_values(Webhook::getResponses())); $responses = implode(',', array_values(Webhook::getResponses()));
$deliveries = implode(',', array_values(Webhook::getDeliveries())); $deliveries = implode(',', array_values(Webhook::getDeliveries()));
$validProtocols = config('firefly.valid_url_protocols'); $validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
/** @var Webhook $webhook */ /** @var Webhook $webhook */
$webhook = $this->route()->parameter('webhook'); $webhook = $this->route()->parameter('webhook');

View File

@@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
/*
* SearchQueryRequest.php
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Requests\Search;
use FireflyIII\Api\V1\Requests\ApiRequest;
use Illuminate\Contracts\Validation\Validator;
class SearchQueryRequest extends ApiRequest
{
public function rules(): array
{
return [
'query' => sprintf('min:0|max:500|%s', $this->required),
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if ($validator->failed()) {
return;
}
$query = $this->convertString('query');
$this->attributes->set('query', $query);
}
);
}
}

View File

@@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
/*
* SearchRequest.php
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Requests\Search;
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Models\TransactionJournal;
use Override;
class TransactionSearchRequest extends AggregateFormRequest
{
#[Override]
protected function getRequests(): array
{
return [
[PaginationRequest::class, 'sort_class' => TransactionJournal::class],
SearchQueryRequest::class,
// [ObjectTypeApiRequest::class, 'object_type' => Account::class],
];
}
}

View File

@@ -37,17 +37,19 @@ class UpdateRequest extends FormRequest
use ChecksLogin; use ChecksLogin;
use ConvertsDataTypes; use ConvertsDataTypes;
private array $booleans = ['configuration.is_demo_site', 'configuration.single_user_mode', 'configuration.enable_exchange_rates', 'configuration.use_running_balance', 'configuration.enable_external_map', 'configuration.enable_external_rates', 'configuration.allow_webhooks'];
private array $integers = ['configuration.permission_update_check', 'configuration.last_update_check'];
/** /**
* Get all data from the request. * Get all data from the request.
*/ */
public function getAll(): array public function getAll(): array
{ {
$name = $this->route()->parameter('dynamicConfigKey'); $name = $this->route()->parameter('dynamicConfigKey');
if (in_array($name, $this->booleans, true)) {
if ('configuration.is_demo_site' === $name || 'configuration.single_user_mode' === $name) {
return ['value' => $this->boolean('value')]; return ['value' => $this->boolean('value')];
} }
if ('configuration.permission_update_check' === $name || 'configuration.last_update_check' === $name) { if (in_array($name, $this->integers, true)) {
return ['value' => $this->convertInteger('value')]; return ['value' => $this->convertInteger('value')];
} }
@@ -61,13 +63,13 @@ class UpdateRequest extends FormRequest
{ {
$name = $this->route()->parameter('configName'); $name = $this->route()->parameter('configName');
if ('configuration.is_demo_site' === $name || 'configuration.single_user_mode' === $name) { if (in_array($name, $this->booleans, true)) {
return ['value' => ['required', new IsBoolean()]]; return ['value' => ['required', new IsBoolean()]];
} }
if ('configuration.permission_update_check' === $name) { if ('configuration.permission_update_check' === $name) {
return ['value' => 'required|numeric|min:-1|max:1']; return ['value' => 'required|numeric|min:-1|max:1'];
} }
if ('configuration.last_update_check' === $name) { if (in_array($name, $this->integers, true)) {
return ['value' => 'required|numeric|min:464272080']; return ['value' => 'required|numeric|min:464272080'];
} }

View File

@@ -39,6 +39,7 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Steam;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -78,34 +79,33 @@ class CorrectsAmounts extends Command
private function correctTransfers(): void private function correctTransfers(): void
{ {
Log::debug('Will now correct transfers.');
/** @var AccountRepositoryInterface $repository */ /** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class); $repository = app(AccountRepositoryInterface::class);
$type = TransactionType::where('type', TransactionTypeEnum::TRANSFER->value)->first(); $type = TransactionType::where('type', TransactionTypeEnum::TRANSFER->value)->first();
$journals = TransactionJournal::where('transaction_type_id', $type->id)->get(); $journals = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')->whereNotNull('transactions.foreign_amount')->where('transaction_journals.transaction_type_id', $type->id)->distinct()->get(['transaction_journals.*']);
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
$repository->setUser($journal->user); $repository->setUser($journal->user);
$primary = Amount::getPrimaryCurrencyByUserGroup($journal->userGroup); $primary = Amount::getPrimaryCurrencyByUserGroup($journal->userGroup);
/** @var null|Transaction $source */ $valid = $this->validateJournal($journal);
$source = $journal->transactions()->where('amount', '<', 0)->first(); if (false === $valid) {
// Log::debug(sprintf('Journal #%d does not need to be fixed or is invalid (see previous messages)', $journal->id));
/** @var null|Transaction $destination */
$destination = $journal->transactions()->where('amount', '>', 0)->first();
if (null === $source || null === $destination) {
continue;
}
if (null === $source->foreign_currency_id || null === $destination->foreign_currency_id) {
continue; continue;
} }
Log::debug(sprintf('Journal #%d is ready to be corrected (if necessary).', $journal->id));
$source = $journal->transactions()->where('amount', '<', '0')->first();
$destination = $journal->transactions()->where('amount', '>', '0')->first();
$sourceAccount = $source->account; $sourceAccount = $source->account;
$destAccount = $destination->account; $destAccount = $destination->account;
if (null === $sourceAccount || null === $destAccount) {
continue;
}
$sourceCurrency = $repository->getAccountCurrency($sourceAccount) ?? $primary; $sourceCurrency = $repository->getAccountCurrency($sourceAccount) ?? $primary;
$destCurrency = $repository->getAccountCurrency($destAccount) ?? $primary; $destCurrency = $repository->getAccountCurrency($destAccount) ?? $primary;
Log::debug(sprintf('Currency of source account #%d "%s" is %s', $sourceAccount->id, $sourceAccount->name, $sourceCurrency->code));
Log::debug(sprintf('Currency of destination account #%d "%s" is %s', $destAccount->id, $destAccount->name, $destCurrency->code));
if ($sourceCurrency->id === $destCurrency->id) { if ($sourceCurrency->id === $destCurrency->id) {
Log::debug('Both accounts have the same currency. Removing foreign currency info.'); Log::debug('Both accounts have the same currency. Removing foreign currency info.');
@@ -119,22 +119,40 @@ class CorrectsAmounts extends Command
continue; continue;
} }
// validate source // validate source transaction
if ($destCurrency->id !== $source->foreign_currency_id) { if ($destCurrency->id !== $source->foreign_currency_id) {
Log::debug(sprintf('Journal #%d: Transaction #%d refers to "%s" but should refer to "%s".', $journal->id, $source->id, $source->foreignCurrency->code, $destCurrency->code)); Log::debug(sprintf('[a] Journal #%d: transaction #%d refers to foreign currency "%s" but should refer to "%s".', $journal->id, $source->id, $source->foreignCurrency->code, $destCurrency->code));
$source->foreign_currency_id = $destCurrency->id; $source->foreign_currency_id = $destCurrency->id;
$source->save(); $source->save();
} }
if ($sourceCurrency->id !== $source->transaction_currency_id) {
Log::debug(sprintf('[b] Journal #%d: transaction #%d refers to currency "%s" but should refer to "%s".', $journal->id, $source->id, $source->transactionCurrency->code, $sourceCurrency->code));
$source->transaction_currency_id = $sourceCurrency->id;
$source->save();
}
// validate destination: // validate destination:
if ($sourceCurrency->id !== $destination->foreign_currency_id) { if ($sourceCurrency->id !== $destination->foreign_currency_id) {
Log::debug(sprintf('Journal #%d: Transaction #%d refers to "%s" but should refer to "%s".', $journal->id, $destination->id, $destination->foreignCurrency->code, $sourceCurrency->code)); Log::debug(sprintf('[c] Journal #%d: transaction #%d refers to foreign currency "%s" but should refer to "%s".', $journal->id, $destination->id, $destination->foreignCurrency->code, $sourceCurrency->code));
$destination->foreign_currency_id = $sourceCurrency->id; $destination->foreign_currency_id = $sourceCurrency->id;
$destination->save(); $destination->save();
} }
if ($destCurrency->id !== $destination->transaction_currency_id) {
Log::debug(sprintf('[d] Journal #%d: transaction #%d refers to currency "%s" but should refer to "%s".', $journal->id, $destination->id, $destination->transactionCurrency->code, $destCurrency->code));
$destination->transaction_currency_id = $destCurrency->id;
$destination->save();
}
Log::debug(sprintf('Done with journal #%d.', $journal->id));
} }
} }
private function deleteJournal(TransactionJournal $journal): void
{
$journal->transactionGroup?->delete();
$journal->delete();
}
private function fixAutoBudgets(): void private function fixAutoBudgets(): void
{ {
$count = AutoBudget::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]); $count = AutoBudget::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
@@ -234,7 +252,7 @@ class CorrectsAmounts extends Command
private function fixRuleTrigger(RuleTrigger $item): bool private function fixRuleTrigger(RuleTrigger $item): bool
{ {
try { try {
$check = bccomp((string) $item->trigger_value, '0'); $check = bccomp((string)$item->trigger_value, '0');
} catch (ValueError) { } catch (ValueError) {
$this->friendlyError(sprintf('Rule #%d contained invalid %s-trigger "%s". The trigger has been removed, and the rule is disabled.', $item->rule_id, $item->trigger_type, $item->trigger_value)); $this->friendlyError(sprintf('Rule #%d contained invalid %s-trigger "%s". The trigger has been removed, and the rule is disabled.', $item->rule_id, $item->trigger_type, $item->trigger_value));
$item->rule->active = false; $item->rule->active = false;
@@ -244,7 +262,7 @@ class CorrectsAmounts extends Command
return false; return false;
} }
if (-1 === $check) { if (-1 === $check) {
$item->trigger_value = app('steam')->positive($item->trigger_value); $item->trigger_value = Steam::positive($item->trigger_value);
$item->save(); $item->save();
return true; return true;
@@ -252,4 +270,57 @@ class CorrectsAmounts extends Command
return false; return false;
} }
private function validateJournal(TransactionJournal $journal): bool
{
$countSource = $journal->transactions()->where('amount', '<', 0)->count();
$countDest = $journal->transactions()->where('amount', '>', 0)->count();
if (1 !== $countSource || 1 !== $countDest) {
$this->friendlyError(sprintf('Transaction journal #%d has bad transaction information. Will delete.', $journal->id));
$this->deleteJournal($journal);
Log::error(sprintf('Transaction journal #%d has bad transaction information. Will delete.', $journal->id));
return false;
}
/** @var null|Transaction $source */
$source = $journal->transactions()->where('amount', '<', 0)->first();
/** @var null|Transaction $destination */
$destination = $journal->transactions()->where('amount', '>', 0)->first();
if (null === $source || null === $destination) {
$this->friendlyError(sprintf('Could not find source OR destination for journal #%d .', $journal->id));
Log::error(sprintf('Could not find source OR destination for journal #%d .', $journal->id));
$this->deleteJournal($journal);
return false;
}
if (null === $source->foreign_currency_id || null === $destination->foreign_currency_id) {
// Log::debug('No foreign currency information is present, can safely continue with other transactions.');
return false;
}
if (null === $source->foreign_amount || null === $destination->foreign_amount) {
$this->friendlyError(sprintf('Transactions of journal #%d have no foreign amount, but have foreign currency info. Will reset this.', $journal->id));
$source->foreign_currency_id = null;
$source->save();
$destination->foreign_currency_id = null;
$source->save();
return false;
}
$sourceAccount = $source->account;
$destAccount = $destination->account;
if (null === $sourceAccount || null === $destAccount) {
$this->friendlyError(sprintf('Could not find accounts for journal #%d,', $journal->id));
$this->deleteJournal($journal);
return false;
}
return true;
}
} }

View File

@@ -36,6 +36,7 @@ use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Symfony\Component\Console\Command\Command as CommandAlias; use Symfony\Component\Console\Command\Command as CommandAlias;
use FireflyIII\Support\Facades\Amount;
class CorrectsCurrencies extends Command class CorrectsCurrencies extends Command
{ {
@@ -63,7 +64,7 @@ class CorrectsCurrencies extends Command
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
// first check if the user has any default currency (not necessarily the case, so can be forced). // first check if the user has any default currency (not necessarily the case, so can be forced).
$primaryCurrency = app('amount')->getPrimaryCurrencyByUserGroup($userGroup); $primaryCurrency = Amount::getPrimaryCurrencyByUserGroup($userGroup);
Log::debug(sprintf('Now correcting currencies for user group #%d', $userGroup->id)); Log::debug(sprintf('Now correcting currencies for user group #%d', $userGroup->id));
$found = [$primaryCurrency->id]; $found = [$primaryCurrency->id];

View File

@@ -29,6 +29,7 @@ use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use FireflyIII\Support\Facades\Steam;
class CorrectsIbans extends Command class CorrectsIbans extends Command
{ {
@@ -55,7 +56,7 @@ class CorrectsIbans extends Command
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
$iban = (string) $account->iban; $iban = (string) $account->iban;
$newIban = app('steam')->filterSpaces($iban); $newIban = Steam::filterSpaces($iban);
if ('' !== $iban && $iban !== $newIban) { if ('' !== $iban && $iban !== $newIban) {
$account->iban = $newIban; $account->iban = $newIban;
$account->save(); $account->save();
@@ -66,7 +67,7 @@ class CorrectsIbans extends Command
$accountNumber = $account->accountMeta->where('name', 'account_number')->first(); $accountNumber = $account->accountMeta->where('name', 'account_number')->first();
if (null !== $accountNumber) { if (null !== $accountNumber) {
$number = (string) $accountNumber->value; $number = (string) $accountNumber->value;
$newNumber = app('steam')->filterSpaces($number); $newNumber = Steam::filterSpaces($number);
if ('' !== $number && $number !== $newNumber) { if ('' !== $number && $number !== $newNumber) {
$accountNumber->value = $newNumber; $accountNumber->value = $newNumber;
$accountNumber->save(); $accountNumber->save();

View File

@@ -35,6 +35,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Amount;
class CorrectsOpeningBalanceCurrencies extends Command class CorrectsOpeningBalanceCurrencies extends Command
{ {
@@ -133,6 +134,6 @@ class CorrectsOpeningBalanceCurrencies extends Command
$repos = app(AccountRepositoryInterface::class); $repos = app(AccountRepositoryInterface::class);
$repos->setUser($account->user); $repos->setUser($account->user);
return $repos->getAccountCurrency($account) ?? app('amount')->getPrimaryCurrencyByUserGroup($account->userGroup); return $repos->getAccountCurrency($account) ?? Amount::getPrimaryCurrencyByUserGroup($account->userGroup);
} }
} }

View File

@@ -48,6 +48,7 @@ use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\Builder as DatabaseBuilder; use Illuminate\Database\Query\Builder as DatabaseBuilder;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class CorrectsPrimaryCurrencyAmounts extends Command class CorrectsPrimaryCurrencyAmounts extends Command
{ {
@@ -62,7 +63,7 @@ class CorrectsPrimaryCurrencyAmounts extends Command
*/ */
public function handle(): int public function handle(): int
{ {
if (false === config('cer.enabled')) { if (false === FireflyConfig::get('enable_exchange_rates', config('cer.enabled'))->data) {
$this->friendlyInfo('This command will not run because currency exchange rates are disabled.'); $this->friendlyInfo('This command will not run because currency exchange rates are disabled.');
return 0; return 0;

View File

@@ -30,6 +30,7 @@ use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Models\AccountBalanceCalculator; use FireflyIII\Support\Models\AccountBalanceCalculator;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -60,7 +61,7 @@ class CorrectsUnevenAmount extends Command
$this->fixUnevenAmounts(); $this->fixUnevenAmounts();
$this->matchCurrencies(); $this->matchCurrencies();
if (true === config('firefly.feature_flags.running_balance_column')) { if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
$this->friendlyInfo('Will recalculate transaction running balance columns. This may take a LONG time. Please be patient.'); $this->friendlyInfo('Will recalculate transaction running balance columns. This may take a LONG time. Please be patient.');
AccountBalanceCalculator::recalculateAll(false); AccountBalanceCalculator::recalculateAll(false);
$this->friendlyInfo('Done recalculating transaction running balance columns.'); $this->friendlyInfo('Done recalculating transaction running balance columns.');
@@ -112,9 +113,9 @@ class CorrectsUnevenAmount extends Command
if ($source->transaction_currency_id === $destination->transaction_currency_id) { if ($source->transaction_currency_id === $destination->transaction_currency_id) {
Log::debug('Ready to swap data between transactions.'); Log::debug('Ready to swap data between transactions.');
$destination->foreign_currency_id = $source->transaction_currency_id; $destination->foreign_currency_id = $source->transaction_currency_id;
$destination->foreign_amount = app('steam')->positive($source->amount); $destination->foreign_amount = Steam::positive($source->amount);
$destination->transaction_currency_id = $source->foreign_currency_id; $destination->transaction_currency_id = $source->foreign_currency_id;
$destination->amount = app('steam')->positive($source->foreign_amount); $destination->amount = Steam::positive($source->foreign_amount);
$destination->balance_dirty = true; $destination->balance_dirty = true;
$source->balance_dirty = true; $source->balance_dirty = true;
$destination->save(); $destination->save();
@@ -132,11 +133,7 @@ class CorrectsUnevenAmount extends Command
private function fixUnevenAmounts(): void private function fixUnevenAmounts(): void
{ {
Log::debug('fixUnevenAmounts()'); Log::debug('fixUnevenAmounts()');
$journals = DB::table('transactions') $journals = DB::table('transactions')->groupBy('transaction_journal_id')->whereNull('deleted_at')->get(['transaction_journal_id', DB::raw('SUM(amount) AS the_sum')]);
->groupBy('transaction_journal_id')
->whereNull('deleted_at')
->get(['transaction_journal_id', DB::raw('SUM(amount) AS the_sum')])
;
/** @var stdClass $entry */ /** @var stdClass $entry */
foreach ($journals as $entry) { foreach ($journals as $entry) {
@@ -146,11 +143,7 @@ class CorrectsUnevenAmount extends Command
|| '' === $sum // @phpstan-ignore-line || '' === $sum // @phpstan-ignore-line
|| str_contains($sum, 'e') || str_contains($sum, 'e')
|| str_contains($sum, ',')) { || str_contains($sum, ',')) {
$message = sprintf( $message = sprintf('Journal #%d has an invalid sum ("%s"). No sure what to do.', $entry->transaction_journal_id, $entry->the_sum);
'Journal #%d has an invalid sum ("%s"). No sure what to do.',
$entry->transaction_journal_id,
$entry->the_sum
);
$this->friendlyWarning($message); $this->friendlyWarning($message);
Log::warning($message); Log::warning($message);
++$this->count; ++$this->count;
@@ -184,13 +177,7 @@ class CorrectsUnevenAmount extends Command
$source = $journal->transactions()->where('amount', '<', 0)->first(); $source = $journal->transactions()->where('amount', '<', 0)->first();
if (null === $source) { if (null === $source) {
$this->friendlyError( $this->friendlyError(sprintf('Journal #%d ("%s") has no source transaction. It will be deleted to maintain database consistency.', $journal->id ?? 0, $journal->description ?? ''));
sprintf(
'Journal #%d ("%s") has no source transaction. It will be deleted to maintain database consistency.',
$journal->id ?? 0,
$journal->description ?? ''
)
);
Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete(); Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete();
TransactionJournal::where('id', $journal->id ?? 0)->forceDelete(); TransactionJournal::where('id', $journal->id ?? 0)->forceDelete();
++$this->count; ++$this->count;
@@ -205,13 +192,7 @@ class CorrectsUnevenAmount extends Command
$destination = $journal->transactions()->where('amount', '>', 0)->first(); $destination = $journal->transactions()->where('amount', '>', 0)->first();
if (null === $destination) { if (null === $destination) {
$this->friendlyError( $this->friendlyError(sprintf('Journal #%d ("%s") has no destination transaction. It will be deleted to maintain database consistency.', $journal->id ?? 0, $journal->description ?? ''));
sprintf(
'Journal #%d ("%s") has no destination transaction. It will be deleted to maintain database consistency.',
$journal->id ?? 0,
$journal->description ?? ''
)
);
Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete(); Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete();
TransactionJournal::where('id', $journal->id ?? 0)->forceDelete(); TransactionJournal::where('id', $journal->id ?? 0)->forceDelete();
@@ -257,8 +238,8 @@ class CorrectsUnevenAmount extends Command
// source currency = dest foreign currency // source currency = dest foreign currency
// dest amount = source foreign currency // dest amount = source foreign currency
// dest currency = source foreign currency // dest currency = source foreign currency
// Log::debug(sprintf('[a] %s', bccomp(app('steam')->positive($source->amount), app('steam')->positive($destination->foreign_amount)))); // Log::debug(sprintf('[a] %s', bccomp(\FireflyIII\Support\Facades\Steam::positive($source->amount), \FireflyIII\Support\Facades\Steam::positive($destination->foreign_amount))));
// Log::debug(sprintf('[b] %s', bccomp(app('steam')->positive($destination->amount), app('steam')->positive($source->foreign_amount)))); // Log::debug(sprintf('[b] %s', bccomp(\FireflyIII\Support\Facades\Steam::positive($destination->amount), \FireflyIII\Support\Facades\Steam::positive($source->foreign_amount))));
// Log::debug(sprintf('[c] %s', var_export($source->transaction_currency_id === $destination->foreign_currency_id,true))); // Log::debug(sprintf('[c] %s', var_export($source->transaction_currency_id === $destination->foreign_currency_id,true)));
// Log::debug(sprintf('[d] %s', var_export((int) $destination->transaction_currency_id ===(int) $source->foreign_currency_id, true))); // Log::debug(sprintf('[d] %s', var_export((int) $destination->transaction_currency_id ===(int) $source->foreign_currency_id, true)));
return 0 === bccomp(Steam::positive($source->amount), Steam::positive($destination->foreign_amount)) return 0 === bccomp(Steam::positive($source->amount), Steam::positive($destination->foreign_amount))
@@ -428,9 +409,9 @@ class CorrectsUnevenAmount extends Command
// // only fix the destination transaction // // only fix the destination transaction
// $destination->foreign_currency_id = $source->transaction_currency_id; // $destination->foreign_currency_id = $source->transaction_currency_id;
// $destination->foreign_amount = app('steam')->positive($source->amount); // $destination->foreign_amount = \FireflyIII\Support\Facades\Steam::positive($source->amount);
// $destination->transaction_currency_id = $source->foreign_currency_id; // $destination->transaction_currency_id = $source->foreign_currency_id;
// $destination->amount = app('steam')->positive($source->foreign_amount); // $destination->amount = \FireflyIII\Support\Facades\Steam::positive($source->foreign_amount);
// $destination->balance_dirty = true; // $destination->balance_dirty = true;
// $source->balance_dirty = true; // $source->balance_dirty = true;
// $destination->save(); // $destination->save();

View File

@@ -28,6 +28,7 @@ namespace FireflyIII\Console\Commands\System;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Support\Models\AccountBalanceCalculator; use FireflyIII\Support\Models\AccountBalanceCalculator;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class RecalculatesRunningBalance extends Command class RecalculatesRunningBalance extends Command
{ {
@@ -52,7 +53,7 @@ class RecalculatesRunningBalance extends Command
*/ */
public function handle(): int public function handle(): int
{ {
if (true === config('firefly.feature_flags.running_balance_column')) { if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
$this->friendlyInfo('Will recalculate account balances. This may take a LONG time. Please be patient.'); $this->friendlyInfo('Will recalculate account balances. This may take a LONG time. Please be patient.');
$this->correctBalanceAmounts($this->option('force')); $this->correctBalanceAmounts($this->option('force'));
$this->friendlyInfo('Done recalculating account balances.'); $this->friendlyInfo('Done recalculating account balances.');

View File

@@ -31,6 +31,7 @@ use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemException;
use Safe\Exceptions\JsonException; use Safe\Exceptions\JsonException;
use FireflyIII\Support\Facades\FireflyConfig;
use function Safe\json_decode; use function Safe\json_decode;
@@ -107,8 +108,8 @@ class VerifySecurityAlerts extends Command
private function removeOldAdvisory(): void private function removeOldAdvisory(): void
{ {
try { try {
app('fireflyconfig')->delete('upgrade_security_message'); FireflyConfig::delete('upgrade_security_message');
app('fireflyconfig')->delete('upgrade_security_level'); FireflyConfig::delete('upgrade_security_level');
} catch (QueryException $e) { } catch (QueryException $e) {
Log::debug(sprintf('Could not delete old security advisory, but thats OK: %s', $e->getMessage())); Log::debug(sprintf('Could not delete old security advisory, but thats OK: %s', $e->getMessage()));
} }
@@ -117,8 +118,8 @@ class VerifySecurityAlerts extends Command
private function saveSecurityAdvisory(array $array): void private function saveSecurityAdvisory(array $array): void
{ {
try { try {
app('fireflyconfig')->set('upgrade_security_message', $array['message']); FireflyConfig::set('upgrade_security_message', $array['message']);
app('fireflyconfig')->set('upgrade_security_level', $array['level']); FireflyConfig::set('upgrade_security_level', $array['level']);
} catch (QueryException $e) { } catch (QueryException $e) {
Log::debug(sprintf('Could not save new security advisory, but thats OK: %s', $e->getMessage())); Log::debug(sprintf('Could not save new security advisory, but thats OK: %s', $e->getMessage()));
} }

View File

@@ -36,6 +36,7 @@ use FireflyIII\Support\Cronjobs\WebhookCronjob;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use InvalidArgumentException; use InvalidArgumentException;
use FireflyIII\Support\Facades\FireflyConfig;
class Cron extends Command class Cron extends Command
{ {
@@ -72,7 +73,7 @@ class Cron extends Command
$force = (bool) $this->option('force'); // @phpstan-ignore-line $force = (bool) $this->option('force'); // @phpstan-ignore-line
// Fire exchange rates cron job. // Fire exchange rates cron job.
if (true === config('cer.download_enabled') && ($doAll || $this->option('download-cer'))) { if (true === FireflyConfig::get('enable_external_rates', config('cer.download_enabled'))->data && ($doAll || $this->option('download-cer'))) {
try { try {
$this->exchangeRatesCronJob($force, $date); $this->exchangeRatesCronJob($force, $date);
} catch (FireflyException $e) { } catch (FireflyException $e) {

View File

@@ -32,6 +32,7 @@ use Illuminate\Console\Command;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use FireflyIII\Support\Facades\FireflyConfig;
class AddsTransactionIdentifiers extends Command class AddsTransactionIdentifiers extends Command
{ {
@@ -97,7 +98,7 @@ class AddsTransactionIdentifiers extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -157,6 +158,6 @@ class AddsTransactionIdentifiers extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -34,6 +34,7 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use JsonException; use JsonException;
use stdClass; use stdClass;
use FireflyIII\Support\Facades\FireflyConfig;
use function Safe\json_decode; use function Safe\json_decode;
@@ -86,7 +87,7 @@ class RemovesDatabaseDecryption extends Command
$this->friendlyPositive(sprintf('Decrypted the data in table "%s".', $table)); $this->friendlyPositive(sprintf('Decrypted the data in table "%s".', $table));
// mark as decrypted: // mark as decrypted:
$configName = sprintf('is_decrypted_%s', $table); $configName = sprintf('is_decrypted_%s', $table);
app('fireflyconfig')->set($configName, true); FireflyConfig::set($configName, true);
} }
private function isDecrypted(string $table): bool private function isDecrypted(string $table): bool
@@ -95,7 +96,7 @@ class RemovesDatabaseDecryption extends Command
$configVar = null; $configVar = null;
try { try {
$configVar = app('fireflyconfig')->get($configName, false); $configVar = FireflyConfig::get($configName, false);
} catch (FireflyException $e) { } catch (FireflyException $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
} }
@@ -120,7 +121,7 @@ class RemovesDatabaseDecryption extends Command
if (null === $original) { if (null === $original) {
return; return;
} }
$id = (int) $row->id; $id = (int)$row->id;
$value = ''; $value = '';
try { try {
@@ -133,7 +134,7 @@ class RemovesDatabaseDecryption extends Command
} }
// A separate routine for preferences table: // A separate routine for preferences table:
if ('preferences' === $table) { if ('preferences' === $table && is_string($value)) {
$this->decryptPreferencesRow($id, $value); $this->decryptPreferencesRow($id, $value);
return; return;

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* CorrectAccountBalance.php * RepairsAccountBalances.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2024 james@firefly-iii.org.
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
@@ -27,6 +27,7 @@ namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Support\Models\AccountBalanceCalculator; use FireflyIII\Support\Models\AccountBalanceCalculator;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class RepairsAccountBalances extends Command class RepairsAccountBalances extends Command
{ {
@@ -43,7 +44,7 @@ class RepairsAccountBalances extends Command
return 0; return 0;
} }
if (true === config('firefly.feature_flags.running_balance_column')) { if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
$this->friendlyInfo('Will recalculate account balances. This may take a LONG time. Please be patient.'); $this->friendlyInfo('Will recalculate account balances. This may take a LONG time. Please be patient.');
$this->markAsExecuted(); $this->markAsExecuted();
$this->correctBalanceAmounts(); $this->correctBalanceAmounts();
@@ -58,14 +59,14 @@ class RepairsAccountBalances extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool) $configVar?->data; return (bool) $configVar?->data;
} }
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
private function correctBalanceAmounts(): void private function correctBalanceAmounts(): void

View File

@@ -41,7 +41,7 @@ class UpgradeSkeleton extends Command
*/ */
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = \FireflyIII\Support\Facades\FireflyConfig::get(self::CONFIG_NAME, false);
if (null !== $configVar) { if (null !== $configVar) {
return (bool)$configVar->data; return (bool)$configVar->data;
} }
@@ -55,6 +55,6 @@ class UpgradeSkeleton extends Command
*/ */
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); \FireflyIII\Support\Facades\FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -35,6 +35,8 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\Amount;
class UpgradesAccountCurrencies extends Command class UpgradesAccountCurrencies extends Command
{ {
@@ -85,7 +87,7 @@ class UpgradesAccountCurrencies extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool) $configVar?->data; return (bool) $configVar?->data;
} }
@@ -104,7 +106,7 @@ class UpgradesAccountCurrencies extends Command
$accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value]); $accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value]);
// get user's currency preference: // get user's currency preference:
$primaryCurrency = app('amount')->getPrimaryCurrencyByUserGroup($user->userGroup); $primaryCurrency = Amount::getPrimaryCurrencyByUserGroup($user->userGroup);
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
@@ -155,6 +157,6 @@ class UpgradesAccountCurrencies extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountMeta;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesAccountMetaData extends Command class UpgradesAccountMetaData extends Command
{ {
@@ -82,7 +83,7 @@ class UpgradesAccountMetaData extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -90,6 +91,6 @@ class UpgradesAccountMetaData extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -30,6 +30,7 @@ use FireflyIII\Models\Attachment;
use FireflyIII\Models\Note; use FireflyIII\Models\Note;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesAttachments extends Command class UpgradesAttachments extends Command
{ {
@@ -92,7 +93,7 @@ class UpgradesAttachments extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -100,6 +101,6 @@ class UpgradesAttachments extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -36,6 +36,7 @@ use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Preferences; use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesBillsToRules extends Command class UpgradesBillsToRules extends Command
{ {
@@ -99,7 +100,7 @@ class UpgradesBillsToRules extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -206,6 +207,6 @@ class UpgradesBillsToRules extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesBudgetLimitPeriods extends Command class UpgradesBudgetLimitPeriods extends Command
{ {
@@ -58,7 +59,7 @@ class UpgradesBudgetLimitPeriods extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool) $configVar->data; return (bool) $configVar->data;
} }
@@ -152,6 +153,6 @@ class UpgradesBudgetLimitPeriods extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -30,6 +30,8 @@ use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\Amount;
class UpgradesBudgetLimits extends Command class UpgradesBudgetLimits extends Command
{ {
@@ -66,7 +68,7 @@ class UpgradesBudgetLimits extends Command
/** @var null|User $user */ /** @var null|User $user */
$user = $budget->user; $user = $budget->user;
if (null !== $user) { if (null !== $user) {
$currency = app('amount')->getPrimaryCurrencyByUserGroup($user->userGroup); $currency = Amount::getPrimaryCurrencyByUserGroup($user->userGroup);
$budgetLimit->transaction_currency_id = $currency->id; $budgetLimit->transaction_currency_id = $currency->id;
$budgetLimit->save(); $budgetLimit->save();
$this->friendlyInfo( $this->friendlyInfo(
@@ -84,7 +86,7 @@ class UpgradesBudgetLimits extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -92,6 +94,6 @@ class UpgradesBudgetLimits extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -31,6 +31,7 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesCreditCardLiabilities extends Command class UpgradesCreditCardLiabilities extends Command
{ {
@@ -80,13 +81,13 @@ class UpgradesCreditCardLiabilities extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool) $configVar?->data; return (bool) $configVar?->data;
} }
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -33,6 +33,7 @@ use FireflyIII\Support\Facades\Amount;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesCurrencyPreferences extends Command class UpgradesCurrencyPreferences extends Command
{ {
@@ -65,7 +66,7 @@ class UpgradesCurrencyPreferences extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -144,6 +145,6 @@ class UpgradesCurrencyPreferences extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -32,6 +32,7 @@ use FireflyIII\Models\TransactionJournal;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesJournalMetaData extends Command class UpgradesJournalMetaData extends Command
{ {
@@ -69,14 +70,14 @@ class UpgradesJournalMetaData extends Command
private function isMigrated(): bool private function isMigrated(): bool
{ {
$configVar = app('fireflyconfig')->get(UpgradesToGroups::CONFIG_NAME, false); $configVar = FireflyConfig::get(UpgradesToGroups::CONFIG_NAME, false);
return (bool) $configVar->data; return (bool) $configVar->data;
} }
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool) $configVar->data; return (bool) $configVar->data;
} }
@@ -218,6 +219,6 @@ class UpgradesJournalMetaData extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -29,6 +29,7 @@ use FireflyIII\Models\Note;
use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Models\TransactionJournalMeta;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesJournalNotes extends Command class UpgradesJournalNotes extends Command
{ {
@@ -86,7 +87,7 @@ class UpgradesJournalNotes extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -94,6 +95,6 @@ class UpgradesJournalNotes extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Services\Internal\Support\CreditRecalculateService; use FireflyIII\Services\Internal\Support\CreditRecalculateService;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesLiabilities extends Command class UpgradesLiabilities extends Command
{ {
@@ -61,7 +62,7 @@ class UpgradesLiabilities extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -148,6 +149,6 @@ class UpgradesLiabilities extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -36,6 +36,7 @@ use FireflyIII\Services\Internal\Support\CreditRecalculateService;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesLiabilitiesEight extends Command class UpgradesLiabilitiesEight extends Command
{ {
@@ -63,7 +64,7 @@ class UpgradesLiabilitiesEight extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -137,7 +138,7 @@ class UpgradesLiabilitiesEight extends Command
return false; return false;
} }
return (bool) $openingJournal->date->isSameDay($liabilityJournal->date); return (bool)$openingJournal->date->isSameDay($liabilityJournal->date);
} }
private function deleteCreditTransaction(Account $account): void private function deleteCreditTransaction(Account $account): void
@@ -148,7 +149,7 @@ class UpgradesLiabilitiesEight extends Command
->where('transaction_journals.transaction_type_id', $liabilityType->id) ->where('transaction_journals.transaction_type_id', $liabilityType->id)
->first(['transaction_journals.*']) ->first(['transaction_journals.*'])
; ;
if (null !== $liabilityJournal) { if (null !== $liabilityJournal && null !== $liabilityJournal->transactionGroup) {
$group = $liabilityJournal->transactionGroup; $group = $liabilityJournal->transactionGroup;
$service = new TransactionGroupDestroyService(); $service = new TransactionGroupDestroyService();
$service->destroy($group); $service->destroy($group);
@@ -192,11 +193,14 @@ class UpgradesLiabilitiesEight extends Command
->where('transactions.account_id', $account->id)->get(['transaction_journals.*']) ->where('transactions.account_id', $account->id)->get(['transaction_journals.*'])
; ;
$service = app(TransactionGroupDestroyService::class);
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
$service = app(TransactionGroupDestroyService::class); if (null !== $journal->transactionGroup) {
$service->destroy($journal->transactionGroup); $service->destroy($journal->transactionGroup);
++$count; ++$count;
}
} }
return $count; return $count;
@@ -204,6 +208,6 @@ class UpgradesLiabilitiesEight extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -31,6 +31,8 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\Amount;
class UpgradesMultiPiggyBanks extends Command class UpgradesMultiPiggyBanks extends Command
{ {
@@ -64,7 +66,7 @@ class UpgradesMultiPiggyBanks extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -94,7 +96,7 @@ class UpgradesMultiPiggyBanks extends Command
$this->repository->setUser($piggyBank->account->user); $this->repository->setUser($piggyBank->account->user);
$this->accountRepository->setUser($piggyBank->account->user); $this->accountRepository->setUser($piggyBank->account->user);
$repetition = $this->repository->getRepetition($piggyBank, true); $repetition = $this->repository->getRepetition($piggyBank, true);
$currency = $this->accountRepository->getAccountCurrency($piggyBank->account) ?? app('amount')->getPrimaryCurrencyByUserGroup($piggyBank->account->user->userGroup); $currency = $this->accountRepository->getAccountCurrency($piggyBank->account) ?? Amount::getPrimaryCurrencyByUserGroup($piggyBank->account->user->userGroup);
// update piggy bank to have a currency. // update piggy bank to have a currency.
$piggyBank->transaction_currency_id = $currency->id; $piggyBank->transaction_currency_id = $currency->id;
@@ -112,6 +114,6 @@ class UpgradesMultiPiggyBanks extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -28,6 +28,7 @@ namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesPrimaryCurrencyAmounts extends Command class UpgradesPrimaryCurrencyAmounts extends Command
{ {
@@ -60,7 +61,7 @@ class UpgradesPrimaryCurrencyAmounts extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -68,6 +69,6 @@ class UpgradesPrimaryCurrencyAmounts extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -29,6 +29,7 @@ use FireflyIII\Models\Recurrence;
use FireflyIII\Models\RecurrenceMeta; use FireflyIII\Models\RecurrenceMeta;
use FireflyIII\Models\RecurrenceTransactionMeta; use FireflyIII\Models\RecurrenceTransactionMeta;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
use function Safe\json_encode; use function Safe\json_encode;
@@ -65,7 +66,7 @@ class UpgradesRecurrenceMetaData extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -117,6 +118,6 @@ class UpgradesRecurrenceMetaData extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -28,6 +28,7 @@ namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\RuleAction; use FireflyIII\Models\RuleAction;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesRuleActions extends Command class UpgradesRuleActions extends Command
{ {
@@ -63,7 +64,7 @@ class UpgradesRuleActions extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -183,6 +184,6 @@ class UpgradesRuleActions extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\Location; use FireflyIII\Models\Location;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesTagLocations extends Command class UpgradesTagLocations extends Command
{ {
@@ -57,7 +58,7 @@ class UpgradesTagLocations extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -97,6 +98,6 @@ class UpgradesTagLocations extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -39,6 +39,7 @@ use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesToGroups extends Command class UpgradesToGroups extends Command
{ {
@@ -97,7 +98,7 @@ class UpgradesToGroups extends Command
private function isMigrated(): bool private function isMigrated(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -379,6 +380,6 @@ class UpgradesToGroups extends Command
private function markAsMigrated(): void private function markAsMigrated(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -34,6 +34,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesTransferCurrencies extends Command class UpgradesTransferCurrencies extends Command
{ {
@@ -105,7 +106,7 @@ class UpgradesTransferCurrencies extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -480,6 +481,6 @@ class UpgradesTransferCurrencies extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -35,6 +35,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesVariousCurrencyInformation extends Command class UpgradesVariousCurrencyInformation extends Command
{ {
@@ -86,7 +87,7 @@ class UpgradesVariousCurrencyInformation extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -246,6 +247,6 @@ class UpgradesVariousCurrencyInformation extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -34,6 +34,7 @@ use FireflyIII\Models\WebhookDelivery as WebhookDeliveryModel;
use FireflyIII\Models\WebhookResponse as WebhookResponseModel; use FireflyIII\Models\WebhookResponse as WebhookResponseModel;
use FireflyIII\Models\WebhookTrigger as WebhookTriggerModel; use FireflyIII\Models\WebhookTrigger as WebhookTriggerModel;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use FireflyIII\Support\Facades\FireflyConfig;
class UpgradesWebhooks extends Command class UpgradesWebhooks extends Command
{ {
@@ -63,7 +64,7 @@ class UpgradesWebhooks extends Command
private function isExecuted(): bool private function isExecuted(): bool
{ {
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); $configVar = FireflyConfig::get(self::CONFIG_NAME, false);
return (bool)$configVar?->data; return (bool)$configVar?->data;
@@ -109,6 +110,6 @@ class UpgradesWebhooks extends Command
private function markAsExecuted(): void private function markAsExecuted(): void
{ {
app('fireflyconfig')->set(self::CONFIG_NAME, true); FireflyConfig::set(self::CONFIG_NAME, true);
} }
} }

View File

@@ -24,15 +24,20 @@ declare(strict_types=1);
namespace FireflyIII\Events\Model\TransactionGroup; namespace FireflyIII\Events\Model\TransactionGroup;
use FireflyIII\Events\Event; use FireflyIII\Events\Event;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class TriggeredStoredTransactionGroup extends Event class TriggeredStoredTransactionGroup extends Event
{ {
use SerializesModels; use SerializesModels;
public ?RuleGroup $ruleGroup = null;
/** /**
* Create a new event instance. * Create a new event instance.
*/ */
public function __construct(public TransactionGroup $transactionGroup) {} public function __construct(public TransactionGroup $transactionGroup, ?RuleGroup $ruleGroup = null)
{
$this->ruleGroup = $ruleGroup;
}
} }

View File

@@ -42,7 +42,6 @@ use Illuminate\Validation\ValidationException as LaravelValidationException;
use Laravel\Passport\Exceptions\OAuthServerException as LaravelOAuthException; use Laravel\Passport\Exceptions\OAuthServerException as LaravelOAuthException;
use League\OAuth2\Server\Exception\OAuthServerException; use League\OAuth2\Server\Exception\OAuthServerException;
use Override; use Override;
use Sentry\Laravel\Integration;
use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException; use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
@@ -50,6 +49,7 @@ use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Throwable; use Throwable;
use FireflyIII\Support\Facades\Steam;
use function Safe\json_encode; use function Safe\json_encode;
use function Safe\parse_url; use function Safe\parse_url;
@@ -83,14 +83,7 @@ class Handler extends ExceptionHandler
* Register the exception handling callbacks for the application. * Register the exception handling callbacks for the application.
*/ */
#[Override] #[Override]
public function register(): void public function register(): void {}
{
if (true === config('firefly.report_errors_online')) {
$this->reportable(function (Throwable $e): void {
Integration::captureUnhandledException($e);
});
}
}
/** /**
* Render an exception into an HTTP response. It's complex but lucky for us, we never use it because * Render an exception into an HTTP response. It's complex but lucky for us, we never use it because
@@ -287,7 +280,7 @@ class Handler extends ExceptionHandler
protected function invalid($request, LaravelValidationException $exception): \Illuminate\Http\Response|JsonResponse|RedirectResponse protected function invalid($request, LaravelValidationException $exception): \Illuminate\Http\Response|JsonResponse|RedirectResponse
{ {
// protect against open redirect when submitting invalid forms. // protect against open redirect when submitting invalid forms.
$previous = app('steam')->getSafePreviousUrl(); $previous = Steam::getSafePreviousUrl();
$redirect = $this->getRedirectUrl($exception); $redirect = $this->getRedirectUrl($exception);
return redirect($redirect ?? $previous) return redirect($redirect ?? $previous)

View File

@@ -32,6 +32,7 @@ use FireflyIII\Services\Internal\Support\BillServiceTrait;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Amount;
/** /**
* Class BillFactory * Class BillFactory
@@ -51,7 +52,7 @@ class BillFactory
Log::debug(sprintf('Now in %s', __METHOD__), $data); Log::debug(sprintf('Now in %s', __METHOD__), $data);
$factory = app(TransactionCurrencyFactory::class); $factory = app(TransactionCurrencyFactory::class);
$currency = $factory->find((int) ($data['currency_id'] ?? null), (string) ($data['currency_code'] ?? null)) $currency = $factory->find((int) ($data['currency_id'] ?? null), (string) ($data['currency_code'] ?? null))
?? app('amount')->getPrimaryCurrencyByUserGroup($this->user->userGroup); ?? Amount::getPrimaryCurrencyByUserGroup($this->user->userGroup);
try { try {
$skip = array_key_exists('skip', $data) ? $data['skip'] : 0; $skip = array_key_exists('skip', $data) ? $data['skip'] : 0;

View File

@@ -36,6 +36,7 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Amount;
use function Safe\json_encode; use function Safe\json_encode;
@@ -126,7 +127,7 @@ class PiggyBankFactory
private function getCurrency(array $data): TransactionCurrency private function getCurrency(array $data): TransactionCurrency
{ {
// currency: // currency:
$primaryCurrency = app('amount')->getPrimaryCurrency(); $primaryCurrency = Amount::getPrimaryCurrency();
$currency = null; $currency = null;
if (array_key_exists('transaction_currency_code', $data)) { if (array_key_exists('transaction_currency_code', $data)) {
$currency = $this->currencyRepository->findByCode((string)($data['transaction_currency_code'] ?? '')); $currency = $this->currencyRepository->findByCode((string)($data['transaction_currency_code'] ?? ''));

View File

@@ -34,6 +34,7 @@ use FireflyIII\Services\Internal\Update\AccountUpdateService;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class TransactionFactory * Class TransactionFactory
@@ -58,10 +59,10 @@ class TransactionFactory
$foreignAmount = null; $foreignAmount = null;
} }
if (null !== $foreignAmount) { if (null !== $foreignAmount) {
$foreignAmount = app('steam')->negative($foreignAmount); $foreignAmount = Steam::negative($foreignAmount);
} }
return $this->create(app('steam')->negative($amount), $foreignAmount); return $this->create(Steam::negative($amount), $foreignAmount);
} }
/** /**
@@ -170,10 +171,10 @@ class TransactionFactory
$foreignAmount = null; $foreignAmount = null;
} }
if (null !== $foreignAmount) { if (null !== $foreignAmount) {
$foreignAmount = app('steam')->positive($foreignAmount); $foreignAmount = Steam::positive($foreignAmount);
} }
return $this->create(app('steam')->positive($amount), $foreignAmount); return $this->create(Steam::positive($amount), $foreignAmount);
} }
public function setAccount(Account $account): void public function setAccount(Account $account): void

View File

@@ -55,6 +55,7 @@ use FireflyIII\Validation\AccountValidator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use JsonException; use JsonException;
use FireflyIII\Support\Facades\Amount;
use function Safe\json_encode; use function Safe\json_encode;
@@ -251,7 +252,7 @@ class TransactionJournalFactory
$foreignCurrency = $this->getForeignByAccount($type->type, $foreignCurrency, $destinationAccount); $foreignCurrency = $this->getForeignByAccount($type->type, $foreignCurrency, $destinationAccount);
$description = $this->getDescription($description); $description = $this->getDescription($description);
Log::debug(sprintf('Currency is #%d "%s", foreign currency is #%d "%s"', $currency->id, $currency->code, $foreignCurrency?->id, $foreignCurrency)); Log::debug(sprintf('Currency is #%d "%s", foreign currency is #%d "%s"', $currency->id, $currency->code, $foreignCurrency?->id, $foreignCurrency?->code));
Log::debug(sprintf('Date: %s (%s)', $carbon->toW3cString(), $carbon->getTimezone()->getName())); Log::debug(sprintf('Date: %s (%s)', $carbon->toW3cString(), $carbon->getTimezone()->getName()));
/** Create a basic journal. */ /** Create a basic journal. */
@@ -502,7 +503,7 @@ class TransactionJournalFactory
$preference = $this->accountRepository->getAccountCurrency($account); $preference = $this->accountRepository->getAccountCurrency($account);
if (null === $preference && !$currency instanceof TransactionCurrency) { if (null === $preference && !$currency instanceof TransactionCurrency) {
// return user's default: // return user's default:
return app('amount')->getPrimaryCurrencyByUserGroup($this->user->userGroup); return Amount::getPrimaryCurrencyByUserGroup($this->user->userGroup);
} }
$result = $preference ?? $currency; $result = $preference ?? $currency;
Log::debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name)); Log::debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name));

View File

@@ -51,7 +51,7 @@ class TransactionJournalMetaFactory
Log::debug('Is a carbon object.'); Log::debug('Is a carbon object.');
$value = $data['data']->toW3cString(); $value = $data['data']->toW3cString();
} }
if ('' === (string) $value) { if ('' === (string)$value) {
// Log::debug('Is an empty string.'); // Log::debug('Is an empty string.');
// don't store blank strings. // don't store blank strings.
if (null !== $entry) { if (null !== $entry) {

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Generator\Chart\Basic; namespace FireflyIII\Generator\Chart\Basic;
use FireflyIII\Support\ChartColour; use FireflyIII\Support\ChartColour;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class ChartJsGenerator. * Class ChartJsGenerator.
@@ -56,7 +57,7 @@ class ChartJsGenerator implements GeneratorInterface
$index = 0; $index = 0;
foreach ($data as $key => $valueArray) { foreach ($data as $key => $valueArray) {
// make larger than 0 // make larger than 0
$chartData['datasets'][0]['data'][] = app('steam')->positive((string) $valueArray['amount']); $chartData['datasets'][0]['data'][] = Steam::positive((string) $valueArray['amount']);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index); $chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol']; $chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol'];
$chartData['labels'][] = $key; $chartData['labels'][] = $key;
@@ -163,7 +164,7 @@ class ChartJsGenerator implements GeneratorInterface
$index = 0; $index = 0;
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
// make larger than 0 // make larger than 0
$chartData['datasets'][0]['data'][] = app('steam')->positive((string) $value); $chartData['datasets'][0]['data'][] = Steam::positive((string) $value);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index); $chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['labels'][] = $key; $chartData['labels'][] = $key;

View File

@@ -35,6 +35,7 @@ use FireflyIII\Support\Facades\Steam;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Throwable; use Throwable;
use FireflyIII\Support\Facades\Amount;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
@@ -144,7 +145,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
$dayBeforeBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id]; $dayBeforeBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
$startBalance = $dayBeforeBalance['balance']; $startBalance = $dayBeforeBalance['balance'];
$primaryCurrency = app('amount')->getPrimaryCurrencyByUserGroup($account->user->userGroup); $primaryCurrency = Amount::getPrimaryCurrencyByUserGroup($account->user->userGroup);
$currency = $accountRepository->getAccountCurrency($account) ?? $primaryCurrency; $currency = $accountRepository->getAccountCurrency($account) ?? $primaryCurrency;
foreach ($journals as $index => $journal) { foreach ($journals as $index => $journal) {
@@ -153,13 +154,13 @@ class MonthReportGenerator implements ReportGeneratorInterface
// make sure amount is in the right "direction". // make sure amount is in the right "direction".
if ($account->id === $journal['destination_account_id']) { if ($account->id === $journal['destination_account_id']) {
$transactionAmount = app('steam')->positive($journal['amount']); $transactionAmount = Steam::positive($journal['amount']);
} }
if ($currency->id === $journal['foreign_currency_id']) { if ($currency->id === $journal['foreign_currency_id']) {
$transactionAmount = $journal['foreign_amount']; $transactionAmount = $journal['foreign_amount'];
if ($account->id === $journal['destination_account_id']) { if ($account->id === $journal['destination_account_id']) {
$transactionAmount = app('steam')->positive($journal['foreign_amount']); $transactionAmount = Steam::positive($journal['foreign_amount']);
} }
} }
@@ -175,7 +176,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
$journals[$index]['payment_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'payment_date'); $journals[$index]['payment_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'payment_date');
$journals[$index]['invoice_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'invoice_date'); $journals[$index]['invoice_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'invoice_date');
} }
$locale = app('steam')->getLocale(); $locale = Steam::getLocale();
// call is correct. // call is correct.
Log::debug(sprintf('getAuditReport end: Call finalAccountBalance with date/time "%s"', $this->end->toIso8601String())); Log::debug(sprintf('getAuditReport end: Call finalAccountBalance with date/time "%s"', $this->end->toIso8601String()));

View File

@@ -37,6 +37,7 @@ use FireflyIII\Notifications\Test\OwnerTestNotificationPushover;
use FireflyIII\Notifications\Test\OwnerTestNotificationSlack; use FireflyIII\Notifications\Test\OwnerTestNotificationSlack;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class AdminEventHandler. * Class AdminEventHandler.
@@ -45,7 +46,7 @@ class AdminEventHandler
{ {
public function sendInvitationNotification(InvitationCreated $event): void public function sendInvitationNotification(InvitationCreated $event): void
{ {
$sendMail = app('fireflyconfig')->get('notification_invite_created', true)->data; $sendMail = FireflyConfig::get('notification_invite_created', true)->data;
if (false === $sendMail) { if (false === $sendMail) {
return; return;
} }
@@ -96,7 +97,7 @@ class AdminEventHandler
*/ */
public function sendNewVersion(NewVersionAvailable $event): void public function sendNewVersion(NewVersionAvailable $event): void
{ {
$sendMail = app('fireflyconfig')->get('notification_new_version', true)->data; $sendMail = FireflyConfig::get('notification_new_version', true)->data;
if (false === $sendMail) { if (false === $sendMail) {
return; return;
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Events\Model\TransactionGroup\TriggeredStoredTransactionGroup;
use FireflyIII\Events\RequestedSendWebhookMessages; use FireflyIII\Events\RequestedSendWebhookMessages;
use FireflyIII\Events\StoredTransactionGroup; use FireflyIII\Events\StoredTransactionGroup;
use FireflyIII\Generator\Webhook\MessageGeneratorInterface; use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\PeriodStatistic\PeriodStatisticRepositoryInterface; use FireflyIII\Repositories\PeriodStatistic\PeriodStatisticRepositoryInterface;
@@ -46,7 +47,7 @@ class StoredGroupEventHandler
{ {
public function runAllHandlers(StoredTransactionGroup $event): void public function runAllHandlers(StoredTransactionGroup $event): void
{ {
$this->processRules($event); $this->processRules($event, null);
$this->recalculateCredit($event); $this->recalculateCredit($event);
$this->triggerWebhooks($event); $this->triggerWebhooks($event);
$this->removePeriodStatistics($event); $this->removePeriodStatistics($event);
@@ -55,13 +56,13 @@ class StoredGroupEventHandler
public function triggerRulesManually(TriggeredStoredTransactionGroup $event): void public function triggerRulesManually(TriggeredStoredTransactionGroup $event): void
{ {
$newEvent = new StoredTransactionGroup($event->transactionGroup, true, false); $newEvent = new StoredTransactionGroup($event->transactionGroup, true, false);
$this->processRules($newEvent); $this->processRules($newEvent, $event->ruleGroup);
} }
/** /**
* This method grabs all the users rules and processes them. * This method grabs all the users rules and processes them.
*/ */
private function processRules(StoredTransactionGroup $storedGroupEvent): void private function processRules(StoredTransactionGroup $storedGroupEvent, ?RuleGroup $ruleGroup): void
{ {
if (false === $storedGroupEvent->applyRules) { if (false === $storedGroupEvent->applyRules) {
Log::info(sprintf('Will not run rules on group #%d', $storedGroupEvent->transactionGroup->id)); Log::info(sprintf('Will not run rules on group #%d', $storedGroupEvent->transactionGroup->id));
@@ -86,7 +87,14 @@ class StoredGroupEventHandler
// add the groups to the rule engine. // add the groups to the rule engine.
// it should run the rules in the group and cancel the group if necessary. // it should run the rules in the group and cancel the group if necessary.
$groups = $ruleGroupRepository->getRuleGroupsWithRules('store-journal'); if (null === $ruleGroup) {
Log::debug('Fire processRules with ALL store-journal rule groups.');
$groups = $ruleGroupRepository->getRuleGroupsWithRules('store-journal');
}
if (null !== $ruleGroup) {
Log::debug(sprintf('Fire processRules with rule group #%d.', $ruleGroup->id));
$groups = new Collection([$ruleGroup]);
}
// create and fire rule engine. // create and fire rule engine.
$newRuleEngine = app(RuleEngineInterface::class); $newRuleEngine = app(RuleEngineInterface::class);

View File

@@ -57,6 +57,7 @@ use Illuminate\Auth\Events\Login;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class UserEventHandler. * Class UserEventHandler.
@@ -224,7 +225,7 @@ class UserEventHandler
public function sendAdminRegistrationNotification(RegisteredUser $event): void public function sendAdminRegistrationNotification(RegisteredUser $event): void
{ {
$sendMail = (bool)app('fireflyconfig')->get('notification_admin_new_reg', true)->data; $sendMail = (bool)FireflyConfig::get('notification_admin_new_reg', true)->data;
if ($sendMail) { if ($sendMail) {
$owner = $event->owner; $owner = $event->owner;
@@ -367,7 +368,7 @@ class UserEventHandler
*/ */
public function sendRegistrationMail(RegisteredUser $event): void public function sendRegistrationMail(RegisteredUser $event): void
{ {
$sendMail = (bool)app('fireflyconfig')->get('notification_user_new_reg', true)->data; $sendMail = (bool)FireflyConfig::get('notification_user_new_reg', true)->data;
if ($sendMail) { if ($sendMail) {
try { try {
Notification::send($event->user, new UserRegistrationNotification()); Notification::send($event->user, new UserRegistrationNotification());

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\User\UserRepositoryInterface;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class VersionCheckEventHandler * Class VersionCheckEventHandler
@@ -54,7 +55,7 @@ class VersionCheckEventHandler
Log::debug('Now in checkForUpdates()'); Log::debug('Now in checkForUpdates()');
// should not check for updates: // should not check for updates:
$permission = app('fireflyconfig')->get('permission_update_check', -1); $permission = FireflyConfig::get('permission_update_check', -1);
$value = (int) $permission->data; $value = (int) $permission->data;
if (1 !== $value) { if (1 !== $value) {
Log::debug('Update check is not enabled.'); Log::debug('Update check is not enabled.');
@@ -73,7 +74,7 @@ class VersionCheckEventHandler
} }
/** @var Configuration $lastCheckTime */ /** @var Configuration $lastCheckTime */
$lastCheckTime = app('fireflyconfig')->get('last_update_check', Carbon::now()->getTimestamp()); $lastCheckTime = FireflyConfig::get('last_update_check', Carbon::now()->getTimestamp());
$now = Carbon::now()->getTimestamp(); $now = Carbon::now()->getTimestamp();
$diff = $now - $lastCheckTime->data; $diff = $now - $lastCheckTime->data;
Log::debug(sprintf('Last check time is %d, current time is %d, difference is %d', $lastCheckTime->data, $now, $diff)); Log::debug(sprintf('Last check time is %d, current time is %d, difference is %d', $lastCheckTime->data, $now, $diff));
@@ -87,7 +88,7 @@ class VersionCheckEventHandler
$release = $this->getLatestRelease(); $release = $this->getLatestRelease();
session()->flash($release['level'], $release['message']); session()->flash($release['level'], $release['message']);
app('fireflyconfig')->set('last_update_check', Carbon::now()->getTimestamp()); FireflyConfig::set('last_update_check', Carbon::now()->getTimestamp());
} }
/** /**
@@ -107,7 +108,7 @@ class VersionCheckEventHandler
} }
/** @var Configuration $lastCheckTime */ /** @var Configuration $lastCheckTime */
$lastCheckTime = app('fireflyconfig')->get('last_update_warning', Carbon::now()->getTimestamp()); $lastCheckTime = FireflyConfig::get('last_update_warning', Carbon::now()->getTimestamp());
$now = Carbon::now()->getTimestamp(); $now = Carbon::now()->getTimestamp();
$diff = $now - $lastCheckTime->data; $diff = $now - $lastCheckTime->data;
Log::debug(sprintf('Last warning time is %d, current time is %d, difference is %d', $lastCheckTime->data, $now, $diff)); Log::debug(sprintf('Last warning time is %d, current time is %d, difference is %d', $lastCheckTime->data, $now, $diff));
@@ -120,6 +121,6 @@ class VersionCheckEventHandler
Log::debug('Have warned about a new version in four weeks!'); Log::debug('Have warned about a new version in four weeks!');
session()->flash('info', (string) trans('firefly.disabled_but_check')); session()->flash('info', (string) trans('firefly.disabled_but_check'));
app('fireflyconfig')->set('last_update_warning', Carbon::now()->getTimestamp()); FireflyConfig::set('last_update_warning', Carbon::now()->getTimestamp());
} }
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Handlers\Events;
use FireflyIII\Jobs\SendWebhookMessage; use FireflyIII\Jobs\SendWebhookMessage;
use FireflyIII\Models\WebhookMessage; use FireflyIII\Models\WebhookMessage;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class WebhookEventHandler * Class WebhookEventHandler
@@ -39,7 +40,7 @@ class WebhookEventHandler
public function sendWebhookMessages(): void public function sendWebhookMessages(): void
{ {
Log::debug(sprintf('Now in %s', __METHOD__)); Log::debug(sprintf('Now in %s', __METHOD__));
if (false === config('firefly.feature_flags.webhooks') || false === config('firefly.allow_webhooks')) { if (false === config('firefly.feature_flags.webhooks') || false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::debug('Webhook event handler is disabled, do not run sendWebhookMessages().'); Log::debug('Webhook event handler is disabled, do not run sendWebhookMessages().');
return; return;

View File

@@ -52,7 +52,7 @@ class AccountObserver
if (!Amount::convertToPrimary($account->user)) { if (!Amount::convertToPrimary($account->user)) {
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($account->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($account->user->userGroup);
$repository = app(AccountRepositoryInterface::class); $repository = app(AccountRepositoryInterface::class);
$currency = $repository->getAccountCurrency($account); $currency = $repository->getAccountCurrency($account);
if (null !== $currency && $currency->id !== $userCurrency->id && '' !== (string) $account->virtual_balance && 0 !== bccomp($account->virtual_balance, '0')) { if (null !== $currency && $currency->id !== $userCurrency->id && '' !== (string) $account->virtual_balance && 0 !== bccomp($account->virtual_balance, '0')) {

View File

@@ -42,7 +42,7 @@ class AutoBudgetObserver
if (!Amount::convertToPrimary($autoBudget->budget->user)) { if (!Amount::convertToPrimary($autoBudget->budget->user)) {
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($autoBudget->budget->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($autoBudget->budget->user->userGroup);
$autoBudget->native_amount = null; $autoBudget->native_amount = null;
if ($autoBudget->transactionCurrency->id !== $userCurrency->id) { if ($autoBudget->transactionCurrency->id !== $userCurrency->id) {
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();

View File

@@ -44,7 +44,7 @@ class AvailableBudgetObserver
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($availableBudget->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($availableBudget->user->userGroup);
$availableBudget->native_amount = null; $availableBudget->native_amount = null;
if ($availableBudget->transactionCurrency->id !== $userCurrency->id) { if ($availableBudget->transactionCurrency->id !== $userCurrency->id) {
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();

View File

@@ -46,7 +46,7 @@ class BillObserver
if (!Amount::convertToPrimary($bill->user)) { if (!Amount::convertToPrimary($bill->user)) {
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($bill->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($bill->user->userGroup);
$bill->native_amount_min = null; $bill->native_amount_min = null;
$bill->native_amount_max = null; $bill->native_amount_max = null;
if ($bill->transactionCurrency->id !== $userCurrency->id) { if ($bill->transactionCurrency->id !== $userCurrency->id) {

View File

@@ -72,7 +72,7 @@ class BudgetLimitObserver
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($budgetLimit->budget->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($budgetLimit->budget->user->userGroup);
$budgetLimit->native_amount = null; $budgetLimit->native_amount = null;
if ($budgetLimit->transactionCurrency->id !== $userCurrency->id) { if ($budgetLimit->transactionCurrency->id !== $userCurrency->id) {
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();

View File

@@ -48,7 +48,7 @@ class PiggyBankEventObserver
if (!Amount::convertToPrimary($user)) { if (!Amount::convertToPrimary($user)) {
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($event->piggyBank->accounts()->first()->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($event->piggyBank->accounts()->first()->user->userGroup);
$event->native_amount = null; $event->native_amount = null;
if ($event->piggyBank->transactionCurrency->id !== $userCurrency->id) { if ($event->piggyBank->transactionCurrency->id !== $userCurrency->id) {
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();

View File

@@ -29,6 +29,7 @@ use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Support\Http\Api\ExchangeRateConverter; use FireflyIII\Support\Http\Api\ExchangeRateConverter;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Amount;
/** /**
* Class PiggyBankObserver * Class PiggyBankObserver
@@ -49,7 +50,7 @@ class PiggyBankObserver
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($group); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($group);
$piggyBank->native_target_amount = null; $piggyBank->native_target_amount = null;
if ($piggyBank->transactionCurrency->id !== $userCurrency->id) { if ($piggyBank->transactionCurrency->id !== $userCurrency->id) {
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();

View File

@@ -24,7 +24,9 @@ declare(strict_types=1);
namespace FireflyIII\Handlers\Observer; namespace FireflyIII\Handlers\Observer;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Http\Api\ExchangeRateConverter; use FireflyIII\Support\Http\Api\ExchangeRateConverter;
use FireflyIII\Support\Models\AccountBalanceCalculator; use FireflyIII\Support\Models\AccountBalanceCalculator;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -39,9 +41,12 @@ class TransactionObserver
public function created(Transaction $transaction): void public function created(Transaction $transaction): void
{ {
Log::debug('Observe "created" of a transaction.'); Log::debug('Observe "created" of a transaction.');
if (true === config('firefly.feature_flags.running_balance_column') && (1 === bccomp($transaction->amount, '0') && self::$recalculate)) { if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data && (1 === bccomp($transaction->amount, '0') && self::$recalculate)) {
Log::debug('Trigger recalculateForJournal'); Log::debug('Trigger recalculateForJournal');
AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal); $journal = $transaction->transactionJournal;
if ($journal instanceof TransactionJournal) {
AccountBalanceCalculator::recalculateForJournal($journal);
}
} }
$this->updatePrimaryCurrencyAmount($transaction); $this->updatePrimaryCurrencyAmount($transaction);
} }
@@ -51,11 +56,14 @@ class TransactionObserver
if (!Amount::convertToPrimary($transaction->transactionJournal->user)) { if (!Amount::convertToPrimary($transaction->transactionJournal->user)) {
return; return;
} }
$userCurrency = app('amount')->getPrimaryCurrencyByUserGroup($transaction->transactionJournal->user->userGroup); $userCurrency = Amount::getPrimaryCurrencyByUserGroup($transaction->transactionJournal->user->userGroup);
$transaction->native_amount = null; $transaction->native_amount = null;
$transaction->native_foreign_amount = null; $transaction->native_foreign_amount = null;
// first normal amount // first normal amount
if ($transaction->transactionCurrency->id !== $userCurrency->id && (null === $transaction->foreign_currency_id || (null !== $transaction->foreign_currency_id && $transaction->foreign_currency_id !== $userCurrency->id))) { if ($transaction->transactionCurrency->id !== $userCurrency->id
&& (null === $transaction->foreign_currency_id
|| (null !== $transaction->foreign_currency_id
&& $transaction->foreign_currency_id !== $userCurrency->id))) {
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();
$converter->setUserGroup($transaction->transactionJournal->user->userGroup); $converter->setUserGroup($transaction->transactionJournal->user->userGroup);
$converter->setIgnoreSettings(true); $converter->setIgnoreSettings(true);
@@ -82,7 +90,7 @@ class TransactionObserver
public function updated(Transaction $transaction): void public function updated(Transaction $transaction): void
{ {
// Log::debug('Observe "updated" of a transaction.'); // Log::debug('Observe "updated" of a transaction.');
if (true === config('firefly.feature_flags.running_balance_column') && self::$recalculate && 1 === bccomp($transaction->amount, '0')) { if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data && self::$recalculate && 1 === bccomp($transaction->amount, '0')) {
Log::debug('Trigger recalculateForJournal'); Log::debug('Trigger recalculateForJournal');
AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal); AccountBalanceCalculator::recalculateForJournal($transaction->transactionJournal);
} }

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Helpers\Collector\Extensions;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use FireflyIII\Support\Facades\Steam;
/** /**
* Trait AmountCollection * Trait AmountCollection
@@ -39,7 +40,7 @@ trait AmountCollection
{ {
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->where('source.amount', app('steam')->negative($amount)); $q->where('source.amount', Steam::negative($amount));
} }
); );
@@ -50,7 +51,7 @@ trait AmountCollection
{ {
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->where('source.amount', '!=', app('steam')->negative($amount)); $q->where('source.amount', '!=', Steam::negative($amount));
} }
); );
@@ -64,7 +65,7 @@ trait AmountCollection
{ {
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->where('destination.amount', '<=', app('steam')->positive($amount)); $q->where('destination.amount', '<=', Steam::positive($amount));
} }
); );
@@ -78,7 +79,7 @@ trait AmountCollection
{ {
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->where('destination.amount', '>=', app('steam')->positive($amount)); $q->where('destination.amount', '>=', Steam::positive($amount));
} }
); );
@@ -93,7 +94,7 @@ trait AmountCollection
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->whereNotNull('source.foreign_amount'); $q->whereNotNull('source.foreign_amount');
$q->where('source.foreign_amount', app('steam')->negative($amount)); $q->where('source.foreign_amount', Steam::negative($amount));
} }
); );
@@ -108,7 +109,7 @@ trait AmountCollection
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->whereNull('source.foreign_amount'); $q->whereNull('source.foreign_amount');
$q->orWhere('source.foreign_amount', '!=', app('steam')->negative($amount)); $q->orWhere('source.foreign_amount', '!=', Steam::negative($amount));
} }
); );
@@ -123,7 +124,7 @@ trait AmountCollection
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->whereNotNull('destination.foreign_amount'); $q->whereNotNull('destination.foreign_amount');
$q->where('destination.foreign_amount', '<=', app('steam')->positive($amount)); $q->where('destination.foreign_amount', '<=', Steam::positive($amount));
} }
); );
@@ -138,7 +139,7 @@ trait AmountCollection
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line static function (EloquentBuilder $q) use ($amount): void { // @phpstan-ignore-line
$q->whereNotNull('destination.foreign_amount'); $q->whereNotNull('destination.foreign_amount');
$q->where('destination.foreign_amount', '>=', app('steam')->positive($amount)); $q->where('destination.foreign_amount', '>=', Steam::positive($amount));
} }
); );

View File

@@ -66,7 +66,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int) $currencyId); $currency = $repos->find((int)$currencyId);
} }
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
@@ -98,7 +98,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int) $currencyId); $currency = $repos->find((int)$currencyId);
} }
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
@@ -135,7 +135,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int) $currencyId); $currency = $repos->find((int)$currencyId);
} }
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
@@ -174,9 +174,10 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int) $currencyId); $currency = $repos->find((int)$currencyId);
} }
/** @var JournalRepositoryInterface $repository */ /** @var JournalRepositoryInterface $repository */
$repository = app(JournalRepositoryInterface::class); $repository = app(JournalRepositoryInterface::class);
$repository->setUser($account->user); $repository->setUser($account->user);
@@ -187,11 +188,11 @@ class PopupReport implements PopupReportInterface
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
// set report accounts + the request accounts: // the source account must be in the set.
// $set = $attributes['accounts'] ?? new Collection; $set = $attributes['accounts'] ?? new Collection();
// $set->push($account);
$collector->setDestinationAccounts(new Collection()->push($account)) $collector->setDestinationAccounts(new Collection()->push($account))
->setSourceAccounts($set)
->setRange($attributes['startDate'], $attributes['endDate']) ->setRange($attributes['startDate'], $attributes['endDate'])
->withAccountInformation() ->withAccountInformation()
->withBudgetInformation() ->withBudgetInformation()

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Helpers\Update;
use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequestInterface; use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequestInterface;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Trait UpdateTrait * Trait UpdateTrait
@@ -43,7 +44,7 @@ trait UpdateTrait
/** @var UpdateRequestInterface $checker */ /** @var UpdateRequestInterface $checker */
$checker = app(UpdateRequestInterface::class); $checker = app(UpdateRequestInterface::class);
$channelConfig = app('fireflyconfig')->get('update_channel', 'stable'); $channelConfig = FireflyConfig::get('update_channel', 'stable');
$channel = (string) $channelConfig->data; $channel = (string) $channelConfig->data;
return $checker->getUpdateInformation($channel); return $checker->getUpdateInformation($channel);

View File

@@ -38,6 +38,7 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Redirector; use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\View\View; use Illuminate\View\View;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class EditController * Class EditController
@@ -148,9 +149,9 @@ class EditController extends Controller
'BIC' => $repository->getMetaValue($account, 'BIC'), 'BIC' => $repository->getMetaValue($account, 'BIC'),
'opening_balance_date' => substr((string) $openingBalanceDate, 0, 10), 'opening_balance_date' => substr((string) $openingBalanceDate, 0, 10),
'liability_type_id' => $account->account_type_id, 'liability_type_id' => $account->account_type_id,
'opening_balance' => app('steam')->bcround($openingBalanceAmount, $currency->decimal_places), 'opening_balance' => Steam::bcround($openingBalanceAmount, $currency->decimal_places),
'liability_direction' => $this->repository->getMetaValue($account, 'liability_direction'), 'liability_direction' => $this->repository->getMetaValue($account, 'liability_direction'),
'virtual_balance' => app('steam')->bcround($virtualBalance, $currency->decimal_places), 'virtual_balance' => Steam::bcround($virtualBalance, $currency->decimal_places),
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'include_net_worth' => $hasOldInput ? (bool) $request->old('include_net_worth') : $includeNetWorth, 'include_net_worth' => $hasOldInput ? (bool) $request->old('include_net_worth') : $includeNetWorth,
'interest' => $repository->getMetaValue($account, 'interest'), 'interest' => $repository->getMetaValue($account, 'interest'),

View File

@@ -23,11 +23,11 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Requests\ConfigurationRequest; use FireflyIII\Http\Requests\ConfigurationRequest;
use FireflyIII\Support\Facades\FireflyConfig; use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -47,7 +47,7 @@ class ConfigurationController extends Controller
$this->middleware( $this->middleware(
static function ($request, $next) { static function ($request, $next) {
app('view')->share('title', (string) trans('firefly.system_settings')); app('view')->share('title', (string)trans('firefly.system_settings'));
app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
return $next($request); return $next($request);
@@ -63,20 +63,39 @@ class ConfigurationController extends Controller
*/ */
public function index(): Factory|\Illuminate\Contracts\View\View public function index(): Factory|\Illuminate\Contracts\View\View
{ {
$subTitle = (string) trans('firefly.instance_configuration'); $subTitle = (string)trans('firefly.instance_configuration');
$subTitleIcon = 'fa-wrench'; $subTitleIcon = 'fa-wrench';
Log::channel('audit')->info('User visits admin config index.'); Log::channel('audit')->info('User visits admin config index.');
// all available configuration and their default value in case // all available configuration and their default value in case
// they don't exist yet. // they don't exist yet.
$singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; $isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$siteOwner = config('firefly.site_owner'); $siteOwner = config('firefly.site_owner');
$enableExchangeRates = FireflyConfig::get('enable_exchange_rates', config('cer.enabled'))->data;
$useRunningBalance = FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data;
$enableExternalMap = FireflyConfig::get('enable_external_map', config('firefly.enable_external_map'))->data;
$enableExternalRates = FireflyConfig::get('enable_external_rates', config('cer.download_enabled'))->data;
$allowWebhooks = FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data;
$validUrlProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
return view( return view(
'settings.configuration.index', 'settings.configuration.index',
['subTitle' => $subTitle, 'subTitleIcon' => $subTitleIcon, 'singleUserMode' => $singleUserMode, 'isDemoSite' => $isDemoSite, 'siteOwner' => $siteOwner] [
'subTitle' => $subTitle,
'subTitleIcon' => $subTitleIcon,
'singleUserMode' => $singleUserMode,
'isDemoSite' => $isDemoSite,
'siteOwner' => $siteOwner,
'enableExchangeRates' => $enableExchangeRates,
'useRunningBalance' => $useRunningBalance,
'enableExternalMap' => $enableExternalMap,
'enableExternalRates' => $enableExternalRates,
'allowWebhooks' => $allowWebhooks,
'validUrlProtocols' => $validUrlProtocols,
]
); );
} }
@@ -92,10 +111,19 @@ class ConfigurationController extends Controller
// store config values // store config values
FireflyConfig::set('single_user_mode', $data['single_user_mode']); FireflyConfig::set('single_user_mode', $data['single_user_mode']);
FireflyConfig::set('enable_exchange_rates', $data['enable_exchange_rates']);
FireflyConfig::set('use_running_balance', $data['use_running_balance']);
FireflyConfig::set('enable_external_map', $data['enable_external_map']);
FireflyConfig::set('enable_external_rates', $data['enable_external_rates']);
FireflyConfig::set('allow_webhooks', $data['allow_webhooks']);
FireflyConfig::set('valid_url_protocols', $data['valid_url_protocols']);
FireflyConfig::set('is_demo_site', $data['is_demo_site']); FireflyConfig::set('is_demo_site', $data['is_demo_site']);
// flash message // flash message
session()->flash('success', (string) trans('firefly.configuration_updated')); session()->flash('success', (string)trans('firefly.configuration_updated'));
Preferences::mark(); Preferences::mark();
return redirect()->route('settings.configuration.index'); return redirect()->route('settings.configuration.index');

View File

@@ -42,6 +42,7 @@ use Illuminate\Routing\Redirector;
use Illuminate\View\View; use Illuminate\View\View;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class UserController. * Class UserController.
@@ -164,7 +165,7 @@ class UserController extends Controller
$subTitle = (string) trans('firefly.user_administration'); $subTitle = (string) trans('firefly.user_administration');
$subTitleIcon = 'fa-users'; $subTitleIcon = 'fa-users';
$users = $this->repository->all(); $users = $this->repository->all();
$singleUserMode = (bool) app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = (bool) FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$allowInvites = false; $allowInvites = false;
if (!$this->externalIdentity && $singleUserMode) { if (!$this->externalIdentity && $singleUserMode) {
// also registration enabled. // also registration enabled.

View File

@@ -36,6 +36,7 @@ use Illuminate\View\View;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use Safe\Exceptions\UrlException; use Safe\Exceptions\UrlException;
use FireflyIII\Support\Facades\FireflyConfig;
use function Safe\parse_url; use function Safe\parse_url;
@@ -142,7 +143,7 @@ class ForgotPasswordController extends Controller
} }
// is allowed to? // is allowed to?
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$userCount = User::count(); $userCount = User::count();
$allowRegistration = true; $allowRegistration = true;
$pageTitle = (string) trans('firefly.forgot_pw_page_title'); $pageTitle = (string) trans('firefly.forgot_pw_page_title');

View File

@@ -31,6 +31,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Providers\RouteServiceProvider; use FireflyIII\Providers\RouteServiceProvider;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
@@ -49,6 +50,7 @@ use Illuminate\Validation\ValidationException;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\HttpFoundation\Response as ResponseAlias; use Symfony\Component\HttpFoundation\Response as ResponseAlias;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class LoginController * Class LoginController
@@ -132,7 +134,7 @@ class LoginController extends Controller
return $this->sendLoginResponse($request); return $this->sendLoginResponse($request);
} }
Log::warning('Login attempt failed.'); Log::warning('Login attempt failed.');
$username = (string) $request->get($this->username()); $username = (string)$request->get($this->username());
$user = $this->repository->findByEmail($username); $user = $this->repository->findByEmail($username);
if (!$user instanceof User) { if (!$user instanceof User) {
// send event to owner. // send event to owner.
@@ -228,14 +230,14 @@ class LoginController extends Controller
$count = DB::table('users')->count(); $count = DB::table('users')->count();
$guard = config('auth.defaults.guard'); $guard = config('auth.defaults.guard');
$title = (string) trans('firefly.login_page_title'); $title = (string)trans('firefly.login_page_title');
if (0 === $count && 'web' === $guard) { if (0 === $count && 'web' === $guard) {
return redirect(route('register')); return redirect(route('register'));
} }
// is allowed to register, etc. // is allowed to register, etc.
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$allowRegistration = true; $allowRegistration = true;
$allowReset = true; $allowReset = true;
if (true === $singleUserMode && $count > 0) { if (true === $singleUserMode && $count > 0) {
@@ -260,4 +262,23 @@ class LoginController extends Controller
return view('auth.login', ['allowRegistration' => $allowRegistration, 'email' => $email, 'remember' => $remember, 'allowReset' => $allowReset, 'title' => $title, 'usernameField' => $usernameField]); return view('auth.login', ['allowRegistration' => $allowRegistration, 'email' => $email, 'remember' => $remember, 'allowReset' => $allowReset, 'title' => $title, 'usernameField' => $usernameField]);
} }
/**
* Send the response after the user was authenticated.
*
* @return JsonResponse|RedirectResponse
*/
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
if ($response = $this->authenticated($request, $this->guard()->user())) {
return $response;
}
$path = Steam::getSafeUrl(session()->pull('url.intended', route('index')), route('index'));
Log::debug(sprintf('SafeURL is %s', $path));
return $request->wantsJson() ? new JsonResponse([], 204) : redirect()->to($path);
}
} }

View File

@@ -41,6 +41,7 @@ use Illuminate\Validation\ValidationException;
use Illuminate\View\View; use Illuminate\View\View;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class RegisterController * Class RegisterController
@@ -121,7 +122,7 @@ class RegisterController extends Controller
$allowRegistration = true; $allowRegistration = true;
try { try {
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
} catch (ContainerExceptionInterface|NotFoundExceptionInterface) { } catch (ContainerExceptionInterface|NotFoundExceptionInterface) {
$singleUserMode = true; $singleUserMode = true;
} }
@@ -148,7 +149,7 @@ class RegisterController extends Controller
*/ */
public function showInviteForm(Request $request, string $code): Factory|\Illuminate\Contracts\View\View public function showInviteForm(Request $request, string $code): Factory|\Illuminate\Contracts\View\View
{ {
$isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; $isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$pageTitle = (string) trans('firefly.register_page_title'); $pageTitle = (string) trans('firefly.register_page_title');
$repository = app(UserRepositoryInterface::class); $repository = app(UserRepositoryInterface::class);
$allowRegistration = $this->allowedToRegister(); $allowRegistration = $this->allowedToRegister();
@@ -182,7 +183,7 @@ class RegisterController extends Controller
*/ */
public function showRegistrationForm(?Request $request = null): Factory|\Illuminate\Contracts\View\View public function showRegistrationForm(?Request $request = null): Factory|\Illuminate\Contracts\View\View
{ {
$isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; $isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$pageTitle = (string) trans('firefly.register_page_title'); $pageTitle = (string) trans('firefly.register_page_title');
$allowRegistration = $this->allowedToRegister(); $allowRegistration = $this->allowedToRegister();

View File

@@ -36,6 +36,7 @@ use Illuminate\Validation\ValidationException;
use Illuminate\View\View; use Illuminate\View\View;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use FireflyIII\Support\Facades\FireflyConfig;
/** /**
* Class ResetPasswordController * Class ResetPasswordController
@@ -131,7 +132,7 @@ class ResetPasswordController extends Controller
} }
// is allowed to register? // is allowed to register?
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$userCount = User::count(); $userCount = User::count();
$allowRegistration = true; $allowRegistration = true;
$pageTitle = (string) trans('firefly.reset_pw_page_title'); $pageTitle = (string) trans('firefly.reset_pw_page_title');

View File

@@ -35,6 +35,7 @@ use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class EditController * Class EditController
@@ -84,8 +85,8 @@ class EditController extends Controller
$this->rememberPreviousUrl('bills.edit.url'); $this->rememberPreviousUrl('bills.edit.url');
} }
$bill->amount_min = app('steam')->bcround($bill->amount_min, $bill->transactionCurrency->decimal_places); $bill->amount_min = Steam::bcround($bill->amount_min, $bill->transactionCurrency->decimal_places);
$bill->amount_max = app('steam')->bcround($bill->amount_max, $bill->transactionCurrency->decimal_places); $bill->amount_max = Steam::bcround($bill->amount_max, $bill->transactionCurrency->decimal_places);
$rules = $this->repository->getRulesForBill($bill); $rules = $this->repository->getRulesForBill($bill);
// code to handle active-checkboxes // code to handle active-checkboxes

View File

@@ -44,6 +44,8 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Redirector; use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View; use Illuminate\View\View;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Facades\Amount;
/** /**
* Class BudgetLimitController * Class BudgetLimitController
@@ -204,14 +206,14 @@ class BudgetLimitController extends Controller
// add some extra metadata: // add some extra metadata:
$spentArr = $this->opsRepository->sumExpenses($limit->start_date, $limit->end_date, null, new Collection()->push($budget), $currency); $spentArr = $this->opsRepository->sumExpenses($limit->start_date, $limit->end_date, null, new Collection()->push($budget), $currency);
$array['spent'] = $spentArr[$currency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$currency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], (string) $array['amount'])); $array['left_formatted'] = Amount::formatAnything($limit->transactionCurrency, bcadd($array['spent'], (string) $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = Amount::formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string) $this->activeDaysLeft($start, $end); $array['days_left'] = (string) $this->activeDaysLeft($start, $end);
// left per day: // left per day:
$array['left_per_day'] = 0 === bccomp('0', $array['days_left']) ? bcadd((string) $array['spent'], (string) $array['amount']) : bcdiv(bcadd((string) $array['spent'], (string) $array['amount']), $array['days_left']); $array['left_per_day'] = 0 === bccomp('0', $array['days_left']) ? bcadd((string) $array['spent'], (string) $array['amount']) : bcdiv(bcadd((string) $array['spent'], (string) $array['amount']), $array['days_left']);
// left per day formatted. // left per day formatted.
$array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']); $array['left_per_day_formatted'] = Amount::formatAnything($limit->transactionCurrency, $array['left_per_day']);
// notes: // notes:
$array['notes'] = $this->blRepository->getNoteText($limit); $array['notes'] = $this->blRepository->getNoteText($limit);
@@ -238,8 +240,8 @@ class BudgetLimitController extends Controller
$this->blRepository->destroyBudgetLimit($budgetLimit); $this->blRepository->destroyBudgetLimit($budgetLimit);
$array = [ $array = [
'budget_id' => $budgetId, 'budget_id' => $budgetId,
'left_formatted' => app('amount')->formatAnything($currency, '0'), 'left_formatted' => Amount::formatAnything($currency, '0'),
'left_per_day_formatted' => app('amount')->formatAnything($currency, '0'), 'left_per_day_formatted' => Amount::formatAnything($currency, '0'),
'transaction_currency_id' => $currency->id, 'transaction_currency_id' => $currency->id,
]; ];
@@ -268,14 +270,14 @@ class BudgetLimitController extends Controller
); );
$daysLeft = $this->activeDaysLeft($limit->start_date, $limit->end_date); $daysLeft = $this->activeDaysLeft($limit->start_date, $limit->end_date);
$array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], (string) $array['amount'])); $array['left_formatted'] = Amount::formatAnything($limit->transactionCurrency, bcadd($array['spent'], (string) $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = Amount::formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string) $daysLeft; $array['days_left'] = (string) $daysLeft;
$array['left_per_day'] = 0 === $daysLeft ? bcadd((string) $array['spent'], (string) $array['amount']) : bcdiv(bcadd((string) $array['spent'], (string) $array['amount']), $array['days_left']); $array['left_per_day'] = 0 === $daysLeft ? bcadd((string) $array['spent'], (string) $array['amount']) : bcdiv(bcadd((string) $array['spent'], (string) $array['amount']), $array['days_left']);
// left per day formatted. // left per day formatted.
$array['amount'] = app('steam')->bcround($limit['amount'], $limit->transactionCurrency->decimal_places); $array['amount'] = Steam::bcround($limit['amount'], $limit->transactionCurrency->decimal_places);
$array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']); $array['left_per_day_formatted'] = Amount::formatAnything($limit->transactionCurrency, $array['left_per_day']);
if ('true' === $request->get('redirect')) { if ('true' === $request->get('redirect')) {
return redirect(route('budgets.index')); return redirect(route('budgets.index'));
} }

View File

@@ -37,6 +37,7 @@ use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\View\View; use Illuminate\View\View;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class EditController * Class EditController
@@ -104,7 +105,7 @@ class EditController extends Controller
$amount = '0'; $amount = '0';
} }
$amount = (string) $amount; $amount = (string) $amount;
$preFilled['auto_budget_amount'] = app('steam')->bcround($amount, $autoBudget->transactionCurrency->decimal_places); $preFilled['auto_budget_amount'] = Steam::bcround($amount, $autoBudget->transactionCurrency->decimal_places);
} }
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").

View File

@@ -46,6 +46,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\View\View; use Illuminate\View\View;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class IndexController * Class IndexController
@@ -203,7 +204,7 @@ class IndexController extends Controller
foreach ($budgetLimits as $limit) { foreach ($budgetLimits as $limit) {
Log::debug(sprintf('Working on budget limit #%d', $limit->id)); Log::debug(sprintf('Working on budget limit #%d', $limit->id));
$currency = $limit->transactionCurrency ?? $primaryCurrency; $currency = $limit->transactionCurrency ?? $primaryCurrency;
$amount = app('steam')->bcround($limit->amount, $currency->decimal_places); $amount = Steam::bcround($limit->amount, $currency->decimal_places);
$array['budgeted'][] = [ $array['budgeted'][] = [
'id' => $limit->id, 'id' => $limit->id,
'amount' => $amount, 'amount' => $amount,

View File

@@ -31,6 +31,7 @@ use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Support\CacheProperties; use FireflyIII\Support\CacheProperties;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class BillController. * Class BillController.
@@ -113,7 +114,7 @@ class BillController extends Controller
if ($cache->has()) { if ($cache->has()) {
return response()->json($cache->get()); return response()->json($cache->get());
} }
$locale = app('steam')->getLocale(); $locale = Steam::getLocale();
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);

View File

@@ -44,6 +44,7 @@ use FireflyIII\Support\Http\Controllers\DateCalculation;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class BudgetController. * Class BudgetController.
@@ -166,7 +167,7 @@ class BudgetController extends Controller
if ($cache->has()) { if ($cache->has()) {
return response()->json($cache->get()); return response()->json($cache->get());
} }
$locale = app('steam')->getLocale(); $locale = Steam::getLocale();
$entries = []; $entries = [];
$amount = $budgetLimit->amount ?? '0'; $amount = $budgetLimit->amount ?? '0';
$budgetCollection = new Collection()->push($budget); $budgetCollection = new Collection()->push($budget);
@@ -531,13 +532,13 @@ class BudgetController extends Controller
// get budget limit in this period for this currency. // get budget limit in this period for this currency.
$limit = $this->blRepository->find($budget, $currency, $currentStart, $currentEnd); $limit = $this->blRepository->find($budget, $currency, $currentStart, $currentEnd);
if ($limit instanceof BudgetLimit) { if ($limit instanceof BudgetLimit) {
$chartData[1]['entries'][$title] = app('steam')->bcround($limit->amount, $currency->decimal_places); $chartData[1]['entries'][$title] = Steam::bcround($limit->amount, $currency->decimal_places);
} }
// get spent amount in this period for this currency. // get spent amount in this period for this currency.
$sum = $this->opsRepository->sumExpenses($currentStart, $currentEnd, $accounts, new Collection()->push($budget), $currency); $sum = $this->opsRepository->sumExpenses($currentStart, $currentEnd, $accounts, new Collection()->push($budget), $currency);
$amount = app('steam')->positive($sum[$currency->id]['sum'] ?? '0'); $amount = Steam::positive($sum[$currency->id]['sum'] ?? '0');
$chartData[0]['entries'][$title] = app('steam')->bcround($amount, $currency->decimal_places); $chartData[0]['entries'][$title] = Steam::bcround($amount, $currency->decimal_places);
$currentStart = clone $currentEnd; $currentStart = clone $currentEnd;
$currentStart->addDay()->startOfDay(); $currentStart->addDay()->startOfDay();
@@ -574,8 +575,8 @@ class BudgetController extends Controller
$currentEnd = Navigation::endOfPeriod($currentStart, $preferredRange); $currentEnd = Navigation::endOfPeriod($currentStart, $preferredRange);
$title = $currentStart->isoFormat($titleFormat); $title = $currentStart->isoFormat($titleFormat);
$sum = $this->nbRepository->sumExpenses($currentStart, $currentEnd, $accounts, $currency); $sum = $this->nbRepository->sumExpenses($currentStart, $currentEnd, $accounts, $currency);
$amount = app('steam')->positive($sum[$currency->id]['sum'] ?? '0'); $amount = Steam::positive($sum[$currency->id]['sum'] ?? '0');
$chartData[$title] = app('steam')->bcround($amount, $currency->decimal_places); $chartData[$title] = Steam::bcround($amount, $currency->decimal_places);
$currentStart = Navigation::addPeriod($currentStart, $preferredRange, 0); $currentStart = Navigation::addPeriod($currentStart, $preferredRange, 0);
} }

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Support\CacheProperties; use FireflyIII\Support\CacheProperties;
use FireflyIII\Support\Http\Controllers\DateCalculation; use FireflyIII\Support\Http\Controllers\DateCalculation;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use FireflyIII\Support\Facades\Steam;
/** /**
* Class PiggyBankController. * Class PiggyBankController.
@@ -70,7 +71,7 @@ class PiggyBankController extends Controller
} }
$set = $repository->getEvents($piggyBank); $set = $repository->getEvents($piggyBank);
$set = $set->reverse(); $set = $set->reverse();
$locale = app('steam')->getLocale(); $locale = Steam::getLocale();
// get first event or start date of piggy bank or today // get first event or start date of piggy bank or today
$startDate = $piggyBank->start_date ?? today(config('app.timezone')); $startDate = $piggyBank->start_date ?? today(config('app.timezone'));

View File

@@ -38,6 +38,7 @@ use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\View;
use FireflyIII\Support\Facades\FireflyConfig;
use function Safe\ini_get; use function Safe\ini_get;
use function Safe\realpath; use function Safe\realpath;
@@ -71,7 +72,7 @@ abstract class Controller extends BaseController
public function __construct() public function __construct()
{ {
// is site a demo site? // is site a demo site?
$isDemoSiteConfig = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site', false)); $isDemoSiteConfig = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site', false));
$isDemoSite = (bool) $isDemoSiteConfig->data; $isDemoSite = (bool) $isDemoSiteConfig->data;
View::share('IS_DEMO_SITE', $isDemoSite); View::share('IS_DEMO_SITE', $isDemoSite);
View::share('DEMO_USERNAME', config('firefly.demo_username')); View::share('DEMO_USERNAME', config('firefly.demo_username'));
@@ -80,7 +81,7 @@ abstract class Controller extends BaseController
View::share('FF_BUILD_TIME', config('firefly.build_time')); View::share('FF_BUILD_TIME', config('firefly.build_time'));
// is webhooks enabled? // is webhooks enabled?
View::share('featuringWebhooks', true === config('firefly.feature_flags.webhooks') && true === config('firefly.allow_webhooks')); View::share('featuringWebhooks', true === config('firefly.feature_flags.webhooks') && true === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data);
// share custom auth guard info. // share custom auth guard info.
$authGuard = config('firefly.authentication_guard'); $authGuard = config('firefly.authentication_guard');

View File

@@ -51,6 +51,7 @@ use Illuminate\View\View;
use Monolog\Handler\RotatingFileHandler; use Monolog\Handler\RotatingFileHandler;
use Safe\Exceptions\FilesystemException; use Safe\Exceptions\FilesystemException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
use function Safe\file_get_contents; use function Safe\file_get_contents;
use function Safe\ini_get; use function Safe\ini_get;
@@ -241,7 +242,7 @@ class DebugController extends Controller
{ {
$userGuard = config('auth.defaults.guard'); $userGuard = config('auth.defaults.guard');
$config = app('fireflyconfig')->get('last_rt_job', 0); $config = FireflyConfig::get('last_rt_job', 0);
$lastTime = (int) $config->data; $lastTime = (int) $config->data;
$lastCronjob = 'never'; $lastCronjob = 'never';
$lastCronjobAgo = 'never'; $lastCronjobAgo = 'never';

View File

@@ -28,6 +28,7 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use Illuminate\View\View; use Illuminate\View\View;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FireflyIII\Support\Facades\FireflyConfig;
class IndexController extends Controller class IndexController extends Controller
{ {
@@ -47,7 +48,7 @@ class IndexController extends Controller
return $next($request); return $next($request);
} }
); );
if (false === config('cer.enabled')) { if (false === FireflyConfig::get('enable_exchange_rates', config('cer.enabled'))->data) {
throw new NotFoundHttpException(); throw new NotFoundHttpException();
} }
} }

View File

@@ -37,6 +37,7 @@ use Illuminate\Http\Request;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use FireflyIII\Support\Facades\Amount;
/** /**
* Class JavascriptController. * Class JavascriptController.
@@ -105,8 +106,8 @@ class JavascriptController extends Controller
if ($account instanceof Account) { if ($account instanceof Account) {
$currency = $repository->getAccountCurrency($account) ?? $this->primaryCurrency; $currency = $repository->getAccountCurrency($account) ?? $this->primaryCurrency;
} }
$locale = app('steam')->getLocale(); $locale = Steam::getLocale();
$accounting = app('amount')->getJsConfig(); $accounting = Amount::getJsConfig();
$accounting['frac_digits'] = $currency->decimal_places; $accounting['frac_digits'] = $currency->decimal_places;
$pref = Preferences::get('language', config('firefly.default_language', 'en_US')); $pref = Preferences::get('language', config('firefly.default_language', 'en_US'));
$lang = $pref->data; $lang = $pref->data;

View File

@@ -121,15 +121,15 @@ class BoxController extends Controller
$keys = array_keys($sums); $keys = array_keys($sums);
foreach ($keys as $currencyId) { foreach ($keys as $currencyId) {
$currency = $repository->find($currencyId); $currency = $repository->find($currencyId);
$sums[$currencyId] = app('amount')->formatAnything($currency, $sums[$currencyId], false); $sums[$currencyId] = Amount::formatAnything($currency, $sums[$currencyId], false);
$incomes[$currencyId] = app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false); $incomes[$currencyId] = Amount::formatAnything($currency, $incomes[$currencyId] ?? '0', false);
$expenses[$currencyId] = app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false); $expenses[$currencyId] = Amount::formatAnything($currency, $expenses[$currencyId] ?? '0', false);
} }
if (0 === count($sums)) { if (0 === count($sums)) {
$currency = $this->primaryCurrency; $currency = $this->primaryCurrency;
$sums[$this->primaryCurrency->id] = app('amount')->formatAnything($this->primaryCurrency, '0', false); $sums[$this->primaryCurrency->id] = Amount::formatAnything($this->primaryCurrency, '0', false);
$incomes[$this->primaryCurrency->id] = app('amount')->formatAnything($this->primaryCurrency, '0', false); $incomes[$this->primaryCurrency->id] = Amount::formatAnything($this->primaryCurrency, '0', false);
$expenses[$this->primaryCurrency->id] = app('amount')->formatAnything($this->primaryCurrency, '0', false); $expenses[$this->primaryCurrency->id] = Amount::formatAnything($this->primaryCurrency, '0', false);
} }
$response = [ $response = [
@@ -187,7 +187,7 @@ class BoxController extends Controller
if ('primary' === $key) { if ('primary' === $key) {
continue; continue;
} }
$return[$data['currency_id']] = app('amount')->formatFlat($data['currency_symbol'], $data['currency_decimal_places'], $data['balance'], false); $return[$data['currency_id']] = Amount::formatFlat($data['currency_symbol'], $data['currency_decimal_places'], $data['balance'], false);
} }
$return = [ $return = [
'net_worths' => array_values($return), 'net_worths' => array_values($return),

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Support\Http\Controllers\DateCalculation; use FireflyIII\Support\Http\Controllers\DateCalculation;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use FireflyIII\Support\Facades\Amount;
/** /**
* Class BudgetController * Class BudgetController
@@ -84,9 +85,9 @@ class BudgetController extends Controller
return response()->json( return response()->json(
[ [
'budgeted' => $budgeted, 'budgeted' => $budgeted,
'budgeted_formatted' => app('amount')->formatAnything($currency, $budgeted, true), 'budgeted_formatted' => Amount::formatAnything($currency, $budgeted, true),
'available' => $available, 'available' => $available,
'available_formatted' => app('amount')->formatAnything($currency, $available, true), 'available_formatted' => Amount::formatAnything($currency, $available, true),
'percentage' => $percentage, 'percentage' => $percentage,
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,

Some files were not shown because too many files have changed in this diff Show More