Compare commits

...

156 Commits

Author SHA1 Message Date
github-actions[bot] 9ad5dfd45b Merge pull request #11950 from firefly-iii/release-1773557001
🤖 Automatically merge the PR into the develop branch.
2026-03-15 07:43:27 +01:00
JC5 9e3b8e6232 🤖 Auto commit for release 'develop' on 2026-03-15 2026-03-15 07:43:21 +01:00
James Cole 34b5d9fcf6 Update changelog. 2026-03-15 07:37:41 +01:00
James Cole 12bbc91dca Some minor code cleanup. 2026-03-15 06:48:11 +01:00
James Cole a77ff6a51f Expand changelog with fixed issues. 2026-03-14 20:44:58 +01:00
James Cole 62eb054c7f Fix class/id value. 2026-03-14 20:31:16 +01:00
James Cole 13536a2f65 Clean up some phpstan issues. 2026-03-14 20:26:38 +01:00
github-actions[bot] 19dece287e Merge pull request #11949 from firefly-iii/release-1773489415
🤖 Automatically merge the PR into the develop branch.
2026-03-14 12:57:02 +01:00
JC5 897e1f773e 🤖 Auto commit for release 'develop' on 2026-03-14 2026-03-14 12:56:55 +01:00
James Cole 5788e18d6d Fix inline CSS. 2026-03-14 12:39:33 +01:00
github-actions[bot] c8c4816fe8 Merge pull request #11948 from firefly-iii/release-1773486711
🤖 Automatically merge the PR into the develop branch.
2026-03-14 12:12:01 +01:00
JC5 aa57252b11 🤖 Auto commit for release 'develop' on 2026-03-14 2026-03-14 12:11:52 +01:00
James Cole 58e4c26a87 Fix call to budget repos. 2026-03-14 12:05:45 +01:00
github-actions[bot] ac323f11c4 Merge pull request #11946 from firefly-iii/release-1773474241
🤖 Automatically merge the PR into the develop branch.
2026-03-14 08:44:10 +01:00
JC5 a907f9b2f7 🤖 Auto commit for release 'develop' on 2026-03-14 2026-03-14 08:44:01 +01:00
James Cole 8abd2a6604 Add text about AI reports. 2026-03-14 08:36:39 +01:00
James Cole 0780390ff6 Update changelog. 2026-03-14 07:46:47 +01:00
James Cole b9d1ed28a5 Update dev mode settings. 2026-03-14 07:31:16 +01:00
James Cole b8ebcdf1a8 Remove CSS, only chartJS remains 2026-03-14 06:40:23 +01:00
James Cole ac8dbbff6c Remove CSS and unused files. 2026-03-14 06:25:11 +01:00
James Cole fea89c5231 Remove and replace inline styles. 2026-03-14 06:16:53 +01:00
James Cole 654f2ee489 Remove inline CSS 2026-03-14 06:02:40 +01:00
James Cole 5c18624cf9 Fix https://github.com/firefly-iii/firefly-iii/issues/11944 2026-03-14 05:37:30 +01:00
James Cole 27ba8e842a Remove CSS 2026-03-13 20:47:42 +01:00
James Cole e504ee204a Remove styles. 2026-03-13 20:44:51 +01:00
James Cole a3a332643c Replace styles with classes. 2026-03-13 20:35:39 +01:00
James Cole 464a89f305 Remove lots of style attributes. 2026-03-13 20:22:50 +01:00
James Cole 062c2323e3 Clean up and expand css styles. 2026-03-13 19:49:56 +01:00
James Cole a37f995872 Can be returned directly. 2026-03-13 17:36:03 +01:00
James Cole a5b6315cb8 Clean up transaction link code. 2026-03-13 17:35:39 +01:00
github-actions[bot] ff568653c8 Merge pull request #11940 from firefly-iii/release-1773385883
🤖 Automatically merge the PR into the develop branch.
2026-03-13 08:11:30 +01:00
JC5 21447a9b2f 🤖 Auto commit for release 'develop' on 2026-03-13 2026-03-13 08:11:23 +01:00
James Cole 238bfc819e Catch a null pointer. 2026-03-13 08:05:04 +01:00
James Cole 3fab4668fc Move copyright. 2026-03-13 04:14:46 +01:00
James Cole 190050d6cf Rate limit mail message. 2026-03-13 04:12:32 +01:00
James Cole 45d623e0c1 Fix some linting issues 2026-03-13 04:05:38 +01:00
github-actions[bot] 93fe8dbf42 Merge pull request #11938 from firefly-iii/release-1773370546
🤖 Automatically merge the PR into the develop branch.
2026-03-13 03:55:56 +01:00
JC5 63c49f740f 🤖 Auto commit for release 'develop' on 2026-03-13 2026-03-13 03:55:47 +01:00
James Cole bc23bc0173 Fix reference to IP. 2026-03-13 03:50:02 +01:00
James Cole 1611cb3819 Add link to Firefly III in emails 2026-03-13 03:40:07 +01:00
Sander Dorigo c520e79b85 Expand changelog 2026-03-12 08:42:26 +01:00
Sander Dorigo 51e005f305 Finally fix often reported enum issue in rule engine 2026-03-12 08:41:15 +01:00
James Cole 133449640d Fix phpstan issues by adding properties. 2026-03-09 20:56:09 +01:00
James Cole c5a126eb61 Merge branch 'main' into develop 2026-03-09 20:39:56 +01:00
James Cole 4222d8ffdd Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Http/Controllers/Transaction/MassController.php
2026-03-09 20:39:35 +01:00
James Cole 28ff0a8423 Fix a bunch of phpstan issues. 2026-03-09 20:38:58 +01:00
James Cole 4c0e599b01 Merge pull request #11920 from firefly-iii/dependabot/github_actions/crazy-max/ghaction-import-gpg-7 2026-03-09 06:39:06 +01:00
dependabot[bot] 10d2137723 Bump crazy-max/ghaction-import-gpg from 6 to 7
Bumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 6 to 7.
- [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases)
- [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v6...v7)

---
updated-dependencies:
- dependency-name: crazy-max/ghaction-import-gpg
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:53:55 +00:00
github-actions[bot] f9b7149fc7 Merge pull request #11919 from firefly-iii/release-1773028359
🤖 Automatically merge the PR into the develop branch.
2026-03-09 04:52:46 +01:00
JC5 7c3fb7a95a 🤖 Auto commit for release 'develop' on 2026-03-09 2026-03-09 04:52:39 +01:00
James Cole 91b7ee06d8 Fix moar phpstan issues. 2026-03-08 17:44:19 +01:00
James Cole 84ea19d14c Fix a bunch of phpstan errors. 2026-03-08 17:08:51 +01:00
James Cole 9950f79a6b Merge branch 'main' into develop 2026-03-08 11:57:21 +01:00
James Cole e3df7675d3 Fix https://github.com/firefly-iii/firefly-iii/issues/11916 2026-03-08 11:56:53 +01:00
James Cole 15094097bc Update various templates. 2026-03-07 13:42:11 +01:00
github-actions[bot] a07dc4dbc8 Merge pull request #11904 from firefly-iii/release-1772875617
🤖 Automatically merge the PR into the develop branch.
2026-03-07 10:27:06 +01:00
JC5 c86562554b 🤖 Auto commit for release 'develop' on 2026-03-07 2026-03-07 10:26:58 +01:00
James Cole 19b548a417 Fix null type issues. 2026-03-07 10:20:06 +01:00
James Cole 71698b36e2 Fix various phpstan issues. 2026-03-07 10:17:07 +01:00
github-actions[bot] f65ee4d419 Merge pull request #11901 from firefly-iii/release-1772861474
🤖 Automatically merge the PR into the develop branch.
2026-03-07 06:31:23 +01:00
JC5 535fd9777a 🤖 Auto commit for release 'develop' on 2026-03-07 2026-03-07 06:31:14 +01:00
James Cole 5d1fde9cf7 Clean up more errors. 2026-03-07 06:26:08 +01:00
James Cole 922f1e7c1a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-07 06:25:45 +01:00
github-actions[bot] ef5c35c04d Merge pull request #11900 from firefly-iii/release-1772860900
🤖 Automatically merge the PR into the develop branch.
2026-03-07 06:21:47 +01:00
JC5 4dfbdc644c 🤖 Auto commit for release 'develop' on 2026-03-07 2026-03-07 06:21:40 +01:00
James Cole 4a3f45e125 Add empty array 2026-03-07 06:15:55 +01:00
github-actions[bot] a08f776ffa Merge pull request #11897 from firefly-iii/release-1772828319
🤖 Automatically merge the PR into the develop branch.
2026-03-06 21:18:48 +01:00
JC5 e246c1f4b7 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 21:18:39 +01:00
github-actions[bot] f2d1e8e184 Merge pull request #11896 from firefly-iii/release-1772825547
🤖 Automatically merge the PR into the develop branch.
2026-03-06 20:32:37 +01:00
JC5 19d8f46f24 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 20:32:27 +01:00
James Cole 9ac991edd7 Fix phpstan issues. 2026-03-06 20:25:07 +01:00
github-actions[bot] e85f06792b Merge pull request #11889 from firefly-iii/release-1772807505
🤖 Automatically merge the PR into the develop branch.
2026-03-06 15:31:55 +01:00
JC5 b66f95f1dc 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 15:31:45 +01:00
James Cole 4d63146524 Fix more phpstan issues. 2026-03-06 15:24:35 +01:00
James Cole 695f990236 Correct phpstan errors. 2026-03-06 15:18:49 +01:00
James Cole e882530a69 Clean up various phpstan issues. 2026-03-06 13:52:11 +01:00
James Cole 993a2491e9 Clean up some phpstan issues. 2026-03-06 11:46:04 +01:00
James Cole f6ea517b5d Fix https://github.com/orgs/firefly-iii/discussions/11879 2026-03-06 11:41:18 +01:00
github-actions[bot] 6f4143bb79 Merge pull request #11888 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-03-06 10:07:42 +01:00
github-actions[bot] 4a2c77c6b7 Merge pull request #11887 from firefly-iii/release-1772788047
🤖 Automatically merge the PR into the develop branch.
2026-03-06 10:07:36 +01:00
JC5 0e62f980b0 🤖 Auto commit for release 'v6.5.4' on 2026-03-06 2026-03-06 10:07:27 +01:00
James Cole 41533fd922 Clean up changelog. 2026-03-06 10:01:32 +01:00
James Cole d6b5fbe341 Expand changelog. 2026-03-06 08:02:30 +01:00
github-actions[bot] 1047e3290b Merge pull request #11886 from firefly-iii/release-1772780441
🤖 Automatically merge the PR into the develop branch.
2026-03-06 08:00:49 +01:00
JC5 8ac4c535b4 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 08:00:41 +01:00
James Cole 2c997d8d95 Removed last phpstan errors 2026-03-06 07:55:04 +01:00
James Cole 419382f9e0 Remove broken code. 2026-03-06 07:45:28 +01:00
James Cole 12f19c6c34 Remove all "@phpstan-ignore-line" entries. 2026-03-06 07:39:12 +01:00
github-actions[bot] 705138aa27 Merge pull request #11885 from firefly-iii/release-1772775428
🤖 Automatically merge the PR into the develop branch.
2026-03-06 06:37:15 +01:00
JC5 36d20137b2 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 06:37:08 +01:00
James Cole 7f08a3f594 Use safe function. 2026-03-06 06:21:36 +01:00
James Cole a897229958 Add changelog for v6.5.4 2026-03-06 06:12:15 +01:00
James Cole 1fa4632be5 Fix transaction search. 2026-03-06 06:03:12 +01:00
James Cole 221a00a23b Add debug info to track available budget creation. 2026-03-06 05:36:05 +01:00
James Cole 09c3318408 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-05 20:50:32 +01:00
Sander Dorigo 25ba87babb Better validation for webhook URLs 2026-03-05 10:11:09 +01:00
James Cole d7e9a42f58 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-04 20:24:25 +01:00
James Cole 8fd6d99c11 Fix date issues in piggy banks for #11873 2026-03-04 20:21:12 +01:00
github-actions[bot] 463ae00ec2 Merge pull request #11876 from firefly-iii/release-1772642273
🤖 Automatically merge the PR into the develop branch.
2026-03-04 17:38:02 +01:00
JC5 969460d271 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 17:37:53 +01:00
James Cole 8ecfa4b619 Fix #11873 2026-03-04 17:31:42 +01:00
James Cole 55ae86ad62 Merge branch 'main' into develop 2026-03-04 17:28:57 +01:00
github-actions[bot] 5e68d948f3 Merge pull request #11874 from firefly-iii/release-1772634907
🤖 Automatically merge the PR into the develop branch.
2026-03-04 15:35:20 +01:00
JC5 77cae13b95 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 15:35:07 +01:00
Sander Dorigo 49d8a3c32e Catch not numeric numbers 2026-03-04 15:25:32 +01:00
github-actions[bot] 0ad4db8a71 Merge pull request #11872 from firefly-iii/release-1772618461
🤖 Automatically merge the PR into the develop branch.
2026-03-04 11:01:10 +01:00
JC5 ed9754c8d4 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 11:01:01 +01:00
James Cole 7315825475 Update CI workflow to manage environment file
Copy .env.example to .env before running CI and remove .env afterward.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:55:56 +01:00
James Cole eea23ed756 Update composer update command in CI workflow
Removed the '--no-plugins' option from composer update command.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:42:51 +01:00
James Cole 04875728b4 Remove staticMethod.notFound from ignoreErrors
Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:42:22 +01:00
James Cole 1fa51a92c6 Ignore staticMethod.notFound error in PHPStan
Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:24:47 +01:00
Sander Dorigo f8687d4fc1 New config 2026-03-04 10:01:24 +01:00
James Cole 9b5cf09cc0 Update release.yml to enforce error handling
Removed '|| true' from Mago format, PHPCS, and lint commands to ensure they fail the workflow if errors occur.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 09:26:08 +01:00
github-actions[bot] 268377ad3a Merge pull request #11870 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-03-04 07:52:49 +01:00
github-actions[bot] 93500b8156 Merge pull request #11869 from firefly-iii/release-1772607152
🤖 Automatically merge the PR into the develop branch.
2026-03-04 07:52:42 +01:00
JC5 8a3fb50607 🤖 Auto commit for release 'v6.5.3' on 2026-03-04 2026-03-04 07:52:32 +01:00
github-actions[bot] 8a8567c3e4 Merge pull request #11868 from firefly-iii/release-1772605365
🤖 Automatically merge the PR into the develop branch.
2026-03-04 07:22:52 +01:00
JC5 7922671463 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 07:22:45 +01:00
James Cole 3baa1ccd78 Update changelog. 2026-03-04 07:17:36 +01:00
James Cole 4beef8be86 Merge branch 'main' into develop 2026-03-04 07:14:11 +01:00
github-actions[bot] 0aea8875d4 Merge pull request #11867 from firefly-iii/release-1772603927
🤖 Automatically merge the PR into the develop branch.
2026-03-04 06:58:56 +01:00
JC5 773e2ac262 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 06:58:47 +01:00
James Cole 912a9f1ea7 Fix workflow for now. 2026-03-04 06:53:52 +01:00
James Cole 5a7cf58802 Merge branch 'main' into develop 2026-03-04 06:52:26 +01:00
James Cole 63ab0fba8d Fix calls to isset 2026-03-04 06:52:20 +01:00
James Cole 42f4eb448d Expand release workflow. 2026-03-04 06:44:28 +01:00
James Cole b07b0dc69a Expand release thing. 2026-03-04 06:40:32 +01:00
James Cole 41ed650336 Fix all errors. 2026-03-04 06:38:33 +01:00
James Cole 7d67fe52f9 Fix phpstan issues. 2026-03-04 06:34:04 +01:00
James Cole 48f039a275 Add some logging. 2026-03-04 06:13:25 +01:00
James Cole 8cace91ae1 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-04 06:13:04 +01:00
James Cole bf5eef61e4 Merge pull request #11862 from dakennguyen/return-primary-currency-info
Return currency info for tag journals
2026-03-04 06:11:36 +01:00
James Cole fdeffc2978 More fixes. 2026-03-03 20:38:28 +01:00
James Cole f72fe58271 Fix more issues. 2026-03-03 20:37:35 +01:00
James Cole 99c9123770 More clean up according to Mago. 2026-03-03 20:35:51 +01:00
James Cole 47b02b30ea Code cleanup as recommended by Mago. 2026-03-03 20:33:02 +01:00
Khoa Nguyen 5f171e36ab Return currency info for tag journals 2026-03-03 18:19:29 +01:00
James Cole a352ae54b6 Different word 2026-03-03 17:24:38 +01:00
James Cole 72b746d437 Fix spelling 2026-03-03 17:23:48 +01:00
James Cole 18afac99af Merge branch 'main' into develop 2026-03-03 17:23:26 +01:00
James Cole 3c6e03dbb0 Enhance README with digital sovereignty message
Added a section highlighting the importance of digital sovereignty and Firefly III's European roots.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-03 16:38:29 +01:00
James Cole ea8d98481f Add image 2026-03-03 16:32:10 +01:00
James Cole afd0dd0758 Fix bad class call. 2026-03-03 16:30:17 +01:00
github-actions[bot] 0ba2cb5274 Merge pull request #11860 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-03-03 06:42:14 +01:00
github-actions[bot] 7d8dc21722 Merge pull request #11859 from firefly-iii/release-1772516521
🤖 Automatically merge the PR into the develop branch.
2026-03-03 06:42:09 +01:00
JC5 43ea2ab88a 🤖 Auto commit for release 'v6.5.2' on 2026-03-03 2026-03-03 06:42:01 +01:00
github-actions[bot] ed472a17f5 Merge pull request #11858 from firefly-iii/release-1772516161
🤖 Automatically merge the PR into the develop branch.
2026-03-03 06:36:10 +01:00
JC5 fe09f2a664 🤖 Auto commit for release 'develop' on 2026-03-03 2026-03-03 06:36:01 +01:00
James Cole 3469b0253b Expand changelog. 2026-03-03 06:31:17 +01:00
github-actions[bot] b6e9db7339 Merge pull request #11857 from firefly-iii/release-1772515618
🤖 Automatically merge the PR into the develop branch.
2026-03-03 06:27:04 +01:00
JC5 374fdbe1d4 🤖 Auto commit for release 'develop' on 2026-03-03 2026-03-03 06:26:58 +01:00
James Cole e0b05b63ec Fix config issue 2026-03-03 06:21:01 +01:00
github-actions[bot] 342ca61fb6 Merge pull request #11856 from firefly-iii/release-1772514544
🤖 Automatically merge the PR into the develop branch.
2026-03-03 06:09:12 +01:00
JC5 e9d21faf08 🤖 Auto commit for release 'develop' on 2026-03-03 2026-03-03 06:09:04 +01:00
github-actions[bot] 847800f81f Merge pull request #11851 from firefly-iii/release-1772469975
🤖 Automatically merge the PR into the develop branch.
2026-03-02 17:46:23 +01:00
JC5 b1e6f6b264 🤖 Auto commit for release 'develop' on 2026-03-02 2026-03-02 17:46:15 +01:00
854 changed files with 4053 additions and 3301 deletions
+6 -6
View File
@@ -1264,16 +1264,16 @@
},
{
"name": "symfony/console",
"version": "v8.0.6",
"version": "v8.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "488285876e807a4777f074041d8bb508623419fa"
"reference": "15ed9008a4ebe2d6a78e4937f74e0c13ef2e618a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/488285876e807a4777f074041d8bb508623419fa",
"reference": "488285876e807a4777f074041d8bb508623419fa",
"url": "https://api.github.com/repos/symfony/console/zipball/15ed9008a4ebe2d6a78e4937f74e0c13ef2e618a",
"reference": "15ed9008a4ebe2d6a78e4937f74e0c13ef2e618a",
"shasum": ""
},
"require": {
@@ -1330,7 +1330,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v8.0.6"
"source": "https://github.com/symfony/console/tree/v8.0.7"
},
"funding": [
{
@@ -1350,7 +1350,7 @@
"type": "tidelift"
}
],
"time": "2026-02-25T16:59:43+00:00"
"time": "2026-03-06T14:06:22+00:00"
},
{
"name": "symfony/deprecation-contracts",
+49 -13
View File
@@ -1,30 +1,66 @@
parameters:
ergebnis:
noExtends:
enabled: false
final:
enabled: false
noParameterWithNullDefaultValue:
enabled: false
noParameterWithNullableTypeDeclaration:
enabled: false
noCompact:
enabled: false
noSwitch:
enabled: false
noNullableReturnTypeDeclaration:
enabled: false
finalInAbstractClass:
enabled: false
noConstructorParameterWithDefaultValue:
enabled: false
noNamedArgument:
enabled: false
noParameterWithContainerTypeDeclaration:
enabled: false
paths:
- ../app
- ../database
- ../routes
- ../config
- ../bootstrap/app.php
- ../bootstrap/providers.php
universalObjectCratesClasses:
- Illuminate\Database\Eloquent\Model
reportUnmatchedIgnoredErrors: true
ignoreErrors:
# all errors below I will never fix.
- '#expects view-string\|null, string given#'
- '#expects view-string, string given#'
- "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
# ignore everything but things that BREAK
- identifier: property.deprecated
- identifier: method.deprecated
- identifier: cast.useless
- identifier: argument.type
# all errors below I will (probably) never fix.
- identifier: property.unusedType # one false positive
- identifier: varTag.nativeType # dont even know what im supposed to fix.
- identifier: method.notFound # way too many false positives
- identifier: catch.neverThrown # plenty of errors that are thrown undocumented
- identifier: staticMethod.dynamicName # dont care
- identifier: arguments.count # one false positive
- identifier: property.notFound # false positives
- identifier: method.dynamicName # i dont care
- identifier: staticMethod.dynamicCall # many false positives.
- identifier: argument.templateType # no clue how to fix single occurrence.
# - '#expects view-string\|null, string given#'
# - '#expects view-string, string given#'
# - "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
- identifier: missingType.generics # not interesting enough to fix.
-
identifier: larastan.noEnvCallsOutsideOfConfig
path: ../app/Console/Commands/System/CreatesDatabase.php
- identifier: missingType.iterableValue # not interesting enough to fix.
- identifier: varTag.type # needs a custom extension for every repository, not gonna happen.
- '#Dynamic call to static method Illuminate#'
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#' # is custom scope
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#' # is custom scope
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#' # is to allow soft delete
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::accountTypeIn#' # is a custom scope
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::withTrashed#' # is to allow soft delete
# - '#Dynamic call to static method Illuminate#'
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#' # is custom scope
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#' # is custom scope
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#' # is to allow soft delete
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::accountTypeIn#' # is a custom scope
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::withTrashed#' # is to allow soft delete
# The level 8 is the highest level. original was 5
# 7 is more than enough, higher just leaves NULL things.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

+18 -7
View File
@@ -3,13 +3,12 @@
Firefly III is an application to manage your personal finances. As such, the developer has adopted this security
disclosure and response policy to ensure that critical issues are responsibly handled.
## Supported Versions
## Supported versions
Only the latest Firefly III release is maintained. Applicable fixes, including security fixes, will not backported to
older release branches. Please refer to [releases.md](https://github.com/firefly-iii/firefly-iii/blob/main/releases.md)
for details.
older release branches. Please refer to [releases.md](https://github.com/firefly-iii/firefly-iii/blob/main/releases.md) for details.
## Reporting a Vulnerability - Private Disclosure Process
## Reporting a vulnerability - private disclosure process
Security is of the highest importance and all security vulnerabilities or suspected security vulnerabilities should be
reported to Firefly III privately, to minimize attacks against current users of Firefly III before they are fixed.
@@ -28,7 +27,7 @@ within 3 business days, including a detailed plan to investigate the issue and a
the meantime. Do not report non-security-impacting bugs through this channel.
Use [GitHub issues](https://github.com/firefly-iii/firefly-iii/issues/new/choose) instead.
### Proposed Email Content
### Proposed email content
Provide a descriptive subject line and in the body of the email include the following information:
@@ -47,7 +46,7 @@ Provide a descriptive subject line and in the body of the email include the foll
* When you know of or suspect a potential vulnerability on another project that is used by Firefly III. For example
Firefly III has a dependency on Docker, MySQL, etc.
## Patch, Release, and Disclosure
## Patch, release, and disclosure
The Firefly III developer will respond to vulnerability reports as follows:
@@ -75,7 +74,7 @@ The Firefly III developer will respond to vulnerability reports as follows:
8. Once the fix is confirmed, the developer will patch the vulnerability in the next patch or minor release. Upon
release of the patched version of Firefly III, we will follow the **Public Disclosure Process**.
### Public Disclosure Process
### Public disclosure process
The developer publishes a public [advisory](https://github.com/firefly-iii/firefly-iii/security/advisories) to the
Firefly III community via GitHub. In most cases, additional communication via Mastodon, Gitter and other channels will
@@ -97,6 +96,18 @@ III to provide a hardened Firefly III environment. We will not act on any securi
safe defaults. Over time, we will work towards improved safe-by-default configuration, taking into account backwards
compatibility.
## Security scanning through automated means
There is some additional guidance for security vulnerabilities or suspected security vulnerabilities that have been
found with the full or partial support of AI coding agents, large language models and other code-scanning tools. Many of
such reports the developer of Firefly III receives are not applicable. This takes time away from responding to
actual security vulnerabilities or suspected security vulnerabilities. If you use automated means to find these in
the Firefly III code base, please take care to:
1. Manually validate the results before you submit a report,
2. explain how the vulnerability can actually be abused by a nefarious third party, and
3. try to limit the verbosity of your report.
## Credits
This security policy is based on [Harbor](https://github.com/goharbor/harbor)'s security policy.
+17 -5
View File
@@ -33,7 +33,7 @@ jobs:
with:
fetch-depth: 0
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PASSPHRASE }}
@@ -174,12 +174,24 @@ jobs:
uses: nhedger/setup-mago@v1
- name: Run CI
run: |
cp .env.example .env
# install all packages etc.
rm -rf vendor composer.lock
composer update --no-scripts --no-plugins -q
mago format || true
# mago analyze --reporting-format=github || true
composer update --no-scripts -q
# format code.
echo "Will now run Mago Format"
mago format
sudo chown -R runner:docker resources/lang
.ci/phpcs.sh || true
echo "Will now run PHPCS"
.ci/phpcs.sh
# lint and check
echo "Will now run Mago Lint"
mago lint
echo "Will now run PHPstan"
.ci/phpstan.sh
rm .env
- name: Calculate variables
run: |
@@ -41,7 +41,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class AccountController
*/
class AccountController extends Controller
final class AccountController extends Controller
{
use AccountFilter;
@@ -80,16 +80,16 @@ class AccountController extends Controller
public function accounts(AutocompleteApiRequest $request): JsonResponse
{
// Log::debug('Before All.');
['types' => $types, 'query' => $query, 'date' => $date, 'limit' => $limit] = $request->attributes->all();
['types' => $types, 'query' => $query, 'date' => $date, 'limit' => $limit] = $request->attributes->all();
$date ??= today(config('app.timezone'));
// set date to end-of-day for account balance. so it is at $date 23:59:59
$date->endOfDay();
$return = [];
$result = $this->repository->searchAccount((string) $query, $types, $limit);
$allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary);
$return = [];
$result = $this->repository->searchAccount((string) $query, $types, $limit);
$allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary);
/** @var Account $account */
foreach ($result as $account) {
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class BillController
*/
class BillController extends Controller
final class BillController extends Controller
{
private BillRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_SUBSCRIPTIONS];
@@ -63,7 +63,7 @@ class BillController extends Controller
public function bills(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchBill($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(static fn (Bill $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
$filtered = $result->map(static fn (Bill $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
return response()->api($filtered->toArray());
}
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class BudgetController
*/
class BudgetController extends Controller
final class BudgetController extends Controller
{
private BudgetRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_BUDGETS];
@@ -63,7 +63,7 @@ class BudgetController extends Controller
public function budgets(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchBudget($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(static fn (Budget $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
$filtered = $result->map(static fn (Budget $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
return response()->api($filtered->toArray());
}
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class CategoryController
*/
class CategoryController extends Controller
final class CategoryController extends Controller
{
private CategoryRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
@@ -63,7 +63,7 @@ class CategoryController extends Controller
public function categories(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchCategory($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(static fn (Category $item): array => ['id' => (string) $item->id, 'name' => $item->name]);
$filtered = $result->map(static fn (Category $item): array => ['id' => (string) $item->id, 'name' => $item->name]);
return response()->api($filtered->toArray());
}
@@ -37,7 +37,7 @@ use Illuminate\Http\Request;
/**
* Class CurrencyController
*/
class CurrencyController extends Controller
final class CurrencyController extends Controller
{
private CurrencyRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class ObjectGroupController
*/
class ObjectGroupController extends Controller
final class ObjectGroupController extends Controller
{
private ObjectGroupRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
@@ -67,7 +67,7 @@ class ObjectGroupController extends Controller
/** @var ObjectGroup $objectGroup */
foreach ($result as $objectGroup) {
$return[] = ['id' => (string) $objectGroup->id, 'name' => $objectGroup->title, 'title' => $objectGroup->title];
$return[] = ['id' => (string) $objectGroup->id, 'name' => $objectGroup->title, 'title' => $objectGroup->title];
}
return response()->api($return);
@@ -38,7 +38,7 @@ use Illuminate\Http\Request;
/**
* Class PiggyBankController
*/
class PiggyBankController extends Controller
final class PiggyBankController extends Controller
{
private AccountRepositoryInterface $accountRepository;
private PiggyBankRepositoryInterface $piggyRepository;
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class RecurrenceController
*/
class RecurrenceController extends Controller
final class RecurrenceController extends Controller
{
private RecurringRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_RECURRING];
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class RuleController
*/
class RuleController extends Controller
final class RuleController extends Controller
{
private RuleRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_RULES];
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class RuleGroupController
*/
class RuleGroupController extends Controller
final class RuleGroupController extends Controller
{
private RuleGroupRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_RULES];
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class TagController
*/
class TagController extends Controller
final class TagController extends Controller
{
private TagRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
@@ -63,7 +63,7 @@ class TagController extends Controller
/** @var Tag $tag */
foreach ($result as $tag) {
$array[] = ['id' => (string) $tag->id, 'name' => $tag->tag, 'tag' => $tag->tag];
$array[] = ['id' => (string) $tag->id, 'name' => $tag->tag, 'tag' => $tag->tag];
}
return response()->api($array);
@@ -39,7 +39,7 @@ use Illuminate\Support\Collection;
/**
* Class TransactionController
*/
class TransactionController extends Controller
final class TransactionController extends Controller
{
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private TransactionGroupRepositoryInterface $groupRepository;
@@ -35,7 +35,7 @@ use Illuminate\Http\Request;
/**
* Class TransactionTypeController
*/
class TransactionTypeController extends Controller
final class TransactionTypeController extends Controller
{
private TransactionTypeRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
@@ -62,7 +62,7 @@ class TransactionTypeController extends Controller
/** @var TransactionType $type */
foreach ($types as $type) {
// different key for consistency.
$array[] = ['id' => (string) $type->id, 'name' => $type->type, 'type' => $type->type];
$array[] = ['id' => (string) $type->id, 'name' => $type->type, 'type' => $type->type];
}
return response()->api($array);
@@ -44,7 +44,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class AccountController
*/
class AccountController extends Controller
final class AccountController extends Controller
{
use ApiSupport;
use CleansChartData;
@@ -40,7 +40,7 @@ use Illuminate\Http\Request;
/**
* Class BalanceController
*/
class BalanceController extends Controller
final class BalanceController extends Controller
{
use CleansChartData;
use CollectsAccountsFromFilter;
@@ -47,7 +47,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class BudgetController
*/
class BudgetController extends Controller
final class BudgetController extends Controller
{
use CleansChartData;
use ValidatesUserGroupTrait;
@@ -220,7 +220,7 @@ class BudgetController extends Controller
'end_date' => $row['end'],
'yAxisID' => 0,
'type' => 'bar',
'entries' => ['budgeted' => $row['budgeted'], 'spent' => $row['spent'], 'left' => $row['left'], 'overspent' => $row['overspent']],
'entries' => ['budgeted' => $row['budgeted'], 'spent' => $row['spent'], 'left' => $row['left'], 'overspent' => $row['overspent']],
'pc_entries' => [
'budgeted' => $row['pc_budgeted'],
'spent' => $row['pc_spent'],
@@ -45,7 +45,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class BudgetController
*/
class CategoryController extends Controller
final class CategoryController extends Controller
{
use CleansChartData;
use ValidatesUserGroupTrait;
@@ -153,8 +153,8 @@ class CategoryController extends Controller
'end_date' => $end->toAtomString(),
'yAxisID' => 0,
'type' => 'bar',
'entries' => ['spent' => '0', 'earned' => '0'],
'pc_entries' => ['spent' => '0', 'earned' => '0'],
'entries' => ['spent' => '0', 'earned' => '0'],
'pc_entries' => ['spent' => '0', 'earned' => '0'],
];
// add monies
+7 -5
View File
@@ -63,6 +63,8 @@ abstract class Controller extends BaseController
use ValidatesRequests;
use ValidatesUserGroupTrait;
protected array $acceptedRoles = [];
protected const string CONTENT_TYPE = 'application/vnd.api+json';
protected const string JSON_CONTENT_TYPE = 'application/json';
@@ -169,6 +171,9 @@ abstract class Controller extends BaseController
return $manager->createData($resource)->toArray();
}
/**
* @deprecated
*/
#[Deprecated(message: <<<'TXT'
use Request classes
Method to grab all parameters from the URL
@@ -222,11 +227,8 @@ abstract class Controller extends BaseController
$value = min(max(1, $value), 2 ** 16);
$bag->set($integer, $value);
}
if (
null === $value
&& 'limit' === $integer // @phpstan-ignore-line
&& auth()->check()
) {
// && 'limit' === $integer
if (null === $value && auth()->check()) {
// set default for user:
/** @var User $user */
$user = auth()->user();
@@ -42,7 +42,7 @@ use Illuminate\Http\Request;
* Because this is a security nightmare waiting to happen validation
* is pretty strict.
*/
class TransactionController extends Controller
final class TransactionController extends Controller
{
private AccountRepositoryInterface $repository;
@@ -54,7 +54,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private bool $unused;
@@ -185,6 +185,8 @@ class DestroyController extends Controller
/** @var BudgetRepositoryInterface $budgetRepository */
$budgetRepository = app(BudgetRepositoryInterface::class);
$budgetRepository->destroyAll();
$abRepository->cleanup();
}
private function destroyCategories(): void
@@ -38,7 +38,7 @@ use function Safe\date;
/**
* Class ExportController
*/
class ExportController extends Controller
final class ExportController extends Controller
{
private ExportDataGenerator $exporter;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
@@ -44,7 +44,7 @@ use Illuminate\Http\Request;
/**
* Class PurgeController
*/
class PurgeController extends Controller
final class PurgeController extends Controller
{
protected array $acceptedRoles = [UserRoleEnum::FULL];
@@ -37,7 +37,7 @@ use Illuminate\Http\JsonResponse;
* Shows expense information grouped or limited by date.
* I.e. all expenses grouped by account + currency.
*/
class AccountController extends Controller
final class AccountController extends Controller
{
use ApiSupport;
@@ -36,7 +36,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class BillController
*/
class BillController extends Controller
final class BillController extends Controller
{
private BillRepositoryInterface $repository;
@@ -36,7 +36,7 @@ use Illuminate\Support\Collection;
/**
* Class BudgetController
*/
class BudgetController extends Controller
final class BudgetController extends Controller
{
private NoBudgetRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
@@ -36,7 +36,7 @@ use Illuminate\Support\Collection;
/**
* Class CategoryController
*/
class CategoryController extends Controller
final class CategoryController extends Controller
{
private NoCategoryRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
@@ -35,7 +35,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class PeriodController
*/
class PeriodController extends Controller
final class PeriodController extends Controller
{
public function total(GenericRequest $request): JsonResponse
{
@@ -36,7 +36,7 @@ use Illuminate\Support\Facades\Log;
/**
* Class TagController
*/
class TagController extends Controller
final class TagController extends Controller
{
private TagRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use Illuminate\Http\JsonResponse;
* Shows income information grouped or limited by date.
* I.e. all income grouped by account + currency.
*/
class AccountController extends Controller
final class AccountController extends Controller
{
use ApiSupport;
@@ -36,7 +36,7 @@ use Illuminate\Support\Collection;
/**
* Class CategoryController
*/
class CategoryController extends Controller
final class CategoryController extends Controller
{
private NoCategoryRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
@@ -35,7 +35,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class PeriodController
*/
class PeriodController extends Controller
final class PeriodController extends Controller
{
public function total(GenericRequest $request): JsonResponse
{
@@ -36,7 +36,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class TagController
*/
class TagController extends Controller
final class TagController extends Controller
{
private TagRepositoryInterface $repository;
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class AccountController
*/
class AccountController extends Controller
final class AccountController extends Controller
{
use ApiSupport;
@@ -36,7 +36,7 @@ use Illuminate\Support\Collection;
/**
* Class CategoryController
*/
class CategoryController extends Controller
final class CategoryController extends Controller
{
private NoCategoryRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
@@ -35,7 +35,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class PeriodController
*/
class PeriodController extends Controller
final class PeriodController extends Controller
{
public function total(GenericRequest $request): JsonResponse
{
@@ -36,7 +36,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class TagController
*/
class TagController extends Controller
final class TagController extends Controller
{
private TagRepositoryInterface $repository;
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
public const string RESOURCE_KEY = 'accounts';
@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Account;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\Transaction\ListRequest;
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account;
@@ -46,7 +46,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
use TransactionFilter;
@@ -70,21 +70,21 @@ class ListController extends Controller
public function attachments(PaginationRequest $request, Account $account): JsonResponse
{
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$collection = $this->repository->getAttachments($account);
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$collection = $this->repository->getAttachments($account);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -93,31 +93,31 @@ class ListController extends Controller
public function piggyBanks(PaginationRequest $request, Account $account): JsonResponse
{
// create some objects:
$manager = $this->getManager();
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
// get list of piggy banks. Count it and split it.
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice($offset, $limit);
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice($offset, $limit);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new PiggyBankEnrichment();
$admin = auth()->user();
$enrichment = new PiggyBankEnrichment();
$enrichment->setUser($admin);
$piggyBanks = $enrichment->enrich($piggyBanks);
$piggyBanks = $enrichment->enrich($piggyBanks);
// make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer = app(PiggyBankTransformer::class);
// $transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -126,18 +126,18 @@ class ListController extends Controller
/**
* Show all transaction groups related to the account.
*/
public function transactions(ListRequest $request, Account $account): JsonResponse
public function transactions(PaginationDateRangeRequest $request, Account $account): JsonResponse
{
['limit' => $limit, 'page' => $page, 'start' => $start, 'end' => $end, 'type' => $type] = $request->attributes->all();
$types = $this->mapTransactionTypes($type ?? 'default');
$manager = $this->getManager();
['limit' => $limit, 'page' => $page, 'start' => $start, 'end' => $end, 'type' => $type] = $request->attributes->all();
$types = $this->mapTransactionTypes($type ?? 'default');
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector = app(GroupCollectorInterface::class);
$collector->setUser($admin)->setAccounts(new Collection()->push($account))->withAPIInformation()->setLimit($limit)->setPage($page)->setTypes($types);
if (null !== $start) {
$collector->setStart($start);
@@ -146,18 +146,18 @@ class ListController extends Controller
$collector->setEnd($end);
}
$paginator = $collector->getPaginatedGroups();
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.accounts.transactions', [$account->id]).$this->buildParams());
// enrich
$enrichment = new TransactionGroupEnrichment();
$enrichment = new TransactionGroupEnrichment();
$enrichment->setUser($admin);
$transactions = $enrichment->enrich($paginator->getCollection());
$transactions = $enrichment->enrich($paginator->getCollection());
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer = app(TransactionGroupTransformer::class);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -41,7 +41,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
use AccountFilter;
@@ -124,22 +124,22 @@ class ShowController extends Controller
// get list of accounts. Count it and split it.
$this->repository->resetAccountOrder();
$account->refresh();
$manager = $this->getManager();
['start' => $start, 'end' => $end, 'date' => $date] = $request->attributes->all();
$manager = $this->getManager();
['start' => $start, 'end' => $end, 'date' => $date] = $request->attributes->all();
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new AccountEnrichment();
$admin = auth()->user();
$enrichment = new AccountEnrichment();
$enrichment->setDate($date);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$enrichment->setUser($admin);
$account = $enrichment->enrichSingle($account);
$account = $enrichment->enrichSingle($account);
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
$transformer = app(AccountTransformer::class);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
@@ -36,7 +36,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
public const string RESOURCE_KEY = 'accounts';
@@ -39,7 +39,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
public const string RESOURCE_KEY = 'accounts';
@@ -37,7 +37,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private AttachmentRepositoryInterface $repository;
@@ -44,7 +44,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private AttachmentRepositoryInterface $repository;
@@ -121,7 +121,7 @@ class ShowController extends Controller
*/
public function index(PaginationRequest $request): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
@@ -129,21 +129,21 @@ class ShowController extends Controller
throw new NotFoundHttpException();
}
$manager = $this->getManager();
$manager = $this->getManager();
// get list of attachments. Count it and split it.
$collection = $this->repository->get();
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$collection = $this->repository->get();
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.attachments.index').$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -42,7 +42,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private AttachmentRepositoryInterface $repository;
@@ -39,7 +39,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private AttachmentRepositoryInterface $repository;
@@ -40,7 +40,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private AvailableBudgetRepositoryInterface $abRepository;
@@ -68,29 +68,29 @@ class ShowController extends Controller
*/
public function index(PaginationDateRangeRequest $request): JsonResponse
{
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page, 'start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page, 'start' => $start, 'end' => $end] = $request->attributes->all();
// get list of available budgets. Count it and split it.
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice($offset, $limit);
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice($offset, $limit);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment();
$admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment();
$enrichment->setUser($admin);
$availableBudgets = $enrichment->enrich($availableBudgets);
$availableBudgets = $enrichment->enrich($availableBudgets);
// make paginator:
$paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer = app(AvailableBudgetTransformer::class);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private BillRepositoryInterface $repository;
@@ -44,7 +44,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
use TransactionFilter;
@@ -72,21 +72,21 @@ class ListController extends Controller
*/
public function attachments(PaginationRequest $request, Bill $bill): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getAttachments($bill);
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getAttachments($bill);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -100,20 +100,20 @@ class ListController extends Controller
*/
public function rules(PaginationRequest $request, Bill $bill): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice($offset, $limit);
$manager = $this->getManager();
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams());
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$resource = new FractalCollection($rules, $transformer, 'rules');
$transformer = app(RuleTransformer::class);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -127,16 +127,16 @@ class ListController extends Controller
*/
public function transactions(PaginationDateRangeRequest $request, Bill $bill): JsonResponse
{
['limit' => $limit, 'page' => $page, 'types' => $types, 'start' => $start, 'end' => $end] = $request->attributes->all();
['limit' => $limit, 'page' => $page, 'types' => $types, 'start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// include source + destination account name and type.
@@ -159,18 +159,18 @@ class ListController extends Controller
}
// get paginator.
$paginator = $collector->getPaginatedGroups();
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams());
// enrich
$enrichment = new TransactionGroupEnrichment();
$enrichment = new TransactionGroupEnrichment();
$enrichment->setUser($admin);
$transactions = $enrichment->enrich($paginator->getCollection());
$transactions = $enrichment->enrich($paginator->getCollection());
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer = app(TransactionGroupTransformer::class);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -41,7 +41,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private BillRepositoryInterface $repository;
@@ -67,28 +67,28 @@ class ShowController extends Controller
*/
public function index(PaginationDateRangeRequest $request): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'start' => $start, 'end' => $end, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'start' => $start, 'end' => $end, 'page' => $page] = $request->attributes->all();
$this->repository->correctOrder();
$bills = $this->repository->getBills();
$manager = $this->getManager();
$count = $bills->count();
$bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
$bills = $this->repository->getBills();
$manager = $this->getManager();
$count = $bills->count();
$bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$bills = $enrichment->enrich($bills);
$bills = $enrichment->enrich($bills);
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer = app(BillTransformer::class);
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -102,23 +102,23 @@ class ShowController extends Controller
*/
public function show(DateRangeRequest $request, Bill $bill): JsonResponse
{
['start' => $start, 'end' => $end] = $request->attributes->all();
['start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
$manager = $this->getManager();
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$bill = $enrichment->enrichSingle($bill);
$bill = $enrichment->enrichSingle($bill);
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer = app(BillTransformer::class);
$resource = new Item($bill, $transformer, 'bills');
$resource = new Item($bill, $transformer, 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
@@ -38,7 +38,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
use TransactionFilter;
@@ -83,7 +83,6 @@ class StoreController extends Controller
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($bill, $transformer, 'bills');
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private BillRepositoryInterface $repository;
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private BudgetRepositoryInterface $repository;
@@ -44,7 +44,7 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
// Class ListController
class ListController extends Controller
final class ListController extends Controller
{
use TransactionFilter;
@@ -40,7 +40,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
private BudgetRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private BudgetRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private BudgetRepositoryInterface $repository;
@@ -36,7 +36,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
@@ -40,7 +40,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
use TransactionFilter;
@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\SameDateRequest;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit;
@@ -44,7 +44,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
private BudgetRepositoryInterface $repository;
@@ -118,12 +118,12 @@ class ShowController extends Controller
*
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/
public function indexAll(SameDateRequest $request): JsonResponse
public function indexAll(DateRangeRequest $request): JsonResponse
{
$manager = $this->getManager();
$manager->parseIncludes('budget');
$pageSize = $this->parameters->get('limit');
$collection = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
$collection = $this->blRepository->getAllBudgetLimits($request->attributes->get('start'), $request->attributes->get('end'));
$count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
@@ -39,7 +39,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private CategoryRepositoryInterface $repository;
@@ -42,7 +42,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
use TransactionFilter;
@@ -39,7 +39,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private CategoryRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private CategoryRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private CategoryRepositoryInterface $repository;
@@ -36,7 +36,7 @@ use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DestroyController extends Controller
final class DestroyController extends Controller
{
use ValidatesUserGroupTrait;
@@ -36,7 +36,7 @@ use Illuminate\Pagination\LengthAwarePaginator;
/**
* Class ShowController
*/
class IndexController extends Controller
final class IndexController extends Controller
{
use ValidatesUserGroupTrait;
@@ -40,7 +40,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
use ValidatesUserGroupTrait;
@@ -41,7 +41,7 @@ use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
class StoreController extends Controller
final class StoreController extends Controller
{
use ValidatesUserGroupTrait;
@@ -37,7 +37,7 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class UpdateController extends Controller
final class UpdateController extends Controller
{
use ValidatesUserGroupTrait;
@@ -34,7 +34,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private ObjectGroupRepositoryInterface $repository;
@@ -40,7 +40,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
private ObjectGroupRepositoryInterface $repository;
@@ -38,7 +38,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private ObjectGroupRepositoryInterface $repository;
@@ -36,7 +36,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private ObjectGroupRepositoryInterface $repository;
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private PiggyBankRepositoryInterface $repository;
@@ -41,7 +41,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
private PiggyBankRepositoryInterface $repository;
@@ -39,7 +39,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private PiggyBankRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private PiggyBankRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private PiggyBankRepositoryInterface $repository;
@@ -33,7 +33,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private RecurringRepositoryInterface $repository;
@@ -40,7 +40,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
use TransactionFilter;
@@ -39,7 +39,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private RecurringRepositoryInterface $repository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private RecurringRepositoryInterface $repository;
@@ -1,10 +1,8 @@
<?php
declare(strict_types=1);
/*
* TriggerController.php
* Copyright (c) 2025 james@firefly-iii.org
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
@@ -22,10 +20,12 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Recurrence;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Generic\SingleDateRequest;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Jobs\CreateRecurringTransactions;
use FireflyIII\Models\Recurrence;
@@ -41,7 +41,7 @@ use Illuminate\Support\Facades\Log;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
class TriggerController extends Controller
final class TriggerController extends Controller
{
private RecurringRepositoryInterface $repository;
@@ -59,12 +59,12 @@ class TriggerController extends Controller
});
}
public function trigger(SingleDateRequest $request, Recurrence $recurrence): JsonResponse
public function trigger(DateRequest $request, Recurrence $recurrence): JsonResponse
{
// find recurrence occurrence for this date and trigger it.
// grab the date from the last time the recurrence fired:
$backupDate = $recurrence->latest_date;
$date = $request->getDate();
$date = $request->attributes->get('date');
// fire the recurring cron job on the given date, then post-date the created transaction.
Log::info(sprintf('Trigger: will now fire recurring cron job task for date "%s".', $date->format('Y-m-d H:i:s')));
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private RecurringRepositoryInterface $repository;
@@ -34,7 +34,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private RuleRepositoryInterface $ruleRepository;
@@ -31,7 +31,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class ExpressionController
*/
class ExpressionController extends Controller
final class ExpressionController extends Controller
{
/**
* This endpoint is documented at:
@@ -38,7 +38,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private RuleRepositoryInterface $ruleRepository;
@@ -35,7 +35,7 @@ use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
final class StoreController extends Controller
{
private RuleRepositoryInterface $ruleRepository;
@@ -42,7 +42,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class TriggerController
*/
class TriggerController extends Controller
final class TriggerController extends Controller
{
private RuleRepositoryInterface $ruleRepository;
@@ -78,15 +78,15 @@ class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && '' !== $parameters['accounts']) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// file the rule(s)
@@ -98,7 +98,7 @@ class TriggerController extends Controller
$enrichment->setUser($rule->user);
$transactions = $enrichment->enrich($transactions);
$paginator = new LengthAwarePaginator($transactions, $count, 31337, $this->parameters->get('page'));
$paginator = new LengthAwarePaginator($transactions, $count, 31_337, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rules.test', [$rule->id]).$this->buildParams());
// resulting list is presented as JSON thing.
@@ -132,15 +132,15 @@ class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && is_array($parameters['accounts']) && count($parameters['accounts']) > 0) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// fire the rule(s)
@@ -36,7 +36,7 @@ use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
final class UpdateController extends Controller
{
private RuleRepositoryInterface $ruleRepository;
@@ -34,7 +34,7 @@ use Illuminate\Http\JsonResponse;
/**
* Class DestroyController
*/
class DestroyController extends Controller
final class DestroyController extends Controller
{
private RuleGroupRepositoryInterface $ruleGroupRepository;
@@ -37,7 +37,7 @@ use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class ListController
*/
class ListController extends Controller
final class ListController extends Controller
{
private RuleGroupRepositoryInterface $ruleGroupRepository;
@@ -38,7 +38,7 @@ use League\Fractal\Resource\Item;
/**
* Class ShowController
*/
class ShowController extends Controller
final class ShowController extends Controller
{
private RuleGroupRepositoryInterface $ruleGroupRepository;

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