Compare commits

...

118 Commits

Author SHA1 Message Date
github-actions[bot]
2f6ab2ef96 Merge pull request #12345 from firefly-iii/release-1780917755
🤖 Automatically merge the PR into the develop branch.
2026-06-08 13:22:46 +02:00
JC5
439994f64c 🤖 Auto commit for release 'develop' on 2026-06-08 2026-06-08 13:22:36 +02:00
Sander Dorigo
1336b05f48 Fix build 2026-06-08 13:04:19 +02:00
Sander Dorigo
0885fb6319 Fix phpstan issues 2026-06-08 12:40:59 +02:00
James Cole
7a28365f7f Merge pull request #12344 from firefly-iii/dependabot/npm_and_yarn/develop/vite-8.0.16
Bump vite from 8.0.15 to 8.0.16
2026-06-08 10:17:40 +02:00
James Cole
1b68b592c8 Merge pull request #12342 from firefly-iii/dependabot/composer/develop/phpstan/phpstan-2.2.2
Bump phpstan/phpstan from 2.2.1 to 2.2.2
2026-06-08 10:17:27 +02:00
James Cole
d37f6ad6b7 Merge pull request #12343 from firefly-iii/dependabot/npm_and_yarn/develop/webpack-5.107.2
Bump webpack from 5.105.4 to 5.107.2
2026-06-08 10:17:05 +02:00
James Cole
ac54acfdde Merge pull request #12341 from firefly-iii/dependabot/composer/develop/guzzlehttp/guzzle-7.11.1
Bump guzzlehttp/guzzle from 7.11.0 to 7.11.1
2026-06-08 10:12:58 +02:00
dependabot[bot]
b7eef25635 Bump vite from 8.0.15 to 8.0.16
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.15 to 8.0.16.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.16/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 03:52:55 +00:00
dependabot[bot]
9dcd6bc516 Bump webpack from 5.105.4 to 5.107.2
Bumps [webpack](https://github.com/webpack/webpack) from 5.105.4 to 5.107.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.105.4...v5.107.2)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.107.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 03:52:43 +00:00
dependabot[bot]
11ac6dd090 Bump phpstan/phpstan from 2.2.1 to 2.2.2
---
updated-dependencies:
- dependency-name: phpstan/phpstan
  dependency-version: 2.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 03:52:20 +00:00
dependabot[bot]
05fd28e147 Bump guzzlehttp/guzzle from 7.11.0 to 7.11.1
Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 7.11.0 to 7.11.1.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/7.11/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.11.0...7.11.1)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-version: 7.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 03:52:17 +00:00
James Cole
72fe670289 Fix https://github.com/firefly-iii/firefly-iii/issues/12339 2026-06-06 16:33:09 +02:00
James Cole
377123d41f Fix https://github.com/firefly-iii/firefly-iii/issues/12309 2026-06-06 11:15:44 +02:00
James Cole
c421315465 Rename configuration class. 2026-06-06 06:38:15 +02:00
github-actions[bot]
8805e05e07 Merge pull request #12337 from firefly-iii/release-1780631165
🤖 Automatically merge the PR into the develop branch.
2026-06-05 05:46:12 +02:00
JC5
2ba082c787 🤖 Auto commit for release 'develop' on 2026-06-05 2026-06-05 05:46:06 +02:00
James Cole
b1f32406cc Fix https://github.com/firefly-iii/firefly-iii/issues/12335 2026-06-05 05:41:00 +02:00
James Cole
17839d9a34 Merge pull request #12323 from firefly-iii/dependabot/npm_and_yarn/develop/vite-8.0.15
Bump vite from 8.0.14 to 8.0.15
2026-06-02 20:57:11 +02:00
James Cole
3d8f059f38 Merge pull request #12320 from firefly-iii/dependabot/npm_and_yarn/develop/bootstrap5-tags-1.7.17
Bump bootstrap5-tags from 1.7.16 to 1.7.17
2026-06-02 20:56:53 +02:00
James Cole
24af9f0e24 Merge pull request #12318 from firefly-iii/dependabot/npm_and_yarn/develop/date-fns-4.4.0
Bump date-fns from 4.3.0 to 4.4.0
2026-06-02 20:56:37 +02:00
James Cole
ce0d785819 Merge pull request #12315 from firefly-iii/dependabot/npm_and_yarn/develop/vue/compiler-sfc-3.5.35
Bump @vue/compiler-sfc from 3.5.34 to 3.5.35
2026-06-02 20:56:23 +02:00
github-actions[bot]
3534367662 Merge pull request #12331 from firefly-iii/release-1780426455
🤖 Automatically merge the PR into the develop branch.
2026-06-02 20:54:24 +02:00
JC5
028a6fdd75 🤖 Auto commit for release 'develop' on 2026-06-02 2026-06-02 20:54:15 +02:00
github-actions[bot]
8d442ae1a4 Merge pull request #12330 from firefly-iii/release-1780412950
🤖 Automatically merge the PR into the develop branch.
2026-06-02 17:09:20 +02:00
JC5
b275e80571 🤖 Auto commit for release 'develop' on 2026-06-02 2026-06-02 17:09:11 +02:00
github-actions[bot]
92ea572151 Merge pull request #12327 from firefly-iii/release-1780342304
🤖 Automatically merge the PR into the develop branch.
2026-06-01 21:31:55 +02:00
JC5
9cc7747123 🤖 Auto commit for release 'develop' on 2026-06-01 2026-06-01 21:31:44 +02:00
James Cole
344bac5af0 I fix the build. 2026-06-01 21:27:11 +02:00
James Cole
e7cccd6aa1 I fix the build. 2026-06-01 21:26:56 +02:00
dependabot[bot]
f3f69ac95e Bump vite from 8.0.14 to 8.0.15
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.14 to 8.0.15.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.15/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 06:55:08 +00:00
dependabot[bot]
40a308779a Bump bootstrap5-tags from 1.7.16 to 1.7.17
Bumps [bootstrap5-tags](https://github.com/lekoala/bootstrap5-tags) from 1.7.16 to 1.7.17.
- [Release notes](https://github.com/lekoala/bootstrap5-tags/releases)
- [Commits](https://github.com/lekoala/bootstrap5-tags/compare/1.7.16...1.7.17)

---
updated-dependencies:
- dependency-name: bootstrap5-tags
  dependency-version: 1.7.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 06:54:48 +00:00
dependabot[bot]
51cbe00d20 Bump date-fns from 4.3.0 to 4.4.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Commits](https://github.com/date-fns/date-fns/compare/v4.3.0...v4.4.0)

---
updated-dependencies:
- dependency-name: date-fns
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 06:54:40 +00:00
dependabot[bot]
9e7013f498 Bump @vue/compiler-sfc from 3.5.34 to 3.5.35
Bumps [@vue/compiler-sfc](https://github.com/vuejs/core/tree/HEAD/packages/compiler-sfc) from 3.5.34 to 3.5.35.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.5.35/packages/compiler-sfc)

---
updated-dependencies:
- dependency-name: "@vue/compiler-sfc"
  dependency-version: 3.5.35
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 06:54:33 +00:00
James Cole
41ca780790 Some code cleanup. 2026-05-31 13:21:05 +02:00
James Cole
4475a52f20 Fix https://github.com/firefly-iii/firefly-iii/issues/12296 2026-05-30 04:30:38 +02:00
James Cole
4865123d59 Fixed #12305 2026-05-30 04:22:21 +02:00
James Cole
30fd28b928 Fix https://github.com/firefly-iii/firefly-iii/issues/12306 2026-05-30 04:13:53 +02:00
James Cole
88b74a4aab Merge branch 'main' into develop 2026-05-30 04:13:09 +02:00
James Cole
891f5cb42b Merge pull request #12302 from firefly-iii/dependabot/composer/composer-ae8d2872ee 2026-05-29 10:53:29 +02:00
dependabot[bot]
502b0bb74b Bump symfony/polyfill-intl-idn in the composer group across 1 directory
Bumps the composer group with 1 update in the / directory: [symfony/polyfill-intl-idn](https://github.com/symfony/polyfill-intl-idn).


Updates `symfony/polyfill-intl-idn` from 1.37.0 to 1.38.1
- [Release notes](https://github.com/symfony/polyfill-intl-idn/releases)
- [Commits](https://github.com/symfony/polyfill-intl-idn/compare/v1.37.0...v1.38.1)

---
updated-dependencies:
- dependency-name: symfony/polyfill-intl-idn
  dependency-version: 1.38.1
  dependency-type: indirect
  dependency-group: composer
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-29 01:14:59 +00:00
James Cole
51b9802862 Merge branch 'main' into develop 2026-05-28 05:21:58 +02:00
James Cole
66af080b09 Update lock-threads action to use dessant version
Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-28 05:10:49 +02:00
James Cole
6192454c5a Merge pull request #12298 from firefly-iii/dependabot/npm_and_yarn/npm_and_yarn-6ec3e26c6e 2026-05-28 04:59:21 +02:00
dependabot[bot]
c9e533097c Bump tmp in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [tmp](https://github.com/raszi/node-tmp).


Updates `tmp` from 0.2.5 to 0.2.7
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.5...v0.2.7)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.7
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-28 02:57:18 +00:00
James Cole
3c6d3069d9 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-05-28 04:33:58 +02:00
James Cole
11694d2667 Fix https://github.com/firefly-iii/firefly-iii/issues/12297 2026-05-28 04:33:36 +02:00
James Cole
6541ac6f34 Merge pull request #12237 from firefly-iii/dependabot/npm_and_yarn/develop/i18next-http-backend-4.0.0 2026-05-28 03:27:30 +02:00
dependabot[bot]
0fd42ea43f Bump i18next-http-backend from 3.0.6 to 4.0.0
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 3.0.6 to 4.0.0.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v3.0.6...v4.0.0)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 11:41:17 +00:00
James Cole
db73ae39d1 Merge pull request #12288 from firefly-iii/dependabot/npm_and_yarn/develop/vite-8.0.14
Bump vite from 8.0.13 to 8.0.14
2026-05-25 13:39:38 +02:00
James Cole
972d75dc41 Merge pull request #12290 from firefly-iii/dependabot/npm_and_yarn/develop/date-fns-4.3.0
Bump date-fns from 4.1.0 to 4.3.0
2026-05-25 13:39:23 +02:00
James Cole
7891c24f5c Merge pull request #12291 from firefly-iii/dependabot/npm_and_yarn/develop/webpack-5.107.1
Bump webpack from 5.105.4 to 5.107.1
2026-05-25 13:39:03 +02:00
dependabot[bot]
7fa4d67a3f Bump webpack from 5.105.4 to 5.107.1
Bumps [webpack](https://github.com/webpack/webpack) from 5.105.4 to 5.107.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.105.4...v5.107.1)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.107.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 06:37:17 +00:00
github-actions[bot]
bd2e830637 Merge pull request #12293 from firefly-iii/release-1779690884
🤖 Automatically merge the PR into the develop branch.
2026-05-25 08:34:52 +02:00
JC5
b1bb0b1e84 🤖 Auto commit for release 'develop' on 2026-05-25 2026-05-25 08:34:45 +02:00
James Cole
673e3a21f9 Had the case right the first time, duh. 2026-05-25 08:29:33 +02:00
James Cole
a240074343 Fix case 2026-05-25 08:22:26 +02:00
dependabot[bot]
12baa27de9 Bump date-fns from 4.1.0 to 4.3.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 4.1.0 to 4.3.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Commits](https://github.com/date-fns/date-fns/compare/v4.1.0...v4.3.0)

---
updated-dependencies:
- dependency-name: date-fns
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 04:22:37 +00:00
dependabot[bot]
9e60d0ca0d Bump vite from 8.0.13 to 8.0.14
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.13 to 8.0.14.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 04:22:28 +00:00
James Cole
a86039aa78 Merge branch 'main' into develop 2026-05-21 14:59:59 +02:00
James Cole
2c14a605e4 Remove AI assistance disclosure comments
Removed AI assistance disclosure comments from the workflow.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-21 12:32:32 +02:00
James Cole
3b94e0479a Merge branch 'main' into develop 2026-05-21 12:16:04 +02:00
James Cole
c08e3c8797 Add debug for the notification channel thing. 2026-05-21 12:15:48 +02:00
github-actions[bot]
1678c15905 Merge pull request #12276 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-05-21 06:59:51 +02:00
github-actions[bot]
37a3444816 Merge pull request #12275 from firefly-iii/release-1779339576
🤖 Automatically merge the PR into the develop branch.
2026-05-21 06:59:45 +02:00
JC5
008c9b4d8f 🤖 Auto commit for release 'v6.6.3' on 2026-05-21 2026-05-21 06:59:36 +02:00
github-actions[bot]
1c21154799 Merge pull request #12274 from firefly-iii/release-1779338975
🤖 Automatically merge the PR into the develop branch.
2026-05-21 06:49:43 +02:00
JC5
b8c05d6f26 🤖 Auto commit for release 'develop' on 2026-05-21 2026-05-21 06:49:35 +02:00
James Cole
85998cd3d7 Fix mago issues. 2026-05-21 06:44:16 +02:00
James Cole
67a048c279 Fix issues. 2026-05-21 06:38:35 +02:00
James Cole
b81943fad6 Lots of mago fixes applied. 2026-05-21 06:31:24 +02:00
github-actions[bot]
9ee1b4587c Merge pull request #12273 from firefly-iii/release-1779337714
🤖 Automatically merge the PR into the develop branch.
2026-05-21 06:28:41 +02:00
JC5
7579ae2615 🤖 Auto commit for release 'develop' on 2026-05-21 2026-05-21 06:28:34 +02:00
James Cole
c002cb795d Fix date fns 2026-05-21 06:23:17 +02:00
James Cole
f00852aa6a Merge branch 'main' into develop 2026-05-21 06:22:28 +02:00
James Cole
3e26f21bc4 Fix patch and lock version. 2026-05-21 06:22:15 +02:00
James Cole
195fb6cdb7 Update pr-reply-no-disclosure.yml
Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-21 06:07:37 +02:00
James Cole
034280ca17 Update changelog. 2026-05-20 20:53:55 +02:00
github-actions[bot]
c5ce9fd1e2 Merge pull request #12272 from firefly-iii/release-1779302299
🤖 Automatically merge the PR into the develop branch.
2026-05-20 20:38:28 +02:00
JC5
3d64f7fe08 🤖 Auto commit for release 'develop' on 2026-05-20 2026-05-20 20:38:20 +02:00
James Cole
f2efb69b76 Fix broken if statement 2026-05-20 20:30:30 +02:00
James Cole
7499a414f4 Expand changelog 2026-05-20 20:24:50 +02:00
James Cole
8b0f790a56 Merge branch 'main' into develop 2026-05-20 20:18:10 +02:00
James Cole
b70ed32952 Merge pull request #12271 from alanturing881/fix/stored-xss-ale-piggy-name
Fix stored XSS in audit log view via piggy bank name (ale.twig)
2026-05-20 20:16:16 +02:00
James Cole
9e511c822e Update pr-reply-no-disclosure.yml
Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-20 20:12:40 +02:00
iaohkut
fa6c123595 Fix stored XSS in ALE view by HTML-escaping piggy bank name
The Twig template ale.twig rendered the piggy bank name from
AuditLogEntry.after.piggy using |raw, bypassing auto-escaping.
A user-controlled name containing HTML (e.g. <img onerror=...>)
would execute as JavaScript in any browser viewing the transaction
audit log (CWE-79).

Apply |e filter to escape only the user-controlled `name` parameter
before substitution into the trans() string. The |raw filter is
preserved because the `amount` parameter legitimately contains
<span> tags for currency styling.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 11:07:57 -04:00
James Cole
ec1dfca2b5 Enhance PR workflow to check for author
Added logic to check for the author of the pull request.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-19 08:15:40 +02:00
James Cole
bebd3b189e Merge pull request #12265 from firefly-iii/dependabot/npm_and_yarn/develop/vite-8.0.13
Bump vite from 8.0.11 to 8.0.13
2026-05-18 08:11:34 +02:00
github-actions[bot]
e3319dca5d Merge pull request #12266 from firefly-iii/release-1779078811
🤖 Automatically merge the PR into the develop branch.
2026-05-18 06:33:40 +02:00
JC5
a38cb85f55 🤖 Auto commit for release 'develop' on 2026-05-18 2026-05-18 06:33:31 +02:00
dependabot[bot]
0226673a01 Bump vite from 8.0.11 to 8.0.13
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.11 to 8.0.13.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.13/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 04:27:29 +00:00
github-actions[bot]
7816f1be9b Merge pull request #12263 from firefly-iii/release-1779030686
🤖 Automatically merge the PR into the develop branch.
2026-05-17 17:11:33 +02:00
JC5
5878173e80 🤖 Auto commit for release 'develop' on 2026-05-17 2026-05-17 17:11:26 +02:00
github-actions[bot]
45c30f11bc Merge pull request #12260 from firefly-iii/release-1778986654
🤖 Automatically merge the PR into the develop branch.
2026-05-17 04:57:40 +02:00
JC5
fea97efdbf 🤖 Auto commit for release 'develop' on 2026-05-17 2026-05-17 04:57:34 +02:00
James Cole
fe0e8796ca Merge branch 'main' into develop 2026-05-17 04:50:57 +02:00
James Cole
e83c5b9f86 New workflow. 2026-05-17 04:50:34 +02:00
James Cole
9558f05947 Merge branch 'main' into develop 2026-05-17 04:29:39 +02:00
James Cole
f3d6bb0fb5 Possible fix for https://github.com/firefly-iii/firefly-iii/issues/12258 2026-05-17 04:28:06 +02:00
James Cole
57010cd2e0 Fix https://github.com/firefly-iii/firefly-iii/issues/12257 2026-05-17 04:26:45 +02:00
James Cole
9436eeacaf Update warning about AI-generated security advisories
Clarified consequences of reporting AI-generated security advisories.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-17 03:44:01 +02:00
github-actions[bot]
7ddf395ea9 Merge pull request #12256 from firefly-iii/release-1778958406
🤖 Automatically merge the PR into the develop branch.
2026-05-16 21:06:52 +02:00
JC5
492c55bd76 🤖 Auto commit for release 'develop' on 2026-05-16 2026-05-16 21:06:46 +02:00
James Cole
894dea5c9c Fix https://github.com/firefly-iii/firefly-iii/issues/12254 as suggested by @imjuzcy 2026-05-16 21:01:50 +02:00
github-actions[bot]
fecf12790d Merge pull request #12255 from firefly-iii/release-1778957079
🤖 Automatically merge the PR into the develop branch.
2026-05-16 20:44:49 +02:00
JC5
883c083860 🤖 Auto commit for release 'develop' on 2026-05-16 2026-05-16 20:44:39 +02:00
James Cole
e059753c43 Merge branch 'main' into develop 2026-05-16 20:39:12 +02:00
James Cole
0bac0aaaee Add some debug logging. 2026-05-16 20:38:50 +02:00
James Cole
2a68c48e2a Update security reporting guidelines in security.md
Clarified instructions for reporting false security issues.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-16 20:05:44 +02:00
James Cole
c394034876 Clarify AI hallucinations in security reporting
Reworded the third point to clarify AI hallucinations in security issues.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-16 20:05:20 +02:00
James Cole
7bd91048ea Update security.md with reporting guidelines
Clarified reporting guidelines for security issues to prevent false reports.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-16 20:03:49 +02:00
James Cole
d64bca7700 Merge branch 'main' into develop 2026-05-16 19:54:22 +02:00
James Cole
7d768cfa23 Add AI-generated security advisories section
Added a section regarding AI-generated security advisories to clarify reporting policies and potential consequences.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-05-16 19:52:56 +02:00
James Cole
fd50fbf193 Merge branch 'main' into develop 2026-05-12 18:48:04 +02:00
James Cole
134c232f45 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-05-12 18:47:48 +02:00
James Cole
ce603f50d8 Fix https://github.com/firefly-iii/firefly-iii/issues/12243 2026-05-12 18:45:33 +02:00
James Cole
c4ee3598e1 Merge pull request #12239 from firefly-iii/dependabot/github_actions/actions/dependency-review-action-5
Bump actions/dependency-review-action from 4 to 5
2026-05-11 06:08:49 +02:00
dependabot[bot]
8cf8e91448 Bump actions/dependency-review-action from 4 to 5
Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4 to 5.
- [Release notes](https://github.com/actions/dependency-review-action/releases)
- [Commits](https://github.com/actions/dependency-review-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/dependency-review-action
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 03:56:03 +00:00
375 changed files with 3223 additions and 2682 deletions

View File

@@ -471,23 +471,23 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.95.1",
"version": "v3.95.4",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065"
"reference": "3f8f68856837a77e1f1d870354eca3c8747f2f72"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065",
"reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3f8f68856837a77e1f1d870354eca3c8747f2f72",
"reference": "3f8f68856837a77e1f1d870354eca3c8747f2f72",
"shasum": ""
},
"require": {
"clue/ndjson-react": "^1.3",
"composer/semver": "^3.4",
"composer/xdebug-handler": "^3.0.5",
"ergebnis/agent-detector": "^1.1.1",
"ergebnis/agent-detector": "^1.2",
"ext-filter": "*",
"ext-hash": "*",
"ext-json": "*",
@@ -504,16 +504,16 @@
"symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/polyfill-mbstring": "^1.33",
"symfony/polyfill-php80": "^1.33",
"symfony/polyfill-php81": "^1.33",
"symfony/polyfill-php84": "^1.33",
"symfony/polyfill-mbstring": "^1.37",
"symfony/polyfill-php80": "^1.37",
"symfony/polyfill-php81": "^1.37",
"symfony/polyfill-php84": "^1.37",
"symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0",
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
},
"require-dev": {
"facile-it/paraunit": "^1.3.1 || ^2.8.0",
"infection/infection": "^0.32.6",
"facile-it/paraunit": "^1.3.1 || ^2.11.0",
"infection/infection": "^0.32.7",
"justinrainbow/json-schema": "^6.8.0",
"keradus/cli-executor": "^2.3",
"mikey179/vfsstream": "^1.6.12",
@@ -521,9 +521,9 @@
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8",
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55",
"symfony/polyfill-php85": "^1.33",
"symfony/polyfill-php85": "^1.37",
"symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8",
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8"
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.11"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
@@ -564,7 +564,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.4"
},
"funding": [
{
@@ -572,7 +572,7 @@
"type": "github"
}
],
"time": "2026-04-12T17:00:09+00:00"
"time": "2026-06-03T18:02:44+00:00"
},
{
"name": "psr/container",
@@ -1255,16 +1255,16 @@
},
{
"name": "sebastian/diff",
"version": "8.1.0",
"version": "8.3.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "9c957d730257f49c873f3761674559bd90098a7d"
"reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/9c957d730257f49c873f3761674559bd90098a7d",
"reference": "9c957d730257f49c873f3761674559bd90098a7d",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47",
"reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47",
"shasum": ""
},
"require": {
@@ -1277,7 +1277,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "8.1-dev"
"dev-main": "8.3-dev"
}
},
"autoload": {
@@ -1310,7 +1310,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/8.1.0"
"source": "https://github.com/sebastianbergmann/diff/tree/8.3.0"
},
"funding": [
{
@@ -1330,27 +1330,33 @@
"type": "tidelift"
}
],
"time": "2026-04-05T12:02:33+00:00"
"time": "2026-05-15T04:58:09+00:00"
},
{
"name": "symfony/console",
"version": "v8.0.9",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d"
"reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/7113778e2e91f4709cb3194a75dfa9c0d028d94d",
"reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d",
"url": "https://api.github.com/repos/symfony/console/zipball/f5a856c6ecb56b3c21ed94a5b7bf940d857d110a",
"reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-php85": "^1.32",
"symfony/service-contracts": "^2.5|^3",
"symfony/string": "^7.4|^8.0"
"symfony/string": "^7.4.6|^8.0.6"
},
"conflict": {
"symfony/dependency-injection": "<8.1",
"symfony/event-dispatcher": "<8.1"
},
"provide": {
"psr/log-implementation": "1.0|2.0|3.0"
@@ -1358,14 +1364,18 @@
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^7.4|^8.0",
"symfony/dependency-injection": "^7.4|^8.0",
"symfony/event-dispatcher": "^7.4|^8.0",
"symfony/dependency-injection": "^8.1",
"symfony/event-dispatcher": "^8.1",
"symfony/filesystem": "^7.4|^8.0",
"symfony/http-foundation": "^7.4|^8.0",
"symfony/http-kernel": "^7.4|^8.0",
"symfony/lock": "^7.4|^8.0",
"symfony/messenger": "^7.4|^8.0",
"symfony/mime": "^7.4|^8.0",
"symfony/process": "^7.4|^8.0",
"symfony/stopwatch": "^7.4|^8.0",
"symfony/uid": "^7.4|^8.0",
"symfony/validator": "^7.4|^8.0",
"symfony/var-dumper": "^7.4|^8.0"
},
"type": "library",
@@ -1400,7 +1410,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v8.0.9"
"source": "https://github.com/symfony/console/tree/v8.1.0"
},
"funding": [
{
@@ -1420,7 +1430,7 @@
"type": "tidelift"
}
],
"time": "2026-04-29T15:02:55+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -1495,20 +1505,21 @@
},
{
"name": "symfony/event-dispatcher",
"version": "v8.0.9",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f"
"reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0c3c1a17604c4dbbec4b93fe162c538482096e1f",
"reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f249ae3f680958b6f1f9dd76e5747cf0695b4102",
"reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/event-dispatcher-contracts": "^2.5|^3"
},
"conflict": {
@@ -1556,7 +1567,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v8.0.9"
"source": "https://github.com/symfony/event-dispatcher/tree/v8.1.0"
},
"funding": [
{
@@ -1576,7 +1587,7 @@
"type": "tidelift"
}
],
"time": "2026-04-18T13:51:42+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -1660,20 +1671,21 @@
},
{
"name": "symfony/filesystem",
"version": "v8.0.9",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40"
"reference": "99aec13b82b4967ec5088222c4a3ecca955949c2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40",
"reference": "d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2",
"reference": "99aec13b82b4967ec5088222c4a3ecca955949c2",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8"
},
@@ -1706,7 +1718,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v8.0.9"
"source": "https://github.com/symfony/filesystem/tree/v8.1.0"
},
"funding": [
{
@@ -1726,24 +1738,24 @@
"type": "tidelift"
}
],
"time": "2026-04-18T13:51:42+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/finder",
"version": "v8.0.8",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "8da41214757b87d97f181e3d14a4179286151007"
"reference": "58d2e767a66052c1487356f953445634a8194c64"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007",
"reference": "8da41214757b87d97f181e3d14a4179286151007",
"url": "https://api.github.com/repos/symfony/finder/zipball/58d2e767a66052c1487356f953445634a8194c64",
"reference": "58d2e767a66052c1487356f953445634a8194c64",
"shasum": ""
},
"require": {
"php": ">=8.4"
"php": ">=8.4.1"
},
"require-dev": {
"symfony/filesystem": "^7.4|^8.0"
@@ -1774,7 +1786,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v8.0.8"
"source": "https://github.com/symfony/finder/tree/v8.1.0"
},
"funding": [
{
@@ -1794,24 +1806,24 @@
"type": "tidelift"
}
],
"time": "2026-03-30T15:14:47+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/options-resolver",
"version": "v8.0.8",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
"reference": "b48bce0a70b914f6953dafbd10474df232ed4de8"
"reference": "88f9c561f678a02d54b897014049fa839e33ff82"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/b48bce0a70b914f6953dafbd10474df232ed4de8",
"reference": "b48bce0a70b914f6953dafbd10474df232ed4de8",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/88f9c561f678a02d54b897014049fa839e33ff82",
"reference": "88f9c561f678a02d54b897014049fa839e33ff82",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/deprecation-contracts": "^2.5|^3"
},
"type": "library",
@@ -1845,7 +1857,7 @@
"options"
],
"support": {
"source": "https://github.com/symfony/options-resolver/tree/v8.0.8"
"source": "https://github.com/symfony/options-resolver/tree/v8.1.0"
},
"funding": [
{
@@ -1865,7 +1877,7 @@
"type": "tidelift"
}
],
"time": "2026-03-30T15:14:47+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -1952,16 +1964,16 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "4864388bfbd3001ce88e234fab652acd91fdc57e"
"reference": "e9247d281d694a5120554d9afaf54e070e88a603"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e",
"reference": "4864388bfbd3001ce88e234fab652acd91fdc57e",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",
"reference": "e9247d281d694a5120554d9afaf54e070e88a603",
"shasum": ""
},
"require": {
@@ -2010,7 +2022,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"
},
"funding": [
{
@@ -2030,20 +2042,20 @@
"type": "tidelift"
}
],
"time": "2026-04-26T13:13:48+00:00"
"time": "2026-05-26T05:58:03+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.37.0",
"version": "v1.38.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
"shasum": ""
},
"require": {
@@ -2095,7 +2107,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
},
"funding": [
{
@@ -2115,20 +2127,20 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2026-05-25T13:48:31+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315"
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315",
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92",
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92",
"shasum": ""
},
"require": {
@@ -2180,7 +2192,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1"
},
"funding": [
{
@@ -2200,7 +2212,7 @@
"type": "tidelift"
}
],
"time": "2026-04-10T17:25:58+00:00"
"time": "2026-05-26T12:51:13+00:00"
},
{
"name": "symfony/polyfill-php80",
@@ -2288,16 +2300,16 @@
},
{
"name": "symfony/polyfill-php81",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
"reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
"reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
"shasum": ""
},
"require": {
@@ -2344,7 +2356,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1"
},
"funding": [
{
@@ -2364,20 +2376,20 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2026-05-26T12:45:58+00:00"
},
{
"name": "symfony/polyfill-php84",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php84.git",
"reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06"
"reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06",
"reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06",
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
"reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
"shasum": ""
},
"require": {
@@ -2424,7 +2436,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1"
},
"funding": [
{
@@ -2444,24 +2456,104 @@
"type": "tidelift"
}
],
"time": "2026-04-10T18:47:49+00:00"
"time": "2026-05-26T12:51:13+00:00"
},
{
"name": "symfony/process",
"version": "v8.0.8",
"name": "symfony/polyfill-php85",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc"
"url": "https://github.com/symfony/polyfill-php85.git",
"reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc",
"reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc",
"url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1",
"reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1",
"shasum": ""
},
"require": {
"php": ">=8.4"
"php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php85\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2026-05-26T02:25:22+00:00"
},
{
"name": "symfony/process",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
"reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
"shasum": ""
},
"require": {
"php": ">=8.4.1"
},
"type": "library",
"autoload": {
@@ -2489,7 +2581,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v8.0.8"
"source": "https://github.com/symfony/process/tree/v8.1.0"
},
"funding": [
{
@@ -2509,7 +2601,7 @@
"type": "tidelift"
}
],
"time": "2026-03-30T15:14:47+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/service-contracts",
@@ -2600,20 +2692,20 @@
},
{
"name": "symfony/stopwatch",
"version": "v8.0.8",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
"reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3"
"reference": "21c07b026905d596e8379caeb115d87aa479499d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/85954ed72d5440ea4dc9a10b7e49e01df766ffa3",
"reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/21c07b026905d596e8379caeb115d87aa479499d",
"reference": "21c07b026905d596e8379caeb115d87aa479499d",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/service-contracts": "^2.5|^3"
},
"type": "library",
@@ -2642,7 +2734,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/stopwatch/tree/v8.0.8"
"source": "https://github.com/symfony/stopwatch/tree/v8.1.0"
},
"funding": [
{
@@ -2662,24 +2754,24 @@
"type": "tidelift"
}
],
"time": "2026-03-30T15:14:47+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/string",
"version": "v8.0.8",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "ae9488f874d7603f9d2dfbf120203882b645d963"
"reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963",
"reference": "ae9488f874d7603f9d2dfbf120203882b645d963",
"url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9",
"reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-intl-grapheme": "^1.33",
"symfony/polyfill-intl-normalizer": "^1.0",
@@ -2732,7 +2824,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v8.0.8"
"source": "https://github.com/symfony/string/tree/v8.1.0"
},
"funding": [
{
@@ -2752,7 +2844,7 @@
"type": "tidelift"
}
],
"time": "2026-03-30T15:14:47+00:00"
"time": "2026-05-29T05:06:50+00:00"
}
],
"packages-dev": [],

View File

@@ -38,9 +38,11 @@ Example: Fixes #1234. See also #3456.
#### AI usage disclosure
<!--
If AI tools were involved in creating this PR, please check all boxes that apply
If AI tools were involved in creating this PR, please check all boxes that apply
below and make sure that you adhere to our Automated Contributions Policy:
https://docs.firefly-iii.org/explanation/support/#automated-contributions-policy
If you remove or skip this disclosure, your PR may be ignored.
-->
I used AI assistance for:
- [ ] Code generation (e.g., when writing an implementation or fixing a bug)

9
.github/security.md vendored
View File

@@ -3,6 +3,15 @@
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.
## AI-generated security advisories
> [!WARNING]
> Due to a large number of irrelevant, noisy and uninformed AI-generated security advisories coming my way, reporting any the following security issues may result in a permanent ban from the Firefly III organization on GitHub.
1. Any SSRF in any user provided URL field (webhooks, ntfy, SimpleFIN, Slack). It's by design that users may set-up any URL they want, be it internal, private or non-existing.
2. Any XSS issue without a viable attack tree. If you can find a spot where Firefly III or the associated tools render unescaped data, it's not a security issue unless you can show me an actual attack that gets that data into the system.
3. Any issue that is not true. AI models have already *hallucinated* security issues in Firefly III. They've referred to **non-existing** functions, templates and files. Including line numbers and code excerpts. Validate your findings before you report them to me.
## Supported versions
Only the latest Firefly III release is maintained. Applicable fixes, including security fixes, will not be backported to

View File

@@ -13,4 +13,4 @@ jobs:
with:
fetch-depth: 0
- name: 'Dependency review'
uses: actions/dependency-review-action@v4
uses: actions/dependency-review-action@v5

View File

@@ -21,7 +21,7 @@ jobs:
discussions: write
runs-on: ubuntu-latest
steps:
- uses: JC5/lock-threads@v6.0.6
- uses: dessant/lock-threads@main
with:
issue-inactive-days: 21
pr-inactive-days: 21

View File

@@ -0,0 +1,61 @@
name: 'PRs - Check for AI disclosure'
# the workflow to execute on is comments that are newly created
on:
pull_request:
types: [ opened ]
# permissions needed for reacting to IssueOps commands on issues and PRs
permissions:
contents: read
pull-requests: write
issues: write
checks: read
jobs:
respond:
runs-on: ubuntu-latest
steps:
- run: |
BODY=$(gh pr view $NUMBER --json body)
AUTHOR=$(gh pr view $NUMBER --json author)
if [[ $AUTHOR == *"app/dependabot"* ]]; then
echo "Is dependabot, stop"
exit 0
fi
echo "Not dependabot!"
# $BODY must contain one of these four uses.
if [[ $BODY != *"Code generation"* &&
$BODY != *"Test/benchmark generation"* &&
$BODY != *"Documentation"* &&
$BODY != *"Research and understanding"* &&
$BODY != *"I used AI assistance for"* ]]; then
MESSAGE="Hi there!
This is an automated reply. \`Share and enjoy\`
You triggered an automated reply, because it seems you removed or changed the AI assistance disclosure from the PR template. Without a valid disclosure, your PR cannot be processed.
Even if you did not use AI, this disclosure must be present. Please reply to your PR and explain your use of AI in any or all of the following areas:
1. Code generation (e.g., when writing an implementation or fixing a bug)
2. Test/benchmark generation
3. Documentation (including examples)
4. Research and understanding
There cannot be interaction with your PR without this disclosure.
If the disclosure is present but the bot did not pick up on it, please accept my apologies for the intrusion. Contrary to other bots, this one is just a simple \`bash\` script and it may be wrong."
gh pr comment "$NUMBER" --body "$MESSAGE"
echo "Triggered on AI disclosure missing."
exit 0
fi
echo "It has the disclosure"
env:
NUMBER: ${{ github.event.pull_request.number }}
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}

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.
## 2026
- iaohkut
- tasnim0tantawi
- Joe Longendyke
- Daniel Holøien

View File

@@ -87,8 +87,7 @@ final class BalanceController extends Controller
// get journals for entire period:
$this->collector
->setRange($queryParameters['start'], $queryParameters['end'])
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
->withAccountInformation()
->setXorAccounts($accounts)
->setTypes([

View File

@@ -87,7 +87,7 @@ final class PurgeController extends Controller
Rule::whereUserId($user->id)->onlyTrashed()->forceDelete();
// notes (this will actually purge EVERYBODY's deleted notes)
Note::onlyTrashed()->forceDelete();
Note::query()->onlyTrashed()->forceDelete();
// recurring transactions
Recurrence::whereUserId($user->id)->onlyTrashed()->forceDelete();

View File

@@ -31,7 +31,7 @@ use FireflyIII\Enums\WebhookResponse;
use FireflyIII\Enums\WebhookTrigger;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Support\Binder\EitherConfigKey;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;
@@ -128,7 +128,7 @@ final class ConfigurationController extends Controller
$data = $request->getAll();
$shortName = str_replace('configuration.', '', $name);
FireflyConfig::set($shortName, $data['value']);
AppConfiguration::set($shortName, $data['value']);
// get updated config:
$newConfig = $this->getDynamicConfiguration();
@@ -148,17 +148,17 @@ final class ConfigurationController extends Controller
*/
private function getDynamicConfiguration(): array
{
$isDemoSite = FireflyConfig::get('is_demo_site', false);
$updateCheck = FireflyConfig::get('permission_update_check', -1);
$singleUser = FireflyConfig::get('single_user_mode', true);
$lastCheck = FireflyConfig::get('last_update_check', 1);
$enableExchangeRates = FireflyConfig::get('enable_exchange_rates', config('cer.enabled'));
$useRunningBalance = FireflyConfig::get('use_running_balance', true);
$enableExternalMap = FireflyConfig::get('enable_external_map', false);
$enableExternalRates = FireflyConfig::get('enable_external_rates', false);
$allowWebhooks = FireflyConfig::get('allow_webhooks', false);
$enableBatchProcessing = FireflyConfig::get('enable_batch_processing', false);
$validUrlProtocols = FireflyConfig::get('valid_url_protocols', 'http,https');
$isDemoSite = AppConfiguration::get('is_demo_site', false);
$updateCheck = AppConfiguration::get('permission_update_check', -1);
$singleUser = AppConfiguration::get('single_user_mode', true);
$lastCheck = AppConfiguration::get('last_update_check', 1);
$enableExchangeRates = AppConfiguration::get('enable_exchange_rates', config('cer.enabled'));
$useRunningBalance = AppConfiguration::get('use_running_balance', true);
$enableExternalMap = AppConfiguration::get('enable_external_map', false);
$enableExternalRates = AppConfiguration::get('enable_external_rates', false);
$allowWebhooks = AppConfiguration::get('allow_webhooks', false);
$enableBatchProcessing = AppConfiguration::get('enable_batch_processing', false);
$validUrlProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'));
return [
'is_demo_site' => $isDemoSite?->data,
@@ -171,7 +171,7 @@ final class ConfigurationController extends Controller
'enable_external_rates' => $enableExternalRates?->data,
'allow_webhooks' => $allowWebhooks?->data,
'enable_batch_processing' => $enableBatchProcessing?->data,
'valid_url_protocols' => $validUrlProtocols->data ?? 'http,https',
'valid_url_protocols' => $validUrlProtocols->data ?? config('firefly.valid_url_protocols'),
];
}

View File

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

View File

@@ -30,7 +30,7 @@ use FireflyIII\Models\Webhook;
use FireflyIII\Models\WebhookAttempt;
use FireflyIII\Models\WebhookMessage;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Transformers\WebhookAttemptTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator;
@@ -71,7 +71,7 @@ final class AttemptController extends Controller
if ($message->webhook_id !== $webhook->id) {
throw new FireflyException('200040: Webhook and webhook message are no match');
}
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf(
'User lists webhook attempts of webhook #%d and message #%d, but webhooks are DISABLED.',
$webhook->id,
@@ -119,7 +119,7 @@ final class AttemptController extends Controller
throw new FireflyException('200041: Webhook message and webhook attempt are no match');
}
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf(
'User views single webhook attempt #%d of webhook #%d and message #%d, but webhooks are DISABLED',
$attempt->id,

View File

@@ -30,7 +30,7 @@ use FireflyIII\Models\Webhook;
use FireflyIII\Models\WebhookAttempt;
use FireflyIII\Models\WebhookMessage;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
@@ -62,7 +62,7 @@ final class DestroyController extends Controller
*/
public function destroy(Webhook $webhook): JsonResponse
{
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d. but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -92,7 +92,7 @@ final class DestroyController extends Controller
throw new FireflyException('200041: Webhook message and webhook attempt are no match');
}
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf(
'User tries to destroy webhook #%d, message #%d, attempt #%d, but webhooks are DISABLED.',
$webhook->id,
@@ -125,7 +125,7 @@ final class DestroyController extends Controller
throw new FireflyException('200040: Webhook and webhook message are no match');
}
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d, message #%d, but webhooks are DISABLED.', $webhook->id, $message->id));
throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -29,7 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Webhook;
use FireflyIII\Models\WebhookMessage;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Transformers\WebhookMessageTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator;
@@ -65,7 +65,7 @@ final class MessageController extends Controller
*/
public function index(Webhook $webhook): JsonResponse
{
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to view messages of webhook #%d, but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -105,7 +105,7 @@ final class MessageController extends Controller
if ($message->webhook_id !== $webhook->id) {
throw new FireflyException('200040: Webhook and webhook message are no match');
}
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->warning(sprintf('User tries to view message #%d of webhook #%d, but webhooks are DISABLED.', $message->id, $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -31,7 +31,7 @@ use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\Webhook;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
use FireflyIII\Transformers\WebhookTransformer;
use FireflyIII\User;
@@ -72,7 +72,7 @@ final class ShowController extends Controller
*/
public function index(): JsonResponse
{
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info('User tries to view all webhooks, but webhooks are DISABLED.');
throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -114,7 +114,7 @@ final class ShowController extends Controller
*/
public function show(Webhook $webhook): JsonResponse
{
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf('User tries to view webhook #%d, but webhooks are DISABLED.', $webhook->id));
throw new NotFoundHttpException('Webhooks are not enabled.');
@@ -146,7 +146,7 @@ final class ShowController extends Controller
*/
public function triggerTransaction(Webhook $webhook, TransactionGroup $group): JsonResponse
{
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf(
'User tries to trigger webhook #%d on transaction group #%d, but webhooks are DISABLED.',
$webhook->id,

View File

@@ -27,7 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Webhook;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\Webhook\CreateRequest;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
use FireflyIII\Transformers\WebhookTransformer;
use FireflyIII\User;
@@ -63,7 +63,7 @@ final class StoreController extends Controller
public function store(CreateRequest $request): JsonResponse
{
$data = $request->getData();
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info('User tries to store new webhook, but webhooks are DISABLED.', $data);
throw new NotFoundHttpException('Webhooks are not enabled.');

View File

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

View File

@@ -28,7 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\Webhook\UpdateRequest;
use FireflyIII\Models\Webhook;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
use FireflyIII\Transformers\WebhookTransformer;
use FireflyIII\User;
@@ -62,7 +62,7 @@ final class UpdateController extends Controller
public function update(Webhook $webhook, UpdateRequest $request): JsonResponse
{
$data = $request->getData();
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
Log::channel('audit')->info(sprintf('User tries to update webhook #%d, but webhooks are DISABLED.', $webhook->id), $data);
throw new NotFoundHttpException('Webhooks are not enabled.');

View File

@@ -59,6 +59,6 @@ class AutocompleteRequest extends FormRequest
public function rules(): array
{
return ['date' => 'date|after:1970-01-02|before:2038-01-17'];
return ['date' => ['date', 'after:1970-01-02', 'before:2038-01-17']];
}
}

View File

@@ -60,11 +60,11 @@ class ChartRequest extends FormRequest
public function rules(): array
{
return [
'start' => 'required|date|after:1970-01-02|before:2038-01-17|before_or_equal:end',
'end' => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start',
'start' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17', 'before_or_equal:end'],
'end' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17', 'after_or_equal:start'],
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
'accounts' => 'nullable|array',
'accounts' => ['nullable', 'array'],
'accounts.*' => 'exists:accounts,id',
];
}

View File

@@ -46,14 +46,11 @@ class MoveTransactionsRequest extends FormRequest
return ['original_account' => $this->convertInteger('original_account'), 'destination_account' => $this->convertInteger('destination_account')];
}
/**
* @return string[]
*/
public function rules(): array
{
return [
'original_account' => 'required|different:destination_account|belongsToUser:accounts,id',
'destination_account' => 'required|different:original_account|belongsToUser:accounts,id',
'original_account' => ['required', 'different:destination_account', 'belongsToUser:accounts,id'],
'destination_account' => ['required', 'different:original_account', 'belongsToUser:accounts,id'],
];
}

View File

@@ -72,6 +72,6 @@ class ExportRequest extends FormRequest
*/
public function rules(): array
{
return ['type' => 'in:csv', 'accounts' => 'min:1|max:32768', 'start' => 'date|before:end', 'end' => 'date|after:start'];
return ['type' => 'in:csv', 'accounts' => ['min:1', 'max:32768'], 'start' => ['date', 'before:end'], 'end' => ['date', 'after:start']];
}
}

View File

@@ -55,6 +55,6 @@ class SameDateRequest extends FormRequest
*/
public function rules(): array
{
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
return ['start' => ['required', 'date'], 'end' => ['required', 'date', 'after_or_equal:start']];
}
}

View File

@@ -56,6 +56,6 @@ class SingleDateRequest extends FormRequest
*/
public function rules(): array
{
return ['date' => 'required|date|after:1970-01-02|before:2038-01-17'];
return ['date' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17']];
}
}

View File

@@ -169,7 +169,7 @@ class GenericRequest extends FormRequest
$this->bills = new Collection();
$this->tags = new Collection();
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
return ['start' => ['required', 'date'], 'end' => ['required', 'date', 'after_or_equal:start']];
}
private function parseAccounts(): void

View File

@@ -99,29 +99,29 @@ class StoreRequest extends FormRequest
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
$type = $this->convertString('type');
$rules = [
'name' => 'required|max:1024|min:1|uniqueAccountForUser',
'name' => ['required', 'max:1024', 'min:1', 'uniqueAccountForUser'],
'type' => sprintf('required|max:1024|min:1|in:%s', $types),
'iban' => ['iban', 'nullable', new UniqueIban(null, $type)],
'bic' => 'bic|nullable',
'bic' => ['bic', 'nullable'],
'account_number' => ['min:1', 'max:255', 'nullable', new UniqueAccountNumber(null, $type)],
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
'virtual_balance' => 'numeric|nullable',
'order' => 'numeric|nullable',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'opening_balance' => ['numeric', 'required_with:opening_balance_date', 'nullable'],
'opening_balance_date' => ['date', 'required_with:opening_balance', 'nullable'],
'virtual_balance' => ['numeric', 'nullable'],
'order' => ['numeric', 'nullable'],
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:3', 'exists:transaction_currencies,code'],
'active' => [new IsBoolean()],
'include_net_worth' => [new IsBoolean()],
'account_role' => sprintf('nullable|in:%s|required_if:type,asset', $accountRoles),
'credit_card_type' => sprintf('nullable|in:%s|required_if:account_role,ccAsset', $ccPaymentTypes),
'monthly_payment_date' => 'nullable|date|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
'liability_type' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:loan,debt,mortgage',
'monthly_payment_date' => ['nullable', 'date', 'required_if:account_role,ccAsset', 'required_if:credit_card_type,monthlyFull'],
'liability_type' => ['nullable', 'required_if:type,liability', 'required_if:type,liabilities', 'in:loan,debt,mortgage'],
'liability_amount' => ['required_with:liability_start_date', new IsValidPositiveAmount()],
'liability_start_date' => 'required_with:liability_amount|date',
'liability_direction' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:credit,debit',
'interest' => 'min:0|max:100|numeric',
'liability_start_date' => ['required_with:liability_amount', 'date'],
'liability_direction' => ['nullable', 'required_if:type,liability', 'required_if:type,liabilities', 'in:credit,debit'],
'interest' => ['min:0', 'max:100', 'numeric'],
'interest_period' => sprintf('nullable|in:%s', implode(',', config('firefly.interest_periods'))),
'notes' => 'min:0|max:32768',
'notes' => ['min:0', 'max:32768'],
];
return Location::requestRules($rules);

View File

@@ -95,24 +95,24 @@ class UpdateRequest extends FormRequest
'name' => sprintf('min:1|max:1024|uniqueAccountForUser:%d', $account->id),
'type' => sprintf('in:%s', $types),
'iban' => ['iban', 'nullable', new UniqueIban($account, $this->convertString('type'))],
'bic' => 'bic|nullable',
'bic' => ['bic', 'nullable'],
'account_number' => ['min:1', 'max:255', 'nullable', new UniqueAccountNumber($account, $this->convertString('type'))],
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
'virtual_balance' => 'numeric|nullable',
'order' => 'numeric|nullable',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'opening_balance' => ['numeric', 'required_with:opening_balance_date', 'nullable'],
'opening_balance_date' => ['date', 'required_with:opening_balance', 'nullable'],
'virtual_balance' => ['numeric', 'nullable'],
'order' => ['numeric', 'nullable'],
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
'active' => [new IsBoolean()],
'include_net_worth' => [new IsBoolean()],
'account_role' => sprintf('in:%s|nullable|required_if:type,asset', $accountRoles),
'credit_card_type' => sprintf('in:%s|nullable|required_if:account_role,ccAsset', $ccPaymentTypes),
'monthly_payment_date' => 'date|nullable|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage',
'liability_direction' => 'required_if:type,liability|in:credit,debit',
'interest' => 'required_if:type,liability|min:0|max:100|numeric',
'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly',
'notes' => 'min:0|max:32768',
'monthly_payment_date' => ['date', 'nullable', 'required_if:account_role,ccAsset', 'required_if:credit_card_type,monthlyFull'],
'liability_type' => ['required_if:type,liability', 'in:loan,debt,mortgage'],
'liability_direction' => ['required_if:type,liability', 'in:credit,debit'],
'interest' => ['required_if:type,liability', 'min:0', 'max:100', 'numeric'],
'interest_period' => ['required_if:type,liability', 'in:daily,monthly,yearly'],
'notes' => ['min:0', 'max:32768'],
];
return Location::requestRules($rules);

View File

@@ -64,9 +64,9 @@ class StoreRequest extends FormRequest
$model = $this->convertString('attachable_type');
return [
'filename' => 'required|min:1|max:255',
'filename' => ['required', 'min:1', 'max:255'],
'title' => ['min:1', 'max:255'],
'notes' => 'min:1|max:32768',
'notes' => ['min:1', 'max:32768'],
'attachable_type' => sprintf('required|in:%s', $models),
'attachable_id' => ['required', 'numeric', new IsValidAttachmentModel($model)],
];

View File

@@ -68,7 +68,7 @@ class UpdateRequest extends FormRequest
return [
'filename' => ['min:1', 'max:255'],
'title' => ['min:1', 'max:255'],
'notes' => 'min:1|max:32768',
'notes' => ['min:1', 'max:32768'],
'attachable_type' => sprintf('in:%s', $models),
'attachable_id' => ['numeric', new IsValidAttachmentModel($model)],
];

View File

@@ -65,11 +65,11 @@ class Request extends FormRequest
public function rules(): array
{
return [
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
'amount' => ['nullable', new IsValidPositiveAmount()],
'start' => 'date|after:1970-01-02|before:2038-01-17',
'end' => 'date|after:1970-01-02|before:2038-01-17',
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
];
}

View File

@@ -77,18 +77,18 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'name' => 'min:1|max:255|uniqueObjectForUser:bills,name',
'name' => ['min:1', 'max:255', 'uniqueObjectForUser:bills,name'],
'amount_min' => ['required', new IsValidPositiveAmount()],
'amount_max' => ['required', new IsValidPositiveAmount()],
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'date' => 'date|required|after:1970-01-02|before:2038-01-17',
'end_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17',
'extension_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17',
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly|required',
'skip' => 'min:0|max:31|numeric',
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
'date' => ['date', 'required', 'after:1970-01-02', 'before:2038-01-17'],
'end_date' => ['nullable', 'date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
'extension_date' => ['nullable', 'date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
'repeat_freq' => ['in:weekly,monthly,quarterly,half-year,yearly', 'required'],
'skip' => ['min:0', 'max:31', 'numeric'],
'active' => [new IsBoolean()],
'notes' => 'nullable|min:1|max:32768',
'notes' => ['nullable', 'min:1', 'max:32768'],
];
}

View File

@@ -81,15 +81,15 @@ class UpdateRequest extends FormRequest
'name' => sprintf('min:1|max:255|uniqueObjectForUser:bills,name,%d', $bill->id),
'amount_min' => ['nullable', new IsValidPositiveAmount()],
'amount_max' => ['nullable', new IsValidPositiveAmount()],
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'date' => 'date|after:1970-01-02|before:2038-01-17',
'end_date' => 'date|after:date|after:1970-01-02|before:2038-01-17',
'extension_date' => 'date|after:date|after:1970-01-02|before:2038-01-17',
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
'date' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end_date' => ['date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
'extension_date' => ['date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly',
'skip' => 'min:0|max:31|numeric',
'skip' => ['min:0', 'max:31', 'numeric'],
'active' => [new IsBoolean()],
'notes' => 'min:1|max:32768',
'notes' => ['min:1', 'max:32768'],
];
}

View File

@@ -75,11 +75,11 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'name' => 'required|min:1|max:255|uniqueObjectForUser:budgets,name',
'name' => ['required', 'min:1', 'max:255', 'uniqueObjectForUser:budgets,name'],
'active' => [new IsBoolean()],
'currency_id' => 'exists:transaction_currencies,id',
'currency_code' => 'exists:transaction_currencies,code',
'notes' => 'nullable|min:1|max:32768',
'notes' => ['nullable', 'min:1', 'max:32768'],
// auto budget info
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
'auto_budget_amount' => [
@@ -88,7 +88,12 @@ class StoreRequest extends FormRequest
'required_if:auto_budget_type,adjusted',
new IsValidPositiveAmount(),
],
'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover|required_if:auto_budget_type,adjusted',
'auto_budget_period' => [
'in:daily,weekly,monthly,quarterly,half_year,yearly',
'required_if:auto_budget_type,reset',
'required_if:auto_budget_type,rollover',
'required_if:auto_budget_type,adjusted',
],
// webhooks
'fire_webhooks' => [new IsBoolean()],

View File

@@ -85,7 +85,7 @@ class UpdateRequest extends FormRequest
return [
'name' => sprintf('min:1|max:100|uniqueObjectForUser:budgets,name,%d', $budget->id),
'active' => [new IsBoolean()],
'notes' => 'nullable|min:1|max:32768',
'notes' => ['nullable', 'min:1', 'max:32768'],
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
'auto_budget_currency_id' => 'exists:transaction_currencies,id',
'auto_budget_currency_code' => 'exists:transaction_currencies,code',

View File

@@ -71,12 +71,12 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'start' => 'required|before:end|date',
'end' => 'required|after:start|date',
'start' => ['required', 'before:end', 'date'],
'end' => ['required', 'after:start', 'date'],
'amount' => ['required', new IsValidPositiveAmount()],
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'notes' => 'nullable|min:0|max:32768',
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
'notes' => ['nullable', 'min:0', 'max:32768'],
// webhooks
'fire_webhooks' => [new IsBoolean()],

View File

@@ -73,12 +73,12 @@ class UpdateRequest extends FormRequest
public function rules(): array
{
return [
'start' => 'date|after:1970-01-02|before:2038-01-17',
'end' => 'date|after:1970-01-02|before:2038-01-17',
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'amount' => ['nullable', new IsValidPositiveAmount()],
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'notes' => 'nullable|min:0|max:32768',
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
'notes' => ['nullable', 'min:0', 'max:32768'],
// webhooks
'fire_webhooks' => [new IsBoolean()],

View File

@@ -51,6 +51,6 @@ class StoreRequest extends FormRequest
*/
public function rules(): array
{
return ['name' => 'required|min:1|max:100|uniqueObjectForUser:categories,name'];
return ['name' => ['required', 'min:1', 'max:100', 'uniqueObjectForUser:categories,name']];
}
}

View File

@@ -48,7 +48,7 @@ class StoreByCurrenciesRequest extends FormRequest
*/
public function rules(): array
{
return ['*' => 'required|numeric|min:0.0000000001'];
return ['*' => ['required', 'numeric', 'min:0.0000000001']];
}
public function withValidator(Validator $validator): void

View File

@@ -54,12 +54,14 @@ class StoreByDateRequest extends FormRequest
/**
* The rules that the incoming request must be matched against.
*
* @return array<string, string>
*/
public function rules(): array
{
return ['from' => 'required|exists:transaction_currencies,code', 'rates' => 'required|array', 'rates.*' => 'required|numeric|min:0.0000000001'];
return [
'from' => ['required', 'exists:transaction_currencies,code'],
'rates' => ['required', 'array'],
'rates.*' => ['required', 'numeric', 'min:0.0000000001'],
];
}
public function withValidator(Validator $validator): void

View File

@@ -64,10 +64,10 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
'rate' => 'required|numeric|gt:0',
'from' => 'required|exists:transaction_currencies,code',
'to' => 'required|exists:transaction_currencies,code',
'date' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17'],
'rate' => ['required', 'numeric', 'gt:0'],
'from' => ['required', 'exists:transaction_currencies,code'],
'to' => ['required', 'exists:transaction_currencies,code'],
];
}
}

View File

@@ -52,10 +52,10 @@ class UpdateRequest extends FormRequest
public function rules(): array
{
return [
'date' => 'date|after:1970-01-02|before:2038-01-17',
'rate' => 'required|numeric|gt:0',
'from' => 'nullable|exists:transaction_currencies,code',
'to' => 'nullable|exists:transaction_currencies,code',
'date' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'rate' => ['required', 'numeric', 'gt:0'],
'from' => ['nullable', 'exists:transaction_currencies,code'],
'to' => ['nullable', 'exists:transaction_currencies,code'],
];
}
}

View File

@@ -71,18 +71,18 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'name' => 'required|min:1|max:255|uniquePiggyBankForUser',
'name' => ['required', 'min:1', 'max:255', 'uniquePiggyBankForUser'],
'accounts' => 'required',
'accounts.*' => 'array|required',
'accounts.*.account_id' => 'required|numeric|belongsToUser:accounts,id',
'accounts.*' => ['array', 'required'],
'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'],
'accounts.*.current_amount' => ['numeric', new IsValidZeroOrMoreAmount()],
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
'object_group_id' => ['numeric', 'belongsToUser:object_groups,id'],
'object_group_title' => ['min:1', 'max:255'],
'target_amount' => ['required', new IsValidZeroOrMoreAmount()],
'start_date' => 'required|date|after:1970-01-01|before:2038-01-17',
'transaction_currency_id' => 'exists:transaction_currencies,id|required_without:transaction_currency_code',
'transaction_currency_code' => 'exists:transaction_currencies,code|required_without:transaction_currency_id',
'target_date' => 'date|nullable|after:start_date',
'start_date' => ['required', 'date', 'after:1970-01-01', 'before:2038-01-17'],
'transaction_currency_id' => ['exists:transaction_currencies,id', 'required_without:transaction_currency_code'],
'transaction_currency_code' => ['exists:transaction_currencies,code', 'required_without:transaction_currency_id'],
'target_date' => ['date', 'nullable', 'after:start_date'],
'notes' => 'max:65000',
];
}

View File

@@ -79,17 +79,17 @@ class UpdateRequest extends FormRequest
'name' => 'min:1|max:255|uniquePiggyBankForUser:'.$piggyBank->id,
'current_amount' => ['nullable', new LessThanPiggyTarget(), new IsValidPositiveAmount()],
'target_amount' => ['nullable', new IsValidZeroOrMoreAmount()],
'start_date' => 'date|nullable',
'target_date' => 'date|nullable|after:start_date',
'start_date' => ['date', 'nullable'],
'target_date' => ['date', 'nullable', 'after:start_date'],
'notes' => 'max:65000',
'accounts' => 'array',
'accounts.*' => 'array',
'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'],
'accounts.*.current_amount' => ['numeric', 'nullable', new IsValidZeroOrMoreAmount(true), new IsEnoughInAccounts($piggyBank, $this->getAll())],
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
'object_group_id' => ['numeric', 'belongsToUser:object_groups,id'],
'object_group_title' => ['min:1', 'max:255'],
'transaction_currency_id' => 'exists:transaction_currencies,id|nullable',
'transaction_currency_code' => 'exists:transaction_currencies,code|nullable',
'transaction_currency_id' => ['exists:transaction_currencies,id', 'nullable'],
'transaction_currency_code' => ['exists:transaction_currencies,code', 'nullable'],
];
}
}

View File

@@ -78,40 +78,40 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'type' => 'required|in:withdrawal,transfer,deposit',
'title' => 'required|min:1|max:255|uniqueObjectForUser:recurrences,title',
'description' => 'min:1|max:32768',
'first_date' => 'required|date',
'type' => ['required', 'in:withdrawal,transfer,deposit'],
'title' => ['required', 'min:1', 'max:255', 'uniqueObjectForUser:recurrences,title'],
'description' => ['min:1', 'max:32768'],
'first_date' => ['required', 'date'],
'apply_rules' => [new IsBoolean()],
'active' => [new IsBoolean()],
'repeat_until' => 'nullable|date',
'nr_of_repetitions' => 'nullable|numeric|min:1|max:31',
'repeat_until' => ['nullable', 'date'],
'nr_of_repetitions' => ['nullable', 'numeric', 'min:1', 'max:255'],
'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly',
'repetitions.*.moment' => 'min:0|max:10',
'repetitions.*.skip' => 'nullable|numeric|min:0|max:31',
'repetitions.*.weekend' => 'numeric|min:1|max:4',
'repetitions.*.type' => ['required', 'in:daily,weekly,ndom,monthly,yearly'],
'repetitions.*.moment' => ['min:0', 'max:10'],
'repetitions.*.skip' => ['nullable', 'numeric', 'min:0', 'max:31'],
'repetitions.*.weekend' => ['numeric', 'min:1', 'max:4'],
'transactions.*.description' => 'required|min:1|max:255',
'transactions.*.description' => ['required', 'min:1', 'max:255'],
'transactions.*.amount' => ['required', new IsValidPositiveAmount()],
'transactions.*.foreign_amount' => ['nullable', new IsValidPositiveAmount()],
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
'transactions.*.currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
'transactions.*.currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
'transactions.*.currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
'transactions.*.foreign_currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
'transactions.*.foreign_currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.source_name' => 'min:1|max:255|nullable',
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.destination_name' => 'min:1|max:255|nullable',
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
// new and updated fields:
'transactions.*.budget_id' => ['nullable', 'mustExist:budgets,id', new BelongsUser()],
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.category_id' => ['nullable', 'mustExist:categories,id', new BelongsUser()],
'transactions.*.category_name' => 'min:1|max:255|nullable',
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.piggy_bank_id' => ['nullable', 'numeric', 'mustExist:piggy_banks,id', new BelongsUser()],
'transactions.*.piggy_bank_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.tags' => 'nullable|min:1|max:255',
'transactions.*.tags' => ['nullable', 'min:1', 'max:255'],
];
}

View File

@@ -89,38 +89,38 @@ class UpdateRequest extends FormRequest
return [
'title' => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id),
'description' => 'min:1|max:32768',
'first_date' => 'date|after:1970-01-02|before:2038-01-17',
'description' => ['min:1', 'max:32768'],
'first_date' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'apply_rules' => [new IsBoolean()],
'active' => [new IsBoolean()],
'repeat_until' => 'nullable|date',
'nr_of_repetitions' => 'nullable|numeric|min:1|max:31',
'repeat_until' => ['nullable', 'date'],
'nr_of_repetitions' => ['nullable', 'numeric', 'min:1', 'max:255'],
'repetitions.*.type' => 'in:daily,weekly,ndom,monthly,yearly',
'repetitions.*.moment' => 'min:0|max:10|numeric',
'repetitions.*.skip' => 'nullable|numeric|min:0|max:31',
'repetitions.*.weekend' => 'nullable|numeric|min:1|max:4',
'repetitions.*.moment' => ['min:0', 'max:10', 'numeric'],
'repetitions.*.skip' => ['nullable', 'numeric', 'min:0', 'max:31'],
'repetitions.*.weekend' => ['nullable', 'numeric', 'min:1', 'max:4'],
'transactions.*.description' => ['min:1', 'max:255'],
'transactions.*.amount' => [new IsValidPositiveAmount()],
'transactions.*.foreign_amount' => ['nullable', new IsValidPositiveAmount()],
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
'transactions.*.currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
'transactions.*.currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
'transactions.*.currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
'transactions.*.foreign_currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
'transactions.*.foreign_currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.source_name' => 'min:1|max:255|nullable',
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.destination_name' => 'min:1|max:255|nullable',
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
// new and updated fields:
'transactions.*.budget_id' => ['nullable', 'mustExist:budgets,id', new BelongsUser()],
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.category_id' => ['nullable', 'mustExist:categories,id', new BelongsUser()],
'transactions.*.category_name' => 'min:1|max:255|nullable',
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.piggy_bank_id' => ['nullable', 'numeric', 'mustExist:piggy_banks,id', new BelongsUser()],
'transactions.*.piggy_bank_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.tags' => 'nullable|min:1|max:255',
'transactions.*.tags' => ['nullable', 'min:1', 'max:255'],
];
}

View File

@@ -80,11 +80,11 @@ class StoreRequest extends FormRequest
$contextActions = implode(',', config('firefly.context-rule-actions'));
return [
'title' => 'required|min:1|max:100|uniqueObjectForUser:rules,title',
'description' => 'min:1|max:32768|nullable',
'rule_group_id' => 'belongsToUser:rule_groups|required_without:rule_group_title',
'rule_group_title' => 'nullable|min:1|max:255|required_without:rule_group_id|belongsToUser:rule_groups,title',
'trigger' => 'required|in:store-journal,update-journal,manual-activation',
'title' => ['required', 'min:1', 'max:100', 'uniqueObjectForUser:rules,title'],
'description' => ['min:1', 'max:32768', 'nullable'],
'rule_group_id' => ['belongsToUser:rule_groups', 'required_without:rule_group_title'],
'rule_group_title' => ['nullable', 'min:1', 'max:255', 'required_without:rule_group_id', 'belongsToUser:rule_groups,title'],
'trigger' => ['required', 'in:store-journal,update-journal,manual-activation'],
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024',
'triggers.*.stop_processing' => [new IsBoolean()],

View File

@@ -47,10 +47,10 @@ class TestRequest extends FormRequest
public function rules(): array
{
return [
'start' => 'date|after:1970-01-02|before:2038-01-17',
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
'accounts' => '',
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
'accounts.*' => ['required', 'exists:accounts,id', 'belongsToUser:accounts'],
];
}

View File

@@ -47,10 +47,10 @@ class TriggerRequest extends FormRequest
public function rules(): array
{
return [
'start' => 'date|after:1970-01-02|before:2038-01-17',
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
'accounts' => '',
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
'accounts.*' => ['exists:accounts,id', 'belongsToUser:accounts'],
];
}

View File

@@ -91,9 +91,9 @@ class UpdateRequest extends FormRequest
return [
'title' => sprintf('min:1|max:100|uniqueObjectForUser:rules,title,%d', $rule->id),
'description' => 'min:1|max:32768|nullable',
'description' => ['min:1', 'max:32768', 'nullable'],
'rule_group_id' => 'belongsToUser:rule_groups',
'rule_group_title' => 'nullable|min:1|max:255|belongsToUser:rule_groups,title',
'rule_group_title' => ['nullable', 'min:1', 'max:255', 'belongsToUser:rule_groups,title'],
'trigger' => 'in:store-journal,update-journal,manual-activation',
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024',
@@ -106,7 +106,7 @@ class UpdateRequest extends FormRequest
'strict' => [new IsBoolean()],
'stop_processing' => [new IsBoolean()],
'active' => [new IsBoolean()],
'order' => 'numeric|min:1|max:2048',
'order' => ['numeric', 'min:1', 'max:2048'],
];
}

View File

@@ -67,8 +67,8 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'title' => 'required|min:1|max:100|uniqueObjectForUser:rule_groups,title',
'description' => 'min:1|max:32768|nullable',
'title' => ['required', 'min:1', 'max:100', 'uniqueObjectForUser:rule_groups,title'],
'description' => ['min:1', 'max:32768', 'nullable'],
'active' => [new IsBoolean()],
];
}

View File

@@ -47,10 +47,10 @@ class TestRequest extends FormRequest
public function rules(): array
{
return [
'start' => 'date|after:1970-01-02|before:2038-01-17',
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
'accounts' => '',
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
'accounts.*' => ['exists:accounts,id', 'belongsToUser:accounts'],
];
}

View File

@@ -46,7 +46,10 @@ class TriggerRequest extends FormRequest
public function rules(): array
{
return ['start' => 'date|after:1970-01-02|before:2038-01-17', 'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17'];
return [
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
];
}
private function getAccounts(): array

View File

@@ -66,7 +66,7 @@ class UpdateRequest extends FormRequest
return [
'title' => 'min:1|max:100|uniqueObjectForUser:rule_groups,title,'.$ruleGroup->id,
'description' => 'min:1|max:32768|nullable',
'description' => ['min:1', 'max:32768', 'nullable'],
'active' => [new IsBoolean()],
];
}

View File

@@ -62,9 +62,9 @@ class StoreRequest extends FormRequest
public function rules(): array
{
$rules = [
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
'description' => 'min:1|nullable|max:32768',
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'tag' => ['required', 'min:1', 'uniqueObjectForUser:tags,tag', 'max:1024'],
'description' => ['min:1', 'nullable', 'max:32768'],
'date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
];
return Location::requestRules($rules);

View File

@@ -63,8 +63,8 @@ class UpdateRequest extends FormRequest
$tag = $this->route()->parameter('tagOrId');
$rules = [
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id,
'description' => 'min:1|nullable|max:32768',
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'description' => ['min:1', 'nullable', 'max:32768'],
'date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
];
return Location::requestRules($rules);

View File

@@ -30,7 +30,7 @@ use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\IsDateOrTime;
use FireflyIII\Rules\IsValidPositiveAmount;
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\NullArrayObject;
use FireflyIII\Support\Request\AppendsLocationData;
use FireflyIII\Support\Request\ChecksLogin;
@@ -81,12 +81,12 @@ class StoreRequest extends FormRequest
public function rules(): array
{
Log::debug('Collect rules of TransactionStoreRequest');
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
$locationRules = Location::requestRules([]);
return [
// basic fields for group:
'group_title' => 'min:1|max:1000|nullable',
'group_title' => ['min:1', 'max:1000', 'nullable'],
'error_if_duplicate_hash' => [new IsBoolean()],
'fire_webhooks' => [new IsBoolean()],
'apply_rules' => [new IsBoolean()],
@@ -97,42 +97,42 @@ class StoreRequest extends FormRequest
'transactions.*.zoom_level' => $locationRules['zoom_level'],
// transaction rules (in array for splits):
'transactions.*.type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
'transactions.*.type' => ['required', 'in:withdrawal,deposit,transfer,opening-balance,reconciliation'],
'transactions.*.date' => ['required', new IsDateOrTime()],
'transactions.*.order' => 'numeric|min:0',
'transactions.*.order' => ['numeric', 'min:0'],
// currency info
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
'transactions.*.currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
'transactions.*.foreign_currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
'transactions.*.currency_id' => ['numeric', 'exists:transaction_currencies,id', 'nullable'],
'transactions.*.currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code', 'nullable'],
'transactions.*.foreign_currency_id' => ['numeric', 'exists:transaction_currencies,id', 'nullable'],
'transactions.*.foreign_currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code', 'nullable'],
// amount
'transactions.*.amount' => ['required', new IsValidPositiveAmount()],
'transactions.*.foreign_amount' => ['nullable', new IsValidZeroOrMoreAmount()],
// description
'transactions.*.description' => 'nullable|min:1|max:1000',
'transactions.*.description' => ['nullable', 'min:1', 'max:1000'],
// source of transaction
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.source_name' => 'min:1|max:255|nullable',
'transactions.*.source_iban' => 'min:1|max:255|nullable|iban',
'transactions.*.source_number' => 'min:1|max:255|nullable',
'transactions.*.source_bic' => 'min:1|max:255|nullable|bic',
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.source_iban' => ['min:1', 'max:255', 'nullable', 'iban'],
'transactions.*.source_number' => ['min:1', 'max:255', 'nullable'],
'transactions.*.source_bic' => ['min:1', 'max:255', 'nullable', 'bic'],
// destination of transaction
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.destination_name' => 'min:1|max:255|nullable',
'transactions.*.destination_iban' => 'min:1|max:255|nullable|iban',
'transactions.*.destination_number' => 'min:1|max:255|nullable',
'transactions.*.destination_bic' => 'min:1|max:255|nullable|bic',
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.destination_iban' => ['min:1', 'max:255', 'nullable', 'iban'],
'transactions.*.destination_number' => ['min:1', 'max:255', 'nullable'],
'transactions.*.destination_bic' => ['min:1', 'max:255', 'nullable', 'bic'],
// budget, category, bill and piggy
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser()],
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser(), 'nullable'],
'transactions.*.category_name' => 'min:1|max:255|nullable',
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser()],
'transactions.*.bill_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser()],
@@ -140,34 +140,34 @@ class StoreRequest extends FormRequest
// other interesting fields
'transactions.*.reconciled' => [new IsBoolean()],
'transactions.*.notes' => 'min:1|max:32768|nullable',
'transactions.*.tags' => 'min:0|max:255',
'transactions.*.tags.*' => 'min:0|max:255',
'transactions.*.notes' => ['min:1', 'max:32768', 'nullable'],
'transactions.*.tags' => ['min:0', 'max:255'],
'transactions.*.tags.*' => ['min:0', 'max:255'],
// meta info fields
'transactions.*.internal_reference' => 'min:1|max:255|nullable',
'transactions.*.external_id' => 'min:1|max:255|nullable',
'transactions.*.recurrence_id' => 'min:1|max:255|nullable',
'transactions.*.bunq_payment_id' => 'min:1|max:255|nullable',
'transactions.*.internal_reference' => ['min:1', 'max:255', 'nullable'],
'transactions.*.external_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.recurrence_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.bunq_payment_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.external_url' => sprintf('min:1|max:255|nullable|url:%s', $validProtocols),
// SEPA fields:
'transactions.*.sepa_cc' => 'min:1|max:255|nullable',
'transactions.*.sepa_ct_op' => 'min:1|max:255|nullable',
'transactions.*.sepa_ct_id' => 'min:1|max:255|nullable',
'transactions.*.sepa_db' => 'min:1|max:255|nullable',
'transactions.*.sepa_country' => 'min:1|max:255|nullable',
'transactions.*.sepa_ep' => 'min:1|max:255|nullable',
'transactions.*.sepa_ci' => 'min:1|max:255|nullable',
'transactions.*.sepa_batch_id' => 'min:1|max:255|nullable',
'transactions.*.sepa_cc' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ct_op' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ct_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_db' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_country' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ep' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ci' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_batch_id' => ['min:1', 'max:255', 'nullable'],
// dates
'transactions.*.interest_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.book_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.process_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.due_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.payment_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.invoice_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.interest_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.book_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.process_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.due_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.payment_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.invoice_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
];
}

View File

@@ -31,7 +31,7 @@ use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\IsDateOrTime;
use FireflyIII\Rules\IsValidPositiveAmount;
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Validation\GroupValidation;
@@ -141,80 +141,80 @@ class UpdateRequest extends FormRequest
public function rules(): array
{
Log::debug(sprintf('Now in %s', __METHOD__));
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
return [
// basic fields for group:
'group_title' => 'min:1|max:1000|nullable',
'group_title' => ['min:1', 'max:1000', 'nullable'],
'apply_rules' => [new IsBoolean()],
// transaction rules (in array for splits):
'transactions.*.type' => 'in:withdrawal,deposit,transfer,opening-balance,reconciliation',
'transactions.*.date' => [new IsDateOrTime()],
'transactions.*.order' => 'numeric|min:0',
'transactions.*.order' => ['numeric', 'min:0'],
// group id:
'transactions.*.transaction_journal_id' => ['nullable', 'numeric', new BelongsUser()],
// currency info
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
'transactions.*.currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
'transactions.*.currency_id' => ['numeric', 'exists:transaction_currencies,id', 'nullable'],
'transactions.*.currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code', 'nullable'],
'transactions.*.foreign_currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
'transactions.*.foreign_currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
// amount
'transactions.*.amount' => [new IsValidPositiveAmount()],
'transactions.*.foreign_amount' => ['nullable', new IsValidZeroOrMoreAmount()],
// description
'transactions.*.description' => 'nullable|min:1|max:1000',
'transactions.*.description' => ['nullable', 'min:1', 'max:1000'],
// source of transaction
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.source_name' => 'min:1|max:255|nullable',
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
// destination of transaction
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
'transactions.*.destination_name' => 'min:1|max:255|nullable',
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
// budget, category, bill and piggy
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser(), 'nullable'],
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser(), 'nullable'],
'transactions.*.category_name' => 'min:1|max:255|nullable',
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
'transactions.*.bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser()],
'transactions.*.bill_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
// other interesting fields
'transactions.*.reconciled' => [new IsBoolean()],
'transactions.*.notes' => 'min:1|max:32768|nullable',
'transactions.*.tags' => 'min:0|max:255|nullable',
'transactions.*.tags.*' => 'min:0|max:255',
'transactions.*.notes' => ['min:1', 'max:32768', 'nullable'],
'transactions.*.tags' => ['min:0', 'max:255', 'nullable'],
'transactions.*.tags.*' => ['min:0', 'max:255'],
// meta info fields
'transactions.*.internal_reference' => 'min:1|max:255|nullable',
'transactions.*.external_id' => 'min:1|max:255|nullable',
'transactions.*.recurrence_id' => 'min:1|max:255|nullable',
'transactions.*.bunq_payment_id' => 'min:1|max:255|nullable',
'transactions.*.internal_reference' => ['min:1', 'max:255', 'nullable'],
'transactions.*.external_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.recurrence_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.bunq_payment_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.external_url' => sprintf('min:1|max:255|nullable|url:%s', $validProtocols),
// SEPA fields:
'transactions.*.sepa_cc' => 'min:1|max:255|nullable',
'transactions.*.sepa_ct_op' => 'min:1|max:255|nullable',
'transactions.*.sepa_ct_id' => 'min:1|max:255|nullable',
'transactions.*.sepa_db' => 'min:1|max:255|nullable',
'transactions.*.sepa_country' => 'min:1|max:255|nullable',
'transactions.*.sepa_ep' => 'min:1|max:255|nullable',
'transactions.*.sepa_ci' => 'min:1|max:255|nullable',
'transactions.*.sepa_batch_id' => 'min:1|max:255|nullable',
'transactions.*.sepa_cc' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ct_op' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ct_id' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_db' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_country' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ep' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_ci' => ['min:1', 'max:255', 'nullable'],
'transactions.*.sepa_batch_id' => ['min:1', 'max:255', 'nullable'],
// dates
'transactions.*.interest_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.book_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.process_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.due_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.payment_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.invoice_date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
'transactions.*.interest_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.book_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.process_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.due_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.payment_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
'transactions.*.invoice_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
];
}

View File

@@ -69,10 +69,10 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'name' => 'required|min:1|max:255|unique:transaction_currencies,name',
'code' => 'required|min:3|max:32|unique:transaction_currencies,code',
'symbol' => 'required|min:1|max:32|unique:transaction_currencies,symbol',
'decimal_places' => 'numeric|min:0|max:12',
'name' => ['required', 'min:1', 'max:255', 'unique:transaction_currencies,name'],
'code' => ['required', 'min:3', 'max:32', 'unique:transaction_currencies,code'],
'symbol' => ['required', 'min:1', 'max:32', 'unique:transaction_currencies,symbol'],
'decimal_places' => ['numeric', 'min:0', 'max:12'],
'enabled' => [new IsBoolean()],
'default' => [new IsBoolean()],
];

View File

@@ -82,7 +82,7 @@ class UpdateRequest extends FormRequest
'name' => sprintf('min:1|max:255|unique:transaction_currencies,name,%d', $currency->id),
'code' => sprintf('min:3|max:32|unique:transaction_currencies,code,%d', $currency->id),
'symbol' => sprintf('min:1|max:32|unique:transaction_currencies,symbol,%d', $currency->id),
'decimal_places' => 'numeric|min:0|max:12',
'decimal_places' => ['numeric', 'min:0', 'max:12'],
'enabled' => [new IsBoolean()],
'default' => [new IsBoolean()],
];

View File

@@ -63,11 +63,11 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'link_type_id' => 'exists:link_types,id|required_without:link_type_name',
'link_type_name' => 'exists:link_types,name|required_without:link_type_id',
'inward_id' => 'required|belongsToUser:transaction_journals,id|different:outward_id',
'outward_id' => 'required|belongsToUser:transaction_journals,id|different:inward_id',
'notes' => 'min:1|max:32768|nullable',
'link_type_id' => ['exists:link_types,id', 'required_without:link_type_name'],
'link_type_name' => ['exists:link_types,name', 'required_without:link_type_id'],
'inward_id' => ['required', 'belongsToUser:transaction_journals,id', 'different:outward_id'],
'outward_id' => ['required', 'belongsToUser:transaction_journals,id', 'different:inward_id'],
'notes' => ['min:1', 'max:32768', 'nullable'],
];
}

View File

@@ -65,9 +65,9 @@ class UpdateRequest extends FormRequest
return [
'link_type_id' => 'exists:link_types,id',
'link_type_name' => 'exists:link_types,name',
'inward_id' => 'belongsToUser:transaction_journals,id|different:outward_id',
'outward_id' => 'belongsToUser:transaction_journals,id|different:inward_id',
'notes' => 'min:1|max:32768|nullable',
'inward_id' => ['belongsToUser:transaction_journals,id', 'different:outward_id'],
'outward_id' => ['belongsToUser:transaction_journals,id', 'different:inward_id'],
'notes' => ['min:1', 'max:32768', 'nullable'],
];
}

View File

@@ -52,9 +52,9 @@ class StoreRequest extends FormRequest
public function rules(): array
{
return [
'name' => 'required|unique:link_types,name|min:1|max:1024',
'outward' => 'required|unique:link_types,outward|min:1|different:inward|max:1024',
'inward' => 'required|unique:link_types,inward|min:1|different:outward|max:1024',
'name' => ['required', 'unique:link_types,name', 'min:1', 'max:1024'],
'outward' => ['required', 'unique:link_types,outward', 'min:1', 'different:inward', 'max:1024'],
'inward' => ['required', 'unique:link_types,inward', 'min:1', 'different:outward', 'max:1024'],
];
}
}

View File

@@ -28,7 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Webhook;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\Webhook\IsValidWebhookUrl;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\ValidatesWebhooks;
@@ -72,19 +72,19 @@ class CreateRequest extends FormRequest
$triggers = implode(',', array_values(Webhook::getTriggers()));
$responses = implode(',', array_values(Webhook::getResponses()));
$deliveries = implode(',', array_values(Webhook::getDeliveries()));
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
return [
'title' => 'required|min:1|max:255|uniqueObjectForUser:webhooks,title',
'title' => ['required', 'min:1', 'max:255', 'uniqueObjectForUser:webhooks,title'],
'active' => [new IsBoolean()],
'trigger' => 'prohibited',
'triggers' => 'required|array|min:1|max:10',
'triggers' => ['required', 'array', 'min:1', 'max:10'],
'triggers.*' => sprintf('required|in:%s', $triggers),
'response' => 'prohibited',
'responses' => 'required|array|min:1|max:1',
'responses' => ['required', 'array', 'min:1', 'max:1'],
'responses.*' => sprintf('required|in:%s', $responses),
'delivery' => 'prohibited',
'deliveries' => 'required|array|min:1|max:1',
'deliveries' => ['required', 'array', 'min:1', 'max:1'],
'deliveries.*' => sprintf('required|in:%s', $deliveries),
'url' => ['required', sprintf('url:%s', $validProtocols), new IsValidWebhookUrl()],
];

View File

@@ -28,7 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Webhook;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\Webhook\IsValidWebhookUrl;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\ValidatesWebhooks;
@@ -73,7 +73,7 @@ class UpdateRequest extends FormRequest
$triggers = implode(',', array_values(Webhook::getTriggers()));
$responses = implode(',', array_values(Webhook::getResponses()));
$deliveries = implode(',', array_values(Webhook::getDeliveries()));
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
/** @var Webhook $webhook */
$webhook = $this->route()->parameter('webhook');
@@ -82,13 +82,13 @@ class UpdateRequest extends FormRequest
'title' => sprintf('min:1|max:255|uniqueObjectForUser:webhooks,title,%d', $webhook->id),
'active' => [new IsBoolean()],
'trigger' => 'prohibited',
'triggers' => 'required|array|min:1|max:10',
'triggers' => ['required', 'array', 'min:1', 'max:10'],
'triggers.*' => sprintf('required|in:%s', $triggers),
'response' => 'prohibited',
'responses' => 'required|array|min:1|max:1',
'responses' => ['required', 'array', 'min:1', 'max:1'],
'responses.*' => sprintf('required|in:%s', $responses),
'delivery' => 'prohibited',
'deliveries' => 'required|array|min:1|max:1',
'deliveries' => ['required', 'array', 'min:1', 'max:1'],
'deliveries.*' => sprintf('required|in:%s', $deliveries),
'url' => [sprintf('url:%s', $validProtocols), sprintf('uniqueExistingWebhook:%d', $webhook->id), new IsValidWebhookUrl()],
];

View File

@@ -50,8 +50,8 @@ class PaginationRequest extends ApiRequest
{
return [
'sort' => ['nullable', new IsValidSortInstruction((string) $this->sortClass)],
'limit' => 'numeric|min:1|max:131337',
'page' => 'numeric|min:1|max:131337',
'limit' => ['numeric', 'min:1', 'max:131337'],
'page' => ['numeric', 'min:1', 'max:131337'],
];
}

View File

@@ -34,10 +34,10 @@ class CountRequest extends AggregateFormRequest
public function rules(): array
{
return [
'notes' => 'string|min:1|max:255',
'external_identifier' => 'string|min:1|max:255',
'description' => 'string|min:1|max:255',
'internal_reference' => 'string|min:1|max:255',
'notes' => ['string', 'min:1', 'max:255'],
'external_identifier' => ['string', 'min:1', 'max:255'],
'description' => ['string', 'min:1', 'max:255'],
'internal_reference' => ['string', 'min:1', 'max:255'],
'include_deleted' => new IsBoolean(),
];
}

View File

@@ -68,6 +68,6 @@ class CronRequest extends FormRequest
*/
public function rules(): array
{
return ['force' => 'in:true,false', 'date' => 'nullable|date|after:1970-01-02|before:2038-01-17'];
return ['force' => 'in:true,false', 'date' => ['nullable', 'date', 'after:1970-01-02', 'before:2038-01-17']];
}
}

View File

@@ -77,10 +77,10 @@ class UpdateRequest extends FormRequest
return ['value' => ['required', new IsBoolean()]];
}
if ('configuration.permission_update_check' === $name) {
return ['value' => 'required|numeric|min:-1|max:1'];
return ['value' => ['required', 'numeric', 'min:-1', 'max:1']];
}
if (in_array($name, $this->integers, strict: true)) {
return ['value' => 'required|numeric|min:464272080'];
return ['value' => ['required', 'numeric', 'min:464272080']];
}
return ['value' => 'required'];

View File

@@ -71,7 +71,7 @@ class UserStoreRequest extends FormRequest
public function rules(): array
{
return [
'email' => 'required|email|unique:users,email',
'email' => ['required', 'email', 'unique:users,email'],
'blocked' => [new IsBoolean()],
'blocked_code' => 'in:email_changed',
'role' => 'in:owner,demo',

View File

@@ -52,15 +52,15 @@ class ClearsEmptyForeignAmounts extends Command
public function handle(): int
{
// transaction: has no amount, but reference to currency.
$count = Transaction::whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->count();
$count = Transaction::query()->whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->count();
if ($count > 0) {
Transaction::whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->update(['foreign_currency_id' => null]);
Transaction::query()->whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->update(['foreign_currency_id' => null]);
$this->friendlyInfo(sprintf('Corrected %d invalid foreign amount reference(s)', $count));
}
// transaction: has amount, but no currency.
$count = Transaction::whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->count();
$count = Transaction::query()->whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->count();
if ($count > 0) {
Transaction::whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->update(['foreign_amount' => null]);
Transaction::query()->whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->update(['foreign_amount' => null]);
$this->friendlyInfo(sprintf('Corrected %d invalid foreign amount reference(s)', $count));
}

View File

@@ -26,7 +26,7 @@ namespace FireflyIII\Console\Commands\Correction;
use Carbon\Carbon;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\QueryException;
@@ -58,7 +58,7 @@ class ConvertsDatesToUTC extends Command
$this->ConvertModeltoUTC($model, $fields);
}
// tell the system we are now in UTC mode.
FireflyConfig::set('utc', true);
AppConfiguration::set('utc', true);
return Command::SUCCESS;
}

View File

@@ -88,7 +88,7 @@ class CorrectsAmounts extends Command
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
$type = TransactionType::where('type', TransactionTypeEnum::TRANSFER->value)->first();
$type = TransactionType::query()->where('type', TransactionTypeEnum::TRANSFER->value)->first();
$journals = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->whereNotNull('transactions.foreign_amount')
->where('transaction_journals.transaction_type_id', $type->id)
@@ -188,7 +188,10 @@ class CorrectsAmounts extends Command
private function fixAutoBudgets(): void
{
$count = AutoBudget::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
$count = AutoBudget::query()
->where('amount', '<', 0)
->update(['amount' => DB::raw('amount * -1')])
;
if (0 === $count) {
return;
}
@@ -197,7 +200,10 @@ class CorrectsAmounts extends Command
private function fixAvailableBudgets(): void
{
$count = AvailableBudget::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
$count = AvailableBudget::query()
->where('amount', '<', 0)
->update(['amount' => DB::raw('amount * -1')])
;
if (0 === $count) {
return;
}
@@ -207,8 +213,14 @@ class CorrectsAmounts extends Command
private function fixBills(): void
{
$count = 0;
$count += Bill::where('amount_max', '<', 0)->update(['amount_max' => DB::raw('amount_max * -1')]);
$count += Bill::where('amount_min', '<', 0)->update(['amount_min' => DB::raw('amount_min * -1')]);
$count += Bill::query()
->where('amount_max', '<', 0)
->update(['amount_max' => DB::raw('amount_max * -1')])
;
$count += Bill::query()
->where('amount_min', '<', 0)
->update(['amount_min' => DB::raw('amount_min * -1')])
;
if (0 === $count) {
return;
}
@@ -217,7 +229,10 @@ class CorrectsAmounts extends Command
private function fixBudgetLimits(): void
{
$count = BudgetLimit::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
$count = BudgetLimit::query()
->where('amount', '<', 0)
->update(['amount' => DB::raw('amount * -1')])
;
if (0 === $count) {
return;
}
@@ -226,7 +241,10 @@ class CorrectsAmounts extends Command
private function fixExchangeRates(): void
{
$count = CurrencyExchangeRate::where('rate', '<', 0)->update(['rate' => DB::raw('rate * -1')]);
$count = CurrencyExchangeRate::query()
->where('rate', '<', 0)
->update(['rate' => DB::raw('rate * -1')])
;
if (0 === $count) {
return;
}
@@ -235,7 +253,10 @@ class CorrectsAmounts extends Command
private function fixPiggyBanks(): void
{
$count = PiggyBank::where('target_amount', '<', 0)->update(['target_amount' => DB::raw('target_amount * -1')]);
$count = PiggyBank::query()
->where('target_amount', '<', 0)
->update(['target_amount' => DB::raw('target_amount * -1')])
;
if (0 === $count) {
return;
}
@@ -245,8 +266,14 @@ class CorrectsAmounts extends Command
private function fixRecurrences(): void
{
$count = 0;
$count += RecurrenceTransaction::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
$count += RecurrenceTransaction::where('foreign_amount', '<', 0)->update(['foreign_amount' => DB::raw('foreign_amount * -1')]);
$count += RecurrenceTransaction::query()
->where('amount', '<', 0)
->update(['amount' => DB::raw('amount * -1')])
;
$count += RecurrenceTransaction::query()
->where('foreign_amount', '<', 0)
->update(['foreign_amount' => DB::raw('foreign_amount * -1')])
;
if (0 === $count) {
return;
}
@@ -285,7 +312,7 @@ class CorrectsAmounts extends Command
*/
private function fixRuleTriggers(): void
{
$set = RuleTrigger::whereIn('trigger_type', ['amount_less', 'amount_more', 'amount_is'])->get();
$set = RuleTrigger::query()->whereIn('trigger_type', ['amount_less', 'amount_more', 'amount_is'])->get();
$fixed = 0;
/** @var RuleTrigger $item */

View File

@@ -81,7 +81,7 @@ class CorrectsCurrencies extends Command
}
// get all from journals:
$journals = TransactionJournal::where('user_group_id', $userGroup->id)->groupBy('transaction_currency_id')->get(['transaction_currency_id']);
$journals = TransactionJournal::query()->where('user_group_id', $userGroup->id)->groupBy('transaction_currency_id')->get(['transaction_currency_id']);
foreach ($journals as $entry) {
$found[] = (int) $entry->transaction_currency_id;
}

View File

@@ -49,7 +49,10 @@ class CorrectsGroupAccounts extends Command
{
Log::debug('Start of correction:group-accounts');
$groups = [];
$res = TransactionJournal::groupBy('transaction_group_id')->get(['transaction_group_id', DB::raw('COUNT(transaction_group_id) as the_count')]);
$res = TransactionJournal::query()->groupBy('transaction_group_id')->get([
'transaction_group_id',
DB::raw('COUNT(transaction_group_id) as the_count'),
]);
/** @var TransactionJournal $journal */
foreach ($res as $journal) {

View File

@@ -44,7 +44,7 @@ class CorrectsIbans extends Command
*/
public function handle(): int
{
$accounts = Account::with('accountMeta')->get();
$accounts = Account::query()->with('accountMeta')->get();
$this->filterIbans($accounts);
$this->countAndCorrectIbans($accounts);

View File

@@ -53,7 +53,7 @@ class CorrectsInvertedBudgetLimits extends Command
*/
public function handle(): int
{
$set = BudgetLimit::where('start_date', '>', DB::raw('end_date'))->get();
$set = BudgetLimit::query()->where('start_date', '>', DB::raw('end_date'))->get();
if (0 === $set->count()) {
Log::debug('No inverted budget limits found.');

View File

@@ -44,7 +44,7 @@ class CorrectsLongDescriptions extends Command
*/
public function handle(): int
{
$journals = TransactionJournal::where(DB::raw('LENGTH(description)'), '>', self::MAX_LENGTH)->get(['id', 'description']);
$journals = TransactionJournal::query()->where(DB::raw('LENGTH(description)'), '>', self::MAX_LENGTH)->get(['id', 'description']);
$count = 0;
/** @var TransactionJournal $journal */
@@ -57,7 +57,7 @@ class CorrectsLongDescriptions extends Command
}
}
$groups = TransactionGroup::where(DB::raw('LENGTH(title)'), '>', self::MAX_LENGTH)->get(['id', 'title']);
$groups = TransactionGroup::query()->where(DB::raw('LENGTH(title)'), '>', self::MAX_LENGTH)->get(['id', 'title']);
/** @var TransactionGroup $group */
foreach ($groups as $group) {

View File

@@ -42,7 +42,7 @@ class CorrectsPiggyBanks extends Command
public function handle(): int
{
$count = 0;
$set = PiggyBankEvent::with(['PiggyBank', 'TransactionJournal'])->get();
$set = PiggyBankEvent::query()->with(['PiggyBank', 'TransactionJournal'])->get();
/** @var PiggyBankEvent $event */
foreach ($set as $event) {

View File

@@ -47,7 +47,7 @@ class CorrectsPreferences extends Command
foreach ($users as $user) {
$count = 0;
foreach ($items as $item) {
$preference = Preference::where('name', $item)->where('user_id', $user->id)->first();
$preference = Preference::query()->where('name', $item)->where('user_id', $user->id)->first();
if (null === $preference) {
continue;
}

View File

@@ -26,7 +26,7 @@ namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Services\Internal\Recalculate\PrimaryAmountRecalculationService;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
@@ -43,7 +43,7 @@ class CorrectsPrimaryCurrencyAmounts extends Command
*/
public function handle(): int
{
if (false === FireflyConfig::get('enable_exchange_rates', config('cer.enabled'))->data) {
if (false === AppConfiguration::get('enable_exchange_rates', config('cer.enabled'))->data) {
$this->friendlyInfo('This command will not run because currency exchange rates are disabled.');
return 0;

View File

@@ -36,7 +36,7 @@ use FireflyIII\Models\PiggyBankRepetition;
use FireflyIII\Models\Recurrence;
use FireflyIII\Models\Tag;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log;
@@ -71,7 +71,7 @@ class CorrectsTimezoneInformation extends Command
$this->addTimezoneToModel($model, $fields);
}
// not yet in UTC mode
FireflyConfig::set('utc', false);
AppConfiguration::set('utc', false);
}
private function addTimezoneToModel(string $model, array $fields): void

View File

@@ -81,7 +81,7 @@ class CorrectsTransactionTypes extends Command
*/
private function collectJournals(): Collection
{
return TransactionJournal::with(['transactionType', 'transactions', 'transactions.account', 'transactions.account.accountType'])->get();
return TransactionJournal::query()->with(['transactionType', 'transactions', 'transactions.account', 'transactions.account.accountType'])->get();
}
private function fixJournal(TransactionJournal $journal): bool

View File

@@ -42,7 +42,8 @@ class CorrectsTransferBudgets extends Command
*/
public function handle(): int
{
$set = TransactionJournal::distinct()
$set = TransactionJournal::query()
->distinct()
->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
->leftJoin('budget_transaction_journal', 'transaction_journals.id', '=', 'budget_transaction_journal.transaction_journal_id')
->whereNotIn('transaction_types.type', [TransactionTypeEnum::WITHDRAWAL->value])

View File

@@ -30,7 +30,7 @@ use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Models\AccountBalanceCalculator;
use Illuminate\Console\Command;
@@ -61,7 +61,7 @@ class CorrectsUnevenAmount extends Command
$this->fixUnevenAmounts();
$this->matchCurrencies();
if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
if (true === AppConfiguration::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
$this->friendlyInfo('Will recalculate transaction running balance columns. This may take a LONG time. Please be patient.');
AccountBalanceCalculator::recalculateAll(false);
$this->friendlyInfo('Done recalculating transaction running balance columns.');
@@ -76,7 +76,8 @@ class CorrectsUnevenAmount extends Command
$repository = app(AccountRepositoryInterface::class);
Log::debug('convertOldStyleTransactions()');
$count = 0;
$transactions = Transaction::distinct()
$transactions = Transaction::query()
->distinct()
->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id')
->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id')
->leftJoin('accounts', 'accounts.id', 'transactions.account_id')
@@ -188,7 +189,8 @@ class CorrectsUnevenAmount extends Command
{
Log::debug('convertOldStyleTransfers()');
// select transactions with a foreign amount and a foreign currency. and it's a transfer. and they are different.
$transactions = Transaction::distinct()
$transactions = Transaction::query()
->distinct()
->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id')
->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id')
->where('transaction_types.type', TransactionTypeEnum::TRANSFER->value)
@@ -262,8 +264,14 @@ class CorrectsUnevenAmount extends Command
$journal->id ?? 0,
$journal->description ?? ''
));
Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete();
TransactionJournal::where('id', $journal->id ?? 0)->forceDelete();
Transaction::query()
->where('transaction_journal_id', $journal->id ?? 0)
->forceDelete()
;
TransactionJournal::query()
->where('id', $journal->id ?? 0)
->forceDelete()
;
++$this->count;
return;
@@ -282,8 +290,14 @@ class CorrectsUnevenAmount extends Command
$journal->description ?? ''
));
Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete();
TransactionJournal::where('id', $journal->id ?? 0)->forceDelete();
Transaction::query()
->where('transaction_journal_id', $journal->id ?? 0)
->forceDelete()
;
TransactionJournal::query()
->where('id', $journal->id ?? 0)
->forceDelete()
;
++$this->count;
return;
@@ -430,7 +444,7 @@ class CorrectsUnevenAmount extends Command
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {
if (!$this->isForeignCurrencyTransfer($journal) && !$this->isBetweenAssetAndLiability($journal)) {
Transaction::where('transaction_journal_id', $journal->id)->update(['transaction_currency_id' => $journal->transaction_currency_id]);
Transaction::query()->where('transaction_journal_id', $journal->id)->update(['transaction_currency_id' => $journal->transaction_currency_id]);
++$count;
continue;

View File

@@ -50,17 +50,22 @@ class CreatesGroupMemberships extends Command
public static function createGroupMembership(User $user): void
{
// check if membership exists
$userGroup = UserGroup::where('title', $user->email)->first();
$userGroup = UserGroup::query()->where('title', $user->email)->first();
if (null === $userGroup) {
$userGroup = UserGroup::create(['title' => $user->email]);
}
$userRole = UserRole::where('title', UserRoleEnum::OWNER->value)->first();
$userRole = UserRole::query()->where('title', UserRoleEnum::OWNER->value)->first();
if (null === $userRole) {
throw new FireflyException('Firefly III could not find a user role. Please make sure all migrations have run.');
}
$membership = GroupMembership::where('user_id', $user->id)->where('user_group_id', $userGroup->id)->where('user_role_id', $userRole->id)->first();
$membership = GroupMembership::query()
->where('user_id', $user->id)
->where('user_group_id', $userGroup->id)
->where('user_role_id', $userRole->id)
->first()
;
if (null === $membership) {
GroupMembership::create(['user_id' => $user->id, 'user_role_id' => $userRole->id, 'user_group_id' => $userGroup->id]);
}

View File

@@ -49,7 +49,7 @@ class CreatesLinkTypes extends Command
'Reimbursement' => ['(partially) reimburses', 'is (partially) reimbursed by'],
];
foreach ($set as $name => $values) {
$link = LinkType::where('name', $name)->first();
$link = LinkType::query()->where('name', $name)->first();
if (null === $link) {
$link = new LinkType();
$link->name = $name;

View File

@@ -43,11 +43,11 @@ class RemovesBills extends Command
public function handle(): int
{
/** @var null|TransactionType $withdrawal */
$withdrawal = TransactionType::where('type', TransactionTypeEnum::WITHDRAWAL->value)->first();
$withdrawal = TransactionType::query()->where('type', TransactionTypeEnum::WITHDRAWAL->value)->first();
if (null === $withdrawal) {
return 0;
}
$journals = TransactionJournal::whereNotNull('bill_id')->where('transaction_type_id', '!=', $withdrawal->id)->get();
$journals = TransactionJournal::query()->whereNotNull('bill_id')->where('transaction_type_id', '!=', $withdrawal->id)->get();
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {

View File

@@ -57,7 +57,7 @@ class RemovesEmptyGroups extends Command
// again, chunks for SQLite.
$chunks = array_chunk($groupIds, 500);
foreach ($chunks as $chunk) {
TransactionGroup::whereNull('deleted_at')->whereIn('id', $chunk)->delete();
TransactionGroup::query()->whereNull('deleted_at')->whereIn('id', $chunk)->delete();
}
}

View File

@@ -80,10 +80,14 @@ class RemovesEmptyJournals extends Command
*/
private function deleteUnevenJournals(): void
{
$set = Transaction::whereNull('deleted_at')->groupBy('transactions.transaction_journal_id')->get([
DB::raw('COUNT(transactions.transaction_journal_id) as the_count'),
'transaction_journal_id',
]);
$set = Transaction::query()
->whereNull('deleted_at')
->groupBy('transactions.transaction_journal_id')
->get([
DB::raw('COUNT(transactions.transaction_journal_id) as the_count'),
'transaction_journal_id',
])
;
$total = 0;
/** @var Transaction $row */
@@ -100,7 +104,7 @@ class RemovesEmptyJournals extends Command
Log::error($e->getTraceAsString());
}
Transaction::where('transaction_journal_id', $row->transaction_journal_id)->delete();
Transaction::query()->where('transaction_journal_id', $row->transaction_journal_id)->delete();
$this->friendlyWarning(sprintf(
'Deleted transaction journal #%d because it had an uneven number of transactions.',
$row->transaction_journal_id

View File

@@ -57,10 +57,34 @@ class RemovesLinksToDeletedObjects extends Command
*/
public function handle(): void
{
$deletedTags = Tag::withTrashed()->whereNotNull('deleted_at')->get('tags.id')->pluck('id')->toArray();
$deletedJournals = TransactionJournal::withTrashed()->whereNotNull('deleted_at')->get('transaction_journals.id')->pluck('id')->toArray();
$deletedBudgets = Budget::withTrashed()->whereNotNull('deleted_at')->get('budgets.id')->pluck('id')->toArray();
$deletedCategories = Category::withTrashed()->whereNotNull('deleted_at')->get('categories.id')->pluck('id')->toArray();
$deletedTags = Tag::query()
->withTrashed()
->whereNotNull('deleted_at')
->get('tags.id')
->pluck('id')
->toArray()
;
$deletedJournals = TransactionJournal::query()
->withTrashed()
->whereNotNull('deleted_at')
->get('transaction_journals.id')
->pluck('id')
->toArray()
;
$deletedBudgets = Budget::query()
->withTrashed()
->whereNotNull('deleted_at')
->get('budgets.id')
->pluck('id')
->toArray()
;
$deletedCategories = Category::query()
->withTrashed()
->whereNotNull('deleted_at')
->get('categories.id')
->pluck('id')
->toArray()
;
if (count($deletedTags) > 0) {
$this->cleanupTags($deletedTags);

View File

@@ -67,7 +67,7 @@ class RemovesOrphanedTransactions extends Command
/** @var null|TransactionJournal $journal */
$journal = TransactionJournal::find($transaction->transaction_journal_id);
$journal?->delete();
Transaction::where('transaction_journal_id', $transaction->transaction_journal_id)->delete();
Transaction::query()->where('transaction_journal_id', $transaction->transaction_journal_id)->delete();
$this->friendlyWarning(sprintf(
'Deleted transaction journal #%d because account #%d was already deleted.',
$transaction->transaction_journal_id,
@@ -93,7 +93,7 @@ class RemovesOrphanedTransactions extends Command
$this->friendlyInfo(sprintf('Found %d orphaned journal(s).', $count));
foreach ($set as $entry) {
/** @var null|TransactionJournal $journal */
$journal = TransactionJournal::withTrashed()->find($entry->id);
$journal = TransactionJournal::query()->withTrashed()->find($entry->id);
if (null !== $journal) {
$journal->delete();
$this->friendlyWarning(sprintf(

View File

@@ -42,16 +42,16 @@ class RemovesZeroAmount extends Command
*/
public function handle(): int
{
$set = Transaction::where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
$set = Transaction::query()->where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
$set = array_unique($set);
$journals = TransactionJournal::whereIn('id', $set)->get();
$journals = TransactionJournal::query()->whereIn('id', $set)->get();
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {
$this->friendlyWarning(sprintf('Deleted transaction journal #%d because the amount is zero (0.00).', $journal->id));
$journal->delete();
Transaction::where('transaction_journal_id', $journal->id)->delete();
Transaction::query()->where('transaction_journal_id', $journal->id)->delete();
}
return 0;

View File

@@ -26,7 +26,7 @@ namespace FireflyIII\Console\Commands;
use FireflyIII\Events\Test\OwnerTestsNotificationChannel;
use FireflyIII\Notifications\Notifiables\OwnerNotifiable;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
class SendTestEmail extends Command
@@ -63,7 +63,7 @@ class SendTestEmail extends Command
}
/** @var int $lastNotification */
$lastNotification = FireflyConfig::get('last_test_notification', 123)->data;
$lastNotification = AppConfiguration::get('last_test_notification', 123)->data;
if ((time() - $lastNotification) < 120) {
$this->friendlyError((string) trans('firefly.test_rate_limited'));
@@ -72,7 +72,7 @@ class SendTestEmail extends Command
$owner = new OwnerNotifiable();
event(new OwnerTestsNotificationChannel('email', $owner));
FireflyConfig::set('last_test_notification', time());
AppConfiguration::set('last_test_notification', time());
return Command::SUCCESS;
}

View File

@@ -490,11 +490,14 @@ class ForcesDecimalSize extends Command
{
// select all transactions with this currency and issue.
/** @var Builder $query */
$query = Transaction::where('transaction_currency_id', $currency->id)->where(
DB::raw(sprintf('CAST(amount as %s)', $this->cast)),
$this->operator,
DB::raw(sprintf($this->regularExpression, $currency->decimal_places))
);
$query = Transaction::query()
->where('transaction_currency_id', $currency->id)
->where(
DB::raw(sprintf('CAST(amount as %s)', $this->cast)),
$this->operator,
DB::raw(sprintf($this->regularExpression, $currency->decimal_places))
)
;
$result = $query->get(['transactions.*']);
if (0 === $result->count()) {
@@ -519,11 +522,14 @@ class ForcesDecimalSize extends Command
// select all transactions with this FOREIGN currency and issue.
/** @var Builder $query */
$query = Transaction::where('foreign_currency_id', $currency->id)->where(
DB::raw(sprintf('CAST(foreign_amount as %s)', $this->cast)),
$this->operator,
DB::raw(sprintf($this->regularExpression, $currency->decimal_places))
);
$query = Transaction::query()
->where('foreign_currency_id', $currency->id)
->where(
DB::raw(sprintf('CAST(foreign_amount as %s)', $this->cast)),
$this->operator,
DB::raw(sprintf($this->regularExpression, $currency->decimal_places))
)
;
$result = $query->get();
if (0 === $result->count()) {

View File

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

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\System;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
class SetsLatestVersion extends Command
@@ -46,7 +46,7 @@ class SetsLatestVersion extends Command
return 0;
}
FireflyConfig::set('ff3_build_time', (int) config('firefly.build_time'));
AppConfiguration::set('ff3_build_time', (int) config('firefly.build_time'));
$this->friendlyInfo('Updated version.');
return 0;

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands\System;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log;
@@ -108,8 +108,8 @@ class VerifySecurityAlerts extends Command
private function removeOldAdvisory(): void
{
try {
FireflyConfig::delete('upgrade_security_message');
FireflyConfig::delete('upgrade_security_level');
AppConfiguration::delete('upgrade_security_message');
AppConfiguration::delete('upgrade_security_level');
} catch (QueryException $e) {
Log::debug(sprintf('Could not delete old security advisory, but thats OK: %s', $e->getMessage()));
}
@@ -118,8 +118,8 @@ class VerifySecurityAlerts extends Command
private function saveSecurityAdvisory(array $array): void
{
try {
FireflyConfig::set('upgrade_security_message', $array['message']);
FireflyConfig::set('upgrade_security_level', $array['level']);
AppConfiguration::set('upgrade_security_message', $array['message']);
AppConfiguration::set('upgrade_security_level', $array['level']);
} catch (QueryException $e) {
Log::debug(sprintf('Could not save new security advisory, but thats OK: %s', $e->getMessage()));
}

View File

@@ -27,7 +27,7 @@ namespace FireflyIII\Console\Commands\Tools;
use Carbon\Carbon;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequestInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
class ChecksForUpdates extends Command
@@ -57,7 +57,7 @@ class ChecksForUpdates extends Command
$version = config('firefly.version');
$this->friendlyLine(sprintf('You are running version "%s", built on %s', $version, $build->format('Y-m-d H:i')));
$permission = FireflyConfig::get('permission_update_check', -1)->data;
$permission = AppConfiguration::get('permission_update_check', -1)->data;
if (1 !== $permission && false === $this->option('force')) {
$this->friendlyWarning('Checking for updates is disabled. To overrule, use --force.');

View File

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

View File

@@ -28,7 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Facades\AppConfiguration;
use Illuminate\Console\Command;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log;
@@ -93,7 +93,8 @@ class AddsTransactionIdentifiers extends Command
try {
/** @var Transaction $opposing */
$opposing = Transaction::where('transaction_journal_id', $transaction->transaction_journal_id)
$opposing = Transaction::query()
->where('transaction_journal_id', $transaction->transaction_journal_id)
->where('amount', $amount)
->where('identifier', '=', 0)
->whereNotIn('id', $exclude)
@@ -114,14 +115,14 @@ class AddsTransactionIdentifiers extends Command
private function isExecuted(): bool
{
$configVar = FireflyConfig::get(self::CONFIG_NAME, false);
$configVar = AppConfiguration::get(self::CONFIG_NAME, false);
return (bool) $configVar?->data;
}
private function markAsExecuted(): void
{
FireflyConfig::set(self::CONFIG_NAME, true);
AppConfiguration::set(self::CONFIG_NAME, true);
}
/**

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