Compare commits

...

133 Commits

Author SHA1 Message Date
github-actions[bot]
d9ae99b5fe Merge pull request #11374 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-16 06:35:19 +01:00
github-actions[bot]
45d2d86bba Merge pull request #11373 from firefly-iii/release-1765863308
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:35:15 +01:00
JC5
e21d5e5d01 🤖 Auto commit for release 'v6.4.13' on 2025-12-16 2025-12-16 06:35:08 +01:00
github-actions[bot]
9e4bfd9d1a Merge pull request #11372 from firefly-iii/release-1765862987
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:29:55 +01:00
JC5
d61d6aa2e2 🤖 Auto commit for release 'develop' on 2025-12-16 2025-12-16 06:29:47 +01:00
github-actions[bot]
230a3a0180 Merge pull request #11371 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-16 06:25:04 +01:00
github-actions[bot]
002454b995 Merge pull request #11370 from firefly-iii/release-1765862692
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:24:59 +01:00
JC5
e6d9c2e218 🤖 Auto commit for release 'v6.4.12' on 2025-12-16 2025-12-16 06:24:52 +01:00
github-actions[bot]
eaa5054b00 Merge pull request #11369 from firefly-iii/release-1765861996
🤖 Automatically merge the PR into the develop branch.
2025-12-16 06:13:25 +01:00
JC5
4e9e63ed08 🤖 Auto commit for release 'develop' on 2025-12-16 2025-12-16 06:13:16 +01:00
James Cole
76ea5b6e34 Fix #11367 2025-12-16 06:08:38 +01:00
Sander Dorigo
2f788f7397 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop 2025-12-15 15:51:13 +01:00
Sander Dorigo
29766aa9b7 Add better running balance 2025-12-15 14:56:58 +01:00
github-actions[bot]
cc30376297 Merge pull request #11364 from firefly-iii/release-1765805210
🤖 Automatically merge the PR into the develop branch.
2025-12-15 14:26:58 +01:00
JC5
5b007fbe01 🤖 Auto commit for release 'develop' on 2025-12-15 2025-12-15 14:26:50 +01:00
Sander Dorigo
e1f8ea3b1a Fix missing user property 2025-12-15 14:19:43 +01:00
James Cole
6f019f0bb4 Merge pull request #11363 from firefly-iii/main
Merge main into develop
2025-12-15 10:48:19 +01:00
github-actions[bot]
f475947776 Merge pull request #11362 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-15 09:01:26 +01:00
github-actions[bot]
ee6901eb92 Merge pull request #11361 from firefly-iii/release-1765785673
🤖 Automatically merge the PR into the develop branch.
2025-12-15 09:01:21 +01:00
JC5
84d7523d6c 🤖 Auto commit for release 'v6.4.11' on 2025-12-15 2025-12-15 09:01:13 +01:00
github-actions[bot]
6900dc7dae Merge pull request #11360 from firefly-iii/release-1765785184
🤖 Automatically merge the PR into the develop branch.
2025-12-15 08:53:14 +01:00
JC5
6247e516c6 🤖 Auto commit for release 'develop' on 2025-12-15 2025-12-15 08:53:05 +01:00
Sander Dorigo
cdf970a88c Add changelog 2025-12-15 08:42:10 +01:00
Sander Dorigo
a447c387f9 Fix #11357 2025-12-15 08:41:07 +01:00
Sander Dorigo
ce2c94efed Fix #11356 2025-12-15 08:40:19 +01:00
James Cole
205ea4270b Merge pull request #11358 from firefly-iii/dependabot/github_actions/dessant/label-actions-5 2025-12-15 07:27:43 +01:00
github-actions[bot]
dcbb2428f2 Merge pull request #11359 from firefly-iii/release-1765769737
🤖 Automatically merge the PR into the develop branch.
2025-12-15 04:35:45 +01:00
JC5
319916fc8f 🤖 Auto commit for release 'develop' on 2025-12-15 2025-12-15 04:35:37 +01:00
dependabot[bot]
088b0e2f30 Bump dessant/label-actions from 4 to 5
Bumps [dessant/label-actions](https://github.com/dessant/label-actions) from 4 to 5.
- [Release notes](https://github.com/dessant/label-actions/releases)
- [Changelog](https://github.com/dessant/label-actions/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/label-actions/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 03:06:09 +00:00
github-actions[bot]
b45aadf8a3 Merge pull request #11355 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-14 19:13:25 +01:00
github-actions[bot]
1fafeb1515 Merge pull request #11354 from firefly-iii/release-1765735989
🤖 Automatically merge the PR into the develop branch.
2025-12-14 19:13:19 +01:00
JC5
f60c64c9c1 🤖 Auto commit for release 'v6.4.10' on 2025-12-14 2025-12-14 19:13:09 +01:00
James Cole
564dcb1c6d Expand changelog. 2025-12-14 19:09:08 +01:00
github-actions[bot]
4044bb85a9 Merge pull request #11353 from firefly-iii/release-1765725243
🤖 Automatically merge the PR into the develop branch.
2025-12-14 16:14:10 +01:00
JC5
18bb0eecff 🤖 Auto commit for release 'develop' on 2025-12-14 2025-12-14 16:14:03 +01:00
James Cole
9af95907e3 Fix patch etc. 2025-12-14 16:10:21 +01:00
James Cole
40ecba4b5a No longer need patch. 2025-12-14 10:31:35 +01:00
James Cole
73312a4ccc Fix #11310 2025-12-14 10:24:27 +01:00
James Cole
d747ac237b Validate title, fix running balance display 2025-12-13 06:36:20 +01:00
github-actions[bot]
b6c4253d76 Merge pull request #11349 from firefly-iii/release-1765602800
🤖 Automatically merge the PR into the develop branch.
2025-12-13 06:13:28 +01:00
JC5
d74d67633d 🤖 Auto commit for release 'develop' on 2025-12-13 2025-12-13 06:13:20 +01:00
James Cole
0b00f35101 Update packages, another fix for the same issue. 2025-12-13 06:08:58 +01:00
James Cole
8f81cb8cc4 Fix #11346 2025-12-13 06:05:39 +01:00
github-actions[bot]
fa665286b5 Merge pull request #11344 from firefly-iii/release-1765164810
🤖 Automatically merge the PR into the develop branch.
2025-12-08 04:33:39 +01:00
JC5
58ae0c1c9b 🤖 Auto commit for release 'develop' on 2025-12-08 2025-12-08 04:33:30 +01:00
github-actions[bot]
7eab4834c8 Merge pull request #11340 from firefly-iii/release-1765124558
🤖 Automatically merge the PR into the develop branch.
2025-12-07 17:22:47 +01:00
JC5
d1332eb592 🤖 Auto commit for release 'develop' on 2025-12-07 2025-12-07 17:22:38 +01:00
James Cole
346f2dfaea Add amount event. 2025-12-07 16:47:04 +01:00
James Cole
f6037318f4 Fix #11337 2025-12-07 07:00:50 +01:00
James Cole
babf9fe96f Add file permissions checks. #11323 2025-12-06 14:55:15 +01:00
James Cole
ca3922d00a Fix #11313 2025-12-06 13:50:51 +01:00
James Cole
aadb685b57 Add YTD fix. 2025-12-06 08:12:18 +01:00
github-actions[bot]
bee62b2115 Merge pull request #11335 from firefly-iii/release-1765004138
🤖 Automatically merge the PR into the develop branch.
2025-12-06 07:55:46 +01:00
JC5
205169a8ad 🤖 Auto commit for release 'develop' on 2025-12-06 2025-12-06 07:55:38 +01:00
James Cole
5f36bb84a4 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-12-06 07:51:19 +01:00
James Cole
5b395d870b Fix #11333 2025-12-06 07:32:43 +01:00
github-actions[bot]
bceb526cb3 Merge pull request #11334 from firefly-iii/release-1765002701
🤖 Automatically merge the PR into the develop branch.
2025-12-06 07:31:52 +01:00
JC5
1f89dddb08 🤖 Auto commit for release 'develop' on 2025-12-06 2025-12-06 07:31:41 +01:00
James Cole
a93f2d66af Fix #11329 2025-12-06 07:27:41 +01:00
James Cole
551909ea60 Merge branch 'main' into develop 2025-12-05 08:21:34 +01:00
Sander Dorigo
5667044349 Fix #11328 2025-12-04 17:27:20 +01:00
James Cole
6f73e4f2c9 Merge pull request #11316 from firefly-iii/dependabot/composer/develop/symfony/mailgun-mailer-8.0.0
Bump symfony/mailgun-mailer from 7.4.0 to 8.0.0
2025-12-01 14:32:55 +01:00
dependabot[bot]
1f19f20734 Bump symfony/mailgun-mailer from 7.4.0 to 8.0.0
Bumps [symfony/mailgun-mailer](https://github.com/symfony/mailgun-mailer) from 7.4.0 to 8.0.0.
- [Release notes](https://github.com/symfony/mailgun-mailer/releases)
- [Changelog](https://github.com/symfony/mailgun-mailer/blob/7.3/CHANGELOG.md)
- [Commits](https://github.com/symfony/mailgun-mailer/compare/v7.4.0...v8.0.0)

---
updated-dependencies:
- dependency-name: symfony/mailgun-mailer
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 10:45:09 +00:00
James Cole
91c8f0db80 Merge pull request #11317 from firefly-iii/dependabot/composer/develop/symfony/expression-language-8.0.0
Bump symfony/expression-language from 7.4.0 to 8.0.0
2025-12-01 11:41:22 +01:00
dependabot[bot]
2cdd1aa147 Bump symfony/expression-language from 7.4.0 to 8.0.0
Bumps [symfony/expression-language](https://github.com/symfony/expression-language) from 7.4.0 to 8.0.0.
- [Release notes](https://github.com/symfony/expression-language/releases)
- [Changelog](https://github.com/symfony/expression-language/blob/7.3/CHANGELOG.md)
- [Commits](https://github.com/symfony/expression-language/compare/v7.4.0...v8.0.0)

---
updated-dependencies:
- dependency-name: symfony/expression-language
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 08:17:15 +00:00
James Cole
5ac51218aa Merge pull request #11319 from firefly-iii/dependabot/github_actions/github/command-2.0.3 2025-12-01 05:15:37 +01:00
James Cole
80abd277a0 Merge pull request #11315 from firefly-iii/dependabot/composer/develop/symfony/http-client-8.0.0 2025-12-01 05:14:44 +01:00
mergify[bot]
b644f28882 Merge branch 'develop' into dependabot/composer/develop/symfony/http-client-8.0.0 2025-12-01 03:40:11 +00:00
github-actions[bot]
35a81fd2de Merge pull request #11321 from firefly-iii/release-1764560258
🤖 Automatically merge the PR into the develop branch.
2025-12-01 04:37:44 +01:00
JC5
51e8a1dbe2 🤖 Auto commit for release 'develop' on 2025-12-01 2025-12-01 04:37:38 +01:00
dependabot[bot]
b799379a0a Bump github/command from 2.0.2 to 2.0.3
Bumps [github/command](https://github.com/github/command) from 2.0.2 to 2.0.3.
- [Release notes](https://github.com/github/command/releases)
- [Commits](https://github.com/github/command/compare/v2.0.2...v2.0.3)

---
updated-dependencies:
- dependency-name: github/command
  dependency-version: 2.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 03:10:25 +00:00
dependabot[bot]
c8edaee848 Bump symfony/http-client from 7.4.0 to 8.0.0
Bumps [symfony/http-client](https://github.com/symfony/http-client) from 7.4.0 to 8.0.0.
- [Release notes](https://github.com/symfony/http-client/releases)
- [Changelog](https://github.com/symfony/http-client/blob/7.3/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-client/compare/v7.4.0...v8.0.0)

---
updated-dependencies:
- dependency-name: symfony/http-client
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 03:03:40 +00:00
github-actions[bot]
bbe47635d3 Merge pull request #11304 from firefly-iii/release-1764397418
🤖 Automatically merge the PR into the develop branch.
2025-11-29 07:23:46 +01:00
JC5
5c73d238a0 🤖 Auto commit for release 'develop' on 2025-11-29 2025-11-29 07:23:38 +01:00
github-actions[bot]
2bee3d2728 Merge pull request #11301 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-11-28 21:36:11 +01:00
github-actions[bot]
73126786b0 Merge pull request #11300 from firefly-iii/release-1764362158
🤖 Automatically merge the PR into the develop branch.
2025-11-28 21:36:05 +01:00
JC5
962a729025 🤖 Auto commit for release 'v6.4.9' on 2025-11-28 2025-11-28 21:35:58 +01:00
github-actions[bot]
f262cb3947 Merge pull request #11298 from firefly-iii/release-1764353294
🤖 Automatically merge the PR into the develop branch.
2025-11-28 19:08:24 +01:00
JC5
212d579c4f 🤖 Auto commit for release 'develop' on 2025-11-28 2025-11-28 19:08:14 +01:00
James Cole
30937610eb Update changelog. 2025-11-28 19:02:50 +01:00
James Cole
3558bf7647 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-11-28 19:01:21 +01:00
James Cole
3711222f9e Fix #11281 and some other stuff. 2025-11-28 19:01:15 +01:00
github-actions[bot]
76899389b8 Merge pull request #11291 from firefly-iii/release-1764180754
🤖 Automatically merge the PR into the develop branch.
2025-11-26 19:12:42 +01:00
JC5
e83fe023d2 🤖 Auto commit for release 'develop' on 2025-11-26 2025-11-26 19:12:34 +01:00
James Cole
1dd098a283 Fix #11284 2025-11-26 19:06:58 +01:00
James Cole
52164689d4 Switch to 1M when it's MTD. 2025-11-26 19:05:46 +01:00
github-actions[bot]
034b14eb0b Merge pull request #11290 from firefly-iii/release-1764179030
🤖 Automatically merge the PR into the develop branch.
2025-11-26 18:43:56 +01:00
JC5
8722d264dc 🤖 Auto commit for release 'develop' on 2025-11-26 2025-11-26 18:43:50 +01:00
James Cole
3603ef1cc7 Fix #11288 2025-11-26 18:39:05 +01:00
James Cole
7abd30f4dd Attempted fix with sanity check for #11284 2025-11-26 18:35:56 +01:00
github-actions[bot]
3c904c9017 Merge pull request #11286 from firefly-iii/release-1764136451
🤖 Automatically merge the PR into the develop branch.
2025-11-26 06:54:20 +01:00
JC5
d8bdbf2842 🤖 Auto commit for release 'develop' on 2025-11-26 2025-11-26 06:54:11 +01:00
James Cole
d08966d141 Add new correction command. 2025-11-26 06:50:29 +01:00
James Cole
bd71095e40 Merge branch 'main' into develop 2025-11-25 20:13:04 +01:00
James Cole
d7967a81e3 Fix https://github.com/firefly-iii/firefly-iii/issues/11284 2025-11-25 20:12:35 +01:00
James Cole
fa018e80c0 Replace classes 2025-11-25 20:12:23 +01:00
James Cole
eb4b9659cf Merge pull request #11278 from firefly-iii/dependabot/github_actions/actions/checkout-6
Bump actions/checkout from 5 to 6
2025-11-24 08:49:23 +01:00
github-actions[bot]
7b7b9118cd Merge pull request #11279 from firefly-iii/release-1763955257
🤖 Automatically merge the PR into the develop branch.
2025-11-24 04:34:26 +01:00
JC5
373e5c3733 🤖 Auto commit for release 'develop' on 2025-11-24 2025-11-24 04:34:17 +01:00
dependabot[bot]
4e0b1bf65d Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 03:17:24 +00:00
James Cole
521a496c17 Fix #11267 2025-11-23 21:03:53 +01:00
James Cole
5fea35d5b1 Allow command to be forced. 2025-11-23 08:44:01 +01:00
James Cole
21a6892601 Fix #11265 2025-11-23 06:55:54 +01:00
James Cole
3f386b9003 Fix #11191 2025-11-19 06:26:40 +01:00
github-actions[bot]
72fb534eb4 Merge pull request #11249 from firefly-iii/release-1763402892
🤖 Automatically merge the PR into the develop branch.
2025-11-17 19:08:20 +01:00
JC5
69b46af245 🤖 Auto commit for release 'develop' on 2025-11-17 2025-11-17 19:08:12 +01:00
James Cole
4a901a1b42 Add a bunch of debug #11247 2025-11-17 19:01:38 +01:00
James Cole
a8fffc25c0 Merge pull request #11241 from firefly-iii/dependabot/composer/develop/bacon/bacon-qr-code-3.0.2
Bump bacon/bacon-qr-code from 3.0.1 to 3.0.2
2025-11-17 06:48:36 +01:00
mergify[bot]
d0dab136b1 Merge branch 'develop' into dependabot/composer/develop/bacon/bacon-qr-code-3.0.2 2025-11-17 05:47:38 +00:00
James Cole
91184489da Merge pull request #11242 from firefly-iii/dependabot/npm_and_yarn/develop/alpinejs-3.15.2
Bump alpinejs from 3.15.1 to 3.15.2
2025-11-17 06:46:55 +01:00
mergify[bot]
e4e6cc71c3 Merge branch 'develop' into dependabot/composer/develop/bacon/bacon-qr-code-3.0.2 2025-11-17 03:30:51 +00:00
mergify[bot]
33d637e618 Merge branch 'develop' into dependabot/npm_and_yarn/develop/alpinejs-3.15.2 2025-11-17 03:30:49 +00:00
github-actions[bot]
42eb4410f8 Merge pull request #11243 from firefly-iii/release-1763350179
🤖 Automatically merge the PR into the develop branch.
2025-11-17 04:29:45 +01:00
JC5
5f6b345c79 🤖 Auto commit for release 'develop' on 2025-11-17 2025-11-17 04:29:39 +01:00
dependabot[bot]
30b48a479c Bump alpinejs from 3.15.1 to 3.15.2
Bumps [alpinejs](https://github.com/alpinejs/alpine/tree/HEAD/packages/alpinejs) from 3.15.1 to 3.15.2.
- [Release notes](https://github.com/alpinejs/alpine/releases)
- [Commits](https://github.com/alpinejs/alpine/commits/v3.15.2/packages/alpinejs)

---
updated-dependencies:
- dependency-name: alpinejs
  dependency-version: 3.15.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:01:12 +00:00
dependabot[bot]
55d23af802 Bump bacon/bacon-qr-code from 3.0.1 to 3.0.2
Bumps [bacon/bacon-qr-code](https://github.com/Bacon/BaconQrCode) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/Bacon/BaconQrCode/releases)
- [Changelog](https://github.com/Bacon/BaconQrCode/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Bacon/BaconQrCode/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: bacon/bacon-qr-code
  dependency-version: 3.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:00:53 +00:00
James Cole
34bfeba63a Fix #11211 2025-11-13 20:32:02 +01:00
github-actions[bot]
761c20b670 Merge pull request #11234 from firefly-iii/release-1763009724
🤖 Automatically merge the PR into the develop branch.
2025-11-13 05:55:30 +01:00
JC5
d756977ee0 🤖 Auto commit for release 'develop' on 2025-11-13 2025-11-13 05:55:24 +01:00
github-actions[bot]
40fe0d9c57 Merge pull request #11233 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-11-13 05:42:18 +01:00
github-actions[bot]
09b3fa1a52 Merge pull request #11232 from firefly-iii/release-1763008922
🤖 Automatically merge the PR into the develop branch.
2025-11-13 05:42:11 +01:00
JC5
bab767a447 🤖 Auto commit for release 'v6.4.8' on 2025-11-13 2025-11-13 05:42:02 +01:00
James Cole
341ab69939 Merge branch 'main' into develop 2025-11-13 05:37:15 +01:00
James Cole
479b90d9fc Expand changelog. 2025-11-13 05:36:59 +01:00
James Cole
91889332b4 Merge pull request #11231 from firefly-iii/dependabot/composer/composer-da8c4f16ae 2025-11-13 05:09:28 +01:00
dependabot[bot]
22b623c561 Bump symfony/http-foundation in the composer group across 1 directory
Bumps the composer group with 1 update in the / directory: [symfony/http-foundation](https://github.com/symfony/http-foundation).


Updates `symfony/http-foundation` from 7.3.6 to 7.3.7
- [Release notes](https://github.com/symfony/http-foundation/releases)
- [Changelog](https://github.com/symfony/http-foundation/blob/7.3/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-foundation/compare/v7.3.6...v7.3.7)

---
updated-dependencies:
- dependency-name: symfony/http-foundation
  dependency-version: 7.3.7
  dependency-type: indirect
  dependency-group: composer
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-12 23:42:25 +00:00
github-actions[bot]
75932a9671 Merge pull request #11229 from firefly-iii/release-1762967310
🤖 Automatically merge the PR into the develop branch.
2025-11-12 18:08:37 +01:00
JC5
3ec528812b 🤖 Auto commit for release 'develop' on 2025-11-12 2025-11-12 18:08:30 +01:00
James Cole
78de800777 Fix #11228 2025-11-12 18:02:24 +01:00
github-actions[bot]
4456b00cae Merge pull request #11223 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-11-12 05:50:16 +01:00
github-actions[bot]
a3c02d7e07 Merge pull request #11222 from firefly-iii/release-1762923004
🤖 Automatically merge the PR into the develop branch.
2025-11-12 05:50:11 +01:00
JC5
d9ff71b1a5 🤖 Auto commit for release 'v6.4.7' on 2025-11-12 2025-11-12 05:50:05 +01:00
James Cole
2e5528167c Don't do comment. 2025-11-12 05:46:21 +01:00
159 changed files with 2312 additions and 1826 deletions

View File

@@ -402,16 +402,16 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.89.2", "version": "v3.92.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "7569658f91e475ec93b99bd5964b059ad1336dcf" "reference": "ed33ad03313a019533ba065eba6c86af0a382873"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7569658f91e475ec93b99bd5964b059ad1336dcf", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ed33ad03313a019533ba065eba6c86af0a382873",
"reference": "7569658f91e475ec93b99bd5964b059ad1336dcf", "reference": "ed33ad03313a019533ba065eba6c86af0a382873",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -429,17 +429,17 @@
"react/socket": "^1.16", "react/socket": "^1.16",
"react/stream": "^1.4", "react/stream": "^1.4",
"sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0",
"symfony/console": "^5.4.47 || ^6.4.24 || ^7.0", "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0", "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0", "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0", "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0", "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/polyfill-mbstring": "^1.33", "symfony/polyfill-mbstring": "^1.33",
"symfony/polyfill-php80": "^1.33", "symfony/polyfill-php80": "^1.33",
"symfony/polyfill-php81": "^1.33", "symfony/polyfill-php81": "^1.33",
"symfony/polyfill-php84": "^1.33", "symfony/polyfill-php84": "^1.33",
"symfony/process": "^5.4.47 || ^6.4.24 || ^7.2", "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0",
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0" "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
}, },
"require-dev": { "require-dev": {
"facile-it/paraunit": "^1.3.1 || ^2.7", "facile-it/paraunit": "^1.3.1 || ^2.7",
@@ -451,8 +451,9 @@
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
"phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34",
"symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2", "symfony/polyfill-php85": "^1.33",
"symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2" "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0",
"symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0"
}, },
"suggest": { "suggest": {
"ext-dom": "For handling output formats in XML", "ext-dom": "For handling output formats in XML",
@@ -467,7 +468,7 @@
"PhpCsFixer\\": "src/" "PhpCsFixer\\": "src/"
}, },
"exclude-from-classmap": [ "exclude-from-classmap": [
"src/Fixer/Internal/*" "src/**/Internal/"
] ]
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@@ -493,7 +494,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.89.2" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.1"
}, },
"funding": [ "funding": [
{ {
@@ -501,7 +502,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-11-06T21:12:50+00:00" "time": "2025-12-15T23:09:01+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@@ -805,16 +806,16 @@
}, },
{ {
"name": "react/dns", "name": "react/dns",
"version": "v1.13.0", "version": "v1.14.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/dns.git", "url": "https://github.com/reactphp/dns.git",
"reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3",
"reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -869,7 +870,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/reactphp/dns/issues", "issues": "https://github.com/reactphp/dns/issues",
"source": "https://github.com/reactphp/dns/tree/v1.13.0" "source": "https://github.com/reactphp/dns/tree/v1.14.0"
}, },
"funding": [ "funding": [
{ {
@@ -877,20 +878,20 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2024-06-13T14:18:03+00:00" "time": "2025-11-18T19:34:28+00:00"
}, },
{ {
"name": "react/event-loop", "name": "react/event-loop",
"version": "v1.5.0", "version": "v1.6.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/event-loop.git", "url": "https://github.com/reactphp/event-loop.git",
"reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a",
"reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -941,7 +942,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/reactphp/event-loop/issues", "issues": "https://github.com/reactphp/event-loop/issues",
"source": "https://github.com/reactphp/event-loop/tree/v1.5.0" "source": "https://github.com/reactphp/event-loop/tree/v1.6.0"
}, },
"funding": [ "funding": [
{ {
@@ -949,7 +950,7 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2023-11-13T13:48:05+00:00" "time": "2025-11-17T20:46:25+00:00"
}, },
{ {
"name": "react/promise", "name": "react/promise",
@@ -1026,16 +1027,16 @@
}, },
{ {
"name": "react/socket", "name": "react/socket",
"version": "v1.16.0", "version": "v1.17.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/socket.git", "url": "https://github.com/reactphp/socket.git",
"reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08",
"reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1094,7 +1095,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/reactphp/socket/issues", "issues": "https://github.com/reactphp/socket/issues",
"source": "https://github.com/reactphp/socket/tree/v1.16.0" "source": "https://github.com/reactphp/socket/tree/v1.17.0"
}, },
"funding": [ "funding": [
{ {
@@ -1102,7 +1103,7 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2024-07-26T10:38:09+00:00" "time": "2025-11-19T20:47:34+00:00"
}, },
{ {
"name": "react/stream", "name": "react/stream",
@@ -1251,47 +1252,39 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v7.3.6", "version": "v8.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a" "reference": "fcb73f69d655b48fcb894a262f074218df08bd58"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", "url": "https://api.github.com/repos/symfony/console/zipball/fcb73f69d655b48fcb894a262f074218df08bd58",
"reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", "reference": "fcb73f69d655b48fcb894a262f074218df08bd58",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.4",
"symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3",
"symfony/string": "^7.2" "symfony/string": "^7.4|^8.0"
},
"conflict": {
"symfony/dependency-injection": "<6.4",
"symfony/dotenv": "<6.4",
"symfony/event-dispatcher": "<6.4",
"symfony/lock": "<6.4",
"symfony/process": "<6.4"
}, },
"provide": { "provide": {
"psr/log-implementation": "1.0|2.0|3.0" "psr/log-implementation": "1.0|2.0|3.0"
}, },
"require-dev": { "require-dev": {
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^6.4|^7.0", "symfony/config": "^7.4|^8.0",
"symfony/dependency-injection": "^6.4|^7.0", "symfony/dependency-injection": "^7.4|^8.0",
"symfony/event-dispatcher": "^6.4|^7.0", "symfony/event-dispatcher": "^7.4|^8.0",
"symfony/http-foundation": "^6.4|^7.0", "symfony/http-foundation": "^7.4|^8.0",
"symfony/http-kernel": "^6.4|^7.0", "symfony/http-kernel": "^7.4|^8.0",
"symfony/lock": "^6.4|^7.0", "symfony/lock": "^7.4|^8.0",
"symfony/messenger": "^6.4|^7.0", "symfony/messenger": "^7.4|^8.0",
"symfony/process": "^6.4|^7.0", "symfony/process": "^7.4|^8.0",
"symfony/stopwatch": "^6.4|^7.0", "symfony/stopwatch": "^7.4|^8.0",
"symfony/var-dumper": "^6.4|^7.0" "symfony/var-dumper": "^7.4|^8.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1325,7 +1318,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v7.3.6" "source": "https://github.com/symfony/console/tree/v8.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -1345,7 +1338,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-11-04T01:21:42+00:00" "time": "2025-12-05T15:25:33+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@@ -1416,24 +1409,24 @@
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v7.3.3", "version": "v8.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" "reference": "573f95783a2ec6e38752979db139f09fec033f03"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03",
"reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "reference": "573f95783a2ec6e38752979db139f09fec033f03",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.4",
"symfony/event-dispatcher-contracts": "^2.5|^3" "symfony/event-dispatcher-contracts": "^2.5|^3"
}, },
"conflict": { "conflict": {
"symfony/dependency-injection": "<6.4", "symfony/security-http": "<7.4",
"symfony/service-contracts": "<2.5" "symfony/service-contracts": "<2.5"
}, },
"provide": { "provide": {
@@ -1442,13 +1435,14 @@
}, },
"require-dev": { "require-dev": {
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^6.4|^7.0", "symfony/config": "^7.4|^8.0",
"symfony/dependency-injection": "^6.4|^7.0", "symfony/dependency-injection": "^7.4|^8.0",
"symfony/error-handler": "^6.4|^7.0", "symfony/error-handler": "^7.4|^8.0",
"symfony/expression-language": "^6.4|^7.0", "symfony/expression-language": "^7.4|^8.0",
"symfony/http-foundation": "^6.4|^7.0", "symfony/framework-bundle": "^7.4|^8.0",
"symfony/http-foundation": "^7.4|^8.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3",
"symfony/stopwatch": "^6.4|^7.0" "symfony/stopwatch": "^7.4|^8.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1476,7 +1470,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -1496,7 +1490,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-08-13T11:49:31+00:00" "time": "2025-10-30T14:17:19+00:00"
}, },
{ {
"name": "symfony/event-dispatcher-contracts", "name": "symfony/event-dispatcher-contracts",
@@ -1576,25 +1570,25 @@
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v7.3.6", "version": "v8.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "e9bcfd7837928ab656276fe00464092cc9e1826a" "reference": "d937d400b980523dc9ee946bb69972b5e619058d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a", "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d",
"reference": "e9bcfd7837928ab656276fe00464092cc9e1826a", "reference": "d937d400b980523dc9ee946bb69972b5e619058d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.4",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8" "symfony/polyfill-mbstring": "~1.8"
}, },
"require-dev": { "require-dev": {
"symfony/process": "^6.4|^7.0" "symfony/process": "^7.4|^8.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1622,7 +1616,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v7.3.6" "source": "https://github.com/symfony/filesystem/tree/v8.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -1642,27 +1636,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-11-05T09:52:27+00:00" "time": "2025-12-01T09:13:36+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v7.3.5", "version": "v8.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "9f696d2f1e340484b4683f7853b273abff94421f" "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", "url": "https://api.github.com/repos/symfony/finder/zipball/7598dd5770580fa3517ec83e8da0c9b9e01f4291",
"reference": "9f696d2f1e340484b4683f7853b273abff94421f", "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2" "php": ">=8.4"
}, },
"require-dev": { "require-dev": {
"symfony/filesystem": "^6.4|^7.0" "symfony/filesystem": "^7.4|^8.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1690,7 +1684,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v7.3.5" "source": "https://github.com/symfony/finder/tree/v8.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -1710,24 +1704,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-10-15T18:45:57+00:00" "time": "2025-11-05T14:36:47+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
"version": "v7.3.3", "version": "v8.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/options-resolver.git", "url": "https://github.com/symfony/options-resolver.git",
"reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d2b592535ffa6600c265a3893a7f7fd2bad82dd7",
"reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.4",
"symfony/deprecation-contracts": "^2.5|^3" "symfony/deprecation-contracts": "^2.5|^3"
}, },
"type": "library", "type": "library",
@@ -1761,7 +1755,7 @@
"options" "options"
], ],
"support": { "support": {
"source": "https://github.com/symfony/options-resolver/tree/v7.3.3" "source": "https://github.com/symfony/options-resolver/tree/v8.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -1781,7 +1775,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-08-05T10:16:07+00:00" "time": "2025-11-12T15:55:31+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@@ -2364,20 +2358,20 @@
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v7.3.4", "version": "v8.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/process.git",
"reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" "reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", "url": "https://api.github.com/repos/symfony/process/zipball/a0a750500c4ce900d69ba4e9faf16f82c10ee149",
"reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", "reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2" "php": ">=8.4"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -2405,7 +2399,7 @@
"description": "Executes commands in sub-processes", "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/process/tree/v7.3.4" "source": "https://github.com/symfony/process/tree/v8.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -2425,7 +2419,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-09-11T10:12:26+00:00" "time": "2025-10-16T16:25:44+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
@@ -2516,20 +2510,20 @@
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v7.3.0", "version": "v8.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/67df1914c6ccd2d7b52f70d40cf2aea02159d942",
"reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.4",
"symfony/service-contracts": "^2.5|^3" "symfony/service-contracts": "^2.5|^3"
}, },
"type": "library", "type": "library",
@@ -2558,7 +2552,7 @@
"description": "Provides a way to profile code", "description": "Provides a way to profile code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/stopwatch/tree/v7.3.0" "source": "https://github.com/symfony/stopwatch/tree/v8.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -2569,43 +2563,47 @@
"url": "https://github.com/fabpot", "url": "https://github.com/fabpot",
"type": "github" "type": "github"
}, },
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{ {
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-02-24T10:49:57+00:00" "time": "2025-08-04T07:36:47+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v7.3.4", "version": "v8.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "f96476035142921000338bad71e5247fbc138872" "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", "url": "https://api.github.com/repos/symfony/string/zipball/ba65a969ac918ce0cc3edfac6cdde847eba231dc",
"reference": "f96476035142921000338bad71e5247fbc138872", "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.4",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-grapheme": "^1.33",
"symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-intl-normalizer": "^1.0",
"symfony/polyfill-mbstring": "~1.0" "symfony/polyfill-mbstring": "^1.0"
}, },
"conflict": { "conflict": {
"symfony/translation-contracts": "<2.5" "symfony/translation-contracts": "<2.5"
}, },
"require-dev": { "require-dev": {
"symfony/emoji": "^7.1", "symfony/emoji": "^7.4|^8.0",
"symfony/http-client": "^6.4|^7.0", "symfony/http-client": "^7.4|^8.0",
"symfony/intl": "^6.4|^7.0", "symfony/intl": "^7.4|^8.0",
"symfony/translation-contracts": "^2.5|^3.0", "symfony/translation-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^6.4|^7.0" "symfony/var-exporter": "^7.4|^8.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -2644,7 +2642,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v7.3.4" "source": "https://github.com/symfony/string/tree/v8.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -2664,7 +2662,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-09-11T14:36:48+00:00" "time": "2025-12-01T09:13:36+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],
@@ -2675,5 +2673,5 @@
"prefer-lowest": false, "prefer-lowest": false,
"platform": {}, "platform": {},
"platform-dev": {}, "platform-dev": {},
"plugin-api-version": "2.6.0" "plugin-api-version": "2.9.0"
} }

View File

@@ -13,7 +13,7 @@ jobs:
close_duplicates: close_duplicates:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: github/command@v2.0.2 - uses: github/command@v2.0.3
id: command id: command
with: with:
allowed_contexts: "issue" allowed_contexts: "issue"

View File

@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: 'Checkout repository' - name: 'Checkout repository'
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: 'Dependency review' - name: 'Dependency review'

View File

@@ -105,7 +105,7 @@ jobs:
Thank you for running the latest version of Firefly III (or the data importer)." Thank you for running the latest version of Firefly III (or the data importer)."
gh issue comment "$NUMBER" --body "$MESSAGE" # gh issue comment "$NUMBER" --body "$MESSAGE"
echo "Triggered on fourth test" echo "Triggered on fourth test"
exit 0 exit 0
fi fi

View File

@@ -18,4 +18,4 @@ jobs:
action: action:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: dessant/label-actions@v4 - uses: dessant/label-actions@v5

View File

@@ -29,7 +29,7 @@ jobs:
env: env:
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }} version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Import GPG key - name: Import GPG key

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart; namespace FireflyIII\Api\V1\Controllers\Chart;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Chart\ChartRequest; use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
@@ -32,11 +31,13 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\Navigation;
use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Http\Api\ApiSupport; use FireflyIII\Support\Http\Api\ApiSupport;
use FireflyIII\Support\Http\Api\CleansChartData; use FireflyIII\Support\Http\Api\CleansChartData;
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter; use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
/** /**
@@ -48,9 +49,9 @@ class AccountController extends Controller
use CleansChartData; use CleansChartData;
use CollectsAccountsFromFilter; use CollectsAccountsFromFilter;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private array $chartData = []; private array $chartData = [];
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
@@ -103,7 +104,7 @@ class AccountController extends Controller
$currency = $this->repository->getAccountCurrency($account); $currency = $this->repository->getAccountCurrency($account);
$currentStart = clone $params['start']; $currentStart = clone $params['start'];
$range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary); $range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary);
$period = $params['period'] ?? '1D';
$previous = array_values($range)[0]['balance']; $previous = array_values($range)[0]['balance'];
$pcPrevious = null; $pcPrevious = null;
@@ -129,7 +130,7 @@ class AccountController extends Controller
'end_date' => $params['end']->toAtomString(), 'end_date' => $params['end']->toAtomString(),
'type' => 'line', 'type' => 'line',
'yAxisID' => 0, 'yAxisID' => 0,
'period' => '1D', 'period' => $period,
'entries' => [], 'entries' => [],
'pc_entries' => [], 'pc_entries' => [],
]; ];
@@ -141,7 +142,7 @@ class AccountController extends Controller
$currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places; $currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places;
$pcPrevious = array_values($range)[0]['pc_balance']; $pcPrevious = array_values($range)[0]['pc_balance'];
} }
// create array of values to collect.
while ($currentStart <= $params['end']) { while ($currentStart <= $params['end']) {
$format = $currentStart->format('Y-m-d'); $format = $currentStart->format('Y-m-d');
@@ -158,8 +159,8 @@ class AccountController extends Controller
$pcPrevious = $pcBalance; $pcPrevious = $pcBalance;
$currentSet['pc_entries'][$label] = $pcBalance; $currentSet['pc_entries'][$label] = $pcBalance;
} }
$currentStart = Navigation::addPeriod($currentStart, $period);
$currentStart->addDay(); // $currentStart->addDay();
} }
$this->chartData[] = $currentSet; $this->chartData[] = $currentSet;
} }

View File

@@ -40,7 +40,7 @@ class IndexController extends Controller
{ {
use ValidatesUserGroupTrait; use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'currency_exchange_rates'; public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER]; protected array $acceptedRoles = [UserRoleEnum::OWNER];
private ExchangeRateRepositoryInterface $repository; private ExchangeRateRepositoryInterface $repository;

View File

@@ -486,7 +486,7 @@ class BasicController extends Controller
'currency_decimal_places' => $currencies[$currencyId]->decimal_places, 'currency_decimal_places' => $currencies[$currencyId]->decimal_places,
'value_parsed' => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), 'value_parsed' => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false),
'local_icon' => 'money', 'local_icon' => 'money',
'sub_title' => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, $availableBudget, false), 'sub_title' => Amount::formatFlat($currencies[$currencyId]->symbol, $currencies[$currencyId]->decimal_places, bcdiv($availableBudget, (string)$days), false),
]; ];
} }
foreach ($spent as $row) { foreach ($spent as $row) {

View File

@@ -23,15 +23,16 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Generic; namespace FireflyIII\Api\V1\Requests\Generic;
use Override;
use Illuminate\Contracts\Validation\Validator;
use FireflyIII\Api\V1\Requests\ApiRequest; use FireflyIII\Api\V1\Requests\ApiRequest;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Rules\Account\IsValidAccountTypeList; use FireflyIII\Rules\Account\IsValidAccountTypeList;
use FireflyIII\Rules\TransactionType\IsValidTransactionTypeList; use FireflyIII\Rules\TransactionType\IsValidTransactionTypeList;
use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\Http\Api\TransactionFilter;
use Illuminate\Contracts\Validation\Validator;
use Override;
use RuntimeException; use RuntimeException;
class ObjectTypeApiRequest extends ApiRequest class ObjectTypeApiRequest extends ApiRequest
@@ -88,7 +89,11 @@ class ObjectTypeApiRequest extends ApiRequest
// no break // no break
case Account::class: case Account::class:
$this->attributes->set('types', $this->mapAccountTypes($type)); $types = $this->mapAccountTypes($type);
// remove system account types because autocomplete doesn't need them.
$types = array_values(array_diff($types, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::LIABILITY_CREDIT->value]));
$this->attributes->set('types', $types);
break; break;

View File

@@ -339,6 +339,9 @@ class UpdateRequest extends FormRequest
// if more than one, verify that there are journal ID's present. // if more than one, verify that there are journal ID's present.
$this->validateJournalIds($validator, $transactionGroup); $this->validateJournalIds($validator, $transactionGroup);
// if more than one split, needs group title
$this->validateGroupDescription($validator);
// all transaction types must be equal: // all transaction types must be equal:
$this->validateTransactionTypesForUpdate($validator); $this->validateTransactionTypesForUpdate($validator);

View File

@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
/*
* ClearsEmptyForeignAmounts.php
* Copyright (c) 2025 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\Transaction;
use Illuminate\Console\Command;
class ClearsEmptyForeignAmounts extends Command
{
use ShowsFriendlyMessages;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'correction:clears-empty-foreign-amounts';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Removes references to foreign amounts if there is no amount.';
/**
* Execute the console command.
*/
public function handle(): int
{
// transaction: has no amount, but reference to currency.
$count = Transaction::whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->count();
if ($count > 0) {
Transaction::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();
if ($count > 0) {
Transaction::whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->update(['foreign_amount' => null]);
$this->friendlyInfo(sprintf('Corrected %d invalid foreign amount reference(s)', $count));
}
return self::SUCCESS;
}
}

View File

@@ -74,9 +74,11 @@ class CorrectsDatabase extends Command
'correction:group-accounts', 'correction:group-accounts',
'correction:recalculates-liabilities', 'correction:recalculates-liabilities',
'correction:preferences', 'correction:preferences',
'correction:corrects-inverted-budget-limits',
// 'correction:transaction-types', // resource heavy, disabled. // 'correction:transaction-types', // resource heavy, disabled.
'correction:recalculate-pc-amounts', 'correction:recalculate-pc-amounts',
'correction:remove-links-to-deleted-objects', 'correction:remove-links-to-deleted-objects',
'correction:clears-empty-foreign-amounts',
'firefly-iii:report-integrity', 'firefly-iii:report-integrity',
]; ];
foreach ($commands as $command) { foreach ($commands as $command) {

View File

@@ -0,0 +1,80 @@
<?php
declare(strict_types=1);
/*
* CorrectsInversedBudgetLimits.php
* Copyright (c) 2025 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Console\Commands\Correction;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\BudgetLimit;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class CorrectsInvertedBudgetLimits extends Command
{
use ShowsFriendlyMessages;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'correction:corrects-inverted-budget-limits';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Reverse budget limits where the dates are inverted.';
/**
* Execute the console command.
*/
public function handle(): int
{
$set = BudgetLimit::where('start_date', '>', DB::raw('end_date'))->get();
if (0 === $set->count()) {
Log::debug('No inverted budget limits found.');
return Command::SUCCESS;
}
/** @var BudgetLimit $budgetLimit */
foreach ($set as $budgetLimit) {
$start = $budgetLimit->start_date->copy();
$end = $budgetLimit->end_date->copy();
$budgetLimit->start_date = $end;
$budgetLimit->end_date = $start;
$budgetLimit->saveQuietly();
}
if (1 === $set->count()) {
$this->friendlyInfo('Corrected one budget limit to have the right start/end dates.');
return Command::SUCCESS;
}
$this->friendlyInfo(sprintf('Corrected %d budget limits to have the right start/end dates.', count($set)));
return Command::SUCCESS;
}
}

View File

@@ -86,17 +86,27 @@ class RemovesLinksToDeletedObjects extends Command
private function cleanupJournals(array $journals): void private function cleanupJournals(array $journals): void
{ {
$count = DB::table('tag_transaction_journal')->whereIn('transaction_journal_id', $journals)->delete(); $countTags = 0;
if ($count > 0) { $countBudgets = 0;
$this->friendlyInfo(sprintf('Removed %d old relationship(s) between tags and transactions.', $count)); $countCategories = 0;
// #11333
foreach (array_chunk($journals, 1337) as $set) {
$countTags += DB::table('tag_transaction_journal')->whereIn('transaction_journal_id', $set)->delete();
$countBudgets += DB::table('budget_transaction_journal')->whereIn('transaction_journal_id', $set)->delete();
$countCategories += DB::table('category_transaction_journal')->whereIn('transaction_journal_id', $set)->delete();
} }
$count = DB::table('budget_transaction_journal')->whereIn('transaction_journal_id', $journals)->delete();
if ($count > 0) {
$this->friendlyInfo(sprintf('Removed %d old relationship(s) between budgets and transactions.', $count));
if ($countTags > 0) {
$this->friendlyInfo(sprintf('Removed %d old relationship(s) between tags and transactions.', $countTags));
} }
$count = DB::table('category_transaction_journal')->whereIn('transaction_journal_id', $journals)->delete();
if ($count > 0) { if ($countBudgets > 0) {
$this->friendlyInfo(sprintf('Removed %d old relationship(s) categories and transactions.', $count)); $this->friendlyInfo(sprintf('Removed %d old relationship(s) between budgets and transactions.', $countBudgets));
}
if ($countCategories > 0) {
$this->friendlyInfo(sprintf('Removed %d old relationship(s) categories and transactions.', $countCategories));
} }
} }

View File

@@ -1,26 +0,0 @@
<?php
namespace FireflyIII\Console\Commands\Integrity;
use Illuminate\Console\Command;
class ReportSkeleton extends Command
{
protected $description = 'DESCRIPTION HERE';
protected $signature = 'firefly-iii:INT_COMMAND';
/**
* Execute the console command.
*
* @return int
*/
public function handle(): int
{
//
$this->warn('Congrats, you found the skeleton command. Boo!');
return 0;
}
}

View File

@@ -48,6 +48,7 @@ class ReportsIntegrity extends Command
$commands = [ $commands = [
'integrity:empty-objects', 'integrity:empty-objects',
'integrity:total-sums', 'integrity:total-sums',
'integrity:file-permissions',
]; ];
foreach ($commands as $command) { foreach ($commands as $command) {
$this->friendlyLine(sprintf('Now executing %s', $command)); $this->friendlyLine(sprintf('Now executing %s', $command));

View File

@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
/*
* ValidatesFilePermissions.php
* Copyright (c) 2025 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Console\Commands\Integrity;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use Illuminate\Console\Command;
class ValidatesFilePermissions extends Command
{
use ShowsFriendlyMessages;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'integrity:file-permissions';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle(): int
{
$directories = [storage_path('upload')];
$errors = false;
/** @var string $directory */
foreach ($directories as $directory) {
if (!is_dir($directory)) {
$this->friendlyError(sprintf('Directory "%s" cannot found. It is necessary to allow files to be uploaded.', $directory));
$errors = true;
continue;
}
if (!is_writable($directory)) {
$this->friendlyError(sprintf('Directory "%s" is not writeable. Uploading attachments may fail silently.', $directory));
$errors = true;
}
}
if (false === $errors) {
$this->friendlyInfo('All necessary file paths seem to exist, and are writeable.');
}
return self::SUCCESS;
}
}

View File

@@ -56,7 +56,7 @@ class ForcesDecimalSize extends Command
use ShowsFriendlyMessages; use ShowsFriendlyMessages;
protected $description = 'This command resizes DECIMAL columns in MySQL or PostgreSQL and correct amounts (only MySQL).'; protected $description = 'This command resizes DECIMAL columns in MySQL or PostgreSQL and correct amounts (only MySQL).';
protected $signature = 'firefly-iii:force-decimal-size'; protected $signature = 'firefly-iii:force-decimal-size {--force}';
private string $cast; private string $cast;
private array $classes private array $classes
= [ = [
@@ -98,9 +98,14 @@ class ForcesDecimalSize extends Command
Log::debug('Now in ForceDecimalSize::handle()'); Log::debug('Now in ForceDecimalSize::handle()');
$this->determineDatabaseType(); $this->determineDatabaseType();
$this->friendlyError('Running this command is dangerous and can cause data loss.'); $force = $this->option('force');
$this->friendlyError('Please do not continue.'); $question = true;
$question = $this->confirm('Do you want to continue?'); if (false === $force) {
$this->friendlyError('Running this command is dangerous and can cause data loss.');
$this->friendlyError('Please make sure you have a backup.');
$question = $this->confirm('Do you want to continue?');
}
if (true === $question) { if (true === $question) {
$this->correctAmounts(); $this->correctAmounts();
$this->updateDecimals(); $this->updateDecimals();
@@ -131,17 +136,17 @@ class ForcesDecimalSize extends Command
private function correctAmounts(): void private function correctAmounts(): void
{ {
// if sqlite, add function? // if sqlite, add function?
if ('sqlite' === (string) config('database.default')) { if ('sqlite' === (string)config('database.default')) {
DB::connection()->getPdo()->sqliteCreateFunction('REGEXP', static function ($pattern, $value): int { DB::connection()->getPdo()->sqliteCreateFunction('REGEXP', static function ($pattern, $value): int {
mb_regex_encoding('UTF-8'); mb_regex_encoding('UTF-8');
$pattern = trim($pattern, '"'); $pattern = trim($pattern, '"');
return (mb_ereg($pattern, (string) $value)) ? 1 : 0; return (mb_ereg($pattern, (string)$value)) ? 1 : 0;
}); });
} }
if (!in_array((string) config('database.default'), ['mysql', 'pgsql', 'sqlite'], true)) { if (!in_array((string)config('database.default'), ['mysql', 'pgsql', 'sqlite'], true)) {
$this->friendlyWarning(sprintf('Skip correcting amounts, does not support "%s"...', (string) config('database.default'))); $this->friendlyWarning(sprintf('Skip correcting amounts, does not support "%s"...', (string)config('database.default')));
return; return;
} }
@@ -236,7 +241,7 @@ class ForcesDecimalSize extends Command
/** @var Builder $query */ /** @var Builder $query */
$query = Account::leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id') $query = Account::leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id')
->where('account_meta.name', 'currency_id') ->where('account_meta.name', 'currency_id')
->where('account_meta.data', json_encode((string) $currency->id)) ->where('account_meta.data', json_encode((string)$currency->id))
; ;
$query->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void { $query->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
@@ -264,7 +269,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string)round($value * $pow), (string)$pow, 12);
$this->friendlyInfo(sprintf('Account #%d has %s with value "%s", this has been corrected to "%s".', $account->id, $field, $value, $correct)); $this->friendlyInfo(sprintf('Account #%d has %s with value "%s", this has been corrected to "%s".', $account->id, $field, $value, $correct));
/** @var null|Account $updateAccount */ /** @var null|Account $updateAccount */
@@ -316,7 +321,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string)round($value * $pow), (string)$pow, 12);
$this->friendlyWarning(sprintf('%s #%d has %s with value "%s", this has been corrected to "%s".', $table, $item->id, $field, $value, $correct)); $this->friendlyWarning(sprintf('%s #%d has %s with value "%s", this has been corrected to "%s".', $table, $item->id, $field, $value, $correct));
/** @var null|Model $model */ /** @var null|Model $model */
@@ -340,7 +345,7 @@ class ForcesDecimalSize extends Command
->leftJoin('accounts', 'piggy_banks.account_id', '=', 'accounts.id') ->leftJoin('accounts', 'piggy_banks.account_id', '=', 'accounts.id')
->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id') ->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id')
->where('account_meta.name', 'currency_id') ->where('account_meta.name', 'currency_id')
->where('account_meta.data', json_encode((string) $currency->id)) ->where('account_meta.data', json_encode((string)$currency->id))
->where(static function (Builder $q) use ($fields, $currency, $cast, $operator, $regularExpression): void { ->where(static function (Builder $q) use ($fields, $currency, $cast, $operator, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
@@ -369,7 +374,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string)round($value * $pow), (string)$pow, 12);
$this->friendlyWarning( $this->friendlyWarning(
sprintf('Piggy bank event #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct) sprintf('Piggy bank event #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct)
); );
@@ -396,7 +401,7 @@ class ForcesDecimalSize extends Command
->leftJoin('accounts', 'piggy_banks.account_id', '=', 'accounts.id') ->leftJoin('accounts', 'piggy_banks.account_id', '=', 'accounts.id')
->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id') ->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id')
->where('account_meta.name', 'currency_id') ->where('account_meta.name', 'currency_id')
->where('account_meta.data', json_encode((string) $currency->id)) ->where('account_meta.data', json_encode((string)$currency->id))
->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void { ->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
@@ -425,7 +430,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string)round($value * $pow), (string)$pow, 12);
$this->friendlyWarning( $this->friendlyWarning(
sprintf('Piggy bank repetition #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct) sprintf('Piggy bank repetition #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct)
); );
@@ -450,7 +455,7 @@ class ForcesDecimalSize extends Command
$query = PiggyBank::leftJoin('accounts', 'piggy_banks.account_id', '=', 'accounts.id') $query = PiggyBank::leftJoin('accounts', 'piggy_banks.account_id', '=', 'accounts.id')
->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id') ->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id')
->where('account_meta.name', 'currency_id') ->where('account_meta.name', 'currency_id')
->where('account_meta.data', json_encode((string) $currency->id)) ->where('account_meta.data', json_encode((string)$currency->id))
->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void { ->where(static function (Builder $q) use ($fields, $currency, $operator, $cast, $regularExpression): void {
foreach ($fields as $field) { foreach ($fields as $field) {
$q->orWhere( $q->orWhere(
@@ -479,7 +484,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10 ** $currency->decimal_places; $pow = 10 ** $currency->decimal_places;
$correct = bcdiv((string) round($value * $pow), (string) $pow, 12); $correct = bcdiv((string)round($value * $pow), (string)$pow, 12);
$this->friendlyWarning(sprintf('Piggy bank #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct)); $this->friendlyWarning(sprintf('Piggy bank #%d has %s with value "%s", this has been corrected to "%s".', $item->id, $field, $value, $correct));
/** @var null|PiggyBank $piggyBank */ /** @var null|PiggyBank $piggyBank */
@@ -515,7 +520,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10.0 ** $currency->decimal_places; $pow = 10.0 ** $currency->decimal_places;
$correct = bcdiv((string) round((float) $value * $pow), (string) $pow, 12); $correct = bcdiv((string)round((float)$value * $pow), (string)$pow, 12);
$this->friendlyWarning(sprintf('Transaction #%d has amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct)); $this->friendlyWarning(sprintf('Transaction #%d has amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct));
/** @var null|Transaction $transaction */ /** @var null|Transaction $transaction */
@@ -546,7 +551,7 @@ class ForcesDecimalSize extends Command
} }
// fix $field by rounding it down correctly. // fix $field by rounding it down correctly.
$pow = 10.0 ** $currency->decimal_places; $pow = 10.0 ** $currency->decimal_places;
$correct = bcdiv((string) round((float) $value * $pow), (string) $pow, 12); $correct = bcdiv((string)round((float)$value * $pow), (string)$pow, 12);
$this->friendlyWarning( $this->friendlyWarning(
sprintf('Transaction #%d has foreign amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct) sprintf('Transaction #%d has foreign amount with value "%s", this has been corrected to "%s".', $item->id, $value, $correct)
); );
@@ -560,7 +565,7 @@ class ForcesDecimalSize extends Command
private function updateDecimals(): void private function updateDecimals(): void
{ {
$this->friendlyInfo('Going to force the size of DECIMAL columns. Please hold.'); $this->friendlyInfo('Going to force the size of DECIMAL columns. Please hold.');
$type = (string) config('database.default'); $type = (string)config('database.default');
/** /**
* @var string $name * @var string $name

View File

@@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
/*
* TriggeredStoredTransactionGroup.php
* Copyright (c) 2025 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Events\Model\TransactionGroup;
use FireflyIII\Events\Event;
use FireflyIII\Models\TransactionGroup;
use Illuminate\Queue\SerializesModels;
class TriggeredStoredTransactionGroup extends Event
{
use SerializesModels;
/**
* Create a new event instance.
*/
public function __construct(public TransactionGroup $transactionGroup) {}
}

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Handlers\Events; namespace FireflyIII\Handlers\Events;
use FireflyIII\Enums\WebhookTrigger; use FireflyIII\Enums\WebhookTrigger;
use FireflyIII\Events\Model\TransactionGroup\TriggeredStoredTransactionGroup;
use FireflyIII\Events\RequestedSendWebhookMessages; use FireflyIII\Events\RequestedSendWebhookMessages;
use FireflyIII\Events\StoredTransactionGroup; use FireflyIII\Events\StoredTransactionGroup;
use FireflyIII\Generator\Webhook\MessageGeneratorInterface; use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
@@ -51,6 +52,12 @@ class StoredGroupEventHandler
$this->removePeriodStatistics($event); $this->removePeriodStatistics($event);
} }
public function triggerRulesManually(TriggeredStoredTransactionGroup $event): void
{
$newEvent = new StoredTransactionGroup($event->transactionGroup, true, false);
$this->processRules($newEvent);
}
/** /**
* This method grabs all the users rules and processes them. * This method grabs all the users rules and processes them.
*/ */

View File

@@ -53,8 +53,13 @@ class WebhookEventHandler
)->splice(0, 5) )->splice(0, 5)
; ;
Log::debug(sprintf('Found %d webhook message(s) ready to be send.', $messages->count())); Log::debug(sprintf('Found %d webhook message(s) ready to be send.', $messages->count()));
/** @var WebhookMessage $message */
foreach ($messages as $message) { foreach ($messages as $message) {
if (false === $message->sent) { if (false === $message->sent) {
// set it to "sent" right away!
$message->sent = true;
$message->save();
Log::debug(sprintf('Send message #%d', $message->id)); Log::debug(sprintf('Send message #%d', $message->id));
SendWebhookMessage::dispatch($message)->afterResponse(); SendWebhookMessage::dispatch($message)->afterResponse();
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Helpers\Report; namespace FireflyIII\Helpers\Report;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Helpers\Fiscal\FiscalHelperInterface; use FireflyIII\Helpers\Fiscal\FiscalHelperInterface;
@@ -81,7 +82,7 @@ class ReportHelper implements ReportHelperInterface
/** @var Carbon $expectedStart */ /** @var Carbon $expectedStart */
foreach ($expectedDates as $expectedStart) { foreach ($expectedDates as $expectedStart) {
$expectedEnd = app('navigation')->endOfX($expectedStart, $bill->repeat_freq, null); $expectedEnd = Navigation::endOfX($expectedStart, $bill->repeat_freq, null);
// is paid in this period maybe? // is paid in this period maybe?
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -141,18 +142,18 @@ class CreateController extends Controller
$data = $request->getAccountData(); $data = $request->getAccountData();
$account = $this->repository->store($data); $account = $this->repository->store($data);
$request->session()->flash('success', (string) trans('firefly.stored_new_account', ['name' => $account->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_account', ['name' => $account->name]));
app('preferences')->mark(); Preferences::mark();
Log::channel('audit')->info('Stored new account.', $data); Log::channel('audit')->info('Stored new account.', $data);
// update preferences if necessary: // update preferences if necessary:
$frontpage = app('preferences')->get('frontpageAccounts', [])->data; $frontpage = Preferences::get('frontpageAccounts', [])->data;
if (!is_array($frontpage)) { if (!is_array($frontpage)) {
$frontpage = []; $frontpage = [];
} }
if (AccountTypeEnum::ASSET->value === $account->accountType->type) { if (AccountTypeEnum::ASSET->value === $account->accountType->type) {
$frontpage[] = $account->id; $frontpage[] = $account->id;
app('preferences')->set('frontpageAccounts', $frontpage); Preferences::set('frontpageAccounts', $frontpage);
} }
// store attachment(s): // store attachment(s):

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
@@ -101,7 +102,7 @@ class DeleteController extends Controller
$this->repository->destroy($account, $moveTo); $this->repository->destroy($account, $moveTo);
$request->session()->flash('success', (string) trans(sprintf('firefly.%s_deleted', $typeName), ['name' => $name])); $request->session()->flash('success', (string) trans(sprintf('firefly.%s_deleted', $typeName), ['name' => $name]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('accounts.delete.url')); return redirect($this->getPreviousUrl('accounts.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\AccountFormRequest; use FireflyIII\Http\Requests\AccountFormRequest;
@@ -205,7 +206,7 @@ class EditController extends Controller
$redirect = redirect(route('accounts.edit', [$account->id]))->withInput(['return_to_edit' => 1]); $redirect = redirect(route('accounts.edit', [$account->id]))->withInput(['return_to_edit' => 1]);
} }
app('preferences')->mark(); Preferences::mark();
return $redirect; return $redirect;
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@@ -81,7 +82,7 @@ class IndexController extends Controller
$collection = $this->repository->getInactiveAccountsByType($types); $collection = $this->repository->getInactiveAccountsByType($types);
$total = $collection->count(); $total = $collection->count();
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$accounts = $collection->slice(($page - 1) * $pageSize, $pageSize); $accounts = $collection->slice(($page - 1) * $pageSize, $pageSize);
unset($collection); unset($collection);
@@ -153,7 +154,7 @@ class IndexController extends Controller
$collection = $this->repository->getActiveAccountsByType($types); $collection = $this->repository->getActiveAccountsByType($types);
$total = $collection->count(); $total = $collection->count();
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$accounts = $collection->slice(($page - 1) * $pageSize, $pageSize); $accounts = $collection->slice(($page - 1) * $pageSize, $pageSize);
$inactiveCount = $this->repository->getInactiveAccountsByType($types)->count(); $inactiveCount = $this->repository->getInactiveAccountsByType($types)->count();
@@ -167,12 +168,17 @@ class IndexController extends Controller
/** @var Carbon $end */ /** @var Carbon $end */
$end = clone session('end', today(config('app.timezone'))->endOfMonth()); $end = clone session('end', today(config('app.timezone'))->endOfMonth());
$now = now();
if ($now->gt($end) || $now->lt($start)) {
$now = $end;
}
$ids = $accounts->pluck('id')->toArray(); $ids = $accounts->pluck('id')->toArray();
Log::debug(sprintf('index: accountsBalancesInRange("%s", "%s")', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'))); Log::debug(sprintf('index: accountsBalancesInRange("%s", "%s")', $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')));
[ [
$startBalances, $startBalances,
$endBalances, $endBalances,
] = Steam::accountsBalancesInRange($accounts, $start, $end, $this->primaryCurrency, $this->convertToPrimary); ] = Steam::accountsBalancesInRange($accounts, $start, $now, $this->primaryCurrency, $this->convertToPrimary);
$activities = Steam::getLastActivities($ids); $activities = Steam::getLastActivities($ids);

View File

@@ -23,6 +23,8 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Facades\Navigation;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
@@ -91,20 +93,20 @@ class ReconcileController extends Controller
$currency = $this->accountRepos->getAccountCurrency($account) ?? $this->primaryCurrency; $currency = $this->accountRepos->getAccountCurrency($account) ?? $this->primaryCurrency;
// no start or end: // no start or end:
$range = app('navigation')->getViewRange(false); $range = Navigation::getViewRange(false);
// get start and end // get start and end
if (!$start instanceof Carbon && !$end instanceof Carbon) { if (!$start instanceof Carbon && !$end instanceof Carbon) {
/** @var Carbon $start */ /** @var Carbon $start */
$start = clone session('start', app('navigation')->startOfPeriod(new Carbon(), $range)); $start = clone session('start', Navigation::startOfPeriod(new Carbon(), $range));
/** @var Carbon $end */ /** @var Carbon $end */
$end = clone session('end', app('navigation')->endOfPeriod(new Carbon(), $range)); $end = clone session('end', Navigation::endOfPeriod(new Carbon(), $range));
} }
if (null === $end) { if (null === $end) {
/** @var Carbon $end */ /** @var Carbon $end */
$end = app('navigation')->endOfPeriod($start, $range); $end = Navigation::endOfPeriod($start, $range);
} }
if ($end->lt($start)) { if ($end->lt($start)) {
@@ -174,7 +176,7 @@ class ReconcileController extends Controller
$result = $this->createReconciliation($account, $start, $end, $data['difference']); $result = $this->createReconciliation($account, $start, $end, $data['difference']);
} }
Log::debug('End of routine.'); Log::debug('End of routine.');
app('preferences')->mark(); Preferences::mark();
if ('' === $result) { if ('' === $result) {
session()->flash('success', (string) trans('firefly.reconciliation_stored')); session()->flash('success', (string) trans('firefly.reconciliation_stored'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
@@ -113,7 +114,7 @@ class ShowController extends Controller
$today = today(config('app.timezone')); $today = today(config('app.timezone'));
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type));
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$accountCurrency = $this->repository->getAccountCurrency($account); $accountCurrency = $this->repository->getAccountCurrency($account);
$currency = $accountCurrency ?? $this->primaryCurrency; $currency = $accountCurrency ?? $this->primaryCurrency;
$fStart = $start->isoFormat($this->monthAndDayFormat); $fStart = $start->isoFormat($this->monthAndDayFormat);
@@ -164,7 +165,7 @@ class ShowController extends Controller
$timer->stop('collection'); $timer->stop('collection');
$groups->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')])); $groups->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]));
$showAll = false; $showAll = false;
$now = today()->endOfDay(); $now = now();
if ($now->gt($end) || $now->lt($start)) { if ($now->gt($end) || $now->lt($start)) {
$now = $end; $now = $end;
} }
@@ -173,10 +174,7 @@ class ShowController extends Controller
$balances = Steam::accountsBalancesOptimized(new Collection()->push($account), $now)[$account->id]; $balances = Steam::accountsBalancesOptimized(new Collection()->push($account), $now)[$account->id];
// $balances = Steam::filterAccountBalance(Steam::finalAccountBalance($account, $now), $account, $this->convertToPrimary, $accountCurrency); // $balances = Steam::filterAccountBalance(Steam::finalAccountBalance($account, $now), $account, $this->convertToPrimary, $accountCurrency);
return view( return view('accounts.show', ['account' => $account, 'showAll' => $showAll, 'objectType' => $objectType, 'currency' => $currency, 'today' => $today, 'periods' => $periods, 'subTitleIcon' => $subTitleIcon, 'groups' => $groups, 'attachments' => $attachments, 'subTitle' => $subTitle, 'start' => $start, 'end' => $end, 'chartUrl' => $chartUrl, 'location' => $location, 'balances' => $balances]);
'accounts.show',
['account' => $account, 'showAll' => $showAll, 'objectType' => $objectType, 'currency' => $currency, 'today' => $today, 'periods' => $periods, 'subTitleIcon' => $subTitleIcon, 'groups' => $groups, 'attachments' => $attachments, 'subTitle' => $subTitle, 'start' => $start, 'end' => $end, 'chartUrl' => $chartUrl, 'location' => $location, 'balances' => $balances]
);
} }
/** /**
@@ -202,7 +200,7 @@ class ShowController extends Controller
$start = $this->repository->oldestJournalDate($account) ?? today(config('app.timezone'))->startOfMonth(); $start = $this->repository->oldestJournalDate($account) ?? today(config('app.timezone'))->startOfMonth();
$subTitleIcon = config('firefly.subIconsByIdentifier.'.$account->accountType->type); $subTitleIcon = config('firefly.subIconsByIdentifier.'.$account->accountType->type);
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$currency = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency; $currency = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency;
$subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]); $subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]);
$periods = new Collection(); $periods = new Collection();
@@ -224,14 +222,16 @@ class ShowController extends Controller
// correct // correct
Log::debug(sprintf('showAll: Call accountsBalancesOptimized with date/time "%s"', $end->toIso8601String())); Log::debug(sprintf('showAll: Call accountsBalancesOptimized with date/time "%s"', $end->toIso8601String()));
$now = now();
if ($now->gt($end) || $now->lt($start)) {
$now = $end;
}
// 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized. // 2025-10-08 replace finalAccountBalance with accountsBalancesOptimized.
// $balances = Steam::finalAccountBalance($account, $end); // $balances = Steam::finalAccountBalance($account, $end);
// $balances = Steam::filterAccountBalance($balances, $account, $this->convertToPrimary, $accountCurrency); // $balances = Steam::filterAccountBalance($balances, $account, $this->convertToPrimary, $accountCurrency);
$balances = Steam::accountsBalancesOptimized(new Collection()->push($account), $end)[$account->id]; $balances = Steam::accountsBalancesOptimized(new Collection()->push($account), $now)[$account->id];
return view( return view('accounts.show', ['account' => $account, 'showAll' => $showAll, 'location' => $location, 'objectType' => $objectType, 'isLiability' => $isLiability, 'attachments' => $attachments, 'currency' => $currency, 'today' => $today, 'chartUrl' => $chartUrl, 'periods' => $periods, 'subTitleIcon' => $subTitleIcon, 'groups' => $groups, 'subTitle' => $subTitle, 'start' => $start, 'end' => $end, 'balances' => $balances]);
'accounts.show',
['account' => $account, 'showAll' => $showAll, 'location' => $location, 'objectType' => $objectType, 'isLiability' => $isLiability, 'attachments' => $attachments, 'currency' => $currency, 'today' => $today, 'chartUrl' => $chartUrl, 'periods' => $periods, 'subTitleIcon' => $subTitleIcon, 'groups' => $groups, 'subTitle' => $subTitle, 'start' => $start, 'end' => $end, 'balances' => $balances]
);
} }
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Requests\ConfigurationRequest; use FireflyIII\Http\Requests\ConfigurationRequest;
@@ -95,7 +96,7 @@ class ConfigurationController extends Controller
// flash message // flash message
session()->flash('success', (string) trans('firefly.configuration_updated')); session()->flash('success', (string) trans('firefly.configuration_updated'));
app('preferences')->mark(); Preferences::mark();
return redirect()->route('settings.configuration.index'); return redirect()->route('settings.configuration.index');
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
@@ -59,7 +60,7 @@ class HomeController extends Controller
$title = (string) trans('firefly.system_settings'); $title = (string) trans('firefly.system_settings');
$mainTitleIcon = 'fa-hand-spock-o'; $mainTitleIcon = 'fa-hand-spock-o';
$email = auth()->user()->email; $email = auth()->user()->email;
$pref = app('preferences')->get('remote_guard_alt_email'); $pref = Preferences::get('remote_guard_alt_email');
if (null !== $pref && is_string($pref->data)) { if (null !== $pref && is_string($pref->data)) {
$email = $pref->data; $email = $pref->data;
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Requests\LinkTypeFormRequest; use FireflyIII\Http\Requests\LinkTypeFormRequest;
@@ -125,7 +126,7 @@ class LinkController extends Controller
$this->repository->destroy($linkType, $moveTo); $this->repository->destroy($linkType, $moveTo);
$request->session()->flash('success', (string) trans('firefly.deleted_link_type', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_link_type', ['name' => $name]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('link-types.delete.url')); return redirect($this->getPreviousUrl('link-types.delete.url'));
} }
@@ -245,7 +246,7 @@ class LinkController extends Controller
Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data); Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data);
$request->session()->flash('success', (string) trans('firefly.updated_link_type', ['name' => $linkType->name])); $request->session()->flash('success', (string) trans('firefly.updated_link_type', ['name' => $linkType->name]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('link-types.edit.url')); $redirect = redirect($this->getPreviousUrl('link-types.edit.url'));
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// set value so edit routine will not overwrite URL: // set value so edit routine will not overwrite URL:

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Events\Admin\InvitationCreated; use FireflyIII\Events\Admin\InvitationCreated;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -242,7 +243,7 @@ class UserController extends Controller
$this->repository->updateEmail($user, $data['email']); $this->repository->updateEmail($user, $data['email']);
session()->flash('success', (string) trans('firefly.updated_user', ['email' => $user->email])); session()->flash('success', (string) trans('firefly.updated_user', ['email' => $user->email]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('users.edit.url')); $redirect = redirect($this->getPreviousUrl('users.edit.url'));
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
session()->put('users.edit.fromUpdate', true); session()->put('users.edit.fromUpdate', true);

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Requests\AttachmentFormRequest; use FireflyIII\Http\Requests\AttachmentFormRequest;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
@@ -85,7 +86,7 @@ class AttachmentController extends Controller
$this->repository->destroy($attachment); $this->repository->destroy($attachment);
$request->session()->flash('success', (string) trans('firefly.attachment_deleted', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.attachment_deleted', ['name' => $name]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('attachments.delete.url')); return redirect($this->getPreviousUrl('attachments.delete.url'));
} }
@@ -175,7 +176,7 @@ class AttachmentController extends Controller
$this->repository->update($attachment, $data); $this->repository->update($attachment, $data);
$request->session()->flash('success', (string) trans('firefly.attachment_updated', ['name' => $attachment->filename])); $request->session()->flash('success', (string) trans('firefly.attachment_updated', ['name' => $attachment->filename]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('attachments.edit.url')); $redirect = redirect($this->getPreviousUrl('attachments.edit.url'));
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Auth; namespace FireflyIII\Http\Controllers\Auth;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Events\Security\MFABackupFewLeft; use FireflyIII\Events\Security\MFABackupFewLeft;
use FireflyIII\Events\Security\MFABackupNoLeft; use FireflyIII\Events\Security\MFABackupNoLeft;
@@ -65,7 +66,7 @@ class TwoFactorController extends Controller
public function submitMFA(Request $request): Redirector|RedirectResponse public function submitMFA(Request $request): Redirector|RedirectResponse
{ {
/** @var array $mfaHistory */ /** @var array $mfaHistory */
$mfaHistory = app('preferences')->get('mfa_history', [])->data; $mfaHistory = Preferences::get('mfa_history', [])->data;
$mfaCode = (string) $request->get('one_time_password'); $mfaCode = (string) $request->get('one_time_password');
// is in history? then refuse to use it. // is in history? then refuse to use it.
@@ -149,7 +150,7 @@ class TwoFactorController extends Controller
private function filterMFAHistory(): void private function filterMFAHistory(): void
{ {
/** @var array $mfaHistory */ /** @var array $mfaHistory */
$mfaHistory = app('preferences')->get('mfa_history', [])->data; $mfaHistory = Preferences::get('mfa_history', [])->data;
$newHistory = []; $newHistory = [];
$now = Carbon::now()->getTimestamp(); $now = Carbon::now()->getTimestamp();
foreach ($mfaHistory as $entry) { foreach ($mfaHistory as $entry) {
@@ -162,20 +163,20 @@ class TwoFactorController extends Controller
]; ];
} }
} }
app('preferences')->set('mfa_history', $newHistory); Preferences::set('mfa_history', $newHistory);
} }
private function addToMFAFailureCounter(): void private function addToMFAFailureCounter(): void
{ {
$preference = (int) app('preferences')->get('mfa_failure_count', 0)->data; $preference = (int) Preferences::get('mfa_failure_count', 0)->data;
++$preference; ++$preference;
Log::channel('audit')->info(sprintf('MFA failure count is set to %d.', $preference)); Log::channel('audit')->info(sprintf('MFA failure count is set to %d.', $preference));
app('preferences')->set('mfa_failure_count', $preference); Preferences::set('mfa_failure_count', $preference);
} }
private function getMFAFailureCounter(): int private function getMFAFailureCounter(): int
{ {
$value = (int) app('preferences')->get('mfa_failure_count', 0)->data; $value = (int) Preferences::get('mfa_failure_count', 0)->data;
Log::channel('audit')->info(sprintf('MFA failure count is %d.', $value)); Log::channel('audit')->info(sprintf('MFA failure count is %d.', $value));
return $value; return $value;
@@ -184,20 +185,20 @@ class TwoFactorController extends Controller
private function addToMFAHistory(string $mfaCode): void private function addToMFAHistory(string $mfaCode): void
{ {
/** @var array $mfaHistory */ /** @var array $mfaHistory */
$mfaHistory = app('preferences')->get('mfa_history', [])->data; $mfaHistory = Preferences::get('mfa_history', [])->data;
$entry = [ $entry = [
'time' => Carbon::now()->getTimestamp(), 'time' => Carbon::now()->getTimestamp(),
'code' => $mfaCode, 'code' => $mfaCode,
]; ];
$mfaHistory[] = $entry; $mfaHistory[] = $entry;
app('preferences')->set('mfa_history', $mfaHistory); Preferences::set('mfa_history', $mfaHistory);
$this->filterMFAHistory(); $this->filterMFAHistory();
} }
private function resetMFAFailureCounter(): void private function resetMFAFailureCounter(): void
{ {
app('preferences')->set('mfa_failure_count', 0); Preferences::set('mfa_failure_count', 0);
Log::channel('audit')->info('MFA failure count is set to zero.'); Log::channel('audit')->info('MFA failure count is set to zero.');
} }
@@ -206,7 +207,7 @@ class TwoFactorController extends Controller
*/ */
private function isBackupCode(string $mfaCode): bool private function isBackupCode(string $mfaCode): bool
{ {
$list = app('preferences')->get('mfa_recovery', [])->data; $list = Preferences::get('mfa_recovery', [])->data;
if (!is_array($list)) { if (!is_array($list)) {
$list = []; $list = [];
} }
@@ -219,7 +220,7 @@ class TwoFactorController extends Controller
*/ */
private function removeFromBackupCodes(string $mfaCode): void private function removeFromBackupCodes(string $mfaCode): void
{ {
$list = app('preferences')->get('mfa_recovery', [])->data; $list = Preferences::get('mfa_recovery', [])->data;
if (!is_array($list)) { if (!is_array($list)) {
$list = []; $list = [];
} }
@@ -238,6 +239,6 @@ class TwoFactorController extends Controller
event(new MFABackupNoLeft($user)); event(new MFABackupNoLeft($user));
} }
app('preferences')->set('mfa_recovery', $newList); Preferences::set('mfa_recovery', $newList);
} }
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Bill; namespace FireflyIII\Http\Controllers\Bill;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -105,7 +106,7 @@ class CreateController extends Controller
Log::channel('audit')->info('Stored new bill.', $billData); Log::channel('audit')->info('Stored new bill.', $billData);
$request->session()->flash('success', (string) trans('firefly.stored_new_bill', ['name' => $bill->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_bill', ['name' => $bill->name]));
app('preferences')->mark(); Preferences::mark();
/** @var null|array $files */ /** @var null|array $files */
$files = $request->hasFile('attachments') ? $request->file('attachments') : null; $files = $request->hasFile('attachments') ? $request->file('attachments') : null;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Bill; namespace FireflyIII\Http\Controllers\Bill;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
@@ -83,7 +84,7 @@ class DeleteController extends Controller
$this->repository->destroy($bill); $this->repository->destroy($bill);
$request->session()->flash('success', (string) trans('firefly.deleted_bill', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_bill', ['name' => $name]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('bills.delete.url')); return redirect($this->getPreviousUrl('bills.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Bill; namespace FireflyIII\Http\Controllers\Bill;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\BillUpdateRequest; use FireflyIII\Http\Requests\BillUpdateRequest;
@@ -116,7 +117,7 @@ class EditController extends Controller
Log::channel('audit')->info(sprintf('Updated bill #%d.', $bill->id), $billData); Log::channel('audit')->info(sprintf('Updated bill #%d.', $bill->id), $billData);
$request->session()->flash('success', (string) trans('firefly.updated_bill', ['name' => $bill->name])); $request->session()->flash('success', (string) trans('firefly.updated_bill', ['name' => $bill->name]));
app('preferences')->mark(); Preferences::mark();
/** @var null|array $files */ /** @var null|array $files */
$files = $request->hasFile('attachments') ? $request->file('attachments') : null; $files = $request->hasFile('attachments') ? $request->file('attachments') : null;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Bill; namespace FireflyIII\Http\Controllers\Bill;
use FireflyIII\Support\Facades\Navigation;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
@@ -151,7 +152,7 @@ class IndexController extends Controller
private function getSums(array $bills): array private function getSums(array $bills): array
{ {
$sums = []; $sums = [];
$range = app('navigation')->getViewRange(true); $range = Navigation::getViewRange(true);
/** @var array $group */ /** @var array $group */
foreach ($bills as $groupOrder => $group) { foreach ($bills as $groupOrder => $group) {

View File

@@ -24,6 +24,8 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Bill; namespace FireflyIII\Http\Controllers\Bill;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -105,7 +107,7 @@ class ShowController extends Controller
$ruleEngine->fire(); $ruleEngine->fire();
$request->session()->flash('success', trans_choice('firefly.rescanned_bill', $total)); $request->session()->flash('success', trans_choice('firefly.rescanned_bill', $total));
app('preferences')->mark(); Preferences::mark();
return redirect(route('bills.show', [$bill->id])); return redirect(route('bills.show', [$bill->id]));
} }
@@ -131,7 +133,7 @@ class ShowController extends Controller
$end = session('end'); $end = session('end');
$year = $start->year; $year = $start->year;
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$yearAverage = $this->repository->getYearAverage($bill, $start); $yearAverage = $this->repository->getYearAverage($bill, $start);
$overallAverage = $this->repository->getOverallAverage($bill); $overallAverage = $this->repository->getOverallAverage($bill);
$manager = new Manager(); $manager = new Manager();
@@ -139,8 +141,8 @@ class ShowController extends Controller
$manager->parseIncludes(['attachments', 'notes']); $manager->parseIncludes(['attachments', 'notes']);
// add another period to end, could fix 8163 // add another period to end, could fix 8163
$range = app('navigation')->getViewRange(true); $range = Navigation::getViewRange(true);
$end = app('navigation')->addPeriod($end, $range); $end = Navigation::addPeriod($end, $range);
// Make a resource out of the data and // Make a resource out of the data and
$parameters = new ParameterBag(); $parameters = new ParameterBag();

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -255,7 +256,7 @@ class BudgetLimitController extends Controller
$limit = $this->blRepository->update($budgetLimit, ['amount' => $amount, 'notes' => $notes]); $limit = $this->blRepository->update($budgetLimit, ['amount' => $amount, 'notes' => $notes]);
app('preferences')->mark(); Preferences::mark();
$array = $limit->toArray(); $array = $limit->toArray();
$spentArr = $this->opsRepository->sumExpenses( $spentArr = $this->opsRepository->sumExpenses(

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Enums\AutoBudgetType; use FireflyIII\Enums\AutoBudgetType;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
@@ -116,7 +117,7 @@ class CreateController extends Controller
$budget = $this->repository->store($data); $budget = $this->repository->store($data);
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
$request->session()->flash('success', (string) trans('firefly.stored_new_budget', ['name' => $budget->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_budget', ['name' => $budget->name]));
app('preferences')->mark(); Preferences::mark();
Log::channel('audit')->info('Stored new budget.', $data); Log::channel('audit')->info('Stored new budget.', $data);

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
@@ -82,7 +83,7 @@ class DeleteController extends Controller
$name = $budget->name; $name = $budget->name;
$this->repository->destroy($budget); $this->repository->destroy($budget);
$request->session()->flash('success', (string) trans('firefly.deleted_budget', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_budget', ['name' => $name]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('budgets.delete.url')); return redirect($this->getPreviousUrl('budgets.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Enums\AutoBudgetType; use FireflyIII\Enums\AutoBudgetType;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -126,7 +127,7 @@ class EditController extends Controller
$request->session()->flash('success', (string) trans('firefly.updated_budget', ['name' => $budget->name])); $request->session()->flash('success', (string) trans('firefly.updated_budget', ['name' => $budget->name]));
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
app('preferences')->mark(); Preferences::mark();
Log::channel('audit')->info(sprintf('Updated budget #%d.', $budget->id), $data); Log::channel('audit')->info(sprintf('Updated budget #%d.', $budget->id), $data);

View File

@@ -24,6 +24,8 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -94,11 +96,11 @@ class IndexController extends Controller
Log::debug(sprintf('Start of IndexController::index("%s", "%s")', $start?->format('Y-m-d'), $end?->format('Y-m-d'))); Log::debug(sprintf('Start of IndexController::index("%s", "%s")', $start?->format('Y-m-d'), $end?->format('Y-m-d')));
// collect some basic vars: // collect some basic vars:
$range = app('navigation')->getViewRange(true); $range = Navigation::getViewRange(true);
$isCustomRange = session('is_custom_range', false); $isCustomRange = session('is_custom_range', false);
if (false === $isCustomRange) { if (false === $isCustomRange) {
$start ??= session('start', today(config('app.timezone'))->startOfMonth()); $start ??= session('start', today(config('app.timezone'))->startOfMonth());
$end ??= app('navigation')->endOfPeriod($start, $range); $end ??= Navigation::endOfPeriod($start, $range);
} }
// overrule start and end if necessary: // overrule start and end if necessary:
@@ -112,7 +114,7 @@ class IndexController extends Controller
$spent = '0'; $spent = '0';
// new period stuff: // new period stuff:
$periodTitle = app('navigation')->periodShow($start, $range); $periodTitle = Navigation::periodShow($start, $range);
$prevLoop = $this->getPreviousPeriods($start, $range); $prevLoop = $this->getPreviousPeriods($start, $range);
$nextLoop = $this->getNextPeriods($start, $range); $nextLoop = $this->getNextPeriods($start, $range);
@@ -120,6 +122,9 @@ class IndexController extends Controller
$availableBudgets = $this->getAllAvailableBudgets($start, $end); $availableBudgets = $this->getAllAvailableBudgets($start, $end);
// get all active budgets: // get all active budgets:
$budgets = $this->getAllBudgets($start, $end, $currencies, $this->primaryCurrency); $budgets = $this->getAllBudgets($start, $end, $currencies, $this->primaryCurrency);
// echo '<pre>';
// var_dump($budgets[0]);exit;
$sums = $this->getSums($budgets); $sums = $this->getSums($budgets);
// get budgeted for default currency: // get budgeted for default currency:
@@ -307,7 +312,7 @@ class IndexController extends Controller
$repository->setBudgetOrder($budget, $index + 1); $repository->setBudgetOrder($budget, $index + 1);
} }
} }
app('preferences')->mark(); Preferences::mark();
return response()->json(['OK']); return response()->json(['OK']);
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -98,7 +99,7 @@ class ShowController extends Controller
$firstDate = $first instanceof TransactionJournal ? $first->date : $start; $firstDate = $first instanceof TransactionJournal ? $first->date : $start;
$periods = $this->getNoModelPeriodOverview('budget', $firstDate, $end); $periods = $this->getNoModelPeriodOverview('budget', $firstDate, $end);
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
@@ -126,7 +127,7 @@ class ShowController extends Controller
$start = $first instanceof TransactionJournal ? $first->date : new Carbon(); $start = $first instanceof TransactionJournal ? $first->date : new Carbon();
$end = today(config('app.timezone')); $end = today(config('app.timezone'));
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
@@ -153,7 +154,7 @@ class ShowController extends Controller
$allStart = session('first', today(config('app.timezone'))->startOfYear()); $allStart = session('first', today(config('app.timezone'))->startOfYear());
$allEnd = today(); $allEnd = today();
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$limits = $this->getLimits($budget, $allStart, $allEnd); $limits = $this->getLimits($budget, $allStart, $allEnd);
$repetition = null; $repetition = null;
$attachments = $this->repository->getAttachments($budget); $attachments = $this->repository->getAttachments($budget);
@@ -190,7 +191,7 @@ class ShowController extends Controller
$currencySymbol = $budgetLimit->transactionCurrency->symbol; $currencySymbol = $budgetLimit->transactionCurrency->symbol;
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$subTitle = trans( $subTitle = trans(
'firefly.budget_in_period', 'firefly.budget_in_period',
[ [

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Category; namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -92,7 +93,7 @@ class CreateController extends Controller
$category = $this->repository->store($data); $category = $this->repository->store($data);
$request->session()->flash('success', (string) trans('firefly.stored_category', ['name' => $category->name])); $request->session()->flash('success', (string) trans('firefly.stored_category', ['name' => $category->name]));
app('preferences')->mark(); Preferences::mark();
// store attachment(s): // store attachment(s):
/** @var null|array $files */ /** @var null|array $files */

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Category; namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
@@ -83,7 +84,7 @@ class DeleteController extends Controller
$this->repository->destroy($category); $this->repository->destroy($category);
$request->session()->flash('success', (string) trans('firefly.deleted_category', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_category', ['name' => $name]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('categories.delete.url')); return redirect($this->getPreviousUrl('categories.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Category; namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\CategoryFormRequest; use FireflyIII\Http\Requests\CategoryFormRequest;
@@ -94,7 +95,7 @@ class EditController extends Controller
$this->repository->update($category, $data); $this->repository->update($category, $data);
$request->session()->flash('success', (string) trans('firefly.updated_category', ['name' => $category->name])); $request->session()->flash('success', (string) trans('firefly.updated_category', ['name' => $category->name]));
app('preferences')->mark(); Preferences::mark();
// store new attachment(s): // store new attachment(s):
/** @var null|array $files */ /** @var null|array $files */

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Category; namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
@@ -72,7 +73,7 @@ class IndexController extends Controller
public function index(Request $request): Factory|\Illuminate\Contracts\View\View public function index(Request $request): Factory|\Illuminate\Contracts\View\View
{ {
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$collection = $this->repository->getCategories(); $collection = $this->repository->getCategories();
$total = $collection->count(); $total = $collection->count();
$collection = $collection->slice(($page - 1) * $pageSize, $pageSize); $collection = $collection->slice(($page - 1) * $pageSize, $pageSize);

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Category; namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -86,7 +87,7 @@ class NoCategoryController extends Controller
/** @var Carbon $start */ /** @var Carbon $start */
/** @var Carbon $end */ /** @var Carbon $end */
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$subTitle = trans('firefly.without_category_between', ['start' => $start->isoFormat($this->monthAndDayFormat), 'end' => $end->isoFormat($this->monthAndDayFormat)]); $subTitle = trans('firefly.without_category_between', ['start' => $start->isoFormat($this->monthAndDayFormat), 'end' => $end->isoFormat($this->monthAndDayFormat)]);
$first = $this->journalRepos->firstNull()->date ?? clone $start; $first = $this->journalRepos->firstNull()->date ?? clone $start;
$periods = $this->getNoModelPeriodOverview('category', $first, $end); $periods = $this->getNoModelPeriodOverview('category', $first, $end);
@@ -122,7 +123,7 @@ class NoCategoryController extends Controller
$end = null; $end = null;
$periods = new Collection(); $periods = new Collection();
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
Log::debug('Start of noCategory()'); Log::debug('Start of noCategory()');
$subTitle = (string) trans('firefly.all_journals_without_category'); $subTitle = (string) trans('firefly.all_journals_without_category');
$first = $this->journalRepos->firstNull(); $first = $this->journalRepos->firstNull();

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Category; namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
@@ -86,7 +87,7 @@ class ShowController extends Controller
$subTitleIcon = 'fa-bookmark'; $subTitleIcon = 'fa-bookmark';
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$attachments = $this->repository->getAttachments($category); $attachments = $this->repository->getAttachments($category);
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$oldest = $this->repository->firstUseDate($category) ?? today(config('app.timezone'))->startOfYear(); $oldest = $this->repository->firstUseDate($category) ?? today(config('app.timezone'))->startOfYear();
$periods = $this->getCategoryPeriodOverview($category, $oldest, $end); $periods = $this->getCategoryPeriodOverview($category, $oldest, $end);
$path = route('categories.show', [$category->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); $path = route('categories.show', [$category->id, $start->format('Y-m-d'), $end->format('Y-m-d')]);
@@ -125,7 +126,7 @@ class ShowController extends Controller
// default values: // default values:
$subTitleIcon = 'fa-bookmark'; $subTitleIcon = 'fa-bookmark';
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$start = null; $start = null;
$end = null; $end = null;
$periods = new Collection(); $periods = new Collection();

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
@@ -514,7 +515,7 @@ class AccountController extends Controller
// have to make sure this chart is always based on the balance at the END of the period. // have to make sure this chart is always based on the balance at the END of the period.
// This period depends on the size of the chart // This period depends on the size of the chart
$current = clone $start; $current = clone $start;
$current = app('navigation')->endOfX($current, $step, null); $current = Navigation::endOfX($current, $step, null);
$format = (string)trans('config.month_and_day_js', [], $locale); $format = (string)trans('config.month_and_day_js', [], $locale);
$accountCurrency = $this->accountRepository->getAccountCurrency($account); $accountCurrency = $this->accountRepository->getAccountCurrency($account);
Log::debug('Get and filter balance for entire range start'); Log::debug('Get and filter balance for entire range start');
@@ -574,9 +575,9 @@ class AccountController extends Controller
$label = $current->isoFormat($format); $label = $current->isoFormat($format);
$return[$key]['entries'][$label] = $amount; $return[$key]['entries'][$label] = $amount;
} }
$current = app('navigation')->addPeriod($current, $step); $current = Navigation::addPeriod($current, $step);
// here too, to fix #8041, the data is corrected to the end of the period. // here too, to fix #8041, the data is corrected to the end of the period.
$current = app('navigation')->endOfX($current, $step, null); $current = Navigation::endOfX($current, $step, null);
} }
Log::debug('End of chart loop.'); Log::debug('End of chart loop.');
// second loop (yes) to create nice array with info! Yay! // second loop (yes) to create nice array with info! Yay!

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -81,8 +82,8 @@ class CategoryController extends Controller
/** @var CategoryRepositoryInterface $repository */ /** @var CategoryRepositoryInterface $repository */
$repository = app(CategoryRepositoryInterface::class); $repository = app(CategoryRepositoryInterface::class);
$start = $repository->firstUseDate($category) ?? $this->getDate(); $start = $repository->firstUseDate($category) ?? $this->getDate();
$range = app('navigation')->getViewRange(false); $range = Navigation::getViewRange(false);
$start = app('navigation')->startOfPeriod($start, $range); $start = Navigation::startOfPeriod($start, $range);
$end = $this->getDate(); $end = $this->getDate();
/** @var WholePeriodChartGenerator $chartGenerator */ /** @var WholePeriodChartGenerator $chartGenerator */
@@ -178,8 +179,8 @@ class CategoryController extends Controller
$income = $opsRepository->listIncome($start, $end, $accounts, $collection); $income = $opsRepository->listIncome($start, $end, $accounts, $collection);
} }
$currencies = array_unique(array_merge(array_keys($income), array_keys($expenses))); $currencies = array_unique(array_merge(array_keys($income), array_keys($expenses)));
$periods = app('navigation')->listOfPeriods($start, $end); $periods = Navigation::listOfPeriods($start, $end);
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
$chartData = []; $chartData = [];
// make empty data array: // make empty data array:
// double foreach (bad) to make empty array: // double foreach (bad) to make empty array:
@@ -260,8 +261,8 @@ class CategoryController extends Controller
*/ */
public function specificPeriod(Category $category, Carbon $date): JsonResponse public function specificPeriod(Category $category, Carbon $date): JsonResponse
{ {
$range = app('navigation')->getViewRange(false); $range = Navigation::getViewRange(false);
$start = app('navigation')->startOfPeriod($date, $range); $start = Navigation::startOfPeriod($date, $range);
$end = session()->get('end'); $end = session()->get('end');
if ($end < $start) { if ($end < $start) {
[$end, $start] = [$start, $end]; [$end, $start] = [$start, $end];

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -210,7 +211,7 @@ class CategoryReportController extends Controller
$chartData = []; $chartData = [];
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, new Collection()->push($category)); $spent = $this->opsRepository->listExpenses($start, $end, $accounts, new Collection()->push($category));
$earned = $this->opsRepository->listIncome($start, $end, $accounts, new Collection()->push($category)); $earned = $this->opsRepository->listIncome($start, $end, $accounts, new Collection()->push($category));
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
// loop expenses. // loop expenses.
foreach ($spent as $currency) { foreach ($spent as $currency) {
// add things to chart Data for each currency: // add things to chart Data for each currency:
@@ -276,11 +277,11 @@ class CategoryReportController extends Controller
private function makeEntries(Carbon $start, Carbon $end): array private function makeEntries(Carbon $start, Carbon $end): array
{ {
$return = []; $return = [];
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
$preferredRange = app('navigation')->preferredRangeFormat($start, $end); $preferredRange = Navigation::preferredRangeFormat($start, $end);
$currentStart = clone $start; $currentStart = clone $start;
while ($currentStart <= $end) { while ($currentStart <= $end) {
$currentEnd = app('navigation')->endOfPeriod($currentStart, $preferredRange); $currentEnd = Navigation::endOfPeriod($currentStart, $preferredRange);
$key = $currentStart->isoFormat($format); $key = $currentStart->isoFormat($format);
$return[$key] = '0'; $return[$key] = '0';
$currentStart = clone $currentEnd; $currentStart = clone $currentEnd;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -154,7 +155,7 @@ class DoubleReportController extends Controller
$accounts = $accounts->merge($opposing); $accounts = $accounts->merge($opposing);
$spent = $this->opsRepository->listExpenses($start, $end, $accounts); $spent = $this->opsRepository->listExpenses($start, $end, $accounts);
$earned = $this->opsRepository->listIncome($start, $end, $accounts); $earned = $this->opsRepository->listIncome($start, $end, $accounts);
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
// loop expenses. // loop expenses.
foreach ($spent as $currency) { foreach ($spent as $currency) {
@@ -238,11 +239,11 @@ class DoubleReportController extends Controller
private function makeEntries(Carbon $start, Carbon $end): array private function makeEntries(Carbon $start, Carbon $end): array
{ {
$return = []; $return = [];
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
$preferredRange = app('navigation')->preferredRangeFormat($start, $end); $preferredRange = Navigation::preferredRangeFormat($start, $end);
$currentStart = clone $start; $currentStart = clone $start;
while ($currentStart <= $end) { while ($currentStart <= $end) {
$currentEnd = app('navigation')->endOfPeriod($currentStart, $preferredRange); $currentEnd = Navigation::endOfPeriod($currentStart, $preferredRange);
$key = $currentStart->isoFormat($format); $key = $currentStart->isoFormat($format);
$return[$key] = '0'; $return[$key] = '0';
$currentStart = clone $currentEnd; $currentStart = clone $currentEnd;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -83,8 +84,8 @@ class ExpenseReportController extends Controller
return response()->json($cache->get()); return response()->json($cache->get());
} }
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
$function = app('navigation')->preferredEndOfPeriod($start, $end); $function = Navigation::preferredEndOfPeriod($start, $end);
$chartData = []; $chartData = [];
$currentStart = clone $start; $currentStart = clone $start;
$combined = $this->combineAccounts($expense); $combined = $this->combineAccounts($expense);

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -92,7 +93,7 @@ class PiggyBankController extends Controller
$currentSum = $filtered->sum('amount'); $currentSum = $filtered->sum('amount');
$label = $oldest->isoFormat((string) trans('config.month_and_day_js', [], $locale)); $label = $oldest->isoFormat((string) trans('config.month_and_day_js', [], $locale));
$chartData[$label] = $currentSum; $chartData[$label] = $currentSum;
$oldest = app('navigation')->addPeriod($oldest, $step); $oldest = Navigation::addPeriod($oldest, $step);
} }
$finalFiltered = $set->filter( $finalFiltered = $set->filter(
static fn (PiggyBankEvent $event) => $event->date->lte($today) static fn (PiggyBankEvent $event) => $event->date->lte($today)

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
@@ -154,9 +155,9 @@ class ReportController extends Controller
Log::debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray()); Log::debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray());
Log::debug(sprintf('Period: %s to %s', $start->toW3cString(), $end->toW3cString())); Log::debug(sprintf('Period: %s to %s', $start->toW3cString(), $end->toW3cString()));
$format = app('navigation')->preferredCarbonFormat($start, $end); $format = Navigation::preferredCarbonFormat($start, $end);
$titleFormat = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $titleFormat = Navigation::preferredCarbonLocalizedFormat($start, $end);
$preferredRange = app('navigation')->preferredRangeFormat($start, $end); $preferredRange = Navigation::preferredRangeFormat($start, $end);
$ids = $accounts->pluck('id')->toArray(); $ids = $accounts->pluck('id')->toArray();
$data = []; $data = [];
$chartData = []; $chartData = [];
@@ -242,7 +243,7 @@ class ReportController extends Controller
// #8374. Sloppy fix for yearly charts. Not really interested in a better fix with v2 layout and all. // #8374. Sloppy fix for yearly charts. Not really interested in a better fix with v2 layout and all.
if ('1Y' === $preferredRange) { if ('1Y' === $preferredRange) {
$currentEnd = app('navigation')->endOfPeriod($currentEnd, $preferredRange); $currentEnd = Navigation::endOfPeriod($currentEnd, $preferredRange);
} }
Log::debug('Start of sub-loop'); Log::debug('Start of sub-loop');
while ($currentStart <= $currentEnd) { while ($currentStart <= $currentEnd) {
@@ -260,7 +261,7 @@ class ReportController extends Controller
$expense['entries'][$title] = '0'; $expense['entries'][$title] = '0';
} }
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange); $currentStart = Navigation::addPeriod($currentStart, $preferredRange);
} }
Log::debug('End of sub-loop'); Log::debug('End of sub-loop');

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -214,7 +215,7 @@ class TagReportController extends Controller
$chartData = []; $chartData = [];
$spent = $this->opsRepository->listExpenses($start, $end, $accounts, new Collection()->push($tag)); $spent = $this->opsRepository->listExpenses($start, $end, $accounts, new Collection()->push($tag));
$earned = $this->opsRepository->listIncome($start, $end, $accounts, new Collection()->push($tag)); $earned = $this->opsRepository->listIncome($start, $end, $accounts, new Collection()->push($tag));
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
// loop expenses. // loop expenses.
foreach ($spent as $currency) { foreach ($spent as $currency) {
@@ -281,11 +282,11 @@ class TagReportController extends Controller
private function makeEntries(Carbon $start, Carbon $end): array private function makeEntries(Carbon $start, Carbon $end): array
{ {
$return = []; $return = [];
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = Navigation::preferredCarbonLocalizedFormat($start, $end);
$preferredRange = app('navigation')->preferredRangeFormat($start, $end); $preferredRange = Navigation::preferredRangeFormat($start, $end);
$currentStart = clone $start; $currentStart = clone $start;
while ($currentStart <= $end) { while ($currentStart <= $end) {
$currentEnd = app('navigation')->endOfPeriod($currentStart, $preferredRange); $currentEnd = Navigation::endOfPeriod($currentStart, $preferredRange);
$key = $currentStart->isoFormat($format); $key = $currentStart->isoFormat($format);
$return[$key] = '0'; $return[$key] = '0';
$currentStart = clone $currentEnd; $currentStart = clone $currentEnd;

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\InvalidFormatException;
use Exception; use Exception;
@@ -146,7 +147,7 @@ class HomeController extends Controller
$count = $repository->count($types); $count = $repository->count($types);
$subTitle = (string) trans('firefly.welcome_back'); $subTitle = (string) trans('firefly.welcome_back');
$transactions = []; $transactions = [];
$frontpage = app('preferences')->getFresh('frontpageAccounts', $repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray()); $frontpage = Preferences::getFresh('frontpageAccounts', $repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray());
$frontpageArray = $frontpage->data; $frontpageArray = $frontpage->data;
if (!is_array($frontpageArray)) { if (!is_array($frontpageArray)) {
$frontpageArray = []; $frontpageArray = [];

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -107,7 +108,7 @@ class JavascriptController extends Controller
$locale = app('steam')->getLocale(); $locale = app('steam')->getLocale();
$accounting = app('amount')->getJsConfig(); $accounting = app('amount')->getJsConfig();
$accounting['frac_digits'] = $currency->decimal_places; $accounting['frac_digits'] = $currency->decimal_places;
$pref = app('preferences')->get('language', config('firefly.default_language', 'en_US')); $pref = Preferences::get('language', config('firefly.default_language', 'en_US'));
$lang = $pref->data; $lang = $pref->data;
$dateRange = $this->getDateRangeConfig(); $dateRange = $this->getDateRangeConfig();
$uid = substr(hash('sha256', sprintf('%s-%s-%s', (string) config('app.key'), auth()->user()->id, auth()->user()->email)), 0, 12); $uid = substr(hash('sha256', sprintf('%s-%s-%s', (string) config('app.key'), auth()->user()->id, auth()->user()->email)), 0, 12);

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Json; namespace FireflyIII\Http\Controllers\Json;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Support\Http\Controllers\GetConfigurationData; use FireflyIII\Support\Http\Controllers\GetConfigurationData;
@@ -98,8 +99,8 @@ class IntroController extends Controller
$key = sprintf('%s_%s', $key, $specialPage); $key = sprintf('%s_%s', $key, $specialPage);
} }
Log::debug(sprintf('Going to mark the following route as NOT done: %s with special "%s" (%s)', $route, $specialPage, $key)); Log::debug(sprintf('Going to mark the following route as NOT done: %s with special "%s" (%s)', $route, $specialPage, $key));
app('preferences')->set($key, false); Preferences::set($key, false);
app('preferences')->mark(); Preferences::mark();
return response()->json(['message' => (string) trans('firefly.intro_boxes_after_refresh')]); return response()->json(['message' => (string) trans('firefly.intro_boxes_after_refresh')]);
} }
@@ -115,7 +116,7 @@ class IntroController extends Controller
$key = sprintf('%s_%s', $key, $specialPage); $key = sprintf('%s_%s', $key, $specialPage);
} }
Log::debug(sprintf('Going to mark the following route as done: %s with special "%s" (%s)', $route, $specialPage, $key)); Log::debug(sprintf('Going to mark the following route as done: %s with special "%s" (%s)', $route, $specialPage, $key));
app('preferences')->set($key, true); Preferences::set($key, true);
return response()->json(['result' => sprintf('Reported demo watched for route "%s" (%s): %s.', $route, $specialPage, $key)]); return response()->json(['result' => sprintf('Reported demo watched for route "%s" (%s): %s.', $route, $specialPage, $key)]);
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Http\Requests\NewUserFormRequest; use FireflyIII\Http\Requests\NewUserFormRequest;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
@@ -92,7 +93,7 @@ class NewUserController extends Controller
} }
// set language preference: // set language preference:
app('preferences')->set('language', $language); Preferences::set('language', $language);
// Store currency preference from input: // Store currency preference from input:
$currency = $currencyRepository->find((int) $request->input('amount_currency_id_bank_balance')); $currency = $currencyRepository->find((int) $request->input('amount_currency_id_bank_balance'));
@@ -111,10 +112,10 @@ class NewUserController extends Controller
// store frontpage preferences: // store frontpage preferences:
$accounts = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray(); $accounts = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
app('preferences')->set('frontpageAccounts', $accounts); Preferences::set('frontpageAccounts', $accounts);
// mark. // mark.
app('preferences')->mark(); Preferences::mark();
// set default optional fields: // set default optional fields:
$visibleFields = [ $visibleFields = [
@@ -128,10 +129,10 @@ class NewUserController extends Controller
'notes' => true, 'notes' => true,
'attachments' => true, 'attachments' => true,
]; ];
app('preferences')->set('transaction_journal_optional_fields', $visibleFields); Preferences::set('transaction_journal_optional_fields', $visibleFields);
session()->flash('success', (string) trans('firefly.stored_new_accounts_new_user')); session()->flash('success', (string) trans('firefly.stored_new_accounts_new_user'));
app('preferences')->mark(); Preferences::mark();
return redirect(route('index')); return redirect(route('index'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\ObjectGroup; namespace FireflyIII\Http\Controllers\ObjectGroup;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\ObjectGroup;
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
@@ -77,7 +78,7 @@ class DeleteController extends Controller
public function destroy(ObjectGroup $objectGroup): RedirectResponse public function destroy(ObjectGroup $objectGroup): RedirectResponse
{ {
session()->flash('success', (string) trans('firefly.deleted_object_group', ['title' => $objectGroup->title])); session()->flash('success', (string) trans('firefly.deleted_object_group', ['title' => $objectGroup->title]));
app('preferences')->mark(); Preferences::mark();
$this->repository->destroy($objectGroup); $this->repository->destroy($objectGroup);
return redirect($this->getPreviousUrl('object-groups.delete.url')); return redirect($this->getPreviousUrl('object-groups.delete.url'));

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\ObjectGroup; namespace FireflyIII\Http\Controllers\ObjectGroup;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\ObjectGroupFormRequest; use FireflyIII\Http\Requests\ObjectGroupFormRequest;
use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\ObjectGroup;
@@ -87,7 +88,7 @@ class EditController extends Controller
$piggyBank = $this->repository->update($objectGroup, $data); $piggyBank = $this->repository->update($objectGroup, $data);
session()->flash('success', (string) trans('firefly.updated_object_group', ['title' => $objectGroup->title])); session()->flash('success', (string) trans('firefly.updated_object_group', ['title' => $objectGroup->title]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('object-groups.edit.url')); $redirect = redirect($this->getPreviousUrl('object-groups.edit.url'));

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\PiggyBank; namespace FireflyIII\Http\Controllers\PiggyBank;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@@ -167,7 +168,7 @@ class AmountController extends Controller
} }
if (0 !== bccomp($total, '0')) { if (0 !== bccomp($total, '0')) {
session()->flash('success', (string) trans('firefly.added_amount_to_piggy', ['amount' => app('amount')->formatAnything($piggyBank->transactionCurrency, $total, false), 'name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.added_amount_to_piggy', ['amount' => app('amount')->formatAnything($piggyBank->transactionCurrency, $total, false), 'name' => $piggyBank->name]));
app('preferences')->mark(); Preferences::mark();
return redirect(route('piggy-banks.index')); return redirect(route('piggy-banks.index'));
} }
@@ -216,7 +217,7 @@ class AmountController extends Controller
['amount' => app('amount')->formatAnything($piggyBank->transactionCurrency, $total, false), 'name' => $piggyBank->name] ['amount' => app('amount')->formatAnything($piggyBank->transactionCurrency, $total, false), 'name' => $piggyBank->name]
) )
); );
app('preferences')->mark(); Preferences::mark();
return redirect(route('piggy-banks.index')); return redirect(route('piggy-banks.index'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\PiggyBank; namespace FireflyIII\Http\Controllers\PiggyBank;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -75,6 +76,9 @@ class CreateController extends Controller
$subTitleIcon = 'fa-plus'; $subTitleIcon = 'fa-plus';
$request->old('_token'); $request->old('_token');
$preFilled = $request->old(); $preFilled = $request->old();
if (!array_key_exists('transaction_currency_id', $preFilled)) {
$preFilled['transaction_currency_id'] = $this->primaryCurrency->id;
}
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
if (true !== session('piggy-banks.create.fromStore')) { if (true !== session('piggy-banks.create.fromStore')) {
@@ -103,7 +107,7 @@ class CreateController extends Controller
session()->flash('success', (string) trans('firefly.stored_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.stored_piggy_bank', ['name' => $piggyBank->name]));
session()->flash('success_url', route('piggy-banks.show', [$piggyBank->id])); session()->flash('success_url', route('piggy-banks.show', [$piggyBank->id]));
app('preferences')->mark(); Preferences::mark();
// store attachment(s): // store attachment(s):
/** @var null|array $files */ /** @var null|array $files */

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\PiggyBank; namespace FireflyIII\Http\Controllers\PiggyBank;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
@@ -78,7 +79,7 @@ class DeleteController extends Controller
public function destroy(PiggyBank $piggyBank): RedirectResponse public function destroy(PiggyBank $piggyBank): RedirectResponse
{ {
session()->flash('success', (string) trans('firefly.deleted_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.deleted_piggy_bank', ['name' => $piggyBank->name]));
app('preferences')->mark(); Preferences::mark();
$this->piggyRepos->destroy($piggyBank); $this->piggyRepos->destroy($piggyBank);
return redirect($this->getPreviousUrl('piggy-banks.delete.url')); return redirect($this->getPreviousUrl('piggy-banks.delete.url'));

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\PiggyBank; namespace FireflyIII\Http\Controllers\PiggyBank;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\PiggyBankUpdateRequest; use FireflyIII\Http\Requests\PiggyBankUpdateRequest;
@@ -121,7 +122,7 @@ class EditController extends Controller
$piggyBank = $this->piggyRepos->update($piggyBank, $data); $piggyBank = $this->piggyRepos->update($piggyBank, $data);
session()->flash('success', (string) trans('firefly.updated_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.updated_piggy_bank', ['name' => $piggyBank->name]));
app('preferences')->mark(); Preferences::mark();
// store new attachment(s): // store new attachment(s):
/** @var null|array $files */ /** @var null|array $files */

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Events\Preferences\UserGroupChangedPrimaryCurrency; use FireflyIII\Events\Preferences\UserGroupChangedPrimaryCurrency;
@@ -101,7 +102,7 @@ class PreferencesController extends Controller
/** @var array<int, int> $accountIds */ /** @var array<int, int> $accountIds */
$accountIds = $accounts->pluck('id')->toArray(); $accountIds = $accounts->pluck('id')->toArray();
$viewRange = app('navigation')->getViewRange(false); $viewRange = Navigation::getViewRange(false);
$frontpageAccountsPref = Preferences::get('frontpageAccounts', $accountIds); $frontpageAccountsPref = Preferences::get('frontpageAccounts', $accountIds);
$frontpageAccounts = $frontpageAccountsPref->data; $frontpageAccounts = $frontpageAccountsPref->data;
if (!is_array($frontpageAccounts)) { if (!is_array($frontpageAccounts)) {

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Profile; namespace FireflyIII\Http\Controllers\Profile;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Events\Security\DisabledMFA; use FireflyIII\Events\Security\DisabledMFA;
use FireflyIII\Events\Security\EnabledMFA; use FireflyIII\Events\Security\EnabledMFA;
@@ -124,8 +125,8 @@ class MfaController extends Controller
; ;
$codes = implode("\r\n", $recoveryCodes); $codes = implode("\r\n", $recoveryCodes);
app('preferences')->set('mfa_recovery', $recoveryCodes); Preferences::set('mfa_recovery', $recoveryCodes);
app('preferences')->mark(); Preferences::mark();
// send user notification. // send user notification.
$user = auth()->user(); $user = auth()->user();
@@ -172,10 +173,10 @@ class MfaController extends Controller
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
app('preferences')->delete('temp-mfa-secret'); Preferences::delete('temp-mfa-secret');
app('preferences')->delete('temp-mfa-codes'); Preferences::delete('temp-mfa-codes');
$repository->setMFACode($user, null); $repository->setMFACode($user, null);
app('preferences')->mark(); Preferences::mark();
session()->flash('success', (string) trans('firefly.pref_two_factor_auth_disabled')); session()->flash('success', (string) trans('firefly.pref_two_factor_auth_disabled'));
session()->flash('info', (string) trans('firefly.pref_two_factor_auth_remove_it')); session()->flash('info', (string) trans('firefly.pref_two_factor_auth_remove_it'));
@@ -218,7 +219,7 @@ class MfaController extends Controller
$secret = Google2FA::generateSecretKey(); $secret = Google2FA::generateSecretKey();
$image = Google2FA::getQRCodeInline($domain, auth()->user()->email, $secret); $image = Google2FA::getQRCodeInline($domain, auth()->user()->email, $secret);
app('preferences')->set('temp-mfa-secret', $secret); Preferences::set('temp-mfa-secret', $secret);
return view('profile.mfa.enable-mfa', ['image' => $image, 'secret' => $secret]); return view('profile.mfa.enable-mfa', ['image' => $image, 'secret' => $secret]);
@@ -252,7 +253,7 @@ class MfaController extends Controller
/** @var UserRepositoryInterface $repository */ /** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class); $repository = app(UserRepositoryInterface::class);
$secret = app('preferences')->get('temp-mfa-secret')?->data; $secret = Preferences::get('temp-mfa-secret')?->data;
if (is_array($secret)) { if (is_array($secret)) {
$secret = null; $secret = null;
} }
@@ -260,10 +261,10 @@ class MfaController extends Controller
$repository->setMFACode($user, $secret); $repository->setMFACode($user, $secret);
app('preferences')->delete('temp-mfa-secret'); Preferences::delete('temp-mfa-secret');
session()->flash('success', (string) trans('firefly.saved_preferences')); session()->flash('success', (string) trans('firefly.saved_preferences'));
app('preferences')->mark(); Preferences::mark();
// also save the code so replay attack is prevented. // also save the code so replay attack is prevented.
$mfaCode = $request->get('code'); $mfaCode = $request->get('code');
@@ -293,14 +294,14 @@ class MfaController extends Controller
private function addToMFAHistory(string $mfaCode): void private function addToMFAHistory(string $mfaCode): void
{ {
/** @var array $mfaHistory */ /** @var array $mfaHistory */
$mfaHistory = app('preferences')->get('mfa_history', [])->data; $mfaHistory = Preferences::get('mfa_history', [])->data;
$entry = [ $entry = [
'time' => Carbon::now()->getTimestamp(), 'time' => Carbon::now()->getTimestamp(),
'code' => $mfaCode, 'code' => $mfaCode,
]; ];
$mfaHistory[] = $entry; $mfaHistory[] = $entry;
app('preferences')->set('mfa_history', $mfaHistory); Preferences::set('mfa_history', $mfaHistory);
$this->filterMFAHistory(); $this->filterMFAHistory();
} }
@@ -310,7 +311,7 @@ class MfaController extends Controller
private function filterMFAHistory(): void private function filterMFAHistory(): void
{ {
/** @var array $mfaHistory */ /** @var array $mfaHistory */
$mfaHistory = app('preferences')->get('mfa_history', [])->data; $mfaHistory = Preferences::get('mfa_history', [])->data;
$newHistory = []; $newHistory = [];
$now = Carbon::now()->getTimestamp(); $now = Carbon::now()->getTimestamp();
foreach ($mfaHistory as $entry) { foreach ($mfaHistory as $entry) {
@@ -323,7 +324,7 @@ class MfaController extends Controller
]; ];
} }
} }
app('preferences')->set('mfa_history', $newHistory); Preferences::set('mfa_history', $newHistory);
} }
public function index(): Factory|RedirectResponse|View public function index(): Factory|RedirectResponse|View

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Exception; use Exception;
use FireflyIII\Events\UserChangedEmail; use FireflyIII\Events\UserChangedEmail;
@@ -98,7 +99,7 @@ class ProfileController extends Controller
// find preference with this token value. // find preference with this token value.
/** @var Collection $set */ /** @var Collection $set */
$set = app('preferences')->findByName('email_change_confirm_token'); $set = Preferences::findByName('email_change_confirm_token');
$user = null; $user = null;
/** @var Preference $preference */ /** @var Preference $preference */
@@ -112,6 +113,8 @@ class ProfileController extends Controller
throw new FireflyException('Invalid token.'); throw new FireflyException('Invalid token.');
} }
$repository->unblockUser($user); $repository->unblockUser($user);
// also remove the "remote_guard_alt_email" preference.
Preferences::delete('remote_guard_alt_email');
// return to log in. // return to log in.
session()->flash('success', (string) trans('firefly.login_with_new_email')); session()->flash('success', (string) trans('firefly.login_with_new_email'));
@@ -151,7 +154,7 @@ class ProfileController extends Controller
$subTitle = $user->email; $subTitle = $user->email;
$userId = $user->id; $userId = $user->id;
$enabled2FA = null !== $user->mfa_secret; $enabled2FA = null !== $user->mfa_secret;
$recoveryData = app('preferences')->get('mfa_recovery', [])->data; $recoveryData = Preferences::get('mfa_recovery', [])->data;
if (!is_array($recoveryData)) { if (!is_array($recoveryData)) {
$recoveryData = []; $recoveryData = [];
} }
@@ -165,10 +168,10 @@ class ProfileController extends Controller
$repository->createPersonalAccessClient(null, $name, 'http://localhost'); $repository->createPersonalAccessClient(null, $name, 'http://localhost');
} }
$accessToken = app('preferences')->get('access_token'); $accessToken = Preferences::get('access_token');
if (null === $accessToken) { if (null === $accessToken) {
$token = $user->generateAccessToken(); $token = $user->generateAccessToken();
$accessToken = app('preferences')->set('access_token', $token); $accessToken = Preferences::set('access_token', $token);
} }
return view( return view(
@@ -374,7 +377,7 @@ class ProfileController extends Controller
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$token = $user->generateAccessToken(); $token = $user->generateAccessToken();
app('preferences')->set('access_token', $token); Preferences::set('access_token', $token);
session()->flash('success', (string) trans('firefly.token_regenerated')); session()->flash('success', (string) trans('firefly.token_regenerated'));
return redirect(route('profile.index')); return redirect(route('profile.index'));
@@ -392,7 +395,7 @@ class ProfileController extends Controller
} }
// find preference with this token value. // find preference with this token value.
$set = app('preferences')->findByName('email_change_undo_token'); $set = Preferences::findByName('email_change_undo_token');
$user = null; $user = null;
/** @var Preference $preference */ /** @var Preference $preference */
@@ -406,7 +409,7 @@ class ProfileController extends Controller
} }
// found user.which email address to return to? // found user.which email address to return to?
$set = app('preferences')->beginsWith($user, 'previous_email_'); $set = Preferences::beginsWith($user, 'previous_email_');
/** @var null|string $match */ /** @var null|string $match */
$match = null; $match = null;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Enums\RecurrenceRepetitionWeekend; use FireflyIII\Enums\RecurrenceRepetitionWeekend;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
@@ -228,7 +229,7 @@ class CreateController extends Controller
Log::channel('audit')->info('Stored new recurrence.', $data); Log::channel('audit')->info('Stored new recurrence.', $data);
$request->session()->flash('success', (string) trans('firefly.stored_new_recurrence', ['title' => $recurrence->title])); $request->session()->flash('success', (string) trans('firefly.stored_new_recurrence', ['title' => $recurrence->title]));
app('preferences')->mark(); Preferences::mark();
// store attachment(s): // store attachment(s):
/** @var null|array $files */ /** @var null|array $files */

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
@@ -83,7 +84,7 @@ class DeleteController extends Controller
{ {
$repository->destroy($recurrence); $repository->destroy($recurrence);
$request->session()->flash('success', (string) trans('firefly.recurrence_deleted', ['title' => $recurrence->title])); $request->session()->flash('success', (string) trans('firefly.recurrence_deleted', ['title' => $recurrence->title]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('recurrences.delete.url')); return redirect($this->getPreviousUrl('recurrences.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Enums\RecurrenceRepetitionWeekend; use FireflyIII\Enums\RecurrenceRepetitionWeekend;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
@@ -173,15 +174,15 @@ class EditController extends Controller
*/ */
public function update(RecurrenceFormRequest $request, Recurrence $recurrence) public function update(RecurrenceFormRequest $request, Recurrence $recurrence)
{ {
$data = $request->getAll(); $data = $request->getAll();
$this->repository->update($recurrence, $data); $recurrence = $this->repository->update($recurrence, $data);
$request->session()->flash('success', (string) trans('firefly.updated_recurrence', ['title' => $recurrence->title])); $request->session()->flash('success', (string) trans('firefly.updated_recurrence', ['title' => $recurrence->title]));
Log::channel('audit')->info(sprintf('Updated recurrence #%d.', $recurrence->id), $data); Log::channel('audit')->info(sprintf('Updated recurrence #%d.', $recurrence->id), $data);
// store new attachment(s): // store new attachment(s):
/** @var null|array $files */ /** @var null|array $files */
$files = $request->hasFile('attachments') ? $request->file('attachments') : null; $files = $request->hasFile('attachments') ? $request->file('attachments') : null;
if (null !== $files && !auth()->user()->hasRole('demo')) { if (null !== $files && !auth()->user()->hasRole('demo')) {
$this->attachments->saveAttachmentsForModel($recurrence, $files); $this->attachments->saveAttachmentsForModel($recurrence, $files);
} }
@@ -193,8 +194,8 @@ class EditController extends Controller
if (count($this->attachments->getMessages()->get('attachments')) > 0) { if (count($this->attachments->getMessages()->get('attachments')) > 0) {
$request->session()->flash('info', $this->attachments->getMessages()->get('attachments')); $request->session()->flash('info', $this->attachments->getMessages()->get('attachments'));
} }
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('recurrences.edit.url')); $redirect = redirect($this->getPreviousUrl('recurrences.edit.url'));
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// set value so edit routine will not overwrite URL: // set value so edit routine will not overwrite URL:
$request->session()->put('recurrences.edit.fromUpdate', true); $request->session()->put('recurrences.edit.fromUpdate', true);

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -82,7 +83,7 @@ class IndexController extends Controller
public function index(Request $request): Factory|\Illuminate\Contracts\View\View public function index(Request $request): Factory|\Illuminate\Contracts\View\View
{ {
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$collection = $this->repository->get(); $collection = $this->repository->get();
$today = today(config('app.timezone')); $today = today(config('app.timezone'));
$year = today(config('app.timezone')); $year = today(config('app.timezone'));

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Report; namespace FireflyIII\Http\Controllers\Report;
use FireflyIII\Support\Facades\Navigation;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -485,7 +486,7 @@ class CategoryController extends Controller
// depending on the carbon format (a reliable way to determine the general date difference) // depending on the carbon format (a reliable way to determine the general date difference)
// change the "listOfPeriods" call so the entire period gets included correctly. // change the "listOfPeriods" call so the entire period gets included correctly.
$format = app('navigation')->preferredCarbonFormat($start, $end); $format = Navigation::preferredCarbonFormat($start, $end);
if ('Y' === $format) { if ('Y' === $format) {
$start->startOfYear(); $start->startOfYear();
@@ -494,7 +495,7 @@ class CategoryController extends Controller
$start->startOfMonth(); $start->startOfMonth();
} }
$periods = app('navigation')->listOfPeriods($start, $end); $periods = Navigation::listOfPeriods($start, $end);
$data = []; $data = [];
$with = $this->opsRepository->listExpenses($start, $end, $accounts); $with = $this->opsRepository->listExpenses($start, $end, $accounts);
$without = $this->noCatRepository->listExpenses($start, $end, $accounts); $without = $this->noCatRepository->listExpenses($start, $end, $accounts);
@@ -559,7 +560,7 @@ class CategoryController extends Controller
// depending on the carbon format (a reliable way to determine the general date difference) // depending on the carbon format (a reliable way to determine the general date difference)
// change the "listOfPeriods" call so the entire period gets included correctly. // change the "listOfPeriods" call so the entire period gets included correctly.
$format = app('navigation')->preferredCarbonFormat($start, $end); $format = Navigation::preferredCarbonFormat($start, $end);
if ('Y' === $format) { if ('Y' === $format) {
$start->startOfYear(); $start->startOfYear();
@@ -568,7 +569,7 @@ class CategoryController extends Controller
$start->startOfMonth(); $start->startOfMonth();
} }
$periods = app('navigation')->listOfPeriods($start, $end); $periods = Navigation::listOfPeriods($start, $end);
$data = []; $data = [];
$with = $this->opsRepository->listIncome($start, $end, $accounts); $with = $this->opsRepository->listIncome($start, $end, $accounts);
$without = $this->noCatRepository->listIncome($start, $end, $accounts); $without = $this->noCatRepository->listIncome($start, $end, $accounts);

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
@@ -227,7 +228,7 @@ class ReportController extends Controller
/** @var Carbon $start */ /** @var Carbon $start */
$start = clone session('first', today(config('app.timezone'))); $start = clone session('first', today(config('app.timezone')));
$months = $this->helper->listOfMonths($start); $months = $this->helper->listOfMonths($start);
$customFiscalYear = app('preferences')->get('customFiscalYear', 0)->data; $customFiscalYear = Preferences::get('customFiscalYear', 0)->data;
$accounts = $repository->getAccountsByType( $accounts = $repository->getAccountsByType(
[AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value] [AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value]
); );

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Rule; namespace FireflyIII\Http\Controllers\Rule;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RuleFormRequest; use FireflyIII\Http\Requests\RuleFormRequest;
@@ -269,7 +270,7 @@ class CreateController extends Controller
$rule = $this->ruleRepos->store($data); $rule = $this->ruleRepos->store($data);
session()->flash('success_url', route('rules.select-transactions', [$rule->id])); session()->flash('success_url', route('rules.select-transactions', [$rule->id]));
session()->flash('success', (string) trans('firefly.stored_new_rule', ['title' => $rule->title])); session()->flash('success', (string) trans('firefly.stored_new_rule', ['title' => $rule->title]));
app('preferences')->mark(); Preferences::mark();
// redirect to show bill. // redirect to show bill.
if ('true' === $request->get('return_to_bill') && (int) $request->get('bill_id') > 0) { if ('true' === $request->get('return_to_bill') && (int) $request->get('bill_id') > 0) {

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Rule; namespace FireflyIII\Http\Controllers\Rule;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
@@ -82,7 +83,7 @@ class DeleteController extends Controller
$this->ruleRepos->destroy($rule); $this->ruleRepos->destroy($rule);
session()->flash('success', (string) trans('firefly.deleted_rule', ['title' => $title])); session()->flash('success', (string) trans('firefly.deleted_rule', ['title' => $title]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('rules.delete.url')); return redirect($this->getPreviousUrl('rules.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Rule; namespace FireflyIII\Http\Controllers\Rule;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -204,7 +205,7 @@ class EditController extends Controller
$this->ruleRepos->update($rule, $data); $this->ruleRepos->update($rule, $data);
session()->flash('success', (string) trans('firefly.updated_rule', ['title' => $rule->title])); session()->flash('success', (string) trans('firefly.updated_rule', ['title' => $rule->title]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('rules.edit.url')); $redirect = redirect($this->getPreviousUrl('rules.edit.url'));
if (true === $data['run_after_form']) { if (true === $data['run_after_form']) {

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\RuleGroup; namespace FireflyIII\Http\Controllers\RuleGroup;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RuleGroupFormRequest; use FireflyIII\Http\Requests\RuleGroupFormRequest;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
@@ -89,7 +90,7 @@ class CreateController extends Controller
$ruleGroup = $this->repository->store($data); $ruleGroup = $this->repository->store($data);
session()->flash('success', (string) trans('firefly.created_new_rule_group', ['title' => $ruleGroup->title])); session()->flash('success', (string) trans('firefly.created_new_rule_group', ['title' => $ruleGroup->title]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('rule-groups.create.url')); $redirect = redirect($this->getPreviousUrl('rule-groups.create.url'));
if (1 === (int) $request->get('create_another')) { if (1 === (int) $request->get('create_another')) {

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\RuleGroup; namespace FireflyIII\Http\Controllers\RuleGroup;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
@@ -87,7 +88,7 @@ class DeleteController extends Controller
$this->repository->destroy($ruleGroup, $moveTo); $this->repository->destroy($ruleGroup, $moveTo);
session()->flash('success', (string) trans('firefly.deleted_rule_group', ['title' => $title])); session()->flash('success', (string) trans('firefly.deleted_rule_group', ['title' => $title]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('rule-groups.delete.url')); return redirect($this->getPreviousUrl('rule-groups.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\RuleGroup; namespace FireflyIII\Http\Controllers\RuleGroup;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RuleGroupFormRequest; use FireflyIII\Http\Requests\RuleGroupFormRequest;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
@@ -129,7 +130,7 @@ class EditController extends Controller
$this->repository->update($ruleGroup, $data); $this->repository->update($ruleGroup, $data);
session()->flash('success', (string) trans('firefly.updated_rule_group', ['title' => $ruleGroup->title])); session()->flash('success', (string) trans('firefly.updated_rule_group', ['title' => $ruleGroup->title]));
app('preferences')->mark(); Preferences::mark();
$redirect = redirect($this->getPreviousUrl('rule-groups.edit.url')); $redirect = redirect($this->getPreviousUrl('rule-groups.edit.url'));
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
session()->put('rule-groups.edit.fromUpdate', true); session()->put('rule-groups.edit.fromUpdate', true);

View File

@@ -26,14 +26,16 @@ namespace FireflyIII\Http\Controllers\RuleGroup;
use Carbon\Carbon; use Carbon\Carbon;
use Exception; use Exception;
use FireflyIII\Events\Model\TransactionGroup\TriggeredStoredTransactionGroup;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\SelectTransactionsRequest; use FireflyIII\Http\Requests\SelectTransactionsRequest;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\TransactionRules\Engine\RuleEngineInterface; use FireflyIII\Models\TransactionGroup;
use FireflyIII\User; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log;
use Illuminate\View\View; use Illuminate\View\View;
/** /**
@@ -41,18 +43,20 @@ use Illuminate\View\View;
*/ */
class ExecutionController extends Controller class ExecutionController extends Controller
{ {
private readonly AccountRepositoryInterface $repository;
/** /**
* ExecutionController constructor. * ExecutionController constructor.
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->repository = app(AccountRepositoryInterface::class);
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string) trans('firefly.rules')); app('view')->share('title', (string)trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->repository->setUser(auth()->user());
return $next($request); return $next($request);
} }
@@ -67,34 +71,37 @@ class ExecutionController extends Controller
public function execute(SelectTransactionsRequest $request, RuleGroup $ruleGroup): RedirectResponse public function execute(SelectTransactionsRequest $request, RuleGroup $ruleGroup): RedirectResponse
{ {
// Get parameters specified by the user // Get parameters specified by the user
/** @var User $user */ $accounts = $request->get('accounts');
$user = auth()->user(); $set = $this->repository->getAccountsById($accounts);
$accounts = implode(',', $request->get('accounts'));
// create new rule engine:
$newRuleEngine = app(RuleEngineInterface::class);
$newRuleEngine->setUser($user);
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setAccounts($set);
// add date operators. // add date operators.
if (null !== $request->get('start')) { if (null !== $request->get('start')) {
$startDate = new Carbon($request->get('start')); $startDate = new Carbon($request->get('start'));
$newRuleEngine->addOperator(['type' => 'date_after', 'value' => $startDate->format('Y-m-d')]); $collector->setStart($startDate);
} }
if (null !== $request->get('end')) { if (null !== $request->get('end')) {
$endDate = new Carbon($request->get('end')); $endDate = new Carbon($request->get('end'));
$newRuleEngine->addOperator(['type' => 'date_before', 'value' => $endDate->format('Y-m-d')]); $collector->setEnd($endDate);
}
$final = $collector->getGroups();
$ids = $final->pluck('id')->toArray();
Log::debug(sprintf('Found %d groups collected from %d account(s)', $final->count(), $set->count()));
foreach (array_chunk($ids, 1337) as $setOfIds) {
Log::debug(sprintf('Now processing %d groups', count($setOfIds)));
$groups = TransactionGroup::whereIn('id', $setOfIds)->get();
/** @var TransactionGroup $group */
foreach ($groups as $group) {
Log::debug(sprintf('Processing group #%d.', $group->id));
event(new TriggeredStoredTransactionGroup($group));
}
} }
// add extra operators:
$newRuleEngine->addOperator(['type' => 'account_id', 'value' => $accounts]);
// set rules:
// #10427, file rule group and not the set of rules.
$collection = new Collection()->push($ruleGroup);
$newRuleEngine->setRuleGroups($collection);
$newRuleEngine->fire();
// Tell the user that the job is queued // Tell the user that the job is queued
session()->flash('success', (string) trans('firefly.applied_rule_group_selection', ['title' => $ruleGroup->title])); session()->flash('success', (string)trans('firefly.applied_rule_group_selection', ['title' => $ruleGroup->title]));
return redirect()->route('rules.index'); return redirect()->route('rules.index');
} }
@@ -106,7 +113,7 @@ class ExecutionController extends Controller
*/ */
public function selectTransactions(RuleGroup $ruleGroup): Factory|\Illuminate\Contracts\View\View public function selectTransactions(RuleGroup $ruleGroup): Factory|\Illuminate\Contracts\View\View
{ {
$subTitle = (string) trans('firefly.apply_rule_group_selection', ['title' => $ruleGroup->title]); $subTitle = (string)trans('firefly.apply_rule_group_selection', ['title' => $ruleGroup->title]);
return view('rules.rule-group.select-transactions', ['ruleGroup' => $ruleGroup, 'subTitle' => $subTitle]); return view('rules.rule-group.select-transactions', ['ruleGroup' => $ruleGroup, 'subTitle' => $subTitle]);
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\System; namespace FireflyIII\Http\Controllers\System;
use FireflyIII\Support\Facades\Preferences;
use Exception; use Exception;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -149,7 +150,7 @@ class InstallController extends Controller
} }
// clear cache as well. // clear cache as well.
Cache::clear(); Cache::clear();
app('preferences')->mark(); Preferences::mark();
return true; return true;
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
@@ -212,7 +213,7 @@ class TagController extends Controller
$this->repository->destroy($tag); $this->repository->destroy($tag);
session()->flash('success', (string) trans('firefly.deleted_tag', ['tag' => $tagName])); session()->flash('success', (string) trans('firefly.deleted_tag', ['tag' => $tagName]));
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('tags.delete.url')); return redirect($this->getPreviousUrl('tags.delete.url'));
} }
@@ -231,7 +232,7 @@ class TagController extends Controller
// default values: // default values:
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$start ??= session('start'); $start ??= session('start');
$end ??= session('end'); $end ??= session('end');
$location = $this->repository->getLocation($tag); $location = $this->repository->getLocation($tag);
@@ -275,7 +276,7 @@ class TagController extends Controller
// default values: // default values:
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
$page = (int) $request->get('page'); $page = (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$periods = []; $periods = [];
$subTitle = (string) trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]); $subTitle = (string) trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]);
$start = $this->repository->firstUseDate($tag) ?? today(config('app.timezone')); $start = $this->repository->firstUseDate($tag) ?? today(config('app.timezone'));
@@ -309,7 +310,7 @@ class TagController extends Controller
Log::debug('Data after storage', $result->toArray()); Log::debug('Data after storage', $result->toArray());
session()->flash('success', (string) trans('firefly.created_tag', ['tag' => $data['tag']])); session()->flash('success', (string) trans('firefly.created_tag', ['tag' => $data['tag']]));
app('preferences')->mark(); Preferences::mark();
// store attachment(s): // store attachment(s):
/** @var null|array $files */ /** @var null|array $files */
@@ -347,7 +348,7 @@ class TagController extends Controller
$tag = $this->repository->update($tag, $data); $tag = $this->repository->update($tag, $data);
session()->flash('success', (string) trans('firefly.updated_tag', ['tag' => $data['tag']])); session()->flash('success', (string) trans('firefly.updated_tag', ['tag' => $data['tag']]));
app('preferences')->mark(); Preferences::mark();
// store new attachment(s): // store new attachment(s):
/** @var null|array $files */ /** @var null|array $files */

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Transaction; namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Events\UpdatedTransactionGroup; use FireflyIII\Events\UpdatedTransactionGroup;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -122,7 +123,7 @@ class BulkController extends Controller
event(new UpdatedTransactionGroup($journal->transactionGroup, true, true, false)); event(new UpdatedTransactionGroup($journal->transactionGroup, true, true, false));
} }
app('preferences')->mark(); Preferences::mark();
$request->session()->flash('success', trans_choice('firefly.mass_edited_transactions_success', $count)); $request->session()->flash('success', trans_choice('firefly.mass_edited_transactions_success', $count));
// redirect to previous URL: // redirect to previous URL:

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Transaction; namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Events\UpdatedAccount; use FireflyIII\Events\UpdatedAccount;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@@ -129,7 +130,7 @@ class DeleteController extends Controller
Log::debug(sprintf('Now going to trigger updated account event for account #%d', $account->id)); Log::debug(sprintf('Now going to trigger updated account event for account #%d', $account->id));
event(new UpdatedAccount($account)); event(new UpdatedAccount($account));
} }
app('preferences')->mark(); Preferences::mark();
return redirect($this->getPreviousUrl('transactions.delete.url')); return redirect($this->getPreviousUrl('transactions.delete.url'));
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Transaction; namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
@@ -76,7 +77,7 @@ class EditController extends Controller
*/ */
public function edit(TransactionGroup $transactionGroup): Factory|\Illuminate\Contracts\View\View|Redirector|RedirectResponse public function edit(TransactionGroup $transactionGroup): Factory|\Illuminate\Contracts\View\View|Redirector|RedirectResponse
{ {
app('preferences')->mark(); Preferences::mark();
if (!$this->isEditableGroup($transactionGroup)) { if (!$this->isEditableGroup($transactionGroup)) {
return $this->redirectGroupToAccount($transactionGroup); return $this->redirectGroupToAccount($transactionGroup);
@@ -98,7 +99,7 @@ class EditController extends Controller
$previousUrl = str_replace($search, '', $previousUrl); $previousUrl = str_replace($search, '', $previousUrl);
// settings necessary for v2 // settings necessary for v2
$optionalFields = app('preferences')->get('transaction_journal_optional_fields', [])->data; $optionalFields = Preferences::get('transaction_journal_optional_fields', [])->data;
if (!is_array($optionalFields)) { if (!is_array($optionalFields)) {
$optionalFields = []; $optionalFields = [];
} }

View File

@@ -30,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Http\Controllers\PeriodOverview; use FireflyIII\Support\Http\Controllers\PeriodOverview;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -57,7 +58,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-exchange'); app('view')->share('mainTitleIcon', 'fa-exchange');
app('view')->share('title', (string) trans('firefly.transactions')); app('view')->share('title', (string)trans('firefly.transactions'));
$this->repository = app(JournalRepositoryInterface::class); $this->repository = app(JournalRepositoryInterface::class);
@@ -83,8 +84,8 @@ class IndexController extends Controller
$subTitleIcon = config('firefly.transactionIconsByType.'.$objectType); $subTitleIcon = config('firefly.transactionIconsByType.'.$objectType);
$types = config('firefly.transactionTypesByType.'.$objectType); $types = config('firefly.transactionTypesByType.'.$objectType);
$page = (int) $request->get('page'); $page = (int)$request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int)Preferences::get('listPageSize', 50)->data;
if (!$start instanceof Carbon) { if (!$start instanceof Carbon) {
$start = session('start'); $start = session('start');
@@ -99,11 +100,17 @@ class IndexController extends Controller
[$start, $end] = $end < $start ? [$end, $start] : [$start, $end]; [$start, $end] = $end < $start ? [$end, $start] : [$start, $end];
$startStr = $start->isoFormat($this->monthAndDayFormat); $startStr = $start->isoFormat($this->monthAndDayFormat);
$endStr = $end->isoFormat($this->monthAndDayFormat); $endStr = $end->isoFormat($this->monthAndDayFormat);
$subTitle = (string) trans(sprintf('firefly.title_%s_between', $objectType), ['start' => $startStr, 'end' => $endStr]); $subTitle = (string)trans(sprintf('firefly.title_%s_between', $objectType), ['start' => $startStr, 'end' => $endStr]);
$path = route('transactions.index', [$objectType, $start->format('Y-m-d'), $end->format('Y-m-d')]); $path = route('transactions.index', [$objectType, $start->format('Y-m-d'), $end->format('Y-m-d')]);
$firstJournal = $this->repository->firstNull(); $firstJournal = $this->repository->firstNull();
$startPeriod = $firstJournal instanceof TransactionJournal ? $firstJournal->date : new Carbon(); $startPeriod = $firstJournal instanceof TransactionJournal ? $firstJournal->date : new Carbon();
$endPeriod = clone $end; $endPeriod = clone $end;
// limit to 3 years for the time being.
if (now()->diffInYears($startPeriod, true) > 3) {
$startPeriod = now()->subYears(3);
}
$periods = $this->getTransactionPeriodOverview($objectType, $startPeriod, $endPeriod); $periods = $this->getTransactionPeriodOverview($objectType, $startPeriod, $endPeriod);
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
@@ -136,14 +143,14 @@ class IndexController extends Controller
{ {
$subTitleIcon = config('firefly.transactionIconsByType.'.$objectType); $subTitleIcon = config('firefly.transactionIconsByType.'.$objectType);
$types = config('firefly.transactionTypesByType.'.$objectType); $types = config('firefly.transactionTypesByType.'.$objectType);
$page = (int) $request->get('page'); $page = (int)$request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int)Preferences::get('listPageSize', 50)->data;
$path = route('transactions.index.all', [$objectType]); $path = route('transactions.index.all', [$objectType]);
$first = $this->repository->firstNull(); $first = $this->repository->firstNull();
$start = $first instanceof TransactionJournal ? $first->date : new Carbon(); $start = $first instanceof TransactionJournal ? $first->date : new Carbon();
$last = $this->repository->getLast(); $last = $this->repository->getLast();
$end = $last instanceof TransactionJournal ? $last->date : today(config('app.timezone')); $end = $last instanceof TransactionJournal ? $last->date : today(config('app.timezone'));
$subTitle = (string) trans('firefly.all_'.$objectType); $subTitle = (string)trans('firefly.all_'.$objectType);
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Transaction; namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\JournalLinkRequest; use FireflyIII\Http\Requests\JournalLinkRequest;
@@ -86,7 +87,7 @@ class LinkController extends Controller
$this->repository->destroyLink($link); $this->repository->destroyLink($link);
session()->flash('success', (string) trans('firefly.deleted_link')); session()->flash('success', (string) trans('firefly.deleted_link'));
app('preferences')->mark(); Preferences::mark();
return redirect((string) session('journal_links.delete.url')); return redirect((string) session('journal_links.delete.url'));
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Transaction; namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
@@ -110,7 +111,7 @@ class MassController extends Controller
Log::debug(sprintf('Could not find transaction journal #%d', $journalId)); Log::debug(sprintf('Could not find transaction journal #%d', $journalId));
} }
} }
app('preferences')->mark(); Preferences::mark();
session()->flash('success', trans_choice('firefly.mass_deleted_transactions_success', $count)); session()->flash('success', trans_choice('firefly.mass_deleted_transactions_success', $count));
// redirect to previous URL: // redirect to previous URL:
@@ -177,7 +178,7 @@ class MassController extends Controller
} }
} }
app('preferences')->mark(); Preferences::mark();
session()->flash('success', trans_choice('firefly.mass_edited_transactions_success', $count)); session()->flash('success', trans_choice('firefly.mass_edited_transactions_success', $count));
// redirect to previous URL: // redirect to previous URL:

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\TransactionCurrency; namespace FireflyIII\Http\Controllers\TransactionCurrency;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\CurrencyFormRequest; use FireflyIII\Http\Requests\CurrencyFormRequest;
@@ -128,7 +129,7 @@ class EditController extends Controller
$currency = $this->repository->update($currency, $data); $currency = $this->repository->update($currency, $data);
Log::channel('audit')->info('Updated (POST) currency.', $data); Log::channel('audit')->info('Updated (POST) currency.', $data);
$request->session()->flash('success', (string) trans('firefly.updated_currency', ['name' => $currency->name])); $request->session()->flash('success', (string) trans('firefly.updated_currency', ['name' => $currency->name]));
app('preferences')->mark(); Preferences::mark();
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
$request->session()->put('currencies.edit.fromUpdate', true); $request->session()->put('currencies.edit.fromUpdate', true);

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\TransactionCurrency; namespace FireflyIII\Http\Controllers\TransactionCurrency;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
@@ -73,7 +74,7 @@ class IndexController extends Controller
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) Preferences::get('listPageSize', 50)->data;
$collection = $this->repository->getAll(); $collection = $this->repository->getAll();
// order so default and enabled are on top: // order so default and enabled are on top:

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Middleware; namespace FireflyIII\Http\Middleware;
use FireflyIII\Support\Facades\Preferences;
use Closure; use Closure;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@@ -54,27 +55,27 @@ class InterestingMessage
} }
if ($this->groupMessage($request)) { if ($this->groupMessage($request)) {
app('preferences')->mark(); Preferences::mark();
$this->handleGroupMessage($request); $this->handleGroupMessage($request);
} }
if ($this->userGroupMessage($request)) { if ($this->userGroupMessage($request)) {
app('preferences')->mark(); Preferences::mark();
$this->handleUserGroupMessage($request); $this->handleUserGroupMessage($request);
} }
if ($this->accountMessage($request)) { if ($this->accountMessage($request)) {
app('preferences')->mark(); Preferences::mark();
$this->handleAccountMessage($request); $this->handleAccountMessage($request);
} }
if ($this->billMessage($request)) { if ($this->billMessage($request)) {
app('preferences')->mark(); Preferences::mark();
$this->handleBillMessage($request); $this->handleBillMessage($request);
} }
if ($this->webhookMessage($request)) { if ($this->webhookMessage($request)) {
app('preferences')->mark(); Preferences::mark();
$this->handleWebhookMessage($request); $this->handleWebhookMessage($request);
} }
if ($this->currencyMessage($request)) { if ($this->currencyMessage($request)) {
app('preferences')->mark(); Preferences::mark();
$this->handleCurrencyMessage($request); $this->handleCurrencyMessage($request);
} }

View File

@@ -23,6 +23,8 @@ declare(strict_types=1);
namespace FireflyIII\Http\Middleware; namespace FireflyIII\Http\Middleware;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use Closure; use Closure;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
@@ -69,14 +71,14 @@ class Range
// ignore preference. set the range to be the current month: // ignore preference. set the range to be the current month:
if (!app('session')->has('start') && !app('session')->has('end')) { if (!app('session')->has('start') && !app('session')->has('end')) {
Log::debug('setRange: Session has no start or end.'); Log::debug('setRange: Session has no start or end.');
$viewRange = app('preferences')->get('viewRange', '1M')->data; $viewRange = Preferences::get('viewRange', '1M')->data;
if (is_array($viewRange)) { if (is_array($viewRange)) {
$viewRange = '1M'; $viewRange = '1M';
} }
$today = today(config('app.timezone')); $today = today(config('app.timezone'));
$start = app('navigation')->updateStartDate((string) $viewRange, $today); $start = Navigation::updateStartDate((string) $viewRange, $today);
$end = app('navigation')->updateEndDate((string) $viewRange, $start); $end = Navigation::updateEndDate((string) $viewRange, $start);
app('session')->put('start', $start); app('session')->put('start', $start);
app('session')->put('end', $end); app('session')->put('end', $end);
@@ -137,7 +139,7 @@ class Range
*/ */
private function configureList(): void private function configureList(): void
{ {
$pref = app('preferences')->get('list-length', config('firefly.list_length', 10))->data; $pref = Preferences::get('list-length', config('firefly.list_length', 10))->data;
app('view')->share('listLength', $pref); app('view')->share('listLength', $pref);
// share security message: // share security message:

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Jobs; namespace FireflyIII\Jobs;
use FireflyIII\Support\Facades\Navigation;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Enums\AutoBudgetType; use FireflyIII\Enums\AutoBudgetType;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -122,8 +123,8 @@ class CreateAutoBudgetLimits implements ShouldQueue
); );
// get date range for budget limit, based on range in auto-budget // get date range for budget limit, based on range in auto-budget
$start = app('navigation')->startOfPeriod($this->date, $autoBudget->period); $start = Navigation::startOfPeriod($this->date, $autoBudget->period);
$end = app('navigation')->endOfPeriod($start, $autoBudget->period); $end = Navigation::endOfPeriod($start, $autoBudget->period);
// find budget limit: // find budget limit:
$budgetLimit = $this->findBudgetLimit($autoBudget->budget, $start, $end); $budgetLimit = $this->findBudgetLimit($autoBudget->budget, $start, $end);
@@ -237,12 +238,12 @@ class CreateAutoBudgetLimits implements ShouldQueue
{ {
Log::debug(sprintf('Will now manage rollover for auto budget #%d', $autoBudget->id)); Log::debug(sprintf('Will now manage rollover for auto budget #%d', $autoBudget->id));
// current period: // current period:
$start = app('navigation')->startOfPeriod($this->date, $autoBudget->period); $start = Navigation::startOfPeriod($this->date, $autoBudget->period);
$end = app('navigation')->endOfPeriod($start, $autoBudget->period); $end = Navigation::endOfPeriod($start, $autoBudget->period);
// which means previous period: // which means previous period:
$previousStart = app('navigation')->subtractPeriod($start, $autoBudget->period); $previousStart = Navigation::subtractPeriod($start, $autoBudget->period);
$previousEnd = app('navigation')->endOfPeriod($previousStart, $autoBudget->period); $previousEnd = Navigation::endOfPeriod($previousStart, $autoBudget->period);
Log::debug( Log::debug(
sprintf( sprintf(
@@ -297,12 +298,12 @@ class CreateAutoBudgetLimits implements ShouldQueue
{ {
Log::debug(sprintf('Will now manage rollover for auto budget #%d', $autoBudget->id)); Log::debug(sprintf('Will now manage rollover for auto budget #%d', $autoBudget->id));
// current period: // current period:
$start = app('navigation')->startOfPeriod($this->date, $autoBudget->period); $start = Navigation::startOfPeriod($this->date, $autoBudget->period);
$end = app('navigation')->endOfPeriod($start, $autoBudget->period); $end = Navigation::endOfPeriod($start, $autoBudget->period);
// which means previous period: // which means previous period:
$previousStart = app('navigation')->subtractPeriod($start, $autoBudget->period); $previousStart = Navigation::subtractPeriod($start, $autoBudget->period);
$previousEnd = app('navigation')->endOfPeriod($previousStart, $autoBudget->period); $previousEnd = Navigation::endOfPeriod($previousStart, $autoBudget->period);
Log::debug( Log::debug(
sprintf( sprintf(

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Jobs; namespace FireflyIII\Jobs;
use FireflyIII\Support\Facades\Preferences;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Events\RequestedReportOnJournals; use FireflyIII\Events\RequestedReportOnJournals;
use FireflyIII\Events\StoredTransactionGroup; use FireflyIII\Events\StoredTransactionGroup;
@@ -132,7 +133,7 @@ class CreateRecurringTransactions implements ShouldQueue
$this->groupRepository->setUser($recurrence->user); $this->groupRepository->setUser($recurrence->user);
// clear cache for user // clear cache for user
app('preferences')->setForUser($recurrence->user, 'lastActivity', microtime()); Preferences::setForUser($recurrence->user, 'lastActivity', microtime());
Log::debug(sprintf('Now at recurrence #%d of user #%d', $recurrence->id, $recurrence->user_id)); Log::debug(sprintf('Now at recurrence #%d of user #%d', $recurrence->id, $recurrence->user_id));
$createdReps = $this->handleRepetitions($recurrence); $createdReps = $this->handleRepetitions($recurrence);
@@ -150,7 +151,7 @@ class CreateRecurringTransactions implements ShouldQueue
Log::debug('Done with handle()'); Log::debug('Done with handle()');
// clear cache: // clear cache:
app('preferences')->mark(); Preferences::mark();
} }
private function filterRecurrences(Collection $recurrences): Collection private function filterRecurrences(Collection $recurrences): Collection
@@ -414,6 +415,9 @@ class CreateRecurringTransactions implements ShouldQueue
$transactions->first(); $transactions->first();
$return = []; $return = [];
/** @var RecurrenceTransaction $transaction */ /** @var RecurrenceTransaction $transaction */
foreach ($transactions as $index => $transaction) { foreach ($transactions as $index => $transaction) {
$single = [ $single = [

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