Compare commits

...

124 Commits

Author SHA1 Message Date
github-actions
b2516ca1b4 Auto commit for release 'v6.2.0-alpha.2' on 2025-01-19 2025-01-19 19:12:01 +01:00
James Cole
053b46ae63 [chore] fix phpstan errors. 2025-01-19 19:07:19 +01:00
James Cole
6e836aceec Expand changelog. 2025-01-19 18:55:03 +01:00
James Cole
0e8bcd2e79 [chore] cod cleanup 2025-01-19 18:53:32 +01:00
James Cole
bd1f8b2497 [chore] Move to native from default. [skip ci] 2025-01-19 11:54:40 +01:00
James Cole
19dfcf7139 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Transformers/CurrencyTransformer.php
#	app/Transformers/V2/CurrencyTransformer.php
2025-01-19 11:48:18 +01:00
James Cole
ef7a3287bb Add info to changelog 2025-01-19 11:47:49 +01:00
James Cole
2900049498 Add default 2025-01-19 11:47:41 +01:00
github-actions
04d1e8fd59 Auto commit for release 'develop' on 2025-01-19 2025-01-19 11:46:08 +01:00
James Cole
9d2f57e40a Fix menu 2025-01-19 11:41:24 +01:00
James Cole
ae366341cc Rename default to native. 2025-01-19 11:40:07 +01:00
James Cole
3766128cb8 Add code for administrations. 2025-01-19 11:34:23 +01:00
James Cole
950c60d55c Fix https://github.com/firefly-iii/firefly-iii/issues/9667 2025-01-19 07:18:07 +01:00
James Cole
4b2807de48 rename admin to settings. 2025-01-18 17:26:31 +01:00
James Cole
649736cb31 Rename admin to settings. 2025-01-18 17:22:11 +01:00
James Cole
6a121a8a78 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Transformers/AccountTransformer.php
2025-01-18 17:21:34 +01:00
James Cole
f69b9ac9da Commit updated transformers. 2025-01-18 17:20:39 +01:00
James Cole
23d70a2fac Rename to settings 2025-01-18 17:20:21 +01:00
James Cole
d178ff9de0 Rename admin routes to settings. 2025-01-18 17:20:06 +01:00
James Cole
3ecad3457f Rename "administration" to "settings" 2025-01-18 17:10:47 +01:00
github-actions
fa6c621968 Auto commit for release 'develop' on 2025-01-15 2025-01-15 20:30:00 +01:00
James Cole
df863b6cff Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-01-15 18:54:56 +01:00
James Cole
9316ff3e51 Fix account api for new features. 2025-01-15 18:54:49 +01:00
James Cole
bfd91f8ee6 Update default.twig
Signed-off-by: James Cole <james@firefly-iii.org>
2025-01-13 11:32:54 +01:00
github-actions
13e5d25cfe Auto commit for release 'develop' on 2025-01-13 2025-01-13 04:14:18 +01:00
James Cole
b13030420b Merge branch 'main' into develop 2025-01-11 10:07:21 +01:00
github-actions
44d1e8181c Auto commit for release 'develop' on 2025-01-11 2025-01-11 10:06:32 +01:00
James Cole
63b34c1853 Remove unused step. 2025-01-11 10:05:51 +01:00
github-actions
facd0144cb Auto commit for release 'develop' on 2025-01-10 2025-01-10 17:56:21 +01:00
James Cole
115e3435af Fix https://github.com/orgs/firefly-iii/discussions/9576 2025-01-10 06:26:28 +01:00
github-actions
d44cd50768 Auto commit for release 'develop' on 2025-01-06 2025-01-06 07:37:27 +01:00
James Cole
1afcaea4c6 Trim quotes 2025-01-06 06:55:34 +01:00
James Cole
2bd1b37717 Move class to separate file. 2025-01-06 06:19:09 +01:00
github-actions
2d37177316 Auto commit for release 'develop' on 2025-01-06 2025-01-06 04:13:41 +01:00
James Cole
abb25e2015 Fix sql query error and upgrade error. 2025-01-05 14:33:33 +01:00
James Cole
d08d075e30 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-01-05 09:23:17 +01:00
github-actions
b4c67c02a7 Auto commit for release 'develop' on 2025-01-05 2025-01-05 09:23:02 +01:00
James Cole
04fb6a953e This rule is no longer necessary. 2025-01-05 09:21:29 +01:00
James Cole
5dce0bec8e This is no longer necessary since translations are no longer stored in the repository. 2025-01-05 09:20:55 +01:00
James Cole
481bb3fb0a Fix a few test cases. 2025-01-05 09:18:03 +01:00
James Cole
b6960dc299 Fix search result page. 2025-01-05 08:03:15 +01:00
James Cole
73104aae1f Fix data provider. 2025-01-05 07:52:23 +01:00
James Cole
10a284848b Drop else-statements, remove debug statement. 2025-01-05 07:45:29 +01:00
James Cole
fd6560bdd0 Fix copyright for new files. 2025-01-05 07:40:30 +01:00
James Cole
0810f617c7 Merge pull request #9598 from Sobuno/NewQueryParserV3
New Query Parser for Search Engine and Rules
2025-01-05 07:32:55 +01:00
James Cole
c3ffd39450 run phpcs 2025-01-05 07:31:26 +01:00
James Cole
0f69e0d672 Level 7 yay! 2025-01-04 19:43:58 +01:00
James Cole
1aa8ebe57f Fixed level 7! 2025-01-04 19:25:43 +01:00
James Cole
23178614d5 First fixes for level 7. 2025-01-04 19:12:04 +01:00
James Cole
d2b6829574 First fixes for level 7. 2025-01-04 19:05:24 +01:00
James Cole
5602715c96 Made it to level 6! 2025-01-04 15:16:11 +01:00
James Cole
54d0433dd4 Start with level 6. [skip ci] 2025-01-04 09:34:17 +01:00
James Cole
f4bc313d0b Fix level 5! Mostly by ignoring the errors lol. 2025-01-04 09:15:39 +01:00
James Cole
5617de3a79 Level 4 fixed! 2025-01-04 09:01:44 +01:00
James Cole
2d62f0ff06 Rename class [skip ci] 2025-01-04 08:44:02 +01:00
James Cole
1c79f6b1b6 Rename again [skip ci] 2025-01-04 08:42:57 +01:00
James Cole
bf01153c6b Rename file [skip ci] 2025-01-04 08:42:36 +01:00
James Cole
c43b37baef Various phpstan fixes [skip ci] 2025-01-04 08:42:06 +01:00
James Cole
d4942efd8e Fix various level 4 issues [skip ci] 2025-01-04 08:02:05 +01:00
James Cole
ea9f635b1a Improved cs fixer config [skip ci] 2025-01-04 07:39:33 +01:00
James Cole
7eaa0e16b3 Run phpcs locally to make sure phpstan stays fixed. [skip ci] 2025-01-04 07:39:16 +01:00
James Cole
1b97d8fd48 Fix phpcs things [skip ci] 2025-01-04 07:31:25 +01:00
James Cole
89a29b9b10 Disable a rule. 2025-01-04 07:25:45 +01:00
James Cole
2baac1a6d7 Fix phpstan level 3! 2025-01-04 07:10:37 +01:00
James Cole
cd296aa9ac Fix test run. 2025-01-04 06:35:26 +01:00
James Cole
959d168352 Fix various phpstan issues. 2025-01-03 19:16:38 +01:00
James Cole
6cd60951ba Fix for level 2 2025-01-03 19:07:29 +01:00
James Cole
3898c0c0ef Fix phpstan issues. 2025-01-03 18:16:27 +01:00
James Cole
fe4d139817 fix phpstan warnings 2025-01-03 15:53:10 +01:00
James Cole
d95f3ca59f No errors on level 1. 2025-01-03 15:07:30 +01:00
James Cole
7f6c03ce17 Fix phpstan issues. 2025-01-03 15:04:15 +01:00
James Cole
394d0eabef Fix various phpstan issues. 2025-01-03 14:56:06 +01:00
James Cole
a8ae496fda Replace enum 2025-01-03 09:15:52 +01:00
James Cole
1787f4421b Replace enum 2025-01-03 09:11:20 +01:00
James Cole
36351a5dd9 Replace enum 2025-01-03 09:09:15 +01:00
James Cole
d009ce31ca Replace enum 2025-01-03 09:05:56 +01:00
James Cole
44eafeeae5 Replace enum 2025-01-03 09:05:19 +01:00
James Cole
21165eb3e0 Update packages. 2025-01-03 08:30:04 +01:00
James Cole
2ef3a33fbf Merge branch 'main' into develop 2025-01-03 08:17:57 +01:00
James Cole
f74be0402f Add copyright statements. 2025-01-03 08:15:09 +01:00
github-actions
a60cb366b2 Auto commit for release 'develop' on 2025-01-03 2025-01-03 07:12:13 +01:00
github-actions
58e2ef187d Auto commit for release 'develop' on 2025-01-03 2025-01-03 07:01:02 +01:00
James Cole
ae80fd8578 Fix test cases. 2025-01-03 04:51:42 +01:00
James Cole
c17f2efca6 Fix missing variables. 2025-01-03 04:36:41 +01:00
James Cole
4a185639b9 Fix removal of all piggy banks. 2025-01-03 04:32:51 +01:00
Sobuno
dae7e7d507 Handle excludedWords on Rule management pages as well 2025-01-03 01:00:17 +01:00
Sobuno
e33e3cc40f Tweak UI 2025-01-03 00:45:19 +01:00
Sobuno
36ec1daf3a Update UI 2025-01-03 00:29:38 +01:00
Sobuno
50aff9cfb6 Make prohibited word search work 2025-01-03 00:13:51 +01:00
Sobuno
058a0f9fb2 Show excluded words in UI 2025-01-03 00:08:11 +01:00
Sobuno
0c955efa8b Allow flipping of subqueries 2025-01-03 00:07:57 +01:00
Sobuno
a62916a63d Simplify further 2025-01-02 23:36:00 +01:00
Sobuno
af7a4b5d3d Renaming of classes, making true recursive structure 2025-01-02 23:19:21 +01:00
Sobuno
2ae3929dd6 Give a bit better error messages in tests 2025-01-02 22:40:50 +01:00
Sobuno
ebd30f4861 Move tests to match rearranged structure + standardize tests 2025-01-02 22:18:12 +01:00
Sobuno
afc9ea08f3 Rearrange structure 2025-01-02 22:17:56 +01:00
Sobuno
78f9f7e2dd Add QUERY_PARSER_IMPLEMENTATION in .env.example 2025-01-02 20:06:11 +01:00
Sobuno
c44b827922 Fix environment-based selection of Query Parser 2025-01-02 20:03:39 +01:00
James Cole
fb30f7ec8f Update build script. 2025-01-02 19:10:39 +01:00
James Cole
e878d5ce07 Fix linking piggy banks to transactions. 2025-01-02 04:54:29 +01:00
github-actions
f727a38b69 Auto commit for release 'develop' on 2025-01-01 2025-01-01 16:47:50 +01:00
James Cole
c11a5384da Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-01-01 16:43:44 +01:00
James Cole
ed92cbd4b8 Fix piggy bank rule action 2025-01-01 16:43:31 +01:00
github-actions
a9ea32772f Auto commit for release 'develop' on 2025-01-01 2025-01-01 16:38:58 +01:00
Sobuno
92f5cca65b Add QueryParser tests to correct group 2025-01-01 14:18:56 +01:00
Sobuno
57b064f590 Remove incorrect LICENSE message at top of file 2025-01-01 14:18:19 +01:00
Sobuno
9729434926 Allow choosing QueryParser implementation 2025-01-01 05:36:22 +01:00
Sobuno
9d9dffee74 Always assert prohibited field 2025-01-01 05:32:49 +01:00
Sobuno
b3f374f4ea Introduce assertion helpers to make tests more readable 2025-01-01 05:32:49 +01:00
Sobuno
50e07d422f Small QoL additions 2025-01-01 05:32:49 +01:00
Sobuno
631ed4956a Handle right parenthesis behaviour correctly 2025-01-01 05:32:49 +01:00
Sobuno
0eca1c8d03 Fix test 2025-01-01 05:32:49 +01:00
Sobuno
e38e4574ad Fix warnings in tests and add some more 2025-01-01 05:32:49 +01:00
Sobuno
be2d3f3637 Rename QueryParser2 to QueryParser 2025-01-01 05:32:49 +01:00
Sobuno
0e3d779e24 Remove V1 2025-01-01 05:32:49 +01:00
Sobuno
4d25336d87 More WIP 2025-01-01 05:32:49 +01:00
Sobuno
74f76a2835 Fix namespace 2025-01-01 05:32:49 +01:00
Sobuno
84560a6f44 WIP 2025-01-01 05:32:49 +01:00
James Cole
6fde693e7a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Support/Steam.php
2024-12-31 08:19:47 +01:00
James Cole
2e46d9ba33 Clean up some logs. 2024-12-31 08:18:40 +01:00
James Cole
e36f8deb08 Clean up some logs. 2024-12-31 08:18:21 +01:00
James Cole
1631b422f1 Clean up logs, add cache. 2024-12-31 08:17:35 +01:00
github-actions
b58d809063 Auto commit for release 'develop' on 2024-12-31 2024-12-31 08:09:51 +01:00
James Cole
9e34314dbc Fix various issues with new features, nullpointers and missing checks. 2024-12-31 08:05:25 +01:00
613 changed files with 8860 additions and 7525 deletions

View File

@@ -61,6 +61,7 @@ return $config->setRules(
'comment_to_phpdoc' => false, // breaks phpstan lines in combination with PHPStorm. 'comment_to_phpdoc' => false, // breaks phpstan lines in combination with PHPStorm.
'type_declaration_spaces' => false, 'type_declaration_spaces' => false,
'cast_spaces' => false, 'cast_spaces' => false,
'phpdoc_to_comment' => false, // do not overrule single line comment style, breaks phpstan.
// complex rules // complex rules
'array_syntax' => ['syntax' => 'short'], 'array_syntax' => ['syntax' => 'short'],

View File

@@ -406,16 +406,16 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.66.0", "version": "v3.68.1",
"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": "5f5f2a142ff36b93c41885bca29cc5f861c013e6" "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/5f5f2a142ff36b93c41885bca29cc5f861c013e6", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b9db2b2ea3cdba7201067acee46f984ef2397cff",
"reference": "5f5f2a142ff36b93c41885bca29cc5f861c013e6", "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -432,17 +432,17 @@
"react/promise": "^2.0 || ^3.0", "react/promise": "^2.0 || ^3.0",
"react/socket": "^1.0", "react/socket": "^1.0",
"react/stream": "^1.0", "react/stream": "^1.0",
"sebastian/diff": "^4.0 || ^5.0 || ^6.0", "sebastian/diff": "^4.0 || ^5.1 || ^6.0",
"symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/console": "^5.4 || ^6.4 || ^7.0",
"symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0",
"symfony/filesystem": "^5.4 || ^6.0 || ^7.0", "symfony/filesystem": "^5.4 || ^6.4 || ^7.0",
"symfony/finder": "^5.4 || ^6.0 || ^7.0", "symfony/finder": "^5.4 || ^6.4 || ^7.0",
"symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0",
"symfony/polyfill-mbstring": "^1.28", "symfony/polyfill-mbstring": "^1.31",
"symfony/polyfill-php80": "^1.28", "symfony/polyfill-php80": "^1.31",
"symfony/polyfill-php81": "^1.28", "symfony/polyfill-php81": "^1.31",
"symfony/process": "^5.4 || ^6.0 || ^7.0 <7.2", "symfony/process": "^5.4 || ^6.4 || ^7.2",
"symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0"
}, },
"require-dev": { "require-dev": {
"facile-it/paraunit": "^1.3.1 || ^2.4", "facile-it/paraunit": "^1.3.1 || ^2.4",
@@ -454,9 +454,9 @@
"php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/accessible-object": "^1.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5",
"phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2",
"symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0",
"symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0"
}, },
"suggest": { "suggest": {
"ext-dom": "For handling output formats in XML", "ext-dom": "For handling output formats in XML",
@@ -497,7 +497,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.66.0" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.1"
}, },
"funding": [ "funding": [
{ {
@@ -505,7 +505,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-12-29T13:46:23+00:00" "time": "2025-01-17T09:20:36+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@@ -734,33 +734,33 @@
}, },
{ {
"name": "react/child-process", "name": "react/child-process",
"version": "v0.6.5", "version": "v0.6.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/child-process.git", "url": "https://github.com/reactphp/child-process.git",
"reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159",
"reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0", "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.0", "php": ">=5.3.0",
"react/event-loop": "^1.2", "react/event-loop": "^1.2",
"react/stream": "^1.2" "react/stream": "^1.4"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
"react/socket": "^1.8", "react/socket": "^1.16",
"sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"React\\ChildProcess\\": "src" "React\\ChildProcess\\": "src/"
} }
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@@ -797,19 +797,15 @@
], ],
"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.5" "source": "https://github.com/reactphp/child-process/tree/v0.6.6"
}, },
"funding": [ "funding": [
{ {
"url": "https://github.com/WyriHaximus", "url": "https://opencollective.com/reactphp",
"type": "github" "type": "open_collective"
},
{
"url": "https://github.com/clue",
"type": "github"
} }
], ],
"time": "2022-09-16T13:41:56+00:00" "time": "2025-01-01T16:37:48+00:00"
}, },
{ {
"name": "react/dns", "name": "react/dns",
@@ -1641,16 +1637,16 @@
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v7.2.0", "version": "v7.2.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49" "reference": "87a71856f2f56e4100373e92529eed3171695cfb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49", "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb",
"reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49", "reference": "87a71856f2f56e4100373e92529eed3171695cfb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1685,7 +1681,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/v7.2.0" "source": "https://github.com/symfony/finder/tree/v7.2.2"
}, },
"funding": [ "funding": [
{ {
@@ -1701,7 +1697,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-10-23T06:56:12+00:00" "time": "2024-12-30T19:00:17+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
@@ -2246,16 +2242,16 @@
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v7.1.8", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/process.git",
"reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
"reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2287,7 +2283,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/v7.1.8" "source": "https://github.com/symfony/process/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -2303,7 +2299,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-06T14:23:19+00:00" "time": "2024-11-06T14:24:19+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
@@ -2390,16 +2386,16 @@
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v7.2.0", "version": "v7.2.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "696f418b0d722a4225e1c3d95489d262971ca924" "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df",
"reference": "696f418b0d722a4225e1c3d95489d262971ca924", "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2432,7 +2428,7 @@
"description": "Provides a way to profile code", "description": "Provides a way to profile code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/stopwatch/tree/v7.2.0" "source": "https://github.com/symfony/stopwatch/tree/v7.2.2"
}, },
"funding": [ "funding": [
{ {
@@ -2448,7 +2444,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-25T14:21:43+00:00" "time": "2024-12-18T14:28:33+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",

View File

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

View File

@@ -1,61 +1,36 @@
parameters: parameters:
scanFiles: scanFiles:
- ../_ide_helper_models.php - ../_ide_helper
universalObjectCratesClasses:
- Illuminate\Database\Eloquent\Model
# TODO: slowly remove these parameters and fix the issues found.
reportUnmatchedIgnoredErrors: false
ignoreErrors:
# TODO: slowly remove these exceptions and fix the issues found.
- '#Dynamic call to static method#' # all the Laravel ORM things depend on this.
- '#Control structures using switch should not be used.#' # switch is fine in some cases.
- '#with no value type specified in iterable type array#' # remove this rule when all other issues are solved.
- '#has no value type specified in iterable type array#' # remove this rule when all other issues are solved.
- '#is not allowed to extend#'
- '#does not specify its types#'
- '#switch is forbidden to use#'
- '#is neither abstract nor final#'
- '#on left side of \?\?\= always exists and is not nullable#'
- '#has a nullable return type declaration#' # perhaps throw errors instead?
- '#with a nullable type declaration#' # decide what action should be if param is null.
- '#with null as default value#'
-
message: '#Constructor in [a-zA-Z0-9\\_]+ has parameter \$[a-zA-Z0-9\\_]+ with default value#'
paths:
- ../app/Exceptions/IntervalException.php
- ../app/Support/Navigation.php
-
message: '#but containers should not be injected#'
paths:
- ../app/Support/Authentication/RemoteUserGuard.php
-
message: '#Function compact\(\) should not be used#' # too useful in template rendering.
paths:
- ../app/Generator/Report/Account/MonthReportGenerator.php
- ../app/Generator/Report/Audit/MonthReportGenerator.php
- ../app/Generator/Report/Budget/MonthReportGenerator.php
- ../app/Generator/Report/Category/MonthReportGenerator.php
- ../app/Generator/Report/Standard/MonthReportGenerator.php
- ../app/Generator/Report/Standard/MultiYearReportGenerator.php
- ../app/Generator/Report/Standard/YearReportGenerator.php
- ../app/Generator/Report/Tag/MonthReportGenerator.php
- ../app/Http/Controllers/Account/*.php
- ../app/Http/Controllers/Admin/*.php
- ../app/Http/Controllers/*.php
- ../app/Support/ExpandedForm.php
- ../app/Support/Form/AccountForm.php
- ../app/Support/Form/CurrencyForm.php
- ../app/Support/Form/FormSupport.php
-
message: '#Either catch a more specific exception#'
paths:
- ../app/Support/Form/FormSupport.php
paths: paths:
- ../app - ../app
- ../database - ../database
- ../routes - ../routes
- ../config - ../config
- ../bootstrap/app.php - ../bootstrap/app.php
universalObjectCratesClasses:
- Illuminate\Database\Eloquent\Model
# TODO: slowly remove these parameters and fix the issues found.
reportUnmatchedIgnoredErrors: true
ignoreErrors:
# TODO: slowly remove these exceptions and fix the issues found.
- '#Dynamic call to static method#' # all the Laravel ORM things depend on this.
- identifier: varTag.nativeType
- identifier: varTag.type
-
identifier: larastan.noEnvCallsOutsideOfConfig
path: ../app/Console/Commands/System/CreatesDatabase.php
- identifier: missingType.iterableValue # not interesting enough to fix.
- identifier: missingType.generics # not interesting enough to fix.
- "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
- '#expects view-string, string given#'
- '#expects view-string\|null, string given#'
# phpstan can't handle this so we ignore them.
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#'
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#'
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#'
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::accountTypeIn#'
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::withTrashed#'
# The level 8 is the highest level. original was 5 # The level 8 is the highest level. original was 5
# 7 is more than enough, higher just leaves NULL things. # 7 is more than enough, higher just leaves NULL things.

View File

@@ -325,6 +325,12 @@ USE_RUNNING_BALANCE=false
# #
FIREFLY_III_LAYOUT=v1 FIREFLY_III_LAYOUT=v1
#
# Which Query Parser implementation to use for the search rngine and rules
# 'new' is experimental, 'legacy' is the classic one
#
QUERY_PARSER_IMPLEMENTATION=legacy
# #
# 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.

53
.github/mergify.yml vendored
View File

@@ -8,56 +8,3 @@ pull_request_rules:
close: close:
message: Please do not open PR's on the `main` branch, but on the `develop` message: Please do not open PR's on the `main` branch, but on the `develop`
branch only. Thank you! branch only. Thank you!
- name: No translations
conditions:
- -author~=^dependabot(|-preview)\[bot\]$
- base=develop
- or:
- files~=^resources/lang/bg_BG
- files~=^resources/lang/ca_ES
- files~=^resources/lang/cs_CZ
- files~=^resources/lang/da_DK
- files~=^resources/lang/de_DE
- files~=^resources/lang/el_GR
- files~=^resources/lang/en_GB
- files~=^resources/lang/es_ES
- files~=^resources/lang/et_EE
- files~=^resources/lang/fa_IR
- files~=^resources/lang/fi_FI
- files~=^resources/lang/fr_FR
- files~=^resources/lang/he_IL
- files~=^resources/lang/hu_HU
- files~=^resources/lang/id_ID
- files~=^resources/lang/is_IS
- files~=^resources/lang/it_IT
- files~=^resources/lang/ja_JP
- files~=^resources/lang/ko_KR
- files~=^resources/lang/lt_LT
- files~=^resources/lang/nb_NO
- files~=^resources/lang/nl_NL
- files~=^resources/lang/pl_PL
- files~=^resources/lang/pt_BR
- files~=^resources/lang/pt_PT
- files~=^resources/lang/ro_RO
- files~=^resources/lang/ru_RU
- files~=^resources/lang/si_LK
- files~=^resources/lang/sk_SK
- files~=^resources/lang/sl_SI
- files~=^resources/lang/sr_CS
- files~=^resources/lang/sv_SE
- files~=^resources/lang/th_TH
- files~=^resources/lang/tlh_AA
- files~=^resources/lang/tr_TR
- files~=^resources/lang/uk_UA
- files~=^resources/lang/vi_VN
- files~=^resources/lang/zh_CN
- files~=^resources/lang/zh_TW
actions:
comment:
message: >
Please do not submit translated strings in your PR. If you need new
sentences to be translated, add them to the `en_US` language strings.
New or changed translations for other languages can be submitted at
https://crowdin.com/project/firefly-iii
Thank you!

View File

@@ -58,15 +58,6 @@ jobs:
GITHUB_TOKEN: ${{ github.token }} GITHUB_TOKEN: ${{ github.token }}
CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }} CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }}
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
- name: Cleanup translations
id: cleanup-transactions
uses: JC5/firefly-iii-dev@main
with:
action: 'ff3:crowdin-warning'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Cleanup changelog - name: Cleanup changelog
id: cleanup-changelog id: cleanup-changelog
uses: JC5/firefly-iii-dev@main uses: JC5/firefly-iii-dev@main
@@ -314,6 +305,7 @@ jobs:
git push origin $releaseName git push origin $releaseName
gh release create $releaseName -p --verify-tag \ gh release create $releaseName -p --verify-tag \
-t "Development release for $(date +'%Y-%m-%d')" \ -t "Development release for $(date +'%Y-%m-%d')" \
--latest=false \
-F output.txt -F output.txt
fi fi
@@ -327,6 +319,7 @@ jobs:
git push origin $releaseName git push origin $releaseName
gh release create $releaseName -p --verify-tag \ gh release create $releaseName -p --verify-tag \
-t "Branch release for $(date +'%Y-%m-%d')" \ -t "Branch release for $(date +'%Y-%m-%d')" \
--latest=false \
-F output.txt -F output.txt
fi fi
@@ -352,7 +345,18 @@ jobs:
echo 'MAIN (real) release' echo 'MAIN (real) release'
git tag -a $releaseName -m "Here be changelog" git tag -a $releaseName -m "Here be changelog"
git push origin $releaseName git push origin $releaseName
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag
# do not tag as latest when alpha or beta.
if [[ "$version" == *alpha* ]] || [[ "$version" == *beta* ]]; then
echo 'Mark alpha or beta as NOT the latest.'
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag --latest=false
fi
# tag as latest when NOT alpha or beta.
if [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then
echo 'Mark prod as the latest.'
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag
fi
# add archive files to release # add archive files to release
gh release upload $releaseName $zipName gh release upload $releaseName $zipName

View File

@@ -8,7 +8,7 @@ on:
- develop - develop
env: env:
DB_CONNECTION: sqlite DB_CONNECTION: sqlite
APP_KEY: UfpBqqeXx7zpNodsC6yjYQcRfDdm4Bxh APP_KEY: TestTestTestTestTestTestTestTest
jobs: jobs:
sonarcloud: sonarcloud:
name: SonarCloud name: SonarCloud
@@ -46,7 +46,9 @@ jobs:
run: composer install --prefer-dist --no-interaction --no-progress --no-scripts run: composer install --prefer-dist --no-interaction --no-progress --no-scripts
- name: "Create database file" - name: "Create database file"
run: touch storage/database/database.sqlite run: |
touch storage/database/database.sqlite
wget -q https://github.com/firefly-iii/test-fixtures/raw/refs/heads/main/test-database.sqlite -O storage/database/database.sqlite
- name: "Upgrades the database to the latest version" - name: "Upgrades the database to the latest version"
run: php artisan firefly-iii:upgrade-database run: php artisan firefly-iii:upgrade-database

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.
## 2024 ## 2024
- Sobuno
- TasneemTantawy - TasneemTantawy
- Antônio Franco - Antônio Franco
- yparitcher - yparitcher

View File

@@ -25,18 +25,24 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers; namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon; use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException;
use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Facades\Steam;
use FireflyIII\Transformers\V2\AbstractTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Routing\Controller as BaseController; use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Collection;
use League\Fractal\Manager; use League\Fractal\Manager;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer; use League\Fractal\Serializer\JsonApiSerializer;
use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
@@ -44,8 +50,8 @@ use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class Controller. * Class Controller.
* *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings("PHPMD.CouplingBetweenObjects")
* @SuppressWarnings(PHPMD.NumberOfChildren) * @SuppressWarnings("PHPMD.NumberOfChildren")
*/ */
abstract class Controller extends BaseController abstract class Controller extends BaseController
{ {
@@ -74,7 +80,7 @@ abstract class Controller extends BaseController
if (auth()->check()) { if (auth()->check()) {
$language = Steam::getLanguage(); $language = Steam::getLanguage();
$this->convertToNative = Amount::convertToNative(); $this->convertToNative = Amount::convertToNative();
$this->defaultCurrency = Amount::getDefaultCurrency(); $this->defaultCurrency = Amount::getNativeCurrency();
app()->setLocale($language); app()->setLocale($language);
} }
@@ -116,7 +122,7 @@ abstract class Controller extends BaseController
if (null !== $date) { if (null !== $date) {
try { try {
$obj = Carbon::parse((string) $date); $obj = Carbon::parse((string) $date);
} catch (InvalidDateException|InvalidFormatException $e) { } catch (InvalidFormatException $e) {
// don't care // don't care
app('log')->warning( app('log')->warning(
sprintf( sprintf(
@@ -224,4 +230,45 @@ abstract class Controller extends BaseController
return $manager; return $manager;
} }
final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array
{
$manager = new Manager();
$baseUrl = sprintf('%s/api/v1/', request()->getSchemeAndHttpHost());
// TODO add stuff to path?
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$objects = $paginator->getCollection();
// the transformer, at this point, needs to collect information that ALL items in the collection
// require, like meta-data and stuff like that, and save it for later.
$objects = $transformer->collectMetaData($objects);
$paginator->setCollection($objects);
$resource = new FractalCollection($objects, $transformer, $key);
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return $manager->createData($resource)->toArray();
}
/**
* Returns a JSON API object and returns it.
*
* @param array<int, mixed>|Model $object
*/
final protected function jsonApiObject(string $key, array|Model $object, AbstractTransformer $transformer): array
{
// create some objects:
$manager = new Manager();
$baseUrl = sprintf('%s/api/v1', request()->getSchemeAndHttpHost());
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$transformer->collectMetaData(new Collection([$object]));
$resource = new Item($object, $transformer, $key);
return $manager->createData($resource)->toArray();
}
} }

View File

@@ -59,7 +59,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function accounts(ExportRequest $request): LaravelResponse public function accounts(ExportRequest $request): LaravelResponse
{ {
@@ -100,7 +100,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function bills(ExportRequest $request): LaravelResponse public function bills(ExportRequest $request): LaravelResponse
{ {
@@ -115,7 +115,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function budgets(ExportRequest $request): LaravelResponse public function budgets(ExportRequest $request): LaravelResponse
{ {
@@ -130,7 +130,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function categories(ExportRequest $request): LaravelResponse public function categories(ExportRequest $request): LaravelResponse
{ {
@@ -145,7 +145,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function piggyBanks(ExportRequest $request): LaravelResponse public function piggyBanks(ExportRequest $request): LaravelResponse
{ {
@@ -160,7 +160,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function recurring(ExportRequest $request): LaravelResponse public function recurring(ExportRequest $request): LaravelResponse
{ {
@@ -175,7 +175,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function rules(ExportRequest $request): LaravelResponse public function rules(ExportRequest $request): LaravelResponse
{ {
@@ -190,7 +190,7 @@ class ExportController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function tags(ExportRequest $request): LaravelResponse public function tags(ExportRequest $request): LaravelResponse
{ {

View File

@@ -70,7 +70,7 @@ class BillController extends Controller
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
$response = []; $response = [];
// get all bills: // get all bills:
@@ -133,7 +133,7 @@ class BillController extends Controller
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.

View File

@@ -48,7 +48,7 @@ class PeriodController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// collect all expenses in this period (regardless of type) // collect all expenses in this period (regardless of type)
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);

View File

@@ -69,7 +69,7 @@ class TagController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);

View File

@@ -47,7 +47,7 @@ class PeriodController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// collect all expenses in this period (regardless of type) // collect all expenses in this period (regardless of type)
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);

View File

@@ -69,7 +69,7 @@ class TagController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);

View File

@@ -26,8 +26,8 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Transfer;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Insight\GenericRequest; use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\TransactionType;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -47,11 +47,11 @@ class PeriodController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// collect all expenses in this period (regardless of type) // collect all expenses in this period (regardless of type)
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
// currency // currency

View File

@@ -26,8 +26,8 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Transfer;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Insight\GenericRequest; use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -67,12 +67,12 @@ class TagController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
$collector->withoutTags(); $collector->withoutTags();
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
@@ -128,7 +128,7 @@ class TagController extends Controller
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
$collector->setTags($tags); $collector->setTags($tags);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();

View File

@@ -100,7 +100,7 @@ class ShowController extends Controller
* *
* Display a listing of the budget limits for this budget. * Display a listing of the budget limits for this budget.
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function indexAll(SameDateRequest $request): JsonResponse public function indexAll(SameDateRequest $request): JsonResponse
{ {

View File

@@ -37,7 +37,7 @@ class ExpressionController 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)#/rules/validateExpression * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/rules/validateExpression
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function validateExpression(ValidateExpressionRequest $request): JsonResponse public function validateExpression(ValidateExpressionRequest $request): JsonResponse
{ {

View File

@@ -88,21 +88,21 @@ class StoreController extends Controller
try { try {
$transactionGroup = $this->groupRepository->store($data); $transactionGroup = $this->groupRepository->store($data);
} catch (DuplicateTransactionException $e) { // @phpstan-ignore-line } catch (DuplicateTransactionException $e) {
app('log')->warning('Caught a duplicate transaction. Return error message.'); app('log')->warning('Caught a duplicate transaction. Return error message.');
$validator = \Validator::make( $validator = \Validator::make(
['transactions' => [['description' => $e->getMessage()]]], ['transactions' => [['description' => $e->getMessage()]]],
['transactions.0.description' => new IsDuplicateTransaction()] ['transactions.0.description' => new IsDuplicateTransaction()]
); );
throw new ValidationException($validator); // @phpstan-ignore-line throw new ValidationException($validator);
} catch (FireflyException $e) { // @phpstan-ignore-line } catch (FireflyException $e) {
app('log')->warning('Caught an exception. Return error message.'); app('log')->warning('Caught an exception. Return error message.');
app('log')->error($e->getMessage()); app('log')->error($e->getMessage());
$message = sprintf('Internal exception: %s', $e->getMessage()); $message = sprintf('Internal exception: %s', $e->getMessage());
$validator = \Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]); $validator = \Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]);
throw new ValidationException($validator); // @phpstan-ignore-line throw new ValidationException($validator);
} }
app('preferences')->mark(); app('preferences')->mark();
$applyRules = $data['apply_rules'] ?? true; $applyRules = $data['apply_rules'] ?? true;

View File

@@ -239,7 +239,7 @@ class ListController extends Controller
$unfiltered = $recurringRepos->getAll(); $unfiltered = $recurringRepos->getAll();
// filter selection // filter selection
$collection = $unfiltered->filter( // @phpstan-ignore-line $collection = $unfiltered->filter(
static function (Recurrence $recurrence) use ($currency) { // @phpstan-ignore-line static function (Recurrence $recurrence) use ($currency) { // @phpstan-ignore-line
/** @var RecurrenceTransaction $transaction */ /** @var RecurrenceTransaction $transaction */
foreach ($recurrence->recurrenceTransactions as $transaction) { foreach ($recurrence->recurrenceTransactions as $transaction) {
@@ -286,7 +286,7 @@ class ListController extends Controller
$ruleRepos = app(RuleRepositoryInterface::class); $ruleRepos = app(RuleRepositoryInterface::class);
$unfiltered = $ruleRepos->getAll(); $unfiltered = $ruleRepos->getAll();
$collection = $unfiltered->filter( // @phpstan-ignore-line $collection = $unfiltered->filter(
static function (Rule $rule) use ($currency) { // @phpstan-ignore-line static function (Rule $rule) use ($currency) { // @phpstan-ignore-line
/** @var RuleTrigger $trigger */ /** @var RuleTrigger $trigger */
foreach ($rule->ruleTriggers as $trigger) { foreach ($rule->ruleTriggers as $trigger) {

View File

@@ -0,0 +1,71 @@
<?php
/*
* IndexController.php
* Copyright (c) 2024 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/.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\UserGroup;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\DateRequest;
use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface;
use FireflyIII\Transformers\UserGroupTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator;
class IndexController extends Controller
{
public const string RESOURCE_KEY = 'user_groups';
private UserGroupRepositoryInterface $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(UserGroupRepositoryInterface::class);
return $next($request);
}
);
}
public function index(DateRequest $request): JsonResponse
{
$administrations = $this->repository->get();
$pageSize = $this->parameters->get('limit');
$count = $administrations->count();
$administrations = $administrations->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($administrations, $count, $pageSize, $this->parameters->get('page'));
$transformer = new UserGroupTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
}

View File

@@ -0,0 +1,64 @@
<?php
/*
* ShowController.php
* Copyright (c) 2021 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\UserGroup;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\UserGroup;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Transformers\UserGroupTransformer;
use Illuminate\Http\JsonResponse;
/**
* Class ShowController
*/
class ShowController extends Controller
{
public const string RESOURCE_KEY = 'user_groups';
private WebhookRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(WebhookRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
}
public function show(UserGroup $userGroup): JsonResponse
{
$transformer = new UserGroupTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $userGroup, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
}

View File

@@ -0,0 +1,71 @@
<?php
/*
* UpdateController.php
* Copyright (c) 2025 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/.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\UserGroup;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\UserGroup\UpdateRequest;
use FireflyIII\Models\UserGroup;
use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface;
use FireflyIII\Transformers\UserGroupTransformer;
use Illuminate\Http\JsonResponse;
class UpdateController extends Controller
{
public const string RESOURCE_KEY = 'user_groups';
private UserGroupRepositoryInterface $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(UserGroupRepositoryInterface::class);
return $next($request);
}
);
}
public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse
{
app('log')->debug(sprintf('Now in %s', __METHOD__));
$data = $request->getData();
$userGroup = $this->repository->update($userGroup, $data);
$userGroup->refresh();
app('preferences')->mark();
$transformer = new UserGroupTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $userGroup, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
}

View File

@@ -124,7 +124,7 @@ class BasicController extends Controller
{ {
// some config settings // some config settings
$convertToNative = Amount::convertToNative(); $convertToNative = Amount::convertToNative();
$default = Amount::getDefaultCurrency(); $default = Amount::getNativeCurrency();
// prep some arrays: // prep some arrays:
$incomes = []; $incomes = [];
$expenses = []; $expenses = [];

View File

@@ -24,7 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Autocomplete; namespace FireflyIII\Api\V1\Requests\Autocomplete;
use FireflyIII\Models\AccountType; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
@@ -46,7 +46,7 @@ class AutocompleteRequest extends FormRequest
} }
// remove 'initial balance' from allowed types. its internal // remove 'initial balance' from allowed types. its internal
$array = array_diff($array, [AccountType::INITIAL_BALANCE, AccountType::RECONCILIATION]); $array = array_diff($array, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value]);
return [ return [
'types' => $array, 'types' => $array,

View File

@@ -55,6 +55,7 @@ class DateRequest extends FormRequest
return [ return [
'start' => $start, 'start' => $start,
'end' => $end, 'end' => $end,
'date' => $this->getCarbonDate('date'),
]; ];
} }
@@ -64,8 +65,9 @@ class DateRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'start' => 'required|date', 'date' => 'date|after:1900-01-01|before:2099-12-31',
'end' => 'required|date|after:start', 'start' => 'date|after:1900-01-01|before:2099-12-31|before:end|required_with:end',
'end' => 'date|after:1900-01-01|before:2099-12-31|after:start|required_with:start',
]; ];
} }
} }

View File

@@ -24,7 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Data\Export; namespace FireflyIII\Api\V1\Requests\Data\Export;
use FireflyIII\Models\AccountType; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
@@ -55,7 +55,7 @@ class ExportRequest extends FormRequest
$accountId = (int) $part; $accountId = (int) $part;
if (0 !== $accountId) { if (0 !== $accountId) {
$account = $repository->find($accountId); $account = $repository->find($accountId);
if (null !== $account && AccountType::ASSET === $account->accountType->type) { if (null !== $account && AccountTypeEnum::ASSET->value === $account->accountType->type) {
$accounts->push($account); $accounts->push($account);
} }
} }

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Insight; namespace FireflyIII\Api\V1\Requests\Insight;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
@@ -70,7 +70,7 @@ class GenericRequest extends FormRequest
/** @var Account $account */ /** @var Account $account */
foreach ($this->accounts as $account) { foreach ($this->accounts as $account) {
$type = $account->accountType->type; $type = $account->accountType->type;
if (in_array($type, [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], true)) { if (in_array($type, [AccountTypeEnum::ASSET->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value], true)) {
$return->push($account); $return->push($account);
} }
} }
@@ -191,7 +191,7 @@ class GenericRequest extends FormRequest
/** @var Account $account */ /** @var Account $account */
foreach ($this->accounts as $account) { foreach ($this->accounts as $account) {
$type = $account->accountType->type; $type = $account->accountType->type;
if (AccountType::EXPENSE === $type) { if (AccountTypeEnum::EXPENSE->value === $type) {
$return->push($account); $return->push($account);
} }
} }
@@ -207,7 +207,7 @@ class GenericRequest extends FormRequest
/** @var Account $account */ /** @var Account $account */
foreach ($this->accounts as $account) { foreach ($this->accounts as $account) {
$type = $account->accountType->type; $type = $account->accountType->type;
if (AccountType::REVENUE === $type) { if (AccountTypeEnum::REVENUE->value === $type) {
$return->push($account); $return->push($account);
} }
} }

View File

@@ -0,0 +1,65 @@
<?php
/*
* UpdateRequest.php
* Copyright (c) 2021 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Models\UserGroup;
use FireflyIII\Models\UserGroup;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class UpdateRequest
*/
class UpdateRequest extends FormRequest
{
use ChecksLogin;
use ConvertsDataTypes;
public function getData(): array
{
$fields = [
'title' => ['title', 'convertString'],
'native_currency_id' => ['native_currency_id', 'convertInteger'],
'native_currency_code' => ['native_currency_code', 'convertString'],
];
return $this->getAllData($fields);
}
/**
* Rules for this request.
*/
public function rules(): array
{
/** @var UserGroup $userGroup */
$userGroup = $this->route()->parameter('userGroup');
return [
'title' => ['required', 'min:1', 'max:255'],
'native_currency_id' => 'exists:transaction_currencies,id',
'native_currency_code' => 'exists:transaction_currencies,code',
];
}
}

View File

@@ -55,7 +55,7 @@ class AccountController extends Controller
$userGroup = $this->validateUserGroup($request); $userGroup = $this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUserGroup($userGroup); $this->repository->setUserGroup($userGroup);
$this->default = app('amount')->getDefaultCurrency(); $this->default = app('amount')->getNativeCurrency();
$this->converter = app(ExchangeRateConverter::class); $this->converter = app(ExchangeRateConverter::class);
return $next($request); return $next($request);

View File

@@ -57,7 +57,7 @@ class AccountController extends Controller
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request)); $this->repository->setUserGroup($this->validateUserGroup($request));
$this->chartData = new ChartData(); $this->chartData = new ChartData();
$this->default = app('amount')->getDefaultCurrency(); $this->default = app('amount')->getNativeCurrency();
return $next($request); return $next($request);
} }

View File

@@ -62,7 +62,7 @@ class BalanceController extends Controller
$this->repository->setUserGroup($userGroup); $this->repository->setUserGroup($userGroup);
$this->collector->setUserGroup($userGroup); $this->collector->setUserGroup($userGroup);
$this->chartData = new ChartData(); $this->chartData = new ChartData();
// $this->default = app('amount')->getDefaultCurrency(); // $this->default = app('amount')->getNativeCurrency();
return $next($request); return $next($request);
} }
@@ -87,7 +87,7 @@ class BalanceController extends Controller
// prepare for currency conversion and data collection: // prepare for currency conversion and data collection:
/** @var TransactionCurrency $default */ /** @var TransactionCurrency $default */
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getNativeCurrency();
// get journals for entire period: // get journals for entire period:

View File

@@ -63,7 +63,7 @@ class BudgetController extends Controller
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class); $this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class);
$this->currency = app('amount')->getDefaultCurrency(); $this->currency = app('amount')->getNativeCurrency();
$userGroup = $this->validateUserGroup($request); $userGroup = $this->validateUserGroup($request);
$this->repository->setUserGroup($userGroup); $this->repository->setUserGroup($userGroup);
$this->opsRepository->setUserGroup($userGroup); $this->opsRepository->setUserGroup($userGroup);

View File

@@ -27,10 +27,10 @@ namespace FireflyIII\Api\V2\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Generic\DateRequest; use FireflyIII\Api\V2\Request\Generic\DateRequest;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface; use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Api\CleansChartData; use FireflyIII\Support\Http\Api\CleansChartData;
@@ -70,7 +70,7 @@ class CategoryController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function dashboard(DateRequest $request): JsonResponse public function dashboard(DateRequest $request): JsonResponse
{ {
@@ -81,8 +81,8 @@ class CategoryController extends Controller
/** @var Carbon $end */ /** @var Carbon $end */
$end = $this->parameters->get('end'); $end = $this->parameters->get('end');
$accounts = $this->accountRepos->getAccountsByType([AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::ASSET, AccountType::DEFAULT]); $accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value]);
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getNativeCurrency();
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();
$currencies = []; $currencies = [];
$return = []; $return = [];

View File

@@ -47,8 +47,8 @@ use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class Controller * Class Controller
* *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings("PHPMD.CouplingBetweenObjects")
* @SuppressWarnings(PHPMD.NumberOfChildren) * @SuppressWarnings("PHPMD.NumberOfChildren")
*/ */
class Controller extends BaseController class Controller extends BaseController
{ {
@@ -74,7 +74,7 @@ class Controller extends BaseController
* TODO duplicate from V1 controller * TODO duplicate from V1 controller
* Method to grab all parameters from the URL. * Method to grab all parameters from the URL.
* *
* @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings("PHPMD.NPathComplexity")
*/ */
private function getParameters(): ParameterBag private function getParameters(): ParameterBag
{ {

View File

@@ -58,7 +58,7 @@ class SumController extends Controller
* *
* TODO see autocomplete/accountcontroller for list. * TODO see autocomplete/accountcontroller for list.
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function paid(DateRequest $request): JsonResponse public function paid(DateRequest $request): JsonResponse
{ {
@@ -74,7 +74,7 @@ class SumController extends Controller
* *
* TODO see autocomplete/accountcontroller for list. * TODO see autocomplete/accountcontroller for list.
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function unpaid(DateRequest $request): JsonResponse public function unpaid(DateRequest $request): JsonResponse
{ {

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V2\Controllers\Model\ExchangeRate;
use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface; use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\V2\ExchangeRateTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;

View File

@@ -80,21 +80,21 @@ class StoreController extends Controller
try { try {
$transactionGroup = $this->groupRepository->store($data); $transactionGroup = $this->groupRepository->store($data);
} catch (DuplicateTransactionException $e) { // @phpstan-ignore-line } catch (DuplicateTransactionException $e) {
app('log')->warning('Caught a duplicate transaction. Return error message.'); app('log')->warning('Caught a duplicate transaction. Return error message.');
$validator = Validator::make( $validator = Validator::make(
['transactions' => [['description' => $e->getMessage()]]], ['transactions' => [['description' => $e->getMessage()]]],
['transactions.0.description' => new IsDuplicateTransaction()] ['transactions.0.description' => new IsDuplicateTransaction()]
); );
throw new ValidationException($validator); // @phpstan-ignore-line throw new ValidationException($validator);
} catch (FireflyException $e) { // @phpstan-ignore-line } catch (FireflyException $e) {
app('log')->warning('Caught an exception. Return error message.'); app('log')->warning('Caught an exception. Return error message.');
app('log')->error($e->getMessage()); app('log')->error($e->getMessage());
$message = sprintf('Internal exception: %s', $e->getMessage()); $message = sprintf('Internal exception: %s', $e->getMessage());
$validator = Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]); $validator = Validator::make(['transactions' => [['description' => $message]]], ['transactions.0.description' => new IsDuplicateTransaction()]);
throw new ValidationException($validator); // @phpstan-ignore-line throw new ValidationException($validator);
} }
app('preferences')->mark(); app('preferences')->mark();
$applyRules = $data['apply_rules'] ?? true; $applyRules = $data['apply_rules'] ?? true;

View File

@@ -66,7 +66,7 @@ class ShowController extends Controller
$default = 1 === $group->pivot->group_default; $default = 1 === $group->pivot->group_default;
} }
$currency->userGroupEnabled = $enabled; $currency->userGroupEnabled = $enabled;
$currency->userGroupDefault = $default; $currency->userGroupNative = $default;
$transformer = new CurrencyTransformer(); $transformer = new CurrencyTransformer();

View File

@@ -27,12 +27,12 @@ namespace FireflyIII\Api\V2\Controllers\Summary;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Generic\DateRequest; use FireflyIII\Api\V2\Request\Generic\DateRequest;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Helpers\Report\NetWorthInterface; use FireflyIII\Helpers\Report\NetWorthInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\UserGroup; use FireflyIII\Models\UserGroup;
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface; use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\UserGroups\Bill\BillRepositoryInterface; use FireflyIII\Repositories\UserGroups\Bill\BillRepositoryInterface;
@@ -94,7 +94,7 @@ class BasicController extends Controller
* *
* @throws \Exception * @throws \Exception
* *
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function basic(DateRequest $request): JsonResponse public function basic(DateRequest $request): JsonResponse
{ {
@@ -118,7 +118,7 @@ class BasicController extends Controller
private function getBalanceInformation(Carbon $start, Carbon $end): array private function getBalanceInformation(Carbon $start, Carbon $end): array
{ {
$object = new SummaryBalanceGrouped(); $object = new SummaryBalanceGrouped();
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getNativeCurrency();
$object->setDefault($default); $object->setDefault($default);
@@ -222,7 +222,7 @@ class BasicController extends Controller
} }
/** /**
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings("PHPMD.ExcessiveMethodLength")
*/ */
private function getLeftToSpendInfo(Carbon $start, Carbon $end): array private function getLeftToSpendInfo(Carbon $start, Carbon $end): array
{ {
@@ -233,7 +233,7 @@ class BasicController extends Controller
$available = $this->abRepository->getAvailableBudgetWithCurrency($start, $end); $available = $this->abRepository->getAvailableBudgetWithCurrency($start, $end);
$budgets = $this->budgetRepository->getActiveBudgets(); $budgets = $this->budgetRepository->getActiveBudgets();
$spent = $this->opsRepository->listExpenses($start, $end, null, $budgets); $spent = $this->opsRepository->listExpenses($start, $end, null, $budgets);
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getNativeCurrency();
$currencies = []; $currencies = [];
$converter = new ExchangeRateConverter(); $converter = new ExchangeRateConverter();
@@ -353,7 +353,7 @@ class BasicController extends Controller
$netWorthHelper = app(NetWorthInterface::class); $netWorthHelper = app(NetWorthInterface::class);
$netWorthHelper->setUserGroup($userGroup); $netWorthHelper->setUserGroup($userGroup);
$allAccounts = $this->accountRepository->getActiveAccountsByType( $allAccounts = $this->accountRepository->getActiveAccountsByType(
[AccountType::ASSET, AccountType::DEFAULT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::DEBT] [AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::DEBT->value]
); );
// filter list on preference of being included. // filter list on preference of being included.

View File

@@ -26,9 +26,9 @@ namespace FireflyIII\Api\V2\Controllers\Summary;
use FireflyIII\Api\V2\Controllers\Controller; use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Generic\SingleDateRequest; use FireflyIII\Api\V2\Request\Generic\SingleDateRequest;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Helpers\Report\NetWorthInterface; use FireflyIII\Helpers\Report\NetWorthInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface; use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -67,7 +67,7 @@ class NetWorthController extends Controller
public function get(SingleDateRequest $request): JsonResponse public function get(SingleDateRequest $request): JsonResponse
{ {
$date = $request->getDate(); $date = $request->getDate();
$accounts = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]); $accounts = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value]);
// filter list on preference of being included. // filter list on preference of being included.
$filtered = $accounts->filter( $filtered = $accounts->filter(

View File

@@ -24,9 +24,8 @@ declare(strict_types=1);
namespace FireflyIII\Api\V2\Request\Autocomplete; namespace FireflyIII\Api\V2\Request\Autocomplete;
use FireflyIII\Models\AccountType; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Http\Api\ParsesQueryFilters;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
@@ -39,7 +38,6 @@ class AutocompleteRequest extends FormRequest
use AccountFilter; use AccountFilter;
use ChecksLogin; use ChecksLogin;
use ConvertsDataTypes; use ConvertsDataTypes;
use ParsesQueryFilters;
/** /**
* Loops over all possible query parameters (these are shared over ALL auto complete requests) * Loops over all possible query parameters (these are shared over ALL auto complete requests)
@@ -67,7 +65,7 @@ class AutocompleteRequest extends FormRequest
} }
// remove 'initial balance' from allowed types. its internal // remove 'initial balance' from allowed types. its internal
$array['account_types'] = array_diff($array['account_types'], [AccountType::INITIAL_BALANCE, AccountType::RECONCILIATION, AccountType::CREDITCARD]); $array['account_types'] = array_diff($array['account_types'], [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::CREDITCARD->value]);
$array['account_types'] = $this->getAccountTypeParameter($array['account_types']); $array['account_types'] = $this->getAccountTypeParameter($array['account_types']);
return $array; return $array;

View File

@@ -25,7 +25,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V2\Request\Chart; namespace FireflyIII\Api\V2\Request\Chart;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Support\Http\Api\ParsesQueryFilters;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
@@ -40,7 +39,6 @@ class ChartRequest extends FormRequest
{ {
use ChecksLogin; use ChecksLogin;
use ConvertsDataTypes; use ConvertsDataTypes;
use ParsesQueryFilters;
use ValidatesUserGroupTrait; use ValidatesUserGroupTrait;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];

View File

@@ -1,5 +1,26 @@
<?php <?php
/*
* SeparateTimezoneCaster.php
* Copyright (c) 2025 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/.
*/
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Casts; namespace FireflyIII\Casts;

View File

@@ -55,34 +55,24 @@ class ConvertsDatesToUTC extends Command
{ {
use ShowsFriendlyMessages; use ShowsFriendlyMessages;
/**
* The console command description.
*
* @var string
*/
protected $description = 'Convert stored dates to UTC.'; protected $description = 'Convert stored dates to UTC.';
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'correction:convert-to-utc'; protected $signature = 'correction:convert-to-utc';
/**
* Execute the console command.
*/
public function handle(): int public function handle(): int
{ {
$this->friendlyWarning('Please do not use this command.'); $this->friendlyWarning('Please do not use this command right now.');
return 0; // this variable is ALWAYS en_US.
// stops phpstan complaining about dead code.
if ('en_US' === config('app.fallback_locale')) {
return Command::SUCCESS;
}
/** /**
* @var string $model * @var string $model
* @var array $fields * @var array $fields
*/ */
foreach (AddTimezonesToDates::$models as $model => $fields) { foreach (CorrectsTimezoneInformation::$models as $model => $fields) {
$this->ConvertModeltoUTC($model, $fields); $this->ConvertModeltoUTC($model, $fields);
} }
// tell the system we are now in UTC mode. // tell the system we are now in UTC mode.
@@ -122,10 +112,10 @@ class ConvertsDatesToUTC extends Command
$items->each( $items->each(
function ($item) use ($field, $timezoneField): void { function ($item) use ($field, $timezoneField): void {
/** @var Carbon $date */ /** @var Carbon $date */
$date = Carbon::parse($item->{$field}, $item->{$timezoneField}); $date = Carbon::parse($item->{$field}, $item->{$timezoneField}); // @phpstan-ignore-line
$date->setTimezone('UTC'); $date->setTimezone('UTC');
$item->{$field} = $date->format('Y-m-d H:i:s'); $item->{$field} = $date->format('Y-m-d H:i:s'); // @phpstan-ignore-line
$item->{$timezoneField} = 'UTC'; $item->{$timezoneField} = 'UTC'; // @phpstan-ignore-line
$item->save(); $item->save();
} }
); );

View File

@@ -26,9 +26,9 @@ namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Factory\AccountFactory; use FireflyIII\Factory\AccountFactory;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
@@ -111,6 +111,8 @@ class CorrectsAccountTypes extends Command
$this->friendlyLine(sprintf('Found %d journals that need to be fixed.', $resultSet->count())); $this->friendlyLine(sprintf('Found %d journals that need to be fixed.', $resultSet->count()));
foreach ($resultSet as $entry) { foreach ($resultSet as $entry) {
app('log')->debug(sprintf('Now fixing journal #%d', $entry->id)); app('log')->debug(sprintf('Now fixing journal #%d', $entry->id));
/** @var null|TransactionJournal $journal */
$journal = TransactionJournal::find($entry->id); $journal = TransactionJournal::find($entry->id);
if (null !== $journal) { if (null !== $journal) {
$this->inspectJournal($journal); $this->inspectJournal($journal);
@@ -245,18 +247,18 @@ class CorrectsAccountTypes extends Command
private function shouldBeTransfer(string $transactionType, string $sourceType, string $destinationType): bool private function shouldBeTransfer(string $transactionType, string $sourceType, string $destinationType): bool
{ {
return TransactionType::TRANSFER === $transactionType && AccountType::ASSET === $sourceType && $this->isLiability($destinationType); return TransactionTypeEnum::TRANSFER->value === $transactionType && AccountTypeEnum::ASSET->value === $sourceType && $this->isLiability($destinationType);
} }
private function isLiability(string $destinationType): bool private function isLiability(string $destinationType): bool
{ {
return AccountType::LOAN === $destinationType || AccountType::DEBT === $destinationType || AccountType::MORTGAGE === $destinationType; return AccountTypeEnum::LOAN->value === $destinationType || AccountTypeEnum::DEBT->value === $destinationType || AccountTypeEnum::MORTGAGE->value === $destinationType;
} }
private function makeTransfer(TransactionJournal $journal): void private function makeTransfer(TransactionJournal $journal): void
{ {
// from an asset to a liability should be a withdrawal: // from an asset to a liability should be a withdrawal:
$withdrawal = TransactionType::whereType(TransactionType::WITHDRAWAL)->first(); $withdrawal = TransactionType::whereType(TransactionTypeEnum::WITHDRAWAL->value)->first();
$journal->transactionType()->associate($withdrawal); $journal->transactionType()->associate($withdrawal);
$journal->save(); $journal->save();
$message = sprintf('Converted transaction #%d from a transfer to a withdrawal.', $journal->id); $message = sprintf('Converted transaction #%d from a transfer to a withdrawal.', $journal->id);
@@ -268,13 +270,13 @@ class CorrectsAccountTypes extends Command
private function shouldBeDeposit(string $transactionType, string $sourceType, string $destinationType): bool private function shouldBeDeposit(string $transactionType, string $sourceType, string $destinationType): bool
{ {
return TransactionType::TRANSFER === $transactionType && $this->isLiability($sourceType) && AccountType::ASSET === $destinationType; return TransactionTypeEnum::TRANSFER->value === $transactionType && $this->isLiability($sourceType) && AccountTypeEnum::ASSET->value === $destinationType;
} }
private function makeDeposit(TransactionJournal $journal): void private function makeDeposit(TransactionJournal $journal): void
{ {
// from a liability to an asset should be a deposit. // from a liability to an asset should be a deposit.
$deposit = TransactionType::whereType(TransactionType::DEPOSIT)->first(); $deposit = TransactionType::whereType(TransactionTypeEnum::DEPOSIT->value)->first();
$journal->transactionType()->associate($deposit); $journal->transactionType()->associate($deposit);
$journal->save(); $journal->save();
$message = sprintf('Converted transaction #%d from a transfer to a deposit.', $journal->id); $message = sprintf('Converted transaction #%d from a transfer to a deposit.', $journal->id);
@@ -286,7 +288,7 @@ class CorrectsAccountTypes extends Command
private function shouldGoToExpenseAccount(string $transactionType, string $sourceType, string $destinationType): bool private function shouldGoToExpenseAccount(string $transactionType, string $sourceType, string $destinationType): bool
{ {
return TransactionType::WITHDRAWAL === $transactionType && AccountType::ASSET === $sourceType && AccountType::REVENUE === $destinationType; return TransactionTypeEnum::WITHDRAWAL->value === $transactionType && AccountTypeEnum::ASSET->value === $sourceType && AccountTypeEnum::REVENUE->value === $destinationType;
} }
private function makeExpenseDestination(TransactionJournal $journal, Transaction $destination): void private function makeExpenseDestination(TransactionJournal $journal, Transaction $destination): void
@@ -294,7 +296,7 @@ class CorrectsAccountTypes extends Command
// withdrawals with a revenue account as destination instead of an expense account. // withdrawals with a revenue account as destination instead of an expense account.
$this->factory->setUser($journal->user); $this->factory->setUser($journal->user);
$oldDest = $destination->account; $oldDest = $destination->account;
$result = $this->factory->findOrCreate($destination->account->name, AccountType::EXPENSE); $result = $this->factory->findOrCreate($destination->account->name, AccountTypeEnum::EXPENSE->value);
$destination->account()->associate($result); $destination->account()->associate($result);
$destination->save(); $destination->save();
$message = sprintf( $message = sprintf(
@@ -312,7 +314,7 @@ class CorrectsAccountTypes extends Command
private function shouldComeFromRevenueAccount(string $transactionType, string $sourceType, string $destinationType): bool private function shouldComeFromRevenueAccount(string $transactionType, string $sourceType, string $destinationType): bool
{ {
return TransactionType::DEPOSIT === $transactionType && AccountType::EXPENSE === $sourceType && AccountType::ASSET === $destinationType; return TransactionTypeEnum::DEPOSIT->value === $transactionType && AccountTypeEnum::EXPENSE->value === $sourceType && AccountTypeEnum::ASSET->value === $destinationType;
} }
private function makeRevenueSource(TransactionJournal $journal, Transaction $source): void private function makeRevenueSource(TransactionJournal $journal, Transaction $source): void
@@ -320,7 +322,7 @@ class CorrectsAccountTypes extends Command
// deposits with an expense account as source instead of a revenue account. // deposits with an expense account as source instead of a revenue account.
// find revenue account. // find revenue account.
$this->factory->setUser($journal->user); $this->factory->setUser($journal->user);
$result = $this->factory->findOrCreate($source->account->name, AccountType::REVENUE); $result = $this->factory->findOrCreate($source->account->name, AccountTypeEnum::REVENUE->value);
$oldSource = $source->account; $oldSource = $source->account;
$source->account()->associate($result); $source->account()->associate($result);
$source->save(); $source->save();

View File

@@ -63,7 +63,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).
$defaultCurrency = app('amount')->getDefaultCurrencyByUserGroup($userGroup); $defaultCurrency = app('amount')->getNativeCurrencyByUserGroup($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 = [$defaultCurrency->id]; $found = [$defaultCurrency->id];

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\AccountType; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
@@ -73,7 +73,7 @@ class CorrectsFrontpageAccounts extends Command
$accountIdInt = (int) $accountId; $accountIdInt = (int) $accountId;
$account = $repository->find($accountIdInt); $account = $repository->find($accountIdInt);
if (null !== $account if (null !== $account
&& in_array($account->accountType->type, [AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE], true) && in_array($account->accountType->type, [AccountTypeEnum::ASSET->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value], true)
&& true === $account->active) { && true === $account->active) {
$fixed[] = $account->id; $fixed[] = $account->id;
} }

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -78,14 +78,14 @@ class CorrectsIbans extends Command
continue; continue;
} }
$type = $account->accountType->type; $type = $account->accountType->type;
if (in_array($type, [AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], true)) { if (in_array($type, [AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value], true)) {
$type = 'liabilities'; $type = 'liabilities';
} }
if (array_key_exists($iban, $set[$userId])) { if (array_key_exists($iban, $set[$userId])) {
// iban already in use! two exceptions exist: // iban already in use! two exceptions exist:
if ( if (
!(AccountType::EXPENSE === $set[$userId][$iban] && AccountType::REVENUE === $type) // allowed combination !(AccountTypeEnum::EXPENSE->value === $set[$userId][$iban] && AccountTypeEnum::REVENUE->value === $type) // allowed combination
&& !(AccountType::REVENUE === $set[$userId][$iban] && AccountType::EXPENSE === $type) // also allowed combination. && !(AccountTypeEnum::REVENUE->value === $set[$userId][$iban] && AccountTypeEnum::EXPENSE->value === $type) // also allowed combination.
) { ) {
$this->friendlyWarning( $this->friendlyWarning(
sprintf( sprintf(

View File

@@ -1,9 +1,9 @@
<?php <?php
declare(strict_types=1);
/* /*
* RecalculateNativeAmounts.php * CorrectsNativeAmounts.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2025 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).
* *
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see https://www.gnu.org/licenses/. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
@@ -59,7 +61,7 @@ class CorrectsNativeAmounts extends Command
*/ */
public function handle(): int public function handle(): int
{ {
if (!config('cer.enabled')) { if (false === config('cer.enabled')) {
$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;
@@ -86,7 +88,7 @@ class CorrectsNativeAmounts extends Command
// do a check with the group's currency so we can skip some stuff. // do a check with the group's currency so we can skip some stuff.
Preferences::mark(); Preferences::mark();
$currency = app('amount')->getDefaultCurrencyByUserGroup($userGroup); $currency = app('amount')->getNativeCurrencyByUserGroup($userGroup);
$this->recalculatePiggyBanks($userGroup, $currency); $this->recalculatePiggyBanks($userGroup, $currency);
$this->recalculateBudgets($userGroup, $currency); $this->recalculateBudgets($userGroup, $currency);
@@ -144,7 +146,7 @@ class CorrectsNativeAmounts extends Command
{ {
$set = $piggyBank->piggyBankEvents()->get(); $set = $piggyBank->piggyBankEvents()->get();
$set->each( $set->each(
static function (PiggyBankEvent $event): void { static function (PiggyBankEvent $event): void { // @phpstan-ignore-line
$event->touch(); $event->touch();
} }
); );
@@ -234,8 +236,9 @@ class CorrectsNativeAmounts extends Command
TransactionObserver::$recalculate = false; TransactionObserver::$recalculate = false;
foreach ($set as $item) { foreach ($set as $item) {
// here we are. // here we are.
/** @var null|Transaction $transaction */
$transaction = Transaction::find($item->id); $transaction = Transaction::find($item->id);
$transaction->touch(); $transaction?->touch();
} }
TransactionObserver::$recalculate = true; TransactionObserver::$recalculate = true;
Log::debug(sprintf('Recalculated %d transactions.', $set->count())); Log::debug(sprintf('Recalculated %d transactions.', $set->count()));

View File

@@ -25,12 +25,12 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -65,10 +65,10 @@ class CorrectsOpeningBalanceCurrencies extends Command
private function getJournals(): Collection private function getJournals(): Collection
{ {
// @var Collection /** @var Collection */
return TransactionJournal::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') return TransactionJournal::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
->whereNull('transaction_journals.deleted_at') ->whereNull('transaction_journals.deleted_at')
->where('transaction_types.type', TransactionType::OPENING_BALANCE)->get(['transaction_journals.*']) ->where('transaction_types.type', TransactionTypeEnum::OPENING_BALANCE->value)->get(['transaction_journals.*'])
; ;
} }
@@ -96,7 +96,7 @@ class CorrectsOpeningBalanceCurrencies extends Command
foreach ($transactions as $transaction) { foreach ($transactions as $transaction) {
/** @var null|Account $account */ /** @var null|Account $account */
$account = $transaction->account()->first(); $account = $transaction->account()->first();
if (null !== $account && AccountType::INITIAL_BALANCE !== $account->accountType()->first()->type) { if (null !== $account && AccountTypeEnum::INITIAL_BALANCE->value !== $account->accountType()->first()->type) {
return $account; return $account;
} }
} }
@@ -132,6 +132,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')->getDefaultCurrencyByUserGroup($account->userGroup); return $repos->getAccountCurrency($account) ?? app('amount')->getNativeCurrencyByUserGroup($account->userGroup);
} }
} }

View File

@@ -1,9 +1,9 @@
<?php <?php
declare(strict_types=1);
/* /*
* MigratePreferences.php * CorrectsPreferences.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2025 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).
* *
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see https://www.gnu.org/licenses/. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;

View File

@@ -81,18 +81,7 @@ class CorrectsTimezoneInformation extends Command
TransactionJournal::class => ['date'], TransactionJournal::class => ['date'],
]; ];
/**
* The console command description.
*
* @var string
*/
protected $description = 'Make sure all dates have a timezone.'; protected $description = 'Make sure all dates have a timezone.';
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'correction:timezones'; protected $signature = 'correction:timezones';
/** /**

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use Illuminate\Console\Command; use Illuminate\Console\Command;
class CorrectsTransferBudgets extends Command class CorrectsTransferBudgets extends Command
@@ -44,7 +44,7 @@ class CorrectsTransferBudgets extends Command
$set = TransactionJournal::distinct() $set = TransactionJournal::distinct()
->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
->leftJoin('budget_transaction_journal', 'transaction_journals.id', '=', 'budget_transaction_journal.transaction_journal_id') ->leftJoin('budget_transaction_journal', 'transaction_journals.id', '=', 'budget_transaction_journal.transaction_journal_id')
->whereNotIn('transaction_types.type', [TransactionType::WITHDRAWAL]) ->whereNotIn('transaction_types.type', [TransactionTypeEnum::WITHDRAWAL->value])
->whereNotNull('budget_transaction_journal.budget_id')->get(['transaction_journals.*']) ->whereNotNull('budget_transaction_journal.budget_id')->get(['transaction_journals.*'])
; ;
$count = 0; $count = 0;

View File

@@ -28,7 +28,6 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use FireflyIII\Support\Models\AccountBalanceCalculator; use FireflyIII\Support\Models\AccountBalanceCalculator;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -50,7 +49,7 @@ class CorrectsUnevenAmount extends Command
$this->convertOldStyleTransfers(); $this->convertOldStyleTransfers();
$this->fixUnevenAmounts(); $this->fixUnevenAmounts();
$this->matchCurrencies(); $this->matchCurrencies();
if (config('firefly.feature_flags.running_balance_column')) { if (true === config('firefly.feature_flags.running_balance_column')) {
$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.');
@@ -84,7 +83,7 @@ class CorrectsUnevenAmount extends Command
continue; continue;
} }
// needs to be a transfer. // needs to be a transfer.
if (TransactionType::TRANSFER !== $journal->transactionType->type) { if (TransactionTypeEnum::TRANSFER->value !== $journal->transactionType->type) {
Log::debug('Must be a transfer, continue.'); Log::debug('Must be a transfer, continue.');
continue; continue;
@@ -122,7 +121,7 @@ class CorrectsUnevenAmount extends Command
$journals = \DB::table('transactions') $journals = \DB::table('transactions')
->groupBy('transaction_journal_id') ->groupBy('transaction_journal_id')
->whereNull('deleted_at') ->whereNull('deleted_at')
->get(['transaction_journal_id', \DB::raw('SUM(amount) AS the_sum')]) ->get(['transaction_journal_id', \DB::raw('SUM(amount) AS the_sum')]) // @phpstan-ignore-line
; ;
/** @var \stdClass $entry */ /** @var \stdClass $entry */
@@ -228,7 +227,7 @@ class CorrectsUnevenAmount extends Command
private function isForeignCurrencyTransfer(TransactionJournal $journal): bool private function isForeignCurrencyTransfer(TransactionJournal $journal): bool
{ {
if (TransactionType::TRANSFER !== $journal->transactionType->type) { if (TransactionTypeEnum::TRANSFER->value !== $journal->transactionType->type) {
return false; return false;
} }

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -42,7 +43,7 @@ class RemovesBills extends Command
public function handle(): int public function handle(): int
{ {
/** @var null|TransactionType $withdrawal */ /** @var null|TransactionType $withdrawal */
$withdrawal = TransactionType::where('type', TransactionType::WITHDRAWAL)->first(); $withdrawal = TransactionType::where('type', TransactionTypeEnum::WITHDRAWAL->value)->first();
if (null === $withdrawal) { if (null === $withdrawal) {
return 0; return 0;
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Correction; namespace FireflyIII\Console\Commands\Correction;
use Exception;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -39,7 +38,7 @@ class RemovesEmptyGroups extends Command
/** /**
* Execute the console command. * Execute the console command.
* *
* @throws Exception; * @throws \Exception
*/ */
public function handle(): int public function handle(): int
{ {

View File

@@ -66,7 +66,9 @@ class RemovesEmptyJournals extends Command
if (1 === $count % 2) { if (1 === $count % 2) {
// uneven number, delete journal and transactions: // uneven number, delete journal and transactions:
try { try {
TransactionJournal::find($row->transaction_journal_id)->delete(); /** @var null|TransactionJournal $journal */
$journal = TransactionJournal::find($row->transaction_journal_id);
$journal?->delete();
} catch (QueryException $e) { } catch (QueryException $e) {
app('log')->info(sprintf('Could not delete journal: %s', $e->getMessage())); app('log')->info(sprintf('Could not delete journal: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); app('log')->error($e->getTraceAsString());
@@ -92,7 +94,9 @@ class RemovesEmptyJournals extends Command
foreach ($set as $entry) { foreach ($set as $entry) {
try { try {
TransactionJournal::find($entry->id)->delete(); /** @var null|TransactionJournal $journal */
$journal = TransactionJournal::find($entry->id);
$journal?->delete();
} catch (QueryException $e) { } catch (QueryException $e) {
app('log')->info(sprintf('Could not delete entry: %s', $e->getMessage())); app('log')->info(sprintf('Could not delete entry: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); app('log')->error($e->getTraceAsString());

View File

@@ -69,6 +69,7 @@ class RemovesOrphanedTransactions extends Command
} }
$this->friendlyInfo(sprintf('Found %d orphaned journal(s).', $count)); $this->friendlyInfo(sprintf('Found %d orphaned journal(s).', $count));
foreach ($set as $entry) { foreach ($set as $entry) {
/** @var null|TransactionJournal $journal */
$journal = TransactionJournal::withTrashed()->find($entry->id); $journal = TransactionJournal::withTrashed()->find($entry->id);
if (null !== $journal) { if (null !== $journal) {
$journal->delete(); $journal->delete();
@@ -130,6 +131,7 @@ class RemovesOrphanedTransactions extends Command
/** @var Transaction $transaction */ /** @var Transaction $transaction */
foreach ($set as $transaction) { foreach ($set as $transaction) {
// delete journals // delete journals
/** @var null|TransactionJournal $journal */
$journal = TransactionJournal::find($transaction->transaction_journal_id); $journal = TransactionJournal::find($transaction->transaction_journal_id);
if (null !== $journal) { if (null !== $journal) {
$journal->delete(); $journal->delete();

View File

@@ -27,9 +27,9 @@ namespace FireflyIII\Console\Commands\Export;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Console\Commands\VerifiesAccessToken; use FireflyIII\Console\Commands\VerifiesAccessToken;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Export\ExportDataGenerator; use FireflyIII\Support\Export\ExportDataGenerator;
@@ -229,7 +229,7 @@ class ExportsData extends Command
$final = new Collection(); $final = new Collection();
$accounts = new Collection(); $accounts = new Collection();
$accountList = (string) $this->option('accounts'); $accountList = (string) $this->option('accounts');
$types = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]; $types = [AccountTypeEnum::ASSET->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value];
if ('' !== $accountList) { if ('' !== $accountList) {
$accountIds = explode(',', $accountList); $accountIds = explode(',', $accountList);
$accounts = $this->accountRepository->getAccountsById($accountIds); $accounts = $this->accountRepository->getAccountsById($accountIds);

View File

@@ -61,12 +61,7 @@ class ReportsSums extends Command
$sum = '' === $sum ? '0' : $sum; $sum = '' === $sum ? '0' : $sum;
$foreign = '' === $foreign ? '0' : $foreign; $foreign = '' === $foreign ? '0' : $foreign;
$total = bcadd($sum, $foreign); $total = bcadd($sum, $foreign);
if (!is_numeric($total)) {
$message = sprintf('Error: Transactions for user #%d (%s) have an invalid sum ("%s").', $user->id, $user->email, $total);
$this->friendlyError($message);
continue;
}
if (0 !== bccomp($total, '0')) { if (0 !== bccomp($total, '0')) {
$message = sprintf('Error: Transactions for user #%d (%s) are off by %s!', $user->id, $user->email, $total); $message = sprintf('Error: Transactions for user #%d (%s) are off by %s!', $user->id, $user->email, $total);
$this->friendlyError($message); $this->friendlyError($message);

View File

@@ -1,9 +1,9 @@
<?php <?php
declare(strict_types=1);
/* /*
* LaravelPassportKeys.php * CallsLaravelPassportKeys.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2025 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).
* *
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see https://www.gnu.org/licenses/. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\System; namespace FireflyIII\Console\Commands\System;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;

View File

@@ -36,24 +36,19 @@ class CreatesDatabase extends Command
protected $signature = 'firefly-iii:create-database'; protected $signature = 'firefly-iii:create-database';
/**
* Execute the console command.
*
* @suppressWarnings(PHPMD.MissingImport)
*/
public function handle(): int public function handle(): int
{ {
if ('mysql' !== env('DB_CONNECTION', 'mysql')) { if ('mysql' !== env('DB_CONNECTION')) { // @phpstan-ignore larastan.noEnvCallsOutsideOfConfig */
$this->friendlyInfo(sprintf('CreateDB does not apply to "%s", skipped.', env('DB_CONNECTION'))); $this->friendlyInfo(sprintf('CreateDB does not apply to "%s", skipped.', env('DB_CONNECTION')));
return 0; return 0;
} }
// try to set up a raw connection: // try to set up a raw connection:
$exists = false; $exists = false;
$dsn = sprintf('mysql:host=%s;port=%d;charset=utf8mb4', env('DB_HOST', 'localhost'), env('DB_PORT', '3306')); $dsn = sprintf('mysql:host=%s;port=%d;charset=utf8mb4', env('DB_HOST'), env('DB_PORT'));
if ('' !== env('DB_SOCKET', '')) { if ('' !== (string) env('DB_SOCKET')) {
$dsn = sprintf('mysql:unix_socket=%s;charset=utf8mb4', env('DB_SOCKET', '')); $dsn = sprintf('mysql:unix_socket=%s;charset=utf8mb4', env('DB_SOCKET'));
} }
$this->friendlyLine(sprintf('DSN is %s', $dsn)); $this->friendlyLine(sprintf('DSN is %s', $dsn));
@@ -65,7 +60,7 @@ class CreatesDatabase extends Command
// when it fails, display error // when it fails, display error
try { try {
$pdo = new \PDO($dsn, env('DB_USERNAME'), env('DB_PASSWORD'), $options); $pdo = new \PDO($dsn, (string) env('DB_USERNAME'), (string) env('DB_PASSWORD'), $options);
} catch (\PDOException $e) { } catch (\PDOException $e) {
$this->friendlyError(sprintf('Error when connecting to DB: %s', $e->getMessage())); $this->friendlyError(sprintf('Error when connecting to DB: %s', $e->getMessage()));

View File

@@ -43,7 +43,7 @@ class CreatesFirstUser extends Command
*/ */
public function handle(): int public function handle(): int
{ {
if ('testing' !== env('APP_ENV', 'local')) { if ('testing' !== config('app.env')) {
$this->friendlyError('This command only works in the testing environment.'); $this->friendlyError('This command only works in the testing environment.');
return 1; return 1;

View File

@@ -173,7 +173,7 @@ class ForcesDecimalSize extends Command
* @var array $fields * @var array $fields
*/ */
foreach ($this->tables as $name => $fields) { foreach ($this->tables as $name => $fields) {
switch ($name) { // @phpstan-ignore-line switch ($name) {
default: default:
$message = sprintf('Cannot handle table "%s"', $name); $message = sprintf('Cannot handle table "%s"', $name);
$this->friendlyError($message); $this->friendlyError($message);
@@ -239,7 +239,7 @@ class ForcesDecimalSize extends Command
$query->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void { $query->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
DB::raw(sprintf('CAST(accounts.%s AS %s)', $field, $cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(accounts.%s AS %s)', $field, $cast)),
$operator, $operator,
DB::raw(sprintf($regularExpression, $currency->decimal_places)) DB::raw(sprintf($regularExpression, $currency->decimal_places))
); );
@@ -256,15 +256,18 @@ class ForcesDecimalSize extends Command
foreach ($result as $account) { foreach ($result as $account) {
/** @var string $field */ /** @var string $field */
foreach ($fields as $field) { foreach ($fields as $field) {
$value = $account->{$field}; $value = $account->{$field};
if (null === $value) { if (null === $value) {
continue; continue;
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string) round($value * $pow), (string) $pow, 12);
$this->friendlyInfo(sprintf('Account #%d has %s with value "%s", this has been corrected to "%s".', $account->id, $field, $value, $correct)); $this->friendlyInfo(sprintf('Account #%d has %s with value "%s", this has been corrected to "%s".', $account->id, $field, $value, $correct));
Account::find($account->id)->update([$field => $correct]);
/** @var null|Account $updateAccount */
$updateAccount = Account::find($account->id);
$updateAccount?->update([$field => $correct]);
} }
} }
} }
@@ -286,7 +289,7 @@ class ForcesDecimalSize extends Command
/** @var string $field */ /** @var string $field */
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
DB::raw(sprintf('CAST(%s AS %s)', $field, $cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(%s AS %s)', $field, $cast)),
$operator, $operator,
DB::raw(sprintf($regularExpression, $currency->decimal_places)) DB::raw(sprintf($regularExpression, $currency->decimal_places))
); );
@@ -313,7 +316,10 @@ class ForcesDecimalSize extends Command
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string) round($value * $pow), (string) $pow, 12);
$this->friendlyWarning(sprintf('%s #%d has %s with value "%s", this has been corrected to "%s".', $table, $item->id, $field, $value, $correct)); $this->friendlyWarning(sprintf('%s #%d has %s with value "%s", this has been corrected to "%s".', $table, $item->id, $field, $value, $correct));
$class::find($item->id)->update([$field => $correct]);
/** @var null|Model $model */
$model = $class::find($item->id);
$model?->update([$field => $correct]);
} }
} }
} }
@@ -336,7 +342,7 @@ class ForcesDecimalSize extends Command
->where(static function (Builder $q) use ($fields, $currency, $cast, $operator, $regularExpression): void { ->where(static function (Builder $q) use ($fields, $currency, $cast, $operator, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
DB::raw(sprintf('CAST(piggy_bank_events.%s AS %s)', $field, $cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(piggy_bank_events.%s AS %s)', $field, $cast)),
$operator, $operator,
DB::raw(sprintf($regularExpression, $currency->decimal_places)) DB::raw(sprintf($regularExpression, $currency->decimal_places))
); );
@@ -365,7 +371,10 @@ class ForcesDecimalSize extends Command
$this->friendlyWarning( $this->friendlyWarning(
sprintf('Piggy bank event #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct) sprintf('Piggy bank event #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct)
); );
PiggyBankEvent::find($item->id)->update([$field => $correct]);
/** @var null|PiggyBankEvent $event */
$event = PiggyBankEvent::find($item->id);
$event?->update([$field => $correct]);
} }
} }
} }
@@ -389,7 +398,7 @@ class ForcesDecimalSize extends Command
->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void { ->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
DB::raw(sprintf('CAST(piggy_bank_repetitions.%s AS %s)', $field, $cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(piggy_bank_repetitions.%s AS %s)', $field, $cast)),
$operator, $operator,
DB::raw(sprintf($regularExpression, $currency->decimal_places)) DB::raw(sprintf($regularExpression, $currency->decimal_places))
); );
@@ -408,17 +417,20 @@ class ForcesDecimalSize extends Command
foreach ($result as $item) { foreach ($result as $item) {
/** @var string $field */ /** @var string $field */
foreach ($fields as $field) { foreach ($fields as $field) {
$value = $item->{$field}; $value = $item->{$field};
if (null === $value) { if (null === $value) {
continue; continue;
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string) round($value * $pow), (string) $pow, 12);
$this->friendlyWarning( $this->friendlyWarning(
sprintf('Piggy bank repetition #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct) sprintf('Piggy bank repetition #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct)
); );
PiggyBankRepetition::find($item->id)->update([$field => $correct]);
/** @var null|PiggyBankRepetition $repetition */
$repetition = PiggyBankRepetition::find($item->id);
$repetition->update([$field => $correct]);
} }
} }
} }
@@ -440,7 +452,7 @@ class ForcesDecimalSize extends Command
->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void { ->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
DB::raw(sprintf('CAST(piggy_banks.%s AS %s)', $field, $cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(piggy_banks.%s AS %s)', $field, $cast)),
$operator, $operator,
DB::raw(sprintf($regularExpression, $currency->decimal_places)) DB::raw(sprintf($regularExpression, $currency->decimal_places))
); );
@@ -459,15 +471,18 @@ class ForcesDecimalSize extends Command
foreach ($result as $item) { foreach ($result as $item) {
/** @var string $field */ /** @var string $field */
foreach ($fields as $field) { foreach ($fields as $field) {
$value = $item->{$field}; $value = $item->{$field};
if (null === $value) { if (null === $value) {
continue; continue;
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string) round($value * $pow), (string) $pow, 12);
$this->friendlyWarning(sprintf('Piggy bank #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct)); $this->friendlyWarning(sprintf('Piggy bank #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct));
PiggyBank::find($item->id)->update([$field => $correct]);
/** @var null|PiggyBank $piggyBank */
$piggyBank = PiggyBank::find($item->id);
$piggyBank?->update([$field => $correct]);
} }
} }
} }
@@ -480,7 +495,7 @@ class ForcesDecimalSize extends Command
// select all transactions with this currency and issue. // select all transactions with this currency and issue.
/** @var Builder $query */ /** @var Builder $query */
$query = Transaction::where('transaction_currency_id', $currency->id)->where( $query = Transaction::where('transaction_currency_id', $currency->id)->where(
DB::raw(sprintf('CAST(amount as %s)', $this->cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(amount as %s)', $this->cast)),
$this->operator, $this->operator,
DB::raw(sprintf($this->regularExpression, $currency->decimal_places)) DB::raw(sprintf($this->regularExpression, $currency->decimal_places))
); );
@@ -492,21 +507,24 @@ class ForcesDecimalSize extends Command
/** @var Transaction $item */ /** @var Transaction $item */
foreach ($result as $item) { foreach ($result as $item) {
$value = $item->amount; $value = $item->amount;
if ('' === $value) { if ('' === $value) {
continue; continue;
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = (float) 10 ** $currency->decimal_places; $pow = (float) 10 ** $currency->decimal_places;
$correct = bcdiv((string) round((float) $value * $pow), (string) $pow, 12); $correct = bcdiv((string) round((float) $value * $pow), (string) $pow, 12);
$this->friendlyWarning(sprintf('Transaction #%d has amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct)); $this->friendlyWarning(sprintf('Transaction #%d has amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct));
Transaction::find($item->id)->update(['amount' => $correct]);
/** @var null|Transaction $transaction */
$transaction = Transaction::find($item->id);
$transaction?->update(['amount' => $correct]);
} }
// select all transactions with this FOREIGN currency and issue. // select all transactions with this FOREIGN currency and issue.
/** @var Builder $query */ /** @var Builder $query */
$query = Transaction::where('foreign_currency_id', $currency->id)->where( $query = Transaction::where('foreign_currency_id', $currency->id)->where(
DB::raw(sprintf('CAST(foreign_amount as %s)', $this->cast)), // @phpstan-ignore-line DB::raw(sprintf('CAST(foreign_amount as %s)', $this->cast)),
$this->operator, $this->operator,
DB::raw(sprintf($this->regularExpression, $currency->decimal_places)) DB::raw(sprintf($this->regularExpression, $currency->decimal_places))
); );
@@ -520,17 +538,20 @@ class ForcesDecimalSize extends Command
/** @var Transaction $item */ /** @var Transaction $item */
foreach ($result as $item) { foreach ($result as $item) {
$value = $item->foreign_amount; $value = $item->foreign_amount;
if (null === $value) { if (null === $value) {
continue; continue;
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = (float) 10 ** $currency->decimal_places; $pow = (float) 10 ** $currency->decimal_places;
$correct = bcdiv((string) round((float) $value * $pow), (string) $pow, 12); $correct = bcdiv((string) round((float) $value * $pow), (string) $pow, 12);
$this->friendlyWarning( $this->friendlyWarning(
sprintf('Transaction #%d has foreign amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct) sprintf('Transaction #%d has foreign amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct)
); );
Transaction::find($item->id)->update(['foreign_amount' => $correct]);
/** @var null|Transaction $transaction */
$transaction = Transaction::find($item->id);
$transaction?->update(['foreign_amount' => $correct]);
} }
} }

View File

@@ -27,8 +27,8 @@ namespace FireflyIII\Console\Commands\Tools;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Console\Commands\VerifiesAccessToken; use FireflyIII\Console\Commands\VerifiesAccessToken;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
@@ -125,7 +125,7 @@ class ApplyRules extends Command
$ruleEngine->addOperator(['type' => 'account_id', 'value' => $list]); $ruleEngine->addOperator(['type' => 'account_id', 'value' => $list]);
// add the date as a filter: // add the date as a filter:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $this->start_date->format('Y-m-d')]); $ruleEngine->addOperator(['type' => 'date_after', 'value' => $this->startDate->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $this->endDate->format('Y-m-d')]); $ruleEngine->addOperator(['type' => 'date_before', 'value' => $this->endDate->format('Y-m-d')]);
// start running rules. // start running rules.
@@ -154,7 +154,7 @@ class ApplyRules extends Command
$this->ruleGroupSelection = []; $this->ruleGroupSelection = [];
$this->ruleRepository = app(RuleRepositoryInterface::class); $this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class); $this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class);
$this->acceptedAccounts = [AccountType::DEFAULT, AccountType::DEBT, AccountType::ASSET, AccountType::LOAN, AccountType::MORTGAGE]; $this->acceptedAccounts = [AccountTypeEnum::DEFAULT->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value];
$this->groups = new Collection(); $this->groups = new Collection();
} }
@@ -226,7 +226,7 @@ class ApplyRules extends Command
foreach ($ruleGroupList as $ruleGroupId) { foreach ($ruleGroupList as $ruleGroupId) {
$ruleGroup = $this->ruleGroupRepository->find((int) $ruleGroupId); $ruleGroup = $this->ruleGroupRepository->find((int) $ruleGroupId);
if ($ruleGroup->active) { if (true === $ruleGroup->active) {
$this->ruleGroupSelection[] = $ruleGroup->id; $this->ruleGroupSelection[] = $ruleGroup->id;
} }
if (false === $ruleGroup->active) { if (false === $ruleGroup->active) {
@@ -248,7 +248,7 @@ class ApplyRules extends Command
foreach ($ruleList as $ruleId) { foreach ($ruleList as $ruleId) {
$rule = $this->ruleRepository->find((int) $ruleId); $rule = $this->ruleRepository->find((int) $ruleId);
if (null !== $rule && $rule->active) { if (null !== $rule && true === $rule->active) {
$this->ruleSelection[] = $rule->id; $this->ruleSelection[] = $rule->id;
} }
} }
@@ -262,8 +262,8 @@ class ApplyRules extends Command
private function verifyInputDates(): void private function verifyInputDates(): void
{ {
// parse start date. // parse start date.
$inputStart = today(config('app.timezone'))->startOfMonth(); $inputStart = today(config('app.timezone'))->startOfMonth();
$startString = $this->option('start_date'); $startString = $this->option('start_date');
if (null === $startString) { if (null === $startString) {
/** @var JournalRepositoryInterface $repository */ /** @var JournalRepositoryInterface $repository */
$repository = app(JournalRepositoryInterface::class); $repository = app(JournalRepositoryInterface::class);
@@ -278,8 +278,8 @@ class ApplyRules extends Command
} }
// parse end date // parse end date
$inputEnd = today(config('app.timezone')); $inputEnd = today(config('app.timezone'));
$endString = $this->option('end_date'); $endString = $this->option('end_date');
if (null !== $endString && '' !== $endString) { if (null !== $endString && '' !== $endString) {
$inputEnd = Carbon::createFromFormat('Y-m-d', $endString); $inputEnd = Carbon::createFromFormat('Y-m-d', $endString);
} }
@@ -293,8 +293,8 @@ class ApplyRules extends Command
[$inputEnd, $inputStart] = [$inputStart, $inputEnd]; [$inputEnd, $inputStart] = [$inputStart, $inputEnd];
} }
$this->start_date = $inputStart; $this->startDate = $inputStart;
$this->endDate = $inputEnd; $this->endDate = $inputEnd;
} }
private function grabAllRules(): void private function grabAllRules(): void

View File

@@ -43,7 +43,7 @@ class RepairsAccountBalances extends Command
return 0; return 0;
} }
if (config('firefly.feature_flags.running_balance_column')) { if (true === config('firefly.feature_flags.running_balance_column')) {
$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();
@@ -70,7 +70,6 @@ class RepairsAccountBalances extends Command
private function correctBalanceAmounts(): void private function correctBalanceAmounts(): void
{ {
return; AccountBalanceCalculator::recalculateAll(false);
AccountBalanceCalculator::recalculateAll(true);
} }
} }

View File

@@ -25,10 +25,10 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
@@ -104,10 +104,10 @@ class UpgradesAccountCurrencies extends Command
private function updateCurrenciesForUser(User $user): void private function updateCurrenciesForUser(User $user): void
{ {
$this->accountRepos->setUser($user); $this->accountRepos->setUser($user);
$accounts = $this->accountRepos->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value]);
// get user's currency preference: // get user's currency preference:
$defaultCurrency = app('amount')->getDefaultCurrencyByUserGroup($user->userGroup); $defaultCurrency = app('amount')->getNativeCurrencyByUserGroup($user->userGroup);
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {

View File

@@ -66,7 +66,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')->getDefaultCurrencyByUserGroup($user->userGroup); $currency = app('amount')->getNativeCurrencyByUserGroup($user->userGroup);
$budgetLimit->transaction_currency_id = $currency->id; $budgetLimit->transaction_currency_id = $currency->id;
$budgetLimit->save(); $budgetLimit->save();
$this->friendlyInfo( $this->friendlyInfo(

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
@@ -52,8 +53,8 @@ class UpgradesCreditCardLiabilities extends Command
return 0; return 0;
} }
$ccType = AccountType::where('type', AccountType::CREDITCARD)->first(); $ccType = AccountType::where('type', AccountTypeEnum::CREDITCARD->value)->first();
$debtType = AccountType::where('type', AccountType::DEBT)->first(); $debtType = AccountType::where('type', AccountTypeEnum::DEBT->value)->first();
if (null === $ccType || null === $debtType) { if (null === $ccType || null === $debtType) {
$this->markAsExecuted(); $this->markAsExecuted();

View File

@@ -95,7 +95,7 @@ class UpgradesCurrencyPreferences extends Command
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */
foreach ($currencies as $currency) { foreach ($currencies as $currency) {
if ($currency->enabled) { if (true === $currency->enabled) {
$enabled->push($currency); $enabled->push($currency);
} }
} }
@@ -109,7 +109,7 @@ class UpgradesCurrencyPreferences extends Command
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */
foreach ($currencies as $currency) { foreach ($currencies as $currency) {
if ($currency->enabled) { if (true === $currency->enabled) {
$enabled->push($currency); $enabled->push($currency);
} }
} }

View File

@@ -138,11 +138,13 @@ class UpgradesLiabilities extends Command
private function getSourceTransaction(TransactionJournal $journal): ?Transaction private function getSourceTransaction(TransactionJournal $journal): ?Transaction
{ {
/** @var null|Transaction */
return $journal->transactions()->where('amount', '<', 0)->first(); return $journal->transactions()->where('amount', '<', 0)->first();
} }
private function getDestinationTransaction(TransactionJournal $journal): ?Transaction private function getDestinationTransaction(TransactionJournal $journal): ?Transaction
{ {
/** @var null|Transaction */
return $journal->transactions()->where('amount', '>', 0)->first(); return $journal->transactions()->where('amount', '>', 0)->first();
} }

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
@@ -118,8 +119,8 @@ class UpgradesLiabilitiesEight extends Command
private function hasBadOpening(Account $account): bool private function hasBadOpening(Account $account): bool
{ {
$openingBalanceType = TransactionType::whereType(TransactionType::OPENING_BALANCE)->first(); $openingBalanceType = TransactionType::whereType(TransactionTypeEnum::OPENING_BALANCE->value)->first();
$liabilityType = TransactionType::whereType(TransactionType::LIABILITY_CREDIT)->first(); $liabilityType = TransactionType::whereType(TransactionTypeEnum::LIABILITY_CREDIT->value)->first();
$openingJournal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') $openingJournal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->where('transactions.account_id', $account->id) ->where('transactions.account_id', $account->id)
->where('transaction_journals.transaction_type_id', $openingBalanceType->id) ->where('transaction_journals.transaction_type_id', $openingBalanceType->id)
@@ -145,7 +146,7 @@ class UpgradesLiabilitiesEight extends Command
private function deleteCreditTransaction(Account $account): void private function deleteCreditTransaction(Account $account): void
{ {
$liabilityType = TransactionType::whereType(TransactionType::LIABILITY_CREDIT)->first(); $liabilityType = TransactionType::whereType(TransactionTypeEnum::LIABILITY_CREDIT->value)->first();
$liabilityJournal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') $liabilityJournal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->where('transactions.account_id', $account->id) ->where('transactions.account_id', $account->id)
->where('transaction_journals.transaction_type_id', $liabilityType->id) ->where('transaction_journals.transaction_type_id', $liabilityType->id)
@@ -162,7 +163,7 @@ class UpgradesLiabilitiesEight extends Command
private function reverseOpeningBalance(Account $account): void private function reverseOpeningBalance(Account $account): void
{ {
$openingBalanceType = TransactionType::whereType(TransactionType::OPENING_BALANCE)->first(); $openingBalanceType = TransactionType::whereType(TransactionTypeEnum::OPENING_BALANCE->value)->first();
/** @var TransactionJournal $openingJournal */ /** @var TransactionJournal $openingJournal */
$openingJournal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') $openingJournal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')

View File

@@ -1,9 +1,9 @@
<?php <?php
declare(strict_types=1);
/* /*
* UpgradeMultiPiggyBanks.php * UpgradesMultiPiggyBanks.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2025 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).
* *
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see https://www.gnu.org/licenses/. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
@@ -88,7 +90,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')->getDefaultCurrencyByUserGroup($piggyBank->account->user->userGroup); $currency = $this->accountRepository->getAccountCurrency($piggyBank->account) ?? app('amount')->getNativeCurrencyByUserGroup($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;

View File

@@ -1,9 +1,9 @@
<?php <?php
declare(strict_types=1);
/* /*
* UpgradesNativeAmounts.php * UpgradesNativeAmounts.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2025 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).
* *
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see https://www.gnu.org/licenses/. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;

View File

@@ -1,9 +1,9 @@
<?php <?php
declare(strict_types=1);
/* /*
* MigrateRuleActions.php * UpgradesRuleActions.php
* Copyright (c) 2024 james@firefly-iii.org. * Copyright (c) 2025 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).
* *
@@ -21,6 +21,8 @@ declare(strict_types=1);
* along with this program. If not, see https://www.gnu.org/licenses/. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;

View File

@@ -185,7 +185,7 @@ class UpgradesToGroups extends Command
} }
/** /**
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings("PHPMD.ExcessiveMethodLength")
*/ */
private function generateTransaction(TransactionJournal $journal, Transaction $transaction): array private function generateTransaction(TransactionJournal $journal, Transaction $transaction): array
{ {

View File

@@ -25,11 +25,11 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -122,7 +122,7 @@ class UpgradesTransferCurrencies extends Command
*/ */
private function startUpdateRoutine(): void private function startUpdateRoutine(): void
{ {
$set = $this->cliRepos->getAllJournals([TransactionType::TRANSFER]); $set = $this->cliRepos->getAllJournals([TransactionTypeEnum::TRANSFER->value]);
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($set as $journal) { foreach ($set as $journal) {
@@ -207,6 +207,7 @@ class UpgradesTransferCurrencies extends Command
private function getSourceTransaction(TransactionJournal $transfer): ?Transaction private function getSourceTransaction(TransactionJournal $transfer): ?Transaction
{ {
/** @var null|Transaction */
return $transfer->transactions()->where('amount', '<', 0)->first(); return $transfer->transactions()->where('amount', '<', 0)->first();
} }
@@ -242,6 +243,7 @@ class UpgradesTransferCurrencies extends Command
private function getDestinationTransaction(TransactionJournal $transfer): ?Transaction private function getDestinationTransaction(TransactionJournal $transfer): ?Transaction
{ {
/** @var null|Transaction */
return $transfer->transactions()->where('amount', '>', 0)->first(); return $transfer->transactions()->where('amount', '>', 0)->first();
} }

View File

@@ -25,12 +25,12 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\Upgrade; namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; 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;
@@ -103,7 +103,7 @@ class UpgradesVariousCurrencyInformation extends Command
private function updateOtherJournalsCurrencies(): void private function updateOtherJournalsCurrencies(): void
{ {
$set = $this->cliRepos->getAllJournals( $set = $this->cliRepos->getAllJournals(
[TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::OPENING_BALANCE, TransactionType::RECONCILIATION] [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::OPENING_BALANCE->value, TransactionTypeEnum::RECONCILIATION->value]
); );
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
@@ -173,46 +173,47 @@ class UpgradesVariousCurrencyInformation extends Command
*/ */
private function getLeadTransaction(TransactionJournal $journal): ?Transaction private function getLeadTransaction(TransactionJournal $journal): ?Transaction
{ {
/** @var Transaction $lead */ /** @var null|Transaction $lead */
$lead = null; $lead = null;
switch ($journal->transactionType->type) { switch ($journal->transactionType->type) {
default: default:
break; break;
case TransactionType::WITHDRAWAL: case TransactionTypeEnum::WITHDRAWAL->value:
$lead = $journal->transactions()->where('amount', '<', 0)->first(); $lead = $journal->transactions()->where('amount', '<', 0)->first();
break; break;
case TransactionType::DEPOSIT: case TransactionTypeEnum::DEPOSIT->value:
$lead = $journal->transactions()->where('amount', '>', 0)->first(); $lead = $journal->transactions()->where('amount', '>', 0)->first();
break; break;
case TransactionType::OPENING_BALANCE: case TransactionTypeEnum::OPENING_BALANCE->value:
// whichever isn't an initial balance account: // whichever isn't an initial balance account:
$lead = $journal->transactions()->leftJoin('accounts', 'transactions.account_id', '=', 'accounts.id')->leftJoin( $lead = $journal->transactions()->leftJoin('accounts', 'transactions.account_id', '=', 'accounts.id')->leftJoin(
'account_types', 'account_types',
'accounts.account_type_id', 'accounts.account_type_id',
'=', '=',
'account_types.id' 'account_types.id'
)->where('account_types.type', '!=', AccountType::INITIAL_BALANCE)->first(['transactions.*']); )->where('account_types.type', '!=', AccountTypeEnum::INITIAL_BALANCE->value)->first(['transactions.*']);
break; break;
case TransactionType::RECONCILIATION: case TransactionTypeEnum::RECONCILIATION->value:
// whichever isn't the reconciliation account: // whichever isn't the reconciliation account:
$lead = $journal->transactions()->leftJoin('accounts', 'transactions.account_id', '=', 'accounts.id')->leftJoin( $lead = $journal->transactions()->leftJoin('accounts', 'transactions.account_id', '=', 'accounts.id')->leftJoin(
'account_types', 'account_types',
'accounts.account_type_id', 'accounts.account_type_id',
'=', '=',
'account_types.id' 'account_types.id'
)->where('account_types.type', '!=', AccountType::RECONCILIATION)->first(['transactions.*']); )->where('account_types.type', '!=', AccountTypeEnum::RECONCILIATION->value)->first(['transactions.*']);
break; break;
} }
/** @var null|Transaction */
return $lead; return $lead;
} }
@@ -238,8 +239,8 @@ class UpgradesVariousCurrencyInformation extends Command
private function isMultiCurrency(Account $account): bool private function isMultiCurrency(Account $account): bool
{ {
$value = $this->accountRepos->getMetaValue($account, 'is_multi_currency', false); $value = $this->accountRepos->getMetaValue($account, 'is_multi_currency');
if (false === $value || null === $value) { if (null === $value) {
return false; return false;
} }

View File

@@ -36,7 +36,7 @@ class AccountBalance
{ {
$balance = new self(); $balance = new self();
$balance->id = (string) random_int(1, 1000); $balance->id = (string) random_int(1, 1000);
$balance->name = (string) random_int(1, 1000); // $balance->name = (string) random_int(1, 1000);
$balance->amount = (string) random_int(1, 1000); $balance->amount = (string) random_int(1, 1000);
$balance->currencyId = '1'; $balance->currencyId = '1';

View File

@@ -43,7 +43,7 @@ class TriggeredAuditLog extends Event
/** /**
* Create a new event instance. * Create a new event instance.
* *
* @SuppressWarnings(PHPMD.ExcessiveParameterList) * @SuppressWarnings("PHPMD.ExcessiveParameterList")
*/ */
public function __construct(Model $changer, Model $auditable, string $field, mixed $before, mixed $after) public function __construct(Model $changer, Model $auditable, string $field, mixed $before, mixed $after)
{ {

View File

@@ -24,12 +24,12 @@ declare(strict_types=1);
namespace FireflyIII\Exceptions; namespace FireflyIII\Exceptions;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -47,7 +47,7 @@ class GracefulNotFoundHandler extends ExceptionHandler
* *
* @throws \Throwable * @throws \Throwable
* *
* @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings("PHPMD.CyclomaticComplexity")
*/ */
public function render($request, \Throwable $e): Response public function render($request, \Throwable $e): Response
{ {
@@ -208,7 +208,7 @@ class GracefulNotFoundHandler extends ExceptionHandler
$type = $journal->transactionType->type; $type = $journal->transactionType->type;
$request->session()->reflash(); $request->session()->reflash();
if (TransactionType::RECONCILIATION === $type) { if (TransactionTypeEnum::RECONCILIATION->value === $type) {
return redirect(route('accounts.index', ['asset'])); return redirect(route('accounts.index', ['asset']));
} }

View File

@@ -78,8 +78,8 @@ class Handler extends ExceptionHandler
* *
* @throws \Throwable * @throws \Throwable
* *
* @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings("PHPMD.NPathComplexity")
* @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings("PHPMD.CyclomaticComplexity")
*/ */
public function render($request, \Throwable $e): Response public function render($request, \Throwable $e): Response
{ {
@@ -87,17 +87,6 @@ class Handler extends ExceptionHandler
app('log')->debug('Now in Handler::render()'); app('log')->debug('Now in Handler::render()');
if ($e instanceof JsonApiException) {
// ignore it: controller will handle it.
app('log')->debug(sprintf(
'Return to parent to handle JsonApiException(%d)',
$e->getCode()
));
return parent::render($request, $e);
}
if ($e instanceof LaravelValidationException && $expectsJson) { if ($e instanceof LaravelValidationException && $expectsJson) {
// ignore it: controller will handle it. // ignore it: controller will handle it.

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Factory; namespace FireflyIII\Factory;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Events\StoredAccount; use FireflyIII\Events\StoredAccount;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@@ -159,7 +160,7 @@ class AccountFactory
app('log')->debug(sprintf('Now in AccountFactory::find("%s", "%s")', $accountName, $accountType)); app('log')->debug(sprintf('Now in AccountFactory::find("%s", "%s")', $accountName, $accountType));
$type = AccountType::whereType($accountType)->first(); $type = AccountType::whereType($accountType)->first();
// @var Account|null /** @var null|Account */
return $this->user->accounts()->where('account_type_id', $type->id)->where('name', $accountName)->first(); return $this->user->accounts()->where('account_type_id', $type->id)->where('name', $accountName)->first();
} }
@@ -242,7 +243,7 @@ class AccountFactory
$currency = $this->getCurrency($currencyId, $currencyCode); $currency = $this->getCurrency($currencyId, $currencyCode);
// only asset account may have a role: // only asset account may have a role:
if (AccountType::ASSET !== $account->accountType->type) { if (AccountTypeEnum::ASSET->value !== $account->accountType->type) {
$accountRole = ''; $accountRole = '';
} }
// only liability may have direction: // only liability may have direction:
@@ -258,10 +259,10 @@ class AccountFactory
private function storeMetaData(Account $account, array $data): void private function storeMetaData(Account $account, array $data): void
{ {
$fields = $this->validFields; $fields = $this->validFields;
if (AccountType::ASSET === $account->accountType->type) { if (AccountTypeEnum::ASSET->value === $account->accountType->type) {
$fields = $this->validAssetFields; $fields = $this->validAssetFields;
} }
if (AccountType::ASSET === $account->accountType->type && 'ccAsset' === $data['account_role']) { if (AccountTypeEnum::ASSET->value === $account->accountType->type && 'ccAsset' === $data['account_role']) {
$fields = $this->validCCFields; $fields = $this->validCCFields;
} }

View File

@@ -49,7 +49,7 @@ class BillFactory
app('log')->debug(sprintf('Now in %s', __METHOD__), $data); app('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')->getDefaultCurrencyByUserGroup($this->user->userGroup); app('amount')->getNativeCurrencyByUserGroup($this->user->userGroup);
try { try {
$skip = array_key_exists('skip', $data) ? $data['skip'] : 0; $skip = array_key_exists('skip', $data) ? $data['skip'] : 0;
@@ -129,6 +129,7 @@ class BillFactory
public function findByName(string $name): ?Bill public function findByName(string $name): ?Bill
{ {
/** @var null|Bill */
return $this->user->bills()->whereLike('name', sprintf('%%%s%%', $name))->first(); return $this->user->bills()->whereLike('name', sprintf('%%%s%%', $name))->first();
} }

View File

@@ -63,6 +63,7 @@ class BudgetFactory
public function findByName(string $name): ?Budget public function findByName(string $name): ?Budget
{ {
/** @var null|Budget */
return $this->user->budgets()->where('name', $name)->first(); return $this->user->budgets()->where('name', $name)->first();
} }

View File

@@ -84,6 +84,7 @@ class CategoryFactory
public function findByName(string $name): ?Category public function findByName(string $name): ?Category
{ {
/** @var null|Category */
return $this->user->categories()->where('name', $name)->first(); return $this->user->categories()->where('name', $name)->first();
} }

View File

@@ -41,14 +41,7 @@ class PiggyBankFactory
{ {
use CreatesObjectGroups; use CreatesObjectGroups;
public User $user { public User $user;
set(User $value) {
$this->user = $value;
$this->currencyRepository->setUser($value);
$this->accountRepository->setUser($value);
$this->piggyBankRepository->setUser($value);
}
}
private AccountRepositoryInterface $accountRepository; private AccountRepositoryInterface $accountRepository;
private CurrencyRepositoryInterface $currencyRepository; private CurrencyRepositoryInterface $currencyRepository;
private PiggyBankRepositoryInterface $piggyBankRepository; private PiggyBankRepositoryInterface $piggyBankRepository;
@@ -60,6 +53,14 @@ class PiggyBankFactory
$this->piggyBankRepository = app(PiggyBankRepositoryInterface::class); $this->piggyBankRepository = app(PiggyBankRepositoryInterface::class);
} }
public function setUser(User $user): void
{
$this->user = $user;
$this->currencyRepository->setUser($user);
$this->accountRepository->setUser($user);
$this->piggyBankRepository->setUser($user);
}
/** /**
* Store a piggy bank or come back with an exception. * Store a piggy bank or come back with an exception.
*/ */
@@ -120,7 +121,7 @@ class PiggyBankFactory
private function getCurrency(array $data): TransactionCurrency private function getCurrency(array $data): TransactionCurrency
{ {
// currency: // currency:
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getNativeCurrency();
$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'] ?? ''));
@@ -229,8 +230,8 @@ class PiggyBankFactory
foreach ($accounts as $info) { foreach ($accounts as $info) {
if ($account->id === $info['account_id']) { if ($account->id === $info['account_id']) {
if (array_key_exists($account->id, $accounts)) { if (array_key_exists($account->id, $accounts)) {
$toBeLinked[$account->id] = ['current_amount' => $account->pivot?->current_amount ?? '0']; $toBeLinked[$account->id] = ['current_amount' => $account->pivot->current_amount ?? '0'];
Log::debug(sprintf('Prefilled for account #%d with amount %s', $account->id, $account->pivot?->current_amount ?? '0')); Log::debug(sprintf('Prefilled for account #%d with amount %s', $account->id, $account->pivot->current_amount ?? '0'));
} }
} }
} }
@@ -245,7 +246,7 @@ class PiggyBankFactory
} }
if (array_key_exists('current_amount', $info)) { if (array_key_exists('current_amount', $info)) {
$toBeLinked[$account->id] = ['current_amount' => $info['current_amount']]; $toBeLinked[$account->id] = ['current_amount' => $info['current_amount']];
Log::debug(sprintf('Will link account #%d with amount %s', $account->id, $account->pivot?->current_amount ?? '0')); Log::debug(sprintf('Will link account #%d with amount %s', $account->id, $account->pivot->current_amount ?? '0'));
} }
if (!array_key_exists('current_amount', $info)) { if (!array_key_exists('current_amount', $info)) {
$toBeLinked[$account->id] ??= []; $toBeLinked[$account->id] ??= [];

View File

@@ -54,7 +54,7 @@ class RecurrenceFactory
/** /**
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings("PHPMD.NPathComplexity")
*/ */
public function create(array $data): Recurrence public function create(array $data): Recurrence
{ {

View File

@@ -218,7 +218,7 @@ class TransactionFactory
} }
/** /**
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function setUser(User $user): void public function setUser(User $user): void
{ {

View File

@@ -34,7 +34,6 @@ use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Models\TransactionJournalMeta;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
@@ -54,7 +53,7 @@ use Illuminate\Support\Facades\Log;
/** /**
* Class TransactionJournalFactory * Class TransactionJournalFactory
* *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings("PHPMD.CouplingBetweenObjects")
*/ */
class TransactionJournalFactory class TransactionJournalFactory
{ {
@@ -151,7 +150,7 @@ class TransactionJournalFactory
* @throws DuplicateTransactionException * @throws DuplicateTransactionException
* @throws FireflyException * @throws FireflyException
* *
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings("PHPMD.ExcessiveMethodLength")
*/ */
private function createJournal(NullArrayObject $row): ?TransactionJournal private function createJournal(NullArrayObject $row): ?TransactionJournal
{ {
@@ -166,7 +165,7 @@ class TransactionJournalFactory
$currency = $this->currencyRepository->findCurrency((int) $row['currency_id'], $row['currency_code']); $currency = $this->currencyRepository->findCurrency((int) $row['currency_id'], $row['currency_code']);
$foreignCurrency = $this->currencyRepository->findCurrencyNull($row['foreign_currency_id'], $row['foreign_currency_code']); $foreignCurrency = $this->currencyRepository->findCurrencyNull($row['foreign_currency_id'], $row['foreign_currency_code']);
$bill = $this->billRepository->findBill((int) $row['bill_id'], $row['bill_name']); $bill = $this->billRepository->findBill((int) $row['bill_id'], $row['bill_name']);
$billId = TransactionType::WITHDRAWAL === $type->type && null !== $bill ? $bill->id : null; $billId = TransactionTypeEnum::WITHDRAWAL->value === $type->type && null !== $bill ? $bill->id : null;
$description = (string) $row['description']; $description = (string) $row['description'];
// Manipulate basic fields // Manipulate basic fields
@@ -174,7 +173,7 @@ class TransactionJournalFactory
// 2024-11-19, overrule timezone with UTC and store it as UTC. // 2024-11-19, overrule timezone with UTC and store it as UTC.
if (FireflyConfig::get('utc', false)->data) { if (true === FireflyConfig::get('utc', false)->data) {
$carbon->setTimezone('UTC'); $carbon->setTimezone('UTC');
} }
// $carbon->setTimezone('UTC'); // $carbon->setTimezone('UTC');
@@ -279,7 +278,7 @@ class TransactionJournalFactory
$amount = (string) $row['amount']; $amount = (string) $row['amount'];
$foreignAmount = (string) $row['foreign_amount']; $foreignAmount = (string) $row['foreign_amount'];
if (null !== $foreignCurrency && $foreignCurrency->id !== $currency->id if (null !== $foreignCurrency && $foreignCurrency->id !== $currency->id
&& TransactionType::TRANSFER === $type->type && TransactionTypeEnum::TRANSFER->value === $type->type
) { ) {
$transactionFactory->setCurrency($foreignCurrency); $transactionFactory->setCurrency($foreignCurrency);
$transactionFactory->setForeignCurrency($currency); $transactionFactory->setForeignCurrency($currency);
@@ -423,7 +422,7 @@ class TransactionJournalFactory
return [$sourceAccount, $destinationAccount]; return [$sourceAccount, $destinationAccount];
} }
if (null === $destinationAccount) { // @phpstan-ignore-line if (null === $destinationAccount) {
app('log')->debug('Destination account is NULL, source account is not.'); app('log')->debug('Destination account is NULL, source account is not.');
$account = $this->accountRepository->getReconciliation($sourceAccount); $account = $this->accountRepository->getReconciliation($sourceAccount);
app('log')->debug(sprintf('Will return account #%d ("%s") of type "%s"', $account->id, $account->name, $account->accountType->type)); app('log')->debug(sprintf('Will return account #%d ("%s") of type "%s"', $account->id, $account->name, $account->accountType->type));
@@ -451,8 +450,8 @@ class TransactionJournalFactory
app('log')->debug('Now in getCurrencyByAccount()'); app('log')->debug('Now in getCurrencyByAccount()');
return match ($type) { return match ($type) {
default => $this->getCurrency($currency, $source), default => $this->getCurrency($currency, $source),
TransactionType::DEPOSIT => $this->getCurrency($currency, $destination), TransactionTypeEnum::DEPOSIT->value => $this->getCurrency($currency, $destination),
}; };
} }
@@ -467,7 +466,7 @@ class TransactionJournalFactory
$preference = $this->accountRepository->getAccountCurrency($account); $preference = $this->accountRepository->getAccountCurrency($account);
if (null === $preference && null === $currency) { if (null === $preference && null === $currency) {
// return user's default: // return user's default:
return app('amount')->getDefaultCurrencyByUserGroup($this->user->userGroup); return app('amount')->getNativeCurrencyByUserGroup($this->user->userGroup);
} }
$result = $preference ?? $currency; $result = $preference ?? $currency;
app('log')->debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name)); app('log')->debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name));
@@ -495,7 +494,7 @@ class TransactionJournalFactory
*/ */
private function getForeignByAccount(string $type, ?TransactionCurrency $foreignCurrency, Account $destination): ?TransactionCurrency private function getForeignByAccount(string $type, ?TransactionCurrency $foreignCurrency, Account $destination): ?TransactionCurrency
{ {
if (TransactionType::TRANSFER === $type) { if (TransactionTypeEnum::TRANSFER->value === $type) {
return $this->getCurrency($foreignCurrency, $destination); return $this->getCurrency($foreignCurrency, $destination);
} }

View File

@@ -135,7 +135,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
$journals = array_reverse($journals, true); $journals = array_reverse($journals, true);
$dayBeforeBalance = Steam::finalAccountBalance($account, $date); $dayBeforeBalance = Steam::finalAccountBalance($account, $date);
$startBalance = $dayBeforeBalance['balance']; $startBalance = $dayBeforeBalance['balance'];
$defaultCurrency = app('amount')->getDefaultCurrencyByUserGroup($account->user->userGroup); $defaultCurrency = app('amount')->getNativeCurrencyByUserGroup($account->user->userGroup);
$currency = $accountRepository->getAccountCurrency($account) ?? $defaultCurrency; $currency = $accountRepository->getAccountCurrency($account) ?? $defaultCurrency;
foreach ($journals as $index => $journal) { foreach ($journals as $index => $journal) {

View File

@@ -24,10 +24,10 @@ declare(strict_types=1);
namespace FireflyIII\Generator\Report\Budget; namespace FireflyIII\Generator\Report\Budget;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Generator\Report\ReportGeneratorInterface;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@@ -139,7 +139,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setAccounts($this->accounts)->setRange($this->start, $this->end) $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)
->setTypes([TransactionType::WITHDRAWAL]) ->setTypes([TransactionTypeEnum::WITHDRAWAL->value])
->withAccountInformation() ->withAccountInformation()
->withBudgetInformation() ->withBudgetInformation()
->setBudgets($this->budgets) ->setBudgets($this->budgets)

View File

@@ -24,10 +24,10 @@ declare(strict_types=1);
namespace FireflyIII\Generator\Report\Category; namespace FireflyIII\Generator\Report\Category;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Generator\Report\ReportGeneratorInterface;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@@ -138,7 +138,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setAccounts($this->accounts)->setRange($this->start, $this->end) $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)
->setTypes([TransactionType::WITHDRAWAL, TransactionType::TRANSFER]) ->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::TRANSFER->value])
->setCategories($this->categories)->withAccountInformation() ->setCategories($this->categories)->withAccountInformation()
; ;
@@ -181,7 +181,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setAccounts($this->accounts)->setRange($this->start, $this->end) $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)
->setTypes([TransactionType::DEPOSIT, TransactionType::TRANSFER]) ->setTypes([TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value])
->setCategories($this->categories)->withAccountInformation() ->setCategories($this->categories)->withAccountInformation()
; ;

View File

@@ -132,7 +132,7 @@ class StandardMessageGenerator implements MessageGeneratorInterface
return; return;
case TransactionGroup::class: case TransactionGroup::class:
// @var TransactionGroup $model /** @var TransactionGroup $model */
$basicMessage['user_id'] = $model->user->id; $basicMessage['user_id'] = $model->user->id;
break; break;

View File

@@ -48,7 +48,7 @@ class APIEventHandler
if (null !== $user) { if (null !== $user) {
try { try {
Notification::send($user, new NewAccessToken()); Notification::send($user, new NewAccessToken());
} catch (\Exception $e) { // @phpstan-ignore-line } catch (\Exception $e) {
$message = $e->getMessage(); $message = $e->getMessage();
if (str_contains($message, 'Bcc')) { if (str_contains($message, 'Bcc')) {
app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.'); app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');

View File

@@ -51,9 +51,8 @@ class AdminEventHandler
} }
try { try {
$owner = new OwnerNotifiable(); Notification::send(new OwnerNotifiable(), new UserInvitation($event->invitee));
Notification::send($owner, new UserInvitation($owner, $event->invitee)); } catch (\Exception $e) {
} catch (\Exception $e) { // @phpstan-ignore-line
$message = $e->getMessage(); $message = $e->getMessage();
if (str_contains($message, 'Bcc')) { if (str_contains($message, 'Bcc')) {
app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.'); app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
@@ -75,7 +74,7 @@ class AdminEventHandler
try { try {
$owner = new OwnerNotifiable(); $owner = new OwnerNotifiable();
Notification::send($owner, new UnknownUserLoginAttempt($event->address)); Notification::send($owner, new UnknownUserLoginAttempt($event->address));
} catch (\Exception $e) { // @phpstan-ignore-line } catch (\Exception $e) {
$message = $e->getMessage(); $message = $e->getMessage();
if (str_contains($message, 'Bcc')) { if (str_contains($message, 'Bcc')) {
app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.'); app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
@@ -105,7 +104,7 @@ class AdminEventHandler
try { try {
$owner = new OwnerNotifiable(); $owner = new OwnerNotifiable();
Notification::send($owner, new VersionCheckResult($event->message)); Notification::send($owner, new VersionCheckResult($event->message));
} catch (\Exception $e) {// @phpstan-ignore-line } catch (\Exception $e) {
$message = $e->getMessage(); $message = $e->getMessage();
if (str_contains($message, 'Bcc')) { if (str_contains($message, 'Bcc')) {
app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.'); app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');
@@ -158,8 +157,8 @@ class AdminEventHandler
Log::debug(sprintf('Will send %s as a notification.', $class)); Log::debug(sprintf('Will send %s as a notification.', $class));
try { try {
Notification::send($event->owner, new $class($event->owner)); Notification::send($event->owner, new $class());
} catch (\Exception $e) { // @phpstan-ignore-line } catch (\Exception $e) {
$message = $e->getMessage(); $message = $e->getMessage();
if (str_contains($message, 'Bcc')) { if (str_contains($message, 'Bcc')) {
app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.'); app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');

View File

@@ -78,7 +78,7 @@ class AutomationHandler
try { try {
Notification::send($user, new TransactionCreation($groups)); Notification::send($user, new TransactionCreation($groups));
} catch (\Exception $e) { // @phpstan-ignore-line } catch (\Exception $e) {
$message = $e->getMessage(); $message = $e->getMessage();
if (str_contains($message, 'Bcc')) { if (str_contains($message, 'Bcc')) {
app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.'); app('log')->warning('[Bcc] Could not send notification. Please validate your email settings, use the .env.example file as a guide.');

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