Compare commits

...

178 Commits

Author SHA1 Message Date
github-actions[bot]
fe926ae23e Merge pull request #11165 from firefly-iii/release-1762140612
🤖 Automatically merge the PR into the develop branch.
2025-11-03 04:30:23 +01:00
JC5
2852a36712 🤖 Auto commit for release 'develop' on 2025-11-03 2025-11-03 04:30:12 +01:00
James Cole
7743d16ea1 Replace references to log service. 2025-11-02 14:48:36 +01:00
James Cole
ae767fc90d Replace references to log service. 2025-11-02 14:45:39 +01:00
James Cole
b49575db8b Replace reference. 2025-11-02 14:42:34 +01:00
James Cole
69b816d957 Clean up a variety of requests. 2025-11-02 14:39:34 +01:00
James Cole
e9cf5111c9 Add required parameter. 2025-11-02 14:03:59 +01:00
James Cole
a57cf4e9be Clean up some classes, extend API validation. 2025-11-02 14:00:55 +01:00
github-actions[bot]
d5e431c3a1 Merge pull request #11159 from firefly-iii/release-1762056407
🤖 Automatically merge the PR into the develop branch.
2025-11-02 05:06:55 +01:00
JC5
ffe0f39f6a 🤖 Auto commit for release 'develop' on 2025-11-02 2025-11-02 05:06:47 +01:00
James Cole
e99a37bae3 Fix #11157 2025-11-02 04:51:15 +01:00
James Cole
27336e0721 Fix argument order in piggy bank error message. 2025-11-01 21:02:35 +01:00
github-actions[bot]
c20c804f9a Merge pull request #11155 from firefly-iii/release-1762026466
🤖 Automatically merge the PR into the develop branch.
2025-11-01 20:47:54 +01:00
JC5
ddd94276db 🤖 Auto commit for release 'v6.4.4' on 2025-11-01 2025-11-01 20:47:46 +01:00
github-actions[bot]
f8c95f2028 Merge pull request #11154 from firefly-iii/release-1762025972
🤖 Automatically merge the PR into the develop branch.
2025-11-01 20:39:38 +01:00
JC5
418150034b 🤖 Auto commit for release 'develop' on 2025-11-01 2025-11-01 20:39:32 +01:00
James Cole
18589f87b7 Update changelog. 2025-11-01 20:35:36 +01:00
James Cole
e2b3e8492d Fix issue with parsing URLs. 2025-11-01 20:00:45 +01:00
James Cole
8ff40e22e0 Fix #11144 2025-11-01 18:44:32 +01:00
James Cole
a941dca5e1 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-11-01 18:43:41 +01:00
James Cole
b43f0ca4a8 Fix #11147 2025-11-01 18:07:54 +01:00
James Cole
2298fb8406 Merge pull request #11140 from Jihad/add-sar-currency
Add Saudi Riyal (SAR) currency
2025-11-01 18:02:09 +01:00
James Cole
8f4511b466 Fix args/ 2025-11-01 18:00:48 +01:00
James Cole
b5be712754 Expand arg. 2025-11-01 18:00:22 +01:00
James Cole
4f1ea96308 Test argument. 2025-11-01 17:57:07 +01:00
mergify[bot]
7cb8687b88 Merge branch 'develop' into add-sar-currency 2025-11-01 16:55:45 +00:00
github-actions[bot]
feb6ecb01c Merge pull request #11150 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-11-01 17:55:17 +01:00
github-actions[bot]
c63e0a2cc5 Merge pull request #11149 from firefly-iii/release-1762016105
🤖 Automatically merge the PR into the develop branch.
2025-11-01 17:55:12 +01:00
JC5
c53661a579 🤖 Auto commit for release 'v6.4.3' on 2025-11-01 2025-11-01 17:55:05 +01:00
Jihad
4e15717634 Add Saudi Riyal (SAR) currency 2025-10-31 19:51:55 +03:00
github-actions[bot]
860ae9d931 Merge pull request #11139 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-10-31 06:51:41 +01:00
github-actions[bot]
d045248747 Merge pull request #11138 from firefly-iii/release-1761889889
🤖 Automatically merge the PR into the develop branch.
2025-10-31 06:51:36 +01:00
JC5
87aa6feb29 🤖 Auto commit for release '6.4.3' on 2025-10-31 2025-10-31 06:51:29 +01:00
James Cole
dfa32353da Re-order changelog. 2025-10-31 06:47:30 +01:00
github-actions[bot]
08c9703900 Merge pull request #11137 from firefly-iii/release-1761889447
🤖 Automatically merge the PR into the develop branch.
2025-10-31 06:44:16 +01:00
JC5
101f56d1b1 🤖 Auto commit for release 'develop' on 2025-10-31 2025-10-31 06:44:07 +01:00
James Cole
83bdaff033 Update changelog. 2025-10-31 06:39:28 +01:00
James Cole
e25fbcfb19 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-10-31 06:31:02 +01:00
James Cole
40c4c9f109 Fix #11132 2025-10-31 06:30:56 +01:00
github-actions[bot]
d178956541 Merge pull request #11135 from firefly-iii/release-1761853876
🤖 Automatically merge the PR into the develop branch.
2025-10-30 20:51:23 +01:00
JC5
c29f997733 🤖 Auto commit for release 'develop' on 2025-10-30 2025-10-30 20:51:16 +01:00
James Cole
2aabb56d2d Fix https://github.com/firefly-iii/firefly-iii/issues/11134 2025-10-30 20:46:43 +01:00
github-actions[bot]
e1e18a2a0c Merge pull request #11130 from firefly-iii/release-1761763997
🤖 Automatically merge the PR into the develop branch.
2025-10-29 19:53:25 +01:00
JC5
2c41694f41 🤖 Auto commit for release 'develop' on 2025-10-29 2025-10-29 19:53:18 +01:00
James Cole
48a641286c Fix account type list. 2025-10-29 19:47:35 +01:00
James Cole
5eec91f439 Merge branch 'main' into develop
# Conflicts:
#	package-lock.json
2025-10-29 19:22:19 +01:00
James Cole
782f0c7d54 Update readme. 2025-10-29 17:41:56 +01:00
James Cole
a4dff6d39f Fix #11122 2025-10-27 10:00:16 +01:00
James Cole
9312ddbb7b Reset the anonimity. 2025-10-27 08:51:50 +01:00
github-actions[bot]
14a9bede11 Merge pull request #11121 from firefly-iii/release-1761535923
🤖 Automatically merge the PR into the develop branch.
2025-10-27 04:32:13 +01:00
JC5
58d798df86 🤖 Auto commit for release 'develop' on 2025-10-27 2025-10-27 04:32:03 +01:00
James Cole
e740fc57a6 Replace a few request class calls. 2025-10-26 17:15:54 +01:00
James Cole
ecd7750030 Replace a few request instances. 2025-10-26 16:04:03 +01:00
James Cole
19c4a82194 Use new API request. 2025-10-26 15:37:27 +01:00
James Cole
ffc91d5ead Migrate one of the API endpoints to the new unified API thing. 2025-10-26 12:28:42 +01:00
James Cole
4898c29b85 Replace reference to facade. 2025-10-26 12:12:30 +01:00
github-actions[bot]
84b4ab0cc2 Merge pull request #11112 from firefly-iii/release-1761470095
🤖 Automatically merge the PR into the develop branch.
2025-10-26 10:15:03 +01:00
JC5
eb808a0fbc 🤖 Auto commit for release 'develop' on 2025-10-26 2025-10-26 10:14:55 +01:00
James Cole
d25ae50d30 Fix routes. 2025-10-26 10:09:59 +01:00
github-actions[bot]
c43821e29c Merge pull request #11111 from firefly-iii/release-1761469189
🤖 Automatically merge the PR into the develop branch.
2025-10-26 09:59:56 +01:00
JC5
b7570b2651 🤖 Auto commit for release 'develop' on 2025-10-26 2025-10-26 09:59:49 +01:00
James Cole
cb77609f27 Add disclaimer. 2025-10-26 09:55:51 +01:00
James Cole
99651bb61e Catch some exceptions. 2025-10-26 09:53:19 +01:00
James Cole
bf1e14f66d Explain about user agents. 2025-10-26 09:45:00 +01:00
github-actions[bot]
d0e55804f8 Merge pull request #11110 from firefly-iii/release-1761467960
🤖 Automatically merge the PR into the develop branch.
2025-10-26 09:39:29 +01:00
JC5
0a9715b8c1 🤖 Auto commit for release 'develop' on 2025-10-26 2025-10-26 09:39:20 +01:00
James Cole
61390e67f6 Add debug info. 2025-10-26 09:34:40 +01:00
James Cole
536d25980f Fix issues related to #11109 2025-10-26 09:31:07 +01:00
github-actions[bot]
3253b2e569 Merge pull request #11107 from firefly-iii/release-1761395685
🤖 Automatically merge the PR into the develop branch.
2025-10-25 14:34:54 +02:00
JC5
11ac955303 🤖 Auto commit for release 'develop' on 2025-10-25 2025-10-25 14:34:46 +02:00
James Cole
caf9a31bc4 Replace version with build time. 2025-10-25 14:30:22 +02:00
github-actions[bot]
8c84ab5855 Merge pull request #11106 from firefly-iii/release-1761394994
🤖 Automatically merge the PR into the develop branch.
2025-10-25 14:23:23 +02:00
JC5
91a56a7396 🤖 Auto commit for release 'develop' on 2025-10-25 2025-10-25 14:23:14 +02:00
James Cole
f5806ea6de Fix #11102 2025-10-25 14:09:44 +02:00
James Cole
60b3692ac9 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-10-25 11:50:43 +02:00
James Cole
0bdb4f2e69 Fix https://github.com/orgs/firefly-iii/discussions/11104 2025-10-25 11:50:34 +02:00
github-actions[bot]
f89f50c2db Merge pull request #11101 from firefly-iii/release-1761383546
🤖 Automatically merge the PR into the develop branch.
2025-10-25 11:12:35 +02:00
JC5
394df46961 🤖 Auto commit for release 'develop' on 2025-10-25 2025-10-25 11:12:26 +02:00
James Cole
535e5e4f50 Catch null pointer. 2025-10-25 11:08:07 +02:00
James Cole
00ba2a46d2 Fix #11063 2025-10-25 09:20:21 +02:00
James Cole
a3ff26e3e4 Fix https://github.com/firefly-iii/firefly-iii/issues/11096 2025-10-23 16:54:13 +02:00
James Cole
3388cb6f66 Merge pull request #11085 from firefly-iii/dependabot/npm_and_yarn/npm_and_yarn-fd296dbd23
Bump vite from 7.1.9 to 7.1.11 in the npm_and_yarn group across 1 directory
2025-10-21 07:13:37 +02:00
dependabot[bot]
1c3c9377ca Bump vite in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.1.9 to 7.1.11
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-20 22:58:03 +00:00
github-actions[bot]
54aeb4b4ef Merge pull request #11084 from firefly-iii/release-1760930902
🤖 Automatically merge the PR into the develop branch.
2025-10-20 05:28:30 +02:00
JC5
9eb3ad62dd 🤖 Auto commit for release 'develop' on 2025-10-20 2025-10-20 05:28:22 +02:00
github-actions[bot]
4f0e978687 Merge pull request #11060 from firefly-iii/release-1760325917
🤖 Automatically merge the PR into the develop branch.
2025-10-13 05:25:26 +02:00
JC5
e1cf9f7a79 🤖 Auto commit for release 'develop' on 2025-10-13 2025-10-13 05:25:17 +02:00
James Cole
7ce055a22c Merge pull request #11056 from ctrl-f5/feat/account-attachment-list-request
account/attachments endpoint use request object for pagination, add test
2025-10-12 20:15:00 +02:00
Nicky De Maeyer
7bd915930c account/attachments endpoint use request object for pagination, add test 2025-10-12 19:54:47 +02:00
github-actions[bot]
75aa2d99fd Merge pull request #11055 from firefly-iii/release-1760278017
🤖 Automatically merge the PR into the develop branch.
2025-10-12 16:07:07 +02:00
JC5
f52bc0e242 🤖 Auto commit for release 'develop' on 2025-10-12 2025-10-12 16:06:57 +02:00
James Cole
55cf924794 Another fix for #11054 2025-10-12 16:02:14 +02:00
James Cole
df3e4a6554 Fix #11054 2025-10-12 12:25:21 +02:00
James Cole
7c4ada458e Merge pull request #11052 from ctrl-f5/fix/incorrect-validator-function
correct validator function to check for errors + `Account\ShowControllerTest`
2025-10-12 06:47:19 +02:00
Nicky De Maeyer
2a4a98dd10 use the correct validator function to check for errors, add a test for ShowController 2025-10-11 23:02:54 +02:00
github-actions[bot]
a3bf845851 Merge pull request #11051 from firefly-iii/release-1760189013
🤖 Automatically merge the PR into the develop branch.
2025-10-11 15:23:39 +02:00
JC5
78e832cdba 🤖 Auto commit for release 'develop' on 2025-10-11 2025-10-11 15:23:33 +02:00
James Cole
d47e4c4f24 Fix #11050 2025-10-11 15:17:51 +02:00
github-actions[bot]
056329291f Merge pull request #11049 from firefly-iii/release-1760159506
🤖 Automatically merge the PR into the develop branch.
2025-10-11 07:11:57 +02:00
JC5
977946064d 🤖 Auto commit for release 'develop' on 2025-10-11 2025-10-11 07:11:46 +02:00
James Cole
1870345ddf Add new request in style of aggregated requests, fix issue with missing field. 2025-10-11 07:05:32 +02:00
James Cole
6980717075 Set version in more places. 2025-10-11 06:47:55 +02:00
James Cole
1fe0aebacb Validate version using build_time. 2025-10-11 06:45:16 +02:00
github-actions[bot]
cbf7aef0c1 Merge pull request #11048 from firefly-iii/release-1760157167
🤖 Automatically merge the PR into the develop branch.
2025-10-11 06:33:00 +02:00
JC5
8c3e6c0189 🤖 Auto commit for release 'develop' on 2025-10-11 2025-10-11 06:32:47 +02:00
James Cole
cf7ee79c1c Fix two bugs in requests. 2025-10-11 06:27:55 +02:00
github-actions[bot]
7e344e4332 Merge pull request #11047 from firefly-iii/release-1760124177
🤖 Automatically merge the PR into the develop branch.
2025-10-10 21:23:04 +02:00
JC5
0a55e9fb4e 🤖 Auto commit for release 'develop' on 2025-10-10 2025-10-10 21:22:57 +02:00
James Cole
ed2e0e86dc Don't validate on empty string. 2025-10-10 20:54:51 +02:00
James Cole
9d1fb2cd6a Make sure that null|string passed is always a string 2025-10-10 20:54:31 +02:00
github-actions[bot]
57617b750f Merge pull request #11045 from firefly-iii/release-1760116335
🤖 Automatically merge the PR into the develop branch.
2025-10-10 19:12:23 +02:00
JC5
f6411fdc5a 🤖 Auto commit for release 'develop' on 2025-10-10 2025-10-10 19:12:15 +02:00
James Cole
02e24fc919 Whoops. 2025-10-10 19:07:28 +02:00
github-actions[bot]
dbc0210304 Merge pull request #11044 from firefly-iii/release-1760115302
🤖 Automatically merge the PR into the develop branch.
2025-10-10 18:55:11 +02:00
JC5
a709e224d4 🤖 Auto commit for release 'develop' on 2025-10-10 2025-10-10 18:55:02 +02:00
James Cole
83f3eddf44 Small code changes for @ctrl-f5's PR.
- Dropped some "setParameters" calls if unused in transformer.
- Add correct copyright
- Sprintf instead of string concat
- Small ident changes courtesy of phpstorm.
2025-10-10 18:50:39 +02:00
James Cole
7cfc4c2671 Merge pull request #11039 from ctrl-f5/feat/improve-request-objects
proposal for improved request handling
2025-10-10 18:38:02 +02:00
mergify[bot]
1c6055cb2d Merge branch 'develop' into feat/improve-request-objects 2025-10-10 14:42:25 +00:00
James Cole
4f4576e458 Add option to select date, fix #11042 2025-10-10 16:41:46 +02:00
mergify[bot]
84d3bcbb37 Merge branch 'develop' into feat/improve-request-objects 2025-10-10 11:33:40 +00:00
github-actions[bot]
c91c87d646 Merge pull request #11043 from firefly-iii/release-1760095977
🤖 Automatically merge the PR into the develop branch.
2025-10-10 13:33:06 +02:00
JC5
e09b6034f7 🤖 Auto commit for release 'develop' on 2025-10-10 2025-10-10 13:32:57 +02:00
mergify[bot]
ad67bb80f3 Merge branch 'develop' into feat/improve-request-objects 2025-10-10 11:29:39 +00:00
Sander Dorigo
a88d0de34d Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop 2025-10-10 13:28:56 +02:00
Sander Dorigo
ecf498cc81 Add more options 2025-10-10 13:18:47 +02:00
mergify[bot]
569f553d26 Merge branch 'develop' into feat/improve-request-objects 2025-10-10 06:58:56 +00:00
James Cole
7d45bc46b8 Merge pull request #11041 from jreyesr/patch-1
Add XML mimetypes to the allowedMimes list
2025-10-10 08:58:18 +02:00
mergify[bot]
08553fcfb2 Merge branch 'develop' into patch-1 2025-10-10 06:47:30 +00:00
mergify[bot]
58c76bee94 Merge branch 'develop' into feat/improve-request-objects 2025-10-10 06:46:55 +00:00
mergify[bot]
3fa1b6dd27 Merge branch 'develop' into patch-1 2025-10-10 06:46:54 +00:00
Sander Dorigo
63aa8adab7 Import forgotten class 2025-10-10 08:46:47 +02:00
Sander Dorigo
70b8ea0acb Basic check on numbers, needs improv still. 2025-10-10 08:46:11 +02:00
jreyesr
d800a01e33 Add XML mimetypes to the allowedMimes list
Signed-off-by: jreyesr <jreyesr@users.noreply.github.com>
2025-10-09 15:40:07 -05:00
Nicky De Maeyer
52f3ec7d3d improved request handling 2025-10-09 15:05:52 +02:00
Sander Dorigo
d4978a09ee Fix #11038 2025-10-09 12:35:51 +02:00
github-actions[bot]
77095276e2 Merge pull request #11037 from firefly-iii/release-1759999962
🤖 Automatically merge the PR into the develop branch.
2025-10-09 10:52:52 +02:00
JC5
b77a8591dc 🤖 Auto commit for release 'develop' on 2025-10-09 2025-10-09 10:52:43 +02:00
James Cole
132d7d9ff8 Update some logging. 2025-10-09 06:27:15 +02:00
github-actions[bot]
a981e2c5cb Merge pull request #11034 from firefly-iii/release-1759932290
🤖 Automatically merge the PR into the develop branch.
2025-10-08 16:05:00 +02:00
JC5
77b88b7758 🤖 Auto commit for release 'develop' on 2025-10-08 2025-10-08 16:04:50 +02:00
James Cole
b9894eea57 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2025-10-08 15:58:43 +02:00
James Cole
469319a240 Remove plusses. 2025-10-08 15:56:33 +02:00
github-actions[bot]
5a55593e34 Merge pull request #11033 from firefly-iii/release-1759931464
🤖 Automatically merge the PR into the develop branch.
2025-10-08 15:51:16 +02:00
JC5
8979e5ad5a 🤖 Auto commit for release 'develop' on 2025-10-08 2025-10-08 15:51:04 +02:00
James Cole
3ab65c27ac Fix missing array indicator. 2025-10-08 15:47:03 +02:00
James Cole
a3cac6fd0f Fix #11031 2025-10-08 15:16:10 +02:00
James Cole
1acb5d8681 Merge pull request #11028 from codearena-bot/codearena/agent-a-6398119d-1759907698909
Adding Latin American Currency Support
2025-10-08 09:47:22 +02:00
mergify[bot]
f24cdc7897 Merge branch 'develop' into codearena/agent-a-6398119d-1759907698909 2025-10-08 07:23:07 +00:00
github-actions[bot]
a2b611253b Merge pull request #11029 from firefly-iii/release-1759908132
🤖 Automatically merge the PR into the develop branch.
2025-10-08 09:22:23 +02:00
JC5
252459c29b 🤖 Auto commit for release 'develop' on 2025-10-08 2025-10-08 09:22:12 +02:00
mergify[bot]
3582baf9f7 Merge branch 'develop' into codearena/agent-a-6398119d-1759907698909 2025-10-08 07:18:35 +00:00
James Cole
b03ecab035 Move to another method here as well. 2025-10-08 09:17:56 +02:00
codearena-bot
547a4e9dbb Update database/seeders/TransactionCurrencySeeder.php via CodeArena 2025-10-08 00:14:59 -07:00
James Cole
62e33a51bd Better order for method arguments. 2025-10-08 08:54:26 +02:00
James Cole
8b0ee7e20a Support multi-currency accounts better, matches the old method. 2025-10-08 08:12:30 +02:00
James Cole
0e0ec89b26 Remove all uses of "finalAccountBalance", move towards one function to rule them all. 2025-10-08 07:09:42 +02:00
James Cole
ec08485c2b Clean up some code surrounding account balances. 2025-10-08 06:44:48 +02:00
James Cole
d91d30c8f0 Remove some debug logging, use Facade. 2025-10-08 06:31:47 +02:00
James Cole
634a43c361 Merge branch 'main' into develop 2025-10-08 06:31:34 +02:00
James Cole
f2f86e1139 Merge pull request #11024 from ctrl-f5/feat/improve-date-handling
improved balance range date handling
2025-10-08 06:30:56 +02:00
Nicky De Maeyer
a1c870c962 improved request and balance range date handling 2025-10-07 20:30:11 +02:00
github-actions[bot]
98be3a1414 Merge pull request #11023 from firefly-iii/release-1759860049
🤖 Automatically merge the PR into the develop branch.
2025-10-07 20:00:56 +02:00
JC5
e3c3a0a84b 🤖 Auto commit for release 'develop' on 2025-10-07 2025-10-07 20:00:49 +02:00
github-actions[bot]
b254074867 Merge pull request #11021 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-10-07 10:11:49 +02:00
github-actions[bot]
f21a5b3000 Merge pull request #11020 from firefly-iii/release-1759824697
🤖 Automatically merge the PR into the develop branch.
2025-10-07 10:11:44 +02:00
JC5
6029fe2e84 🤖 Auto commit for release 'v6.4.2' on 2025-10-07 2025-10-07 10:11:37 +02:00
Sander Dorigo
651e11ed1c Fix #11018 2025-10-07 10:06:54 +02:00
James Cole
5ba29cdacd Merge pull request #11019 from ctrl-f5/fix/currency-account-end-date
fix #11015 set end date time to end of day
2025-10-07 10:05:15 +02:00
mergify[bot]
f948cc95b4 Merge branch 'develop' into fix/currency-account-end-date 2025-10-07 08:04:45 +00:00
Nicky De Maeyer
11e721c6c9 fix #11018, set end date to endOfDay 2025-10-07 10:03:26 +02:00
github-actions[bot]
4bc77b2707 Merge pull request #11017 from firefly-iii/release-1759823886
🤖 Automatically merge the PR into the develop branch.
2025-10-07 09:58:17 +02:00
JC5
6639309935 🤖 Auto commit for release 'develop' on 2025-10-07 2025-10-07 09:58:06 +02:00
Sander Dorigo
52e08bb9eb Update changelog 2025-10-07 09:52:39 +02:00
Sander Dorigo
435ca994cf Fix #11016 2025-10-07 09:52:29 +02:00
Sander Dorigo
b29c35864c Fix #11015 2025-10-07 09:49:35 +02:00
github-actions[bot]
2ddc012549 Merge pull request #11014 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-10-07 07:20:40 +02:00
github-actions[bot]
22c88383ad Merge pull request #11013 from firefly-iii/release-1759814427
🤖 Automatically merge the PR into the develop branch.
2025-10-07 07:20:35 +02:00
JC5
9593f1b44e 🤖 Auto commit for release 'v6.4.1' on 2025-10-07 2025-10-07 07:20:27 +02:00
274 changed files with 3531 additions and 2073 deletions

View File

@@ -402,16 +402,16 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.88.2", "version": "v3.89.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": "a8d15584bafb0f0d9d938827840060fd4a3ebc99" "reference": "f34967da2866ace090a2b447de1f357356474573"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a8d15584bafb0f0d9d938827840060fd4a3ebc99", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/f34967da2866ace090a2b447de1f357356474573",
"reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99", "reference": "f34967da2866ace090a2b447de1f357356474573",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -426,7 +426,6 @@
"php": "^7.4 || ^8.0", "php": "^7.4 || ^8.0",
"react/child-process": "^0.6.6", "react/child-process": "^0.6.6",
"react/event-loop": "^1.5", "react/event-loop": "^1.5",
"react/promise": "^3.3",
"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",
@@ -494,7 +493,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.88.2" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.89.1"
}, },
"funding": [ "funding": [
{ {
@@ -502,7 +501,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-09-27T00:24:15+00:00" "time": "2025-10-24T12:05:10+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@@ -1252,16 +1251,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v7.3.4", "version": "v7.3.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", "url": "https://api.github.com/repos/symfony/console/zipball/cdb80fa5869653c83cfe1a9084a673b6daf57ea7",
"reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1326,7 +1325,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v7.3.4" "source": "https://github.com/symfony/console/tree/v7.3.5"
}, },
"funding": [ "funding": [
{ {
@@ -1346,7 +1345,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-09-22T15:31:00+00:00" "time": "2025-10-14T15:46:26+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@@ -1647,16 +1646,16 @@
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v7.3.2", "version": "v7.3.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" "reference": "9f696d2f1e340484b4683f7853b273abff94421f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
"reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "reference": "9f696d2f1e340484b4683f7853b273abff94421f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1691,7 +1690,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.2" "source": "https://github.com/symfony/finder/tree/v7.3.5"
}, },
"funding": [ "funding": [
{ {
@@ -1711,7 +1710,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-07-15T13:41:35+00:00" "time": "2025-10-15T18:45:57+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",

View File

@@ -18,6 +18,16 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Validate input
run: |
# validate argument
if [[ $version != develo* ]] && [[ $version != v* ]] && [[ $version != branch* ]] ;
then
echo "Argument '$version' does not start with a d or with a v or a b"
exit 1
fi
env:
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v5
with: with:
@@ -36,6 +46,14 @@ jobs:
extensions: mbstring, intl, zip, bcmath extensions: mbstring, intl, zip, bcmath
- name: Switch and pull - name: Switch and pull
run: | run: |
# validate argument
if [[ $version != d* ]] && [[ $version != v* ]] ;
then
echo 'Argument does not start with a d or with a v'
exit 1
fi
# #
# Always check out origin/develop, unless its a branch release. # Always check out origin/develop, unless its a branch release.
# #

View File

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

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
@@ -79,20 +79,26 @@ class AccountController extends Controller
* @throws FireflyException * @throws FireflyException
* @throws FireflyException * @throws FireflyException
*/ */
public function accounts(AutocompleteRequest $request): JsonResponse public function accounts(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); Log::debug('Before All.');
$types = $data['types']; [
$query = $data['query']; 'types' => $types,
$date = $data['date'] ?? today(config('app.timezone')); 'query' => $query,
$return = []; 'date' => $date,
$timer = Timer::getInstance(); 'limit' => $limit,
$timer->start(sprintf('AC accounts "%s"', $query)); ]
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); = $request->attributes->all();
$date ??= today(config('app.timezone'));
// set date to end-of-day for account balance. so it is at $date 23:59:59 // set date to end-of-day for account balance. so it is at $date 23:59:59
$date->endOfDay(); $date->endOfDay();
$return = [];
$timer = Timer::getInstance();
$timer->start(sprintf('AC accounts "%s"', $query));
$result = $this->repository->searchAccount((string)$query, $types, $limit);
$allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary); $allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary);
/** @var Account $account */ /** @var Account $account */
@@ -111,17 +117,17 @@ class AccountController extends Controller
} }
$return[] = [ $return[] = [
'id' => (string) $account->id, 'id' => (string)$account->id,
'name' => $account->name, 'name' => $account->name,
'name_with_balance' => $nameWithBalance, 'name_with_balance' => $nameWithBalance,
'active' => $account->active, 'active' => $account->active,
'type' => $account->accountType->type, 'type' => $account->accountType->type,
'currency_id' => (string) $useCurrency->id, 'currency_id' => (string)$useCurrency->id,
'currency_name' => $useCurrency->name, 'currency_name' => $useCurrency->name,
'currency_code' => $useCurrency->code, 'currency_code' => $useCurrency->code,
'currency_symbol' => $useCurrency->symbol, 'currency_symbol' => $useCurrency->symbol,
'currency_decimal_places' => $useCurrency->decimal_places, 'currency_decimal_places' => $useCurrency->decimal_places,
'account_currency_id' => (string) $currency->id, 'account_currency_id' => (string)$currency->id,
'account_currency_name' => $currency->name, 'account_currency_name' => $currency->name,
'account_currency_code' => $currency->code, 'account_currency_code' => $currency->code,
'account_currency_symbol' => $currency->symbol, 'account_currency_symbol' => $currency->symbol,
@@ -134,8 +140,8 @@ class AccountController extends Controller
$return, $return,
static function (array $left, array $right) { static function (array $left, array $right) {
$order = [AccountTypeEnum::ASSET->value, AccountTypeEnum::REVENUE->value, AccountTypeEnum::EXPENSE->value]; $order = [AccountTypeEnum::ASSET->value, AccountTypeEnum::REVENUE->value, AccountTypeEnum::EXPENSE->value];
$posA = (int) array_search($left['type'], $order, true); $posA = (int)array_search($left['type'], $order, true);
$posB = (int) array_search($right['type'], $order, true); $posB = (int)array_search($right['type'], $order, true);
return $posA - $posB; return $posA - $posB;
} }

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
@@ -61,10 +61,9 @@ class BillController extends Controller
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC
*/ */
public function bills(AutocompleteRequest $request): JsonResponse public function bills(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $result = $this->repository->searchBill($request->attributes->get('query'), $request->attributes->get('limit'));
$result = $this->repository->searchBill($data['query'], $this->parameters->get('limit'));
$filtered = $result->map( $filtered = $result->map(
static fn (Bill $item) => [ static fn (Bill $item) => [
'id' => (string) $item->id, 'id' => (string) $item->id,

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
@@ -61,10 +61,9 @@ class BudgetController extends Controller
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBudgetsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBudgetsAC
*/ */
public function budgets(AutocompleteRequest $request): JsonResponse public function budgets(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $result = $this->repository->searchBudget($request->attributes->get('query'), $request->attributes->get('limit'));
$result = $this->repository->searchBudget($data['query'], $this->parameters->get('limit'));
$filtered = $result->map( $filtered = $result->map(
static fn (Budget $item) => [ static fn (Budget $item) => [
'id' => (string) $item->id, 'id' => (string) $item->id,

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
@@ -61,10 +61,9 @@ class CategoryController extends Controller
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCategoriesAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCategoriesAC
*/ */
public function categories(AutocompleteRequest $request): JsonResponse public function categories(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $result = $this->repository->searchCategory($request->attributes->get('query'), $request->attributes->get('limit'));
$result = $this->repository->searchCategory($data['query'], $this->parameters->get('limit'));
$filtered = $result->map( $filtered = $result->map(
static fn (Category $item) => [ static fn (Category $item) => [
'id' => (string) $item->id, 'id' => (string) $item->id,

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Deprecated; use Deprecated;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
@@ -62,10 +63,9 @@ class CurrencyController extends Controller
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC
*/ */
public function currencies(AutocompleteRequest $request): JsonResponse public function currencies(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $collection = $this->repository->searchCurrency($request->attributes->get('query'), $request->attributes->get('limit'));
$collection = $this->repository->searchCurrency($data['query'], $this->parameters->get('limit'));
$result = []; $result = [];
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\ObjectGroup;
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
@@ -61,11 +61,10 @@ class ObjectGroupController extends Controller
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC
*/ */
public function objectGroups(AutocompleteRequest $request): JsonResponse public function objectGroups(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData();
$return = []; $return = [];
$result = $this->repository->search($data['query'], $this->parameters->get('limit')); $result = $this->repository->search($request->attributes->get('query'), $request->attributes->get('limit'));
/** @var ObjectGroup $objectGroup */ /** @var ObjectGroup $objectGroup */
foreach ($result as $objectGroup) { foreach ($result as $objectGroup) {

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
@@ -64,10 +64,9 @@ class PiggyBankController extends Controller
); );
} }
public function piggyBanks(AutocompleteRequest $request): JsonResponse public function piggyBanks(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $piggies = $this->piggyRepository->searchPiggyBank($request->attributes->get('query'), $request->attributes->get('limit'));
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
$response = []; $response = [];
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */
@@ -90,10 +89,9 @@ class PiggyBankController extends Controller
return response()->api($response); return response()->api($response);
} }
public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse public function piggyBanksWithBalance(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $piggies = $this->piggyRepository->searchPiggyBank($request->attributes->get('query'), $request->attributes->get('limit'));
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
$response = []; $response = [];
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
@@ -57,10 +57,9 @@ class RecurrenceController extends Controller
); );
} }
public function recurring(AutocompleteRequest $request): JsonResponse public function recurring(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $recurrences = $this->repository->searchRecurrence($request->attributes->get('query'), $request->attributes->get('limit'));
$recurrences = $this->repository->searchRecurrence($data['query'], $this->parameters->get('limit'));
$response = []; $response = [];
/** @var Recurrence $recurrence */ /** @var Recurrence $recurrence */

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
@@ -57,10 +57,9 @@ class RuleController extends Controller
); );
} }
public function rules(AutocompleteRequest $request): JsonResponse public function rules(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $rules = $this->repository->searchRule($request->attributes->get('query'), $request->attributes->get('limit'));
$rules = $this->repository->searchRule($data['query'], $this->parameters->get('limit'));
$response = []; $response = [];
/** @var Rule $rule */ /** @var Rule $rule */

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
@@ -57,10 +57,9 @@ class RuleGroupController extends Controller
); );
} }
public function ruleGroups(AutocompleteRequest $request): JsonResponse public function ruleGroups(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $groups = $this->repository->searchRuleGroup($request->attributes->get('query'), $request->attributes->get('limit'));
$groups = $this->repository->searchRuleGroup($data['query'], $this->parameters->get('limit'));
$response = []; $response = [];
/** @var RuleGroup $group */ /** @var RuleGroup $group */

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface;
@@ -57,10 +57,9 @@ class TagController extends Controller
); );
} }
public function tags(AutocompleteRequest $request): JsonResponse public function tags(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $result = $this->repository->searchTags($request->attributes->get('query'), $request->attributes->get('limit'));
$result = $this->repository->searchTags($data['query'], $this->parameters->get('limit'));
$array = []; $array = [];
/** @var Tag $tag */ /** @var Tag $tag */

View File

@@ -25,7 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteTransactionApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
@@ -64,10 +65,9 @@ class TransactionController extends Controller
); );
} }
public function transactions(AutocompleteRequest $request): JsonResponse public function transactions(AutocompleteTransactionApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $result = $this->repository->searchJournalDescriptions($request->attributes->get('query'), $request->attributes->get('limit'));
$result = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit'));
// limit and unique // limit and unique
$filtered = $result->unique('description'); $filtered = $result->unique('description');
@@ -86,13 +86,12 @@ class TransactionController extends Controller
return response()->api($array); return response()->api($array);
} }
public function transactionsWithID(AutocompleteRequest $request): JsonResponse public function transactionsWithID(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData();
$result = new Collection(); $result = new Collection();
if (is_numeric($data['query'])) { if (is_numeric($request->attributes->get('query'))) {
// search for group, not journal. // search for group, not journal.
$firstResult = $this->groupRepository->find((int) $data['query']); $firstResult = $this->groupRepository->find((int) $request->attributes->get('query'));
if ($firstResult instanceof TransactionGroup) { if ($firstResult instanceof TransactionGroup) {
// group may contain multiple journals, each a result: // group may contain multiple journals, each a result:
foreach ($firstResult->transactionJournals as $journal) { foreach ($firstResult->transactionJournals as $journal) {
@@ -100,8 +99,8 @@ class TransactionController extends Controller
} }
} }
} }
if (!is_numeric($data['query'])) { if (!is_numeric($request->attributes->get('query'))) {
$result = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit')); $result = $this->repository->searchJournalDescriptions($request->attributes->get('query'), $request->attributes->get('limit'));
} }
// limit and unique // limit and unique

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete; namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface;
@@ -55,10 +55,9 @@ class TransactionTypeController extends Controller
); );
} }
public function transactionTypes(AutocompleteRequest $request): JsonResponse public function transactionTypes(AutocompleteApiRequest $request): JsonResponse
{ {
$data = $request->getData(); $types = $this->repository->searchTypes($request->attributes->get('query'), $request->attributes->get('limit'));
$types = $this->repository->searchTypes($data['query'], $this->parameters->get('limit'));
$array = []; $array = [];
/** @var TransactionType $type */ /** @var TransactionType $type */

View File

@@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\SameDateRequest; use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
@@ -83,15 +83,13 @@ class BudgetController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function overview(SameDateRequest $request): JsonResponse public function overview(DateRangeRequest $request): JsonResponse
{ {
$params = $request->getAll();
/** @var Carbon $start */ /** @var Carbon $start */
$start = $params['start']; $start = $request->attributes->get('start');
/** @var Carbon $end */ /** @var Carbon $end */
$end = $params['end']; $end = $request->attributes->get('end');
// code from FrontpageChartGenerator, but not in separate class // code from FrontpageChartGenerator, but not in separate class
$budgets = $this->repository->getActiveBudgets(); $budgets = $this->repository->getActiveBudgets();

View File

@@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\SameDateRequest; use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
@@ -80,13 +80,13 @@ class CategoryController extends Controller
* *
* @SuppressWarnings("PHPMD.UnusedFormalParameter") * @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/ */
public function overview(SameDateRequest $request): JsonResponse public function overview(DateRangeRequest $request): JsonResponse
{ {
/** @var Carbon $start */ /** @var Carbon $start */
$start = $this->parameters->get('start'); $start = $request->attributes->get('start');
/** @var Carbon $end */ /** @var Carbon $end */
$end = $this->parameters->get('end'); $end = $request->attributes->get('end');
$accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value]); $accounts = $this->accountRepos->getAccountsByType([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value]);
$currencies = []; $currencies = [];
$return = []; $return = [];

View File

@@ -29,6 +29,7 @@ use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\Exceptions\BadHttpHeaderException; use FireflyIII\Exceptions\BadHttpHeaderException;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\AbstractTransformer; use FireflyIII\Transformers\AbstractTransformer;
@@ -67,6 +68,8 @@ abstract class Controller extends BaseController
protected bool $convertToPrimary = false; protected bool $convertToPrimary = false;
protected TransactionCurrency $primaryCurrency; protected TransactionCurrency $primaryCurrency;
/** @deprecated use Request classes */
protected ParameterBag $parameters; protected ParameterBag $parameters;
/** /**
@@ -98,7 +101,8 @@ abstract class Controller extends BaseController
} }
/** /**
* Method to grab all parameters from the URL. * @deprecated use Request classes
* Method to grab all parameters from the URL
*/ */
private function getParameters(): ParameterBag private function getParameters(): ParameterBag
{ {
@@ -156,7 +160,7 @@ abstract class Controller extends BaseController
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$pageSize = (int)app('preferences')->getForUser($user, 'listPageSize', 50)->data; $pageSize = (int)Preferences::getForUser($user, 'listPageSize', 50)->data;
$bag->set($integer, $pageSize); $bag->set($integer, $pageSize);
} }
} }

View File

@@ -46,6 +46,7 @@ use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Services\Internal\Destroy\AccountDestroyService; use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
use FireflyIII\Services\Internal\Destroy\JournalDestroyService; use FireflyIII\Services\Internal\Destroy\JournalDestroyService;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -102,7 +103,7 @@ class DestroyController extends Controller
default => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)), default => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)),
}; };
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Account;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -60,7 +61,7 @@ class DestroyController extends Controller
public function destroy(Account $account): JsonResponse public function destroy(Account $account): JsonResponse
{ {
$this->repository->destroy($account, null); $this->repository->destroy($account, null);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -25,6 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Account; namespace FireflyIII\Api\V1\Controllers\Models\Account;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
@@ -36,7 +38,6 @@ use FireflyIII\Transformers\PiggyBankTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
@@ -69,22 +70,25 @@ class ListController extends Controller
); );
} }
public function attachments(Account $account): JsonResponse public function attachments(PaginationRequest $request, Account $account): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); [
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
$collection = $this->repository->getAttachments($account); $collection = $this->repository->getAttachments($account);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice($offset, $limit);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams()); $paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -92,18 +96,21 @@ class ListController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }
public function piggyBanks(Account $account): JsonResponse public function piggyBanks(PaginationRequest $request, Account $account): JsonResponse
{ {
// create some objects: // create some objects:
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: [
$pageSize = $this->parameters->get('limit'); 'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
// get list of piggy banks. Count it and split it. // get list of piggy banks. Count it and split it.
$collection = $this->repository->getPiggyBanks($account); $collection = $this->repository->getPiggyBanks($account);
$count = $collection->count(); $count = $collection->count();
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $piggyBanks = $collection->slice($offset, $limit);
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
@@ -113,12 +120,12 @@ class ListController extends Controller
$piggyBanks = $enrichment->enrich($piggyBanks); $piggyBanks = $enrichment->enrich($piggyBanks);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams()); $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
/** @var PiggyBankTransformer $transformer */ /** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class); $transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters); // $transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks'); $resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -129,12 +136,15 @@ class ListController extends Controller
/** /**
* Show all transaction groups related to the account. * Show all transaction groups related to the account.
*/ */
public function transactions(Request $request, Account $account): JsonResponse public function transactions(PaginationDateRangeRequest $request, Account $account): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); [
$type = $request->get('type') ?? 'default'; 'limit' => $limit,
$this->parameters->set('type', $type); 'page' => $page,
$types = $this->mapTransactionTypes($this->parameters->get('type')); 'start' => $start,
'end' => $end,
'types' => $types,
] = $request->attributes->all();
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
@@ -143,15 +153,12 @@ class ListController extends Controller
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setUser($admin)->setAccounts(new Collection()->push($account)) $collector->setUser($admin)->setAccounts(new Collection()->push($account))->withAPIInformation()->setLimit($limit)->setPage($page)->setTypes($types);
->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types) if (null !== $start) {
; $collector->setStart($start);
if (null !== $this->parameters->get('start')) {
$collector->setStart($this->parameters->get('start'));
} }
if (null !== $this->parameters->get('end')) { if (null !== $end) {
$collector->setEnd($this->parameters->get('end')); $collector->setEnd($end);
} }
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
@@ -164,7 +171,6 @@ class ListController extends Controller
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));

View File

@@ -71,43 +71,45 @@ class ShowController extends Controller
public function index(ShowRequest $request): JsonResponse public function index(ShowRequest $request): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$params = $request->getParameters(); [
$this->parameters->set('type', $params['type']); 'types' => $types,
'page' => $page,
// types to get, page size: 'limit' => $limit,
$types = $this->mapAccountTypes($params['type']); 'offset' => $offset,
'sort' => $sort,
'start' => $start,
'end' => $end,
'date' => $date,
]
= $request->attributes->all();
// get list of accounts. Count it and split it. // get list of accounts. Count it and split it.
$this->repository->resetAccountOrder(); $this->repository->resetAccountOrder();
$collection = $this->repository->getAccountsByType($types, $params['sort']); $collection = $this->repository->getAccountsByType($types, $sort);
$count = $collection->count(); $count = $collection->count();
// continue sort: // continue sort:
// TODO if the user sorts on DB dependent field there must be no slice before enrichment, only after. // TODO if the user sorts on DB dependent field there must be no slice before enrichment, only after.
// TODO still need to figure out how to do this easily. // TODO still need to figure out how to do this easily.
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $params['limit'], $params['limit']); $accounts = $collection->slice($offset, $limit);
// #11007 go to the end of the previous day.
$this->parameters->set('start', $this->parameters->get('start')->subSecond());
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
$enrichment = new AccountEnrichment(); $enrichment = new AccountEnrichment();
$enrichment->setSort($params['sort']); $enrichment->setSort($sort);
$enrichment->setDate($this->parameters->get('date')); $enrichment->setDate($date);
$enrichment->setStart($this->parameters->get('start')); $enrichment->setStart($start);
$enrichment->setEnd($this->parameters->get('end')); $enrichment->setEnd($end);
$enrichment->setUser($admin); $enrichment->setUser($admin);
$accounts = $enrichment->enrich($accounts); $accounts = $enrichment->enrich($accounts);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($accounts, $count, $params['limit'], $this->parameters->get('page')); $paginator = new LengthAwarePaginator($accounts, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.index').$this->buildParams()); $paginator->setPath(route('api.v1.accounts.index').$this->buildParams());
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); $resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY);
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -126,26 +128,25 @@ class ShowController extends Controller
// get list of accounts. Count it and split it. // get list of accounts. Count it and split it.
$this->repository->resetAccountOrder(); $this->repository->resetAccountOrder();
$account->refresh(); $account->refresh();
$manager = $this->getManager(); $manager = $this->getManager();
['start' => $start,
// #11007 go to the end of the previous day. 'end' => $end,
$this->parameters->set('start', $this->parameters->get('start')->subSecond()); 'date' => $date,] = $request->attributes->all();
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
$enrichment = new AccountEnrichment(); $enrichment = new AccountEnrichment();
$enrichment->setDate($this->parameters->get('date')); $enrichment->setDate($date);
$enrichment->setStart($this->parameters->get('start')); $enrichment->setStart($start);
$enrichment->setEnd($this->parameters->get('end')); $enrichment->setEnd($end);
$enrichment->setUser($admin); $enrichment->setUser($admin);
$account = $enrichment->enrichSingle($account); $account = $enrichment->enrichSingle($account);
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters); $resource = new Item($account, $transformer, self::RESOURCE_KEY);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -81,7 +81,6 @@ class StoreController extends Controller
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, self::RESOURCE_KEY); $resource = new Item($account, $transformer, self::RESOURCE_KEY);

View File

@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\Account\UpdateRequest; use FireflyIII\Api\V1\Requests\Models\Account\UpdateRequest;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
use FireflyIII\Transformers\AccountTransformer; use FireflyIII\Transformers\AccountTransformer;
use FireflyIII\User; use FireflyIII\User;
@@ -74,7 +75,7 @@ class UpdateController extends Controller
$account = $this->repository->update($account, $data); $account = $this->repository->update($account, $data);
$manager = $this->getManager(); $manager = $this->getManager();
$account->refresh(); $account->refresh();
app('preferences')->mark(); Preferences::mark();
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
@@ -86,7 +87,6 @@ class UpdateController extends Controller
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, self::RESOURCE_KEY); $resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Middleware\ApiDemoUser; use FireflyIII\Api\V1\Middleware\ApiDemoUser;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -74,7 +75,7 @@ class DestroyController extends Controller
} }
$this->repository->destroy($attachment); $this->repository->destroy($attachment);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Attachment;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Middleware\ApiDemoUser; use FireflyIII\Api\V1\Middleware\ApiDemoUser;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
@@ -120,8 +121,14 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function index(): JsonResponse public function index(PaginationRequest $request): JsonResponse
{ {
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
if (true === auth()->user()->hasRole('demo')) { if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
@@ -130,21 +137,17 @@ class ShowController extends Controller
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size:
$pageSize = $this->parameters->get('limit');
// get list of attachments. Count it and split it. // get list of attachments. Count it and split it.
$collection = $this->repository->get(); $collection = $this->repository->get();
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice($offset, $limit);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.attachments.index').$this->buildParams()); $paginator->setPath(route('api.v1.attachments.index').$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -169,7 +172,6 @@ class ShowController extends Controller
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments'); $resource = new Item($attachment, $transformer, 'attachments');

View File

@@ -87,7 +87,6 @@ class StoreController extends Controller
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments'); $resource = new Item($attachment, $transformer, 'attachments');

View File

@@ -81,7 +81,6 @@ class UpdateController extends Controller
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments'); $resource = new Item($attachment, $transformer, 'attachments');

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget; namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment; use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment;
@@ -67,19 +68,21 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function index(): JsonResponse public function index(PaginationDateRangeRequest $request): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
[
// types to get, page size: 'limit' => $limit,
$pageSize = $this->parameters->get('limit'); 'offset' => $offset,
$start = $this->parameters->get('start'); 'page' => $page,
$end = $this->parameters->get('end'); 'start' => $start,
'end' => $end,
] = $request->attributes->all();
// get list of available budgets. Count it and split it. // get list of available budgets. Count it and split it.
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end); $collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count(); $count = $collection->count();
$availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $availableBudgets = $collection->slice($offset, $limit);
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
@@ -89,12 +92,11 @@ class ShowController extends Controller
$availableBudgets = $enrichment->enrich($availableBudgets); $availableBudgets = $enrichment->enrich($availableBudgets);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams()); $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
/** @var AvailableBudgetTransformer $transformer */ /** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class); $transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets'); $resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -116,15 +118,12 @@ class ShowController extends Controller
/** @var AvailableBudgetTransformer $transformer */ /** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class); $transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment(); $enrichment = new AvailableBudgetEnrichment();
$enrichment->setUser($admin); $enrichment->setUser($admin);
// $enrichment->setStart($start);
// $enrichment->setEnd($end);
$availableBudget = $enrichment->enrichSingle($availableBudget); $availableBudget = $enrichment->enrichSingle($availableBudget);

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Bill;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -61,7 +62,7 @@ class DestroyController extends Controller
public function destroy(Bill $bill): JsonResponse public function destroy(Bill $bill): JsonResponse
{ {
$this->repository->destroy($bill); $this->repository->destroy($bill);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -25,6 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Bill; namespace FireflyIII\Api\V1\Controllers\Models\Bill;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
@@ -35,7 +37,6 @@ use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
@@ -71,22 +72,25 @@ class ListController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function attachments(Bill $bill): JsonResponse public function attachments(PaginationRequest $request, Bill $bill): JsonResponse
{ {
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit');
$collection = $this->repository->getAttachments($bill); $collection = $this->repository->getAttachments($bill);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice($offset, $limit);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams()); $paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -100,25 +104,25 @@ class ListController extends Controller
* *
* List all of them. * List all of them.
*/ */
public function rules(Bill $bill): JsonResponse public function rules(PaginationRequest $request, Bill $bill): JsonResponse
{ {
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size:
$pageSize = $this->parameters->get('limit');
// get list of budgets. Count it and split it.
$collection = $this->repository->getRulesForBill($bill); $collection = $this->repository->getRulesForBill($bill);
$count = $collection->count(); $count = $collection->count();
$rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $rules = $collection->slice($offset, $limit);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams()); $paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams());
/** @var RuleTransformer $transformer */ /** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class); $transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'rules'); $resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -131,13 +135,16 @@ class ListController extends Controller
* *
* Show all transactions. * Show all transactions.
*/ */
public function transactions(Request $request, Bill $bill): JsonResponse public function transactions(PaginationDateRangeRequest $request, Bill $bill): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); [
$type = $request->get('type') ?? 'default'; 'limit' => $limit,
$this->parameters->set('type', $type); 'page' => $page,
'types' => $types,
'start' => $start,
'end' => $end,
] = $request->attributes->all();
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
@@ -153,18 +160,18 @@ class ListController extends Controller
// all info needed for the API: // all info needed for the API:
->withAPIInformation() ->withAPIInformation()
// set page size: // set page size:
->setLimit($pageSize) ->setLimit($limit)
// set page to retrieve // set page to retrieve
->setPage($this->parameters->get('page')) ->setPage($page)
// set types of transactions to return. // set types of transactions to return.
->setTypes($types) ->setTypes($types)
; ;
if (null !== $this->parameters->get('start')) { if (null !== $start) {
$collector->setStart($this->parameters->get('start')); $collector->setStart($start);
} }
if (null !== $this->parameters->get('end')) { if (null !== $end) {
$collector->setEnd($this->parameters->get('end')); $collector->setEnd($end);
} }
// get paginator. // get paginator.
@@ -178,7 +185,6 @@ class ListController extends Controller
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));

View File

@@ -25,6 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Bill; namespace FireflyIII\Api\V1\Controllers\Models\Bill;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment; use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment;
@@ -65,28 +67,34 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function index(): JsonResponse public function index(PaginationDateRangeRequest $request): JsonResponse
{ {
[
'limit' => $limit,
'offset' => $offset,
'start' => $start,
'end' => $end,
'page' => $page,
] = $request->attributes->all();
$this->repository->correctOrder(); $this->repository->correctOrder();
$bills = $this->repository->getBills(); $bills = $this->repository->getBills();
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit');
$count = $bills->count(); $count = $bills->count();
$bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
// enrich // enrich
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
$enrichment = new SubscriptionEnrichment(); $enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin); $enrichment->setUser($admin);
$enrichment->setStart($this->parameters->get('start')); $enrichment->setStart($start);
$enrichment->setEnd($this->parameters->get('end')); $enrichment->setEnd($end);
$bills = $enrichment->enrich($bills); $bills = $enrichment->enrich($bills);
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($bills, $transformer, 'bills'); $resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
@@ -100,8 +108,13 @@ class ShowController extends Controller
* *
* Show the specified bill. * Show the specified bill.
*/ */
public function show(Bill $bill): JsonResponse public function show(DateRangeRequest $request, Bill $bill): JsonResponse
{ {
[
'start' => $start,
'end' => $end,
] = $request->attributes->all();
$manager = $this->getManager(); $manager = $this->getManager();
// enrich // enrich
@@ -109,13 +122,12 @@ class ShowController extends Controller
$admin = auth()->user(); $admin = auth()->user();
$enrichment = new SubscriptionEnrichment(); $enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin); $enrichment->setUser($admin);
$enrichment->setStart($this->parameters->get('start')); $enrichment->setStart($start);
$enrichment->setEnd($this->parameters->get('end')); $enrichment->setEnd($end);
$bill = $enrichment->enrichSingle($bill); $bill = $enrichment->enrichSingle($bill);
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($bill, $transformer, 'bills'); $resource = new Item($bill, $transformer, 'bills');

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Budget;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -61,7 +62,7 @@ class DestroyController extends Controller
public function destroy(Budget $budget): JsonResponse public function destroy(Budget $budget): JsonResponse
{ {
$this->repository->destroy($budget); $this->repository->destroy($budget);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -71,7 +72,7 @@ class DestroyController extends Controller
throw new FireflyException('20028: The budget limit does not belong to the budget.'); throw new FireflyException('20028: The budget limit does not belong to the budget.');
} }
$this->blRepository->destroyBudgetLimit($budgetLimit); $this->blRepository->destroyBudgetLimit($budgetLimit);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -172,7 +172,6 @@ class ShowController extends Controller
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits'); $resource = new Item($budgetLimit, $transformer, 'budget_limits');

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Category;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -61,7 +62,7 @@ class DestroyController extends Controller
public function destroy(Category $category): JsonResponse public function destroy(Category $category): JsonResponse
{ {
$this->repository->destroy($category); $this->repository->destroy($category);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -28,6 +28,7 @@ use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest; use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Models\CurrencyExchangeRate;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface; use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
@@ -75,6 +76,9 @@ class DestroyController extends Controller
if ($exchangeRate instanceof CurrencyExchangeRate) { if ($exchangeRate instanceof CurrencyExchangeRate) {
$this->repository->deleteRate($exchangeRate); $this->repository->deleteRate($exchangeRate);
} }
if (!$exchangeRate instanceof CurrencyExchangeRate) {
throw new FireflyException('Bla');
}
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -82,7 +82,6 @@ class UpdateController extends Controller
$exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date); $exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date);
$transformer = new ExchangeRateTransformer(); $transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response() return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer)) ->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\ObjectGroup;
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -64,7 +65,7 @@ class DestroyController extends Controller
public function destroy(ObjectGroup $objectGroup): JsonResponse public function destroy(ObjectGroup $objectGroup): JsonResponse
{ {
$this->repository->destroy($objectGroup); $this->repository->destroy($objectGroup);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\PiggyBank;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -61,7 +62,7 @@ class DestroyController extends Controller
public function destroy(PiggyBank $piggyBank): JsonResponse public function destroy(PiggyBank $piggyBank): JsonResponse
{ {
$this->repository->destroy($piggyBank); $this->repository->destroy($piggyBank);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Recurrence;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -61,7 +62,7 @@ class DestroyController extends Controller
public function destroy(Recurrence $recurrence): JsonResponse public function destroy(Recurrence $recurrence): JsonResponse
{ {
$this->repository->destroy($recurrence); $this->repository->destroy($recurrence);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Rule;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -65,7 +66,7 @@ class DestroyController extends Controller
public function destroy(Rule $rule): JsonResponse public function destroy(Rule $rule): JsonResponse
{ {
$this->ruleRepository->destroy($rule); $this->ruleRepository->destroy($rule);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\RuleGroup;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -65,7 +66,7 @@ class DestroyController extends Controller
public function destroy(RuleGroup $ruleGroup): JsonResponse public function destroy(RuleGroup $ruleGroup): JsonResponse
{ {
$this->ruleGroupRepository->destroy($ruleGroup, null); $this->ruleGroupRepository->destroy($ruleGroup, null);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Tag;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -65,7 +66,7 @@ class DestroyController extends Controller
public function destroy(Tag $tag): JsonResponse public function destroy(Tag $tag): JsonResponse
{ {
$this->repository->destroy($tag); $this->repository->destroy($tag);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -32,6 +32,7 @@ use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -92,7 +93,7 @@ class DestroyController extends Controller
$this->groupRepository->destroy($transactionGroup); $this->groupRepository->destroy($transactionGroup);
app('preferences')->mark(); Preferences::mark();
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
@@ -112,7 +113,7 @@ class DestroyController extends Controller
public function destroyJournal(TransactionJournal $transactionJournal): JsonResponse public function destroyJournal(TransactionJournal $transactionJournal): JsonResponse
{ {
$this->repository->destroyJournal($transactionJournal); $this->repository->destroyJournal($transactionJournal);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -33,6 +33,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
use FireflyIII\Rules\IsDuplicateTransaction; use FireflyIII\Rules\IsDuplicateTransaction;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
@@ -107,7 +108,7 @@ class StoreController extends Controller
throw new ValidationException($validator); throw new ValidationException($validator);
} }
app('preferences')->mark(); Preferences::mark();
$applyRules = $data['apply_rules'] ?? true; $applyRules = $data['apply_rules'] ?? true;
$fireWebhooks = $data['fire_webhooks'] ?? true; $fireWebhooks = $data['fire_webhooks'] ?? true;
event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks)); event(new StoredTransactionGroup($transactionGroup, $applyRules, $fireWebhooks));

View File

@@ -30,6 +30,7 @@ use FireflyIII\Events\UpdatedTransactionGroup;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment; use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User; use FireflyIII\User;
@@ -79,7 +80,7 @@ class UpdateController extends Controller
$newHash = $this->groupRepository->getCompareHash($transactionGroup); $newHash = $this->groupRepository->getCompareHash($transactionGroup);
$manager = $this->getManager(); $manager = $this->getManager();
app('preferences')->mark(); Preferences::mark();
$applyRules = $data['apply_rules'] ?? true; $applyRules = $data['apply_rules'] ?? true;
$fireWebhooks = $data['fire_webhooks'] ?? true; $fireWebhooks = $data['fire_webhooks'] ?? true;
$runRecalculations = $oldHash !== $newHash; $runRecalculations = $oldHash !== $newHash;

View File

@@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
@@ -89,7 +90,7 @@ class DestroyController extends Controller
} }
$this->repository->destroy($currency); $this->repository->destroy($currency);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -101,7 +101,9 @@ class ListController extends Controller
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// #11007 go to the end of the previous day. // #11007 go to the end of the previous day.
$this->parameters->set('start', $this->parameters->get('start')->subSecond()); $this->parameters->set('start', $this->parameters->get('start')?->subSecond());
// #11018 also end of the day.
$this->parameters->set('end', $this->parameters->get('end')?->endOfDay());
// enrich // enrich
/** @var User $admin */ /** @var User $admin */

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\StoreRequest; use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\StoreRequest;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
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 FireflyIII\Transformers\CurrencyTransformer; use FireflyIII\Transformers\CurrencyTransformer;
@@ -71,7 +72,7 @@ class StoreController extends Controller
$currency = $this->repository->store($request->getAll()); $currency = $this->repository->store($request->getAll());
if (true === $request->boolean('default')) { if (true === $request->boolean('default')) {
$this->repository->makePrimary($currency); $this->repository->makePrimary($currency);
app('preferences')->mark(); Preferences::mark();
} }
$manager = $this->getManager(); $manager = $this->getManager();

View File

@@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\UpdateRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
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 FireflyIII\Transformers\CurrencyTransformer; use FireflyIII\Transformers\CurrencyTransformer;
@@ -105,7 +106,7 @@ class UpdateController extends Controller
$this->repository->enable($currency); $this->repository->enable($currency);
$this->repository->makePrimary($currency); $this->repository->makePrimary($currency);
app('preferences')->mark(); Preferences::mark();
$manager = $this->getManager(); $manager = $this->getManager();
$currency->refreshForUser($user); $currency->refreshForUser($user);
@@ -172,14 +173,13 @@ class UpdateController extends Controller
$currency = $this->repository->update($currency, $data); $currency = $this->repository->update($currency, $data);
app('preferences')->mark(); Preferences::mark();
$manager = $this->getManager(); $manager = $this->getManager();
$currency->refreshForUser($user); $currency->refreshForUser($user);
/** @var CurrencyTransformer $transformer */ /** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class); $transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies'); $resource = new Item($currency, $transformer, 'currencies');

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\TransactionLink;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\TransactionJournalLink; use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -66,7 +67,7 @@ class DestroyController extends Controller
public function destroy(TransactionJournalLink $link): JsonResponse public function destroy(TransactionJournalLink $link): JsonResponse
{ {
$this->repository->destroyLink($link); $this->repository->destroyLink($link);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\LinkType; use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -73,7 +74,7 @@ class DestroyController extends Controller
throw new FireflyException('200020: Link type cannot be changed.'); throw new FireflyException('200020: Link type cannot be changed.');
} }
$this->repository->destroy($linkType); $this->repository->destroy($linkType);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\UserGroup; namespace FireflyIII\Api\V1\Controllers\Models\UserGroup;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\DateRequest; use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface;
use FireflyIII\Transformers\UserGroupTransformer; use FireflyIII\Transformers\UserGroupTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -52,17 +52,19 @@ class IndexController extends Controller
); );
} }
public function index(DateRequest $request): JsonResponse public function index(PaginationRequest $request): JsonResponse
{ {
$administrations = $this->repository->get(); $administrations = $this->repository->get();
$pageSize = $this->parameters->get('limit'); [
'page' => $page,
'limit' => $limit,
'offset' => $offset,
] = $request->attributes->all();
$count = $administrations->count(); $count = $administrations->count();
$administrations = $administrations->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $administrations = $administrations->slice($offset, $limit);
$paginator = new LengthAwarePaginator($administrations, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($administrations, $count, $limit, $page);
$transformer = new UserGroupTransformer(); $transformer = new UserGroupTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response() return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer)) ->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE) ->header('Content-Type', self::CONTENT_TYPE)

View File

@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\UserGroup\UpdateRequest; use FireflyIII\Api\V1\Requests\Models\UserGroup\UpdateRequest;
use FireflyIII\Models\UserGroup; use FireflyIII\Models\UserGroup;
use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Transformers\UserGroupTransformer; use FireflyIII\Transformers\UserGroupTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -59,7 +60,7 @@ class UpdateController extends Controller
$data = $request->getData(); $data = $request->getData();
$userGroup = $this->repository->update($userGroup, $data); $userGroup = $this->repository->update($userGroup, $data);
$userGroup->refresh(); $userGroup->refresh();
app('preferences')->mark(); Preferences::mark();
$transformer = new UserGroupTransformer(); $transformer = new UserGroupTransformer();
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);

View File

@@ -27,7 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Summary;
use Carbon\Carbon; use Carbon\Carbon;
use Exception; use Exception;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\DateRequest; use FireflyIII\Api\V1\Requests\Summary\BasicRequest;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
@@ -88,34 +88,25 @@ class BasicController extends Controller
); );
} }
/** public function basic(BasicRequest $request): JsonResponse
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/summary/getBasicSummary
*
* @throws Exception
*/
public function basic(DateRequest $request): JsonResponse
{ {
// parameters for boxes: // parameters for boxes:
$dates = $request->getAll(); ['start' => $start, 'end' => $end, 'code' => $code] = $request->attributes->all();
$start = $dates['start'];
$end = $dates['end'];
$code = $request->get('currency_code');
// balance information: // balance information:
$balanceData = $this->getBalanceInformation($start, $end); $balanceData = $this->getBalanceInformation($start, $end);
$billData = $this->getSubscriptionInformation($start, $end); $billData = $this->getSubscriptionInformation($start, $end);
$spentData = $this->getLeftToSpendInfo($start, $end); $spentData = $this->getLeftToSpendInfo($start, $end);
$netWorthData = $this->getNetWorthInfo($end); $netWorthData = $this->getNetWorthInfo($end);
// $balanceData = []; // $balanceData = [];
// $billData = []; // $billData = [];
// $spentData = []; // $spentData = [];
// $netWorthData = []; // $netWorthData = [];
$total = array_merge($balanceData, $billData, $spentData, $netWorthData); $total = array_merge($balanceData, $billData, $spentData, $netWorthData);
// give new keys // give new keys
$return = []; $return = [];
foreach ($total as $entry) { foreach ($total as $entry) {
if (null === $code || ($code === $entry['currency_code'])) { if ('' === $code || ($code === $entry['currency_code'])) {
$return[$entry['key']] = $entry; $return[$entry['key']] = $entry;
} }
} }
@@ -589,8 +580,6 @@ class BasicController extends Controller
private function getNetWorthInfo(Carbon $end): array private function getNetWorthInfo(Carbon $end): array
{ {
$end->endOfDay();
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
Log::debug(sprintf('getNetWorthInfo up until "%s".', $end->format('Y-m-d H:i:s'))); Log::debug(sprintf('getNetWorthInfo up until "%s".', $end->format('Y-m-d H:i:s')));

View File

@@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\User\PreferenceStoreRequest;
use FireflyIII\Api\V1\Requests\User\PreferenceUpdateRequest; use FireflyIII\Api\V1\Requests\User\PreferenceUpdateRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Transformers\PreferenceTransformer; use FireflyIII\Transformers\PreferenceTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
@@ -52,7 +53,7 @@ class PreferencesController extends Controller
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
$collection = app('preferences')->all(); $collection = Preferences::all();
$manager = $this->getManager(); $manager = $this->getManager();
$count = $collection->count(); $count = $collection->count();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
@@ -110,7 +111,7 @@ class PreferencesController extends Controller
throw new FireflyException('Please use api/v1/currencies/default instead.'); throw new FireflyException('Please use api/v1/currencies/default instead.');
} }
$pref = app('preferences')->set($data['name'], $data['data']); $pref = Preferences::set($data['name'], $data['data']);
/** @var PreferenceTransformer $transformer */ /** @var PreferenceTransformer $transformer */
$transformer = app(PreferenceTransformer::class); $transformer = app(PreferenceTransformer::class);
@@ -135,7 +136,7 @@ class PreferencesController extends Controller
$manager = $this->getManager(); $manager = $this->getManager();
$data = $request->getAll(); $data = $request->getAll();
$pref = app('preferences')->set($preference->name, $data['data']); $pref = Preferences::set($preference->name, $data['data']);
/** @var PreferenceTransformer $transformer */ /** @var PreferenceTransformer $transformer */
$transformer = app(PreferenceTransformer::class); $transformer = app(PreferenceTransformer::class);

View File

@@ -30,6 +30,7 @@ use FireflyIII\Models\Webhook;
use FireflyIII\Models\WebhookAttempt; use FireflyIII\Models\WebhookAttempt;
use FireflyIII\Models\WebhookMessage; use FireflyIII\Models\WebhookMessage;
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface; use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -70,7 +71,7 @@ class DestroyController extends Controller
Log::channel('audit')->info(sprintf('User destroys webhook #%d.', $webhook->id)); Log::channel('audit')->info(sprintf('User destroys webhook #%d.', $webhook->id));
$this->repository->destroy($webhook); $this->repository->destroy($webhook);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }
@@ -101,7 +102,7 @@ class DestroyController extends Controller
Log::channel('audit')->info(sprintf('User destroys webhook #%d, message #%d, attempt #%d.', $webhook->id, $message->id, $attempt->id)); Log::channel('audit')->info(sprintf('User destroys webhook #%d, message #%d, attempt #%d.', $webhook->id, $message->id, $attempt->id));
$this->repository->destroyAttempt($attempt); $this->repository->destroyAttempt($attempt);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }
@@ -128,7 +129,7 @@ class DestroyController extends Controller
Log::channel('audit')->info(sprintf('User destroys webhook #%d, message #%d.', $webhook->id, $message->id)); Log::channel('audit')->info(sprintf('User destroys webhook #%d, message #%d.', $webhook->id, $message->id));
$this->repository->destroyMessage($message); $this->repository->destroyMessage($message);
app('preferences')->mark(); Preferences::mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -0,0 +1,98 @@
<?php
/*
* Copyright (c) 2025 https://github.com/ctrl-f5
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Validator;
use RuntimeException;
abstract class AggregateFormRequest extends ApiRequest
{
/**
* @var ApiRequest[]
*/
protected array $requests = [];
/** @return class-string[] */
abstract protected function getRequests(): array;
public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void
{
parent::initialize($query, $request, $attributes, $cookies, $files, $server, $content);
// instantiate all subrequests and share current requests' bags with them
Log::debug('Initializing AggregateFormRequest.');
foreach ($this->getRequests() as $config) {
$requestClass = is_array($config) ? array_shift($config) : $config;
if (!is_a($requestClass, Request::class, true)) {
throw new RuntimeException('getRequests() must return class-strings of subclasses of Request');
}
Log::debug(sprintf('Initializing subrequest %s', $requestClass));
$instance = $this->requests[] = new $requestClass();
$instance->request = $this->request;
$instance->query = $this->query;
$instance->attributes = $this->attributes;
$instance->cookies = $this->cookies;
$instance->files = $this->files;
$instance->server = $this->server;
$instance->headers = $this->headers;
if ($instance instanceof ApiRequest) {
$instance->handleConfig(is_array($config) ? $config : []);
}
}
Log::debug('Done initializing AggregateFormRequest.');
}
public function rules(): array
{
// check all subrequests for rules and combine them
return array_reduce(
$this->requests,
static fn (array $rules, FormRequest $request) => $rules
+ (
method_exists($request, 'rules')
? $request->rules()
: []
),
[],
);
}
public function withValidator(Validator $validator): void
{
// register all subrequests' validators
foreach ($this->requests as $request) {
if (method_exists($request, 'withValidator')) {
Log::debug(sprintf('Process withValidator from class %s', get_class($request)));
$request->withValidator($validator);
}
}
}
}

View File

@@ -0,0 +1,43 @@
<?php
/*
* Copyright (c) 2025 https://github.com/ctrl-f5
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest;
class ApiRequest extends FormRequest
{
use ChecksLogin;
use ConvertsDataTypes;
protected string $required = '';
public function handleConfig(array $config): void
{
if (in_array('required', $config, true)) {
$this->required = 'required';
}
}
}

View File

@@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
/*
* AutocompleteApiRequest.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\Api\V1\Requests\Autocomplete;
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Api\V1\Requests\Generic\ObjectTypeApiRequest;
use FireflyIII\Api\V1\Requests\Generic\QueryRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Models\Account;
use Override;
class AutocompleteApiRequest extends AggregateFormRequest
{
#[Override]
protected function getRequests(): array
{
return [
DateRequest::class,
[PaginationRequest::class, 'sort_class' => Account::class],
[ObjectTypeApiRequest::class, 'object_type' => Account::class],
QueryRequest::class,
];
}
}

View File

@@ -31,6 +31,8 @@ use Illuminate\Foundation\Http\FormRequest;
/** /**
* Class AutocompleteRequest * Class AutocompleteRequest
*
* @deprecated
*/ */
class AutocompleteRequest extends FormRequest class AutocompleteRequest extends FormRequest
{ {
@@ -48,10 +50,12 @@ class AutocompleteRequest extends FormRequest
// remove 'initial balance' from allowed types. its internal // remove 'initial balance' from allowed types. its internal
$array = array_diff($array, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value]); $array = array_diff($array, [AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::RECONCILIATION->value]);
$date = $this->getCarbonDate('date') ?? today(config('app.timezone'));
return [ return [
'types' => $array, 'types' => $array,
'query' => $this->convertString('query'), 'query' => $this->convertString('query'),
'date' => $this->getCarbonDate('date'), 'date' => $date->endOfDay(),
]; ];
} }

View File

@@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
/*
* AutocompleteApiRequest.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\Api\V1\Requests\Autocomplete;
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Api\V1\Requests\Generic\ObjectTypeApiRequest;
use FireflyIII\Api\V1\Requests\Generic\QueryRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction;
use Override;
class AutocompleteTransactionApiRequest extends AggregateFormRequest
{
#[Override]
protected function getRequests(): array
{
return [
DateRequest::class,
[PaginationRequest::class, 'sort_class' => Account::class],
[ObjectTypeApiRequest::class, 'object_type' => Transaction::class],
QueryRequest::class,
];
}
}

View File

@@ -1,83 +0,0 @@
<?php
/*
* DateRequest.php
* Copyright (c) 2021 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Data;
use FireflyIII\Exceptions\ValidationException;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest;
/**
* Request class for end points that require date parameters.
*
* Class DateRequest
*/
class DateRequest extends FormRequest
{
use ChecksLogin;
use ConvertsDataTypes;
/**
* Get all data from the request.
*/
public function getAll(): array
{
$start = $this->getCarbonDate('start');
$end = $this->getCarbonDate('end');
if (null === $start) {
$start = now()->startOfMonth();
}
if (null === $end) {
$end = now()->endOfMonth();
}
// sanity check on dates:
[$start, $end] = $end < $start ? [$end, $start] : [$start, $end];
$start->startOfDay();
$end->endOfDay();
if ($start->diffInYears($end, true) > 5) {
throw new ValidationException('Date range out of range.');
}
return [
'start' => $start,
'end' => $end,
'date' => $this->getCarbonDate('date'),
];
}
/**
* The rules that the incoming request must be matched against.
*/
public function rules(): array
{
return [
'date' => 'date|after:1970-01-02|before:2038-01-17',
'start' => 'date|after:1970-01-02|before:2038-01-17|before:end|required_with:end',
'end' => 'date|after:1970-01-02|before:2038-01-17|after:start|required_with:start',
];
}
}

View File

@@ -32,6 +32,8 @@ use Illuminate\Foundation\Http\FormRequest;
* Request class for end points that require date parameters. * Request class for end points that require date parameters.
* *
* Class SameDateRequest * Class SameDateRequest
*
* @deprecated Replaced by DateRangeRequest
*/ */
class SameDateRequest extends FormRequest class SameDateRequest extends FormRequest
{ {

View File

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

View File

@@ -0,0 +1,58 @@
<?php
/*
* Copyright (c) 2025 https://github.com/ctrl-f5
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use Carbon\Carbon;
use Illuminate\Validation\Validator;
class DateRequest extends ApiRequest
{
public function rules(): array
{
return [
'date' => 'date|after:1970-01-02|before:2038-01-17|'.$this->required,
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if ($validator->failed()) {
return;
}
$date = $this->getCarbonDate('date')?->endOfDay();
// if we also have a range, date must be in that range
$start = $this->attributes->get('start');
$end = $this->attributes->get('end');
if ($date instanceof Carbon && $start instanceof Carbon && $end instanceof Carbon && !$date->between($start, $end)) {
$validator->errors()->add('date', (string)trans('validation.between_date'));
}
$this->attributes->set('date', $date);
}
);
}
}

View File

@@ -0,0 +1,101 @@
<?php
declare(strict_types=1);
/*
* AccountTypeApiRequest.php
* Copyright (c) 2025 https://github.com/ctrl-f5
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Requests\Generic;
use FireflyIII\Api\V1\Requests\ApiRequest;
use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction;
use FireflyIII\Rules\Account\IsValidAccountTypeList;
use FireflyIII\Rules\TransactionType\IsValidTransactionTypeList;
use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Http\Api\TransactionFilter;
use Illuminate\Validation\Validator;
use RuntimeException;
class ObjectTypeApiRequest extends ApiRequest
{
use AccountFilter;
use TransactionFilter;
private ?string $objectType = null;
public function handleConfig(array $config): void
{
parent::handleConfig($config);
$this->objectType = $config['object_type'] ?? null;
if (!$this->objectType) {
throw new RuntimeException('ObjectTypeApiRequest requires a object_type config');
}
}
public function rules(): array
{
$rule = null;
if (Account::class === $this->objectType) {
$rule = new IsValidAccountTypeList();
}
if (Transaction::class === $this->objectType) {
$rule = new IsValidTransactionTypeList();
}
$rules = [
'types' => [$rule],
];
if ('' !== $this->required) {
$rules['types'][] = $this->required;
}
return $rules;
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if ($validator->failed()) {
return;
}
$type = $this->convertString('types', 'all');
$this->attributes->set('type', $type);
switch ($this->objectType) {
default:
$this->attributes->set('types', []);
// no break
case Account::class:
$this->attributes->set('types', $this->mapAccountTypes($type));
break;
case Transaction::class:
$this->attributes->set('types', $this->mapTransactionTypes($type));
break;
}
}
);
}
}

View File

@@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
/*
* PaginationDateRangeRequest.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\Api\V1\Requests\Generic;
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Models\Transaction;
/**
* TODO this class includes an object type filter which should be moved to its own thing.
*/
class PaginationDateRangeRequest extends AggregateFormRequest
{
#[Override]
protected function getRequests(): array
{
return [
DateRangeRequest::class,
[ObjectTypeApiRequest::class, 'object_type' => Transaction::class],
[PaginationRequest::class, 'sort_class' => Transaction::class],
];
}
}

View File

@@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
/*
* QueryRequest.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\Api\V1\Requests\Generic;
use FireflyIII\Api\V1\Requests\ApiRequest;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Validation\Validator;
class QueryRequest extends ApiRequest
{
use ChecksLogin;
use ConvertsDataTypes;
public function rules(): array
{
return [
'query' => sprintf('min:1|max:50|%s', $this->required),
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if ($validator->failed()) {
return;
}
$query = $this->convertString('query');
$this->attributes->set('query', $query);
}
);
}
}

View File

@@ -33,6 +33,8 @@ use Illuminate\Foundation\Http\FormRequest;
* Request class for end points that require a date parameter. * Request class for end points that require a date parameter.
* *
* Class SingleDateRequest * Class SingleDateRequest
*
* @deprecated
*/ */
class SingleDateRequest extends FormRequest class SingleDateRequest extends FormRequest
{ {

View File

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

View File

@@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
/*
* AccountTypeApiRequest.php
* Copyright (c) 2025 https://github.com/ctrl-f5
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Requests\Models\Account;
use FireflyIII\Api\V1\Requests\ApiRequest;
use FireflyIII\Rules\Account\IsValidAccountTypeList;
use FireflyIII\Support\Http\Api\AccountFilter;
use Illuminate\Validation\Validator;
class AccountTypesApiRequest extends ApiRequest
{
use AccountFilter;
public function rules(): array
{
// sprintf('in:%s', implode(',', array_keys($this->types))),
return [
'types' => new IsValidAccountTypeList(),
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if ($validator->failed()) {
return;
}
$types = explode(',', $this->convertString('types', 'all'));
$result = [];
// split and find all types:
foreach ($types as $type) {
$result = array_merge($result, $this->mapAccountTypes($type));
}
$result = array_unique($result);
$this->attributes->set('types', $result);
}
);
}
}

View File

@@ -23,77 +23,23 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Models\Account; namespace FireflyIII\Api\V1\Requests\Models\Account;
use Carbon\Carbon; use FireflyIII\Api\V1\Requests\AggregateFormRequest;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Api\V1\Requests\Generic\ObjectTypeApiRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Rules\IsValidSortInstruction;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;
class ShowRequest extends FormRequest class ShowRequest extends AggregateFormRequest
{ {
use AccountFilter; protected function getRequests(): array
use ConvertsDataTypes;
public function getParameters(): array
{ {
$limit = $this->convertInteger('limit');
if (0 === $limit) {
// get default for user:
/** @var User $user */
$user = auth()->user();
$limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data;
}
$page = $this->convertInteger('page');
$page = min(max(1, $page), 2 ** 16);
return [ return [
'type' => $this->convertString('type', 'all'), [PaginationRequest::class, 'sort_class' => Account::class],
'limit' => $limit, DateRangeRequest::class,
'sort' => $this->convertSortParameters('sort', Account::class), DateRequest::class,
'page' => $page, AccountTypeApiRequest::class,
[ObjectTypeApiRequest::class, 'object_type' => Account::class],
]; ];
} }
public function rules(): array
{
$keys = implode(',', array_keys($this->types));
return [
'date' => 'date',
'start' => 'date|present_with:end|before_or_equal:end|before:2038-01-17|after:1970-01-02',
'end' => 'date|present_with:start|after_or_equal:start|before:2038-01-17|after:1970-01-02',
'sort' => ['nullable', new IsValidSortInstruction(Account::class)],
'type' => sprintf('in:%s', $keys),
'limit' => 'numeric|min:1|max:131337',
'page' => 'numeric|min:1|max:131337',
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if (count($validator->failed()) > 0) {
return;
}
$data = $validator->getData();
if (array_key_exists('date', $data) && array_key_exists('start', $data) && array_key_exists('end', $data)) {
// assume valid dates, before we got here.
$start = Carbon::parse($data['start'], config('app.timezone'))->startOfDay();
$end = Carbon::parse($data['end'], config('app.timezone'))->endOfDay();
$date = Carbon::parse($data['date'], config('app.timezone'));
if (!$date->between($start, $end)) {
$validator->errors()->add('date', (string)trans('validation.between_date'));
}
}
}
);
}
} }

View File

@@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
/*
* CurrencyCodeRequest.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\Api\V1\Requests\Models\TransactionCurrency;
use FireflyIII\Api\V1\Requests\ApiRequest;
use Illuminate\Validation\Validator;
class CurrencyCodeRequest extends ApiRequest
{
public function rules(): array
{
return [
'code' => sprintf('exists:transaction_currencies,code|%s', $this->required),
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if (!$validator->valid()) {
return;
}
$code = $this->convertString('code', '');
$this->attributes->set('code', $code);
}
);
}
}

View File

@@ -0,0 +1,82 @@
<?php
/*
* Copyright (c) 2025 https://github.com/ctrl-f5
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\IsValidSortInstruction;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User;
use Illuminate\Validation\Validator;
use RuntimeException;
class PaginationRequest extends ApiRequest
{
private ?string $sortClass = null;
public function handleConfig(array $config): void
{
parent::handleConfig($config);
$this->sortClass = $config['sort_class'] ?? null;
if (!$this->sortClass) {
throw new RuntimeException('PaginationRequest requires a sort_class config');
}
}
public function rules(): array
{
return [
'sort' => ['nullable', new IsValidSortInstruction((string)$this->sortClass)],
'limit' => 'numeric|min:1|max:131337',
'page' => 'numeric|min:1|max:131337',
];
}
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator): void {
if ($validator->failed()) {
return;
}
$limit = $this->convertInteger('limit');
if (0 === $limit) {
// get default for user:
/** @var User $user */
$user = auth()->user();
$limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data;
}
$page = $this->convertInteger('page');
$page = min(max(1, $page), 2 ** 16);
$offset = ($page - 1) * $limit;
$sort = $this->sortClass ? $this->convertSortParameters('sort', $this->sortClass) : $this->get('sort');
$this->attributes->set('limit', $limit);
$this->attributes->set('sort', $sort);
$this->attributes->set('page', $page);
$this->attributes->set('offset', $offset);
}
);
}
}

View File

@@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
/*
* BasicRequest.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\Api\V1\Requests\Summary;
use FireflyIII\Api\V1\Requests\AggregateFormRequest;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Api\V1\Requests\Models\TransactionCurrency\CurrencyCodeRequest;
class BasicRequest extends AggregateFormRequest
{
protected function getRequests(): array
{
return [
[DateRangeRequest::class, 'required'],
CurrencyCodeRequest::class,
];
}
}

View File

@@ -28,6 +28,7 @@ use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -47,7 +48,7 @@ class CorrectsFrontpageAccounts extends Command
/** @var User $user */ /** @var User $user */
foreach ($users as $user) { foreach ($users as $user) {
$preference = app('preferences')->getForUser($user, 'frontpageAccounts'); $preference = Preferences::getForUser($user, 'frontpageAccounts');
if (null !== $preference) { if (null !== $preference) {
$this->fixPreference($preference); $this->fixPreference($preference);
} }
@@ -79,6 +80,6 @@ class CorrectsFrontpageAccounts extends Command
} }
} }
} }
app('preferences')->setForUser($preference->user, 'frontpageAccounts', $fixed); Preferences::setForUser($preference->user, 'frontpageAccounts', $fixed);
} }
} }

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Console\Commands\Correction;
use Exception; use Exception;
use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -54,10 +55,10 @@ class CreatesAccessTokens extends Command
/** @var User $user */ /** @var User $user */
foreach ($users as $user) { foreach ($users as $user) {
$pref = app('preferences')->getForUser($user, 'access_token'); $pref = Preferences::getForUser($user, 'access_token');
if (null === $pref) { if (null === $pref) {
$token = $user->generateAccessToken(); $token = $user->generateAccessToken();
app('preferences')->setForUser($user, 'access_token', $token); Preferences::setForUser($user, 'access_token', $token);
$this->friendlyInfo(sprintf('Generated access token for user %s', $user->email)); $this->friendlyInfo(sprintf('Generated access token for user %s', $user->email));
++$count; ++$count;
} }

View File

@@ -46,7 +46,7 @@ class SetsLatestVersion extends Command
return 0; return 0;
} }
FireflyConfig::set('ff3_version', config('firefly.version')); FireflyConfig::set('ff3_build_time', (int) config('firefly.build_time'));
$this->friendlyInfo('Updated version.'); $this->friendlyInfo('Updated version.');
return 0; return 0;

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -114,7 +115,7 @@ class UpgradesBillsToRules extends Command
$this->ruleRepository->setUser($user); $this->ruleRepository->setUser($user);
/** @var Preference $lang */ /** @var Preference $lang */
$lang = app('preferences')->getForUser($user, 'language', 'en_US'); $lang = Preferences::getForUser($user, 'language', 'en_US');
$language = null !== $lang->data && !is_array($lang->data) ? (string) $lang->data : 'en_US'; $language = null !== $lang->data && !is_array($lang->data) ? (string) $lang->data : 'en_US';
$groupTitle = (string) trans('firefly.rulegroup_for_bills_title', [], $language); $groupTitle = (string) trans('firefly.rulegroup_for_bills_title', [], $language);
$ruleGroup = $this->ruleGroupRepository->findByTitle($groupTitle); $ruleGroup = $this->ruleGroupRepository->findByTitle($groupTitle);

View File

@@ -87,7 +87,7 @@ class UpgradesDatabase extends Command
$this->call($command, $args); $this->call($command, $args);
} }
// index will set FF3 version. // index will set FF3 version.
FireflyConfig::set('ff3_version', (string) config('firefly.version')); FireflyConfig::set('ff3_build_time', (int) config('firefly.build_time'));
return 0; return 0;
} }

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Console\Commands;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -79,7 +80,7 @@ trait VerifiesAccessToken
return false; return false;
} }
$accessToken = app('preferences')->getForUser($user, 'access_token'); $accessToken = Preferences::getForUser($user, 'access_token');
if (null === $accessToken) { if (null === $accessToken) {
Log::error(sprintf('User #%d has no access token, so cannot access command line options.', $userId)); Log::error(sprintf('User #%d has no access token, so cannot access command line options.', $userId));

View File

@@ -84,8 +84,10 @@ class AttachmentFactory
return $attachment; return $attachment;
} }
public function setUser(User $user): void public function setUser(User $user): static
{ {
$this->user = $user; $this->user = $user;
return $this;
} }
} }

View File

@@ -31,6 +31,7 @@ use FireflyIII\Repositories\ObjectGroup\CreatesObjectGroups;
use FireflyIII\Services\Internal\Support\BillServiceTrait; use FireflyIII\Services\Internal\Support\BillServiceTrait;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log;
/** /**
* Class BillFactory * Class BillFactory
@@ -47,7 +48,7 @@ class BillFactory
*/ */
public function create(array $data): ?Bill public function create(array $data): ?Bill
{ {
app('log')->debug(sprintf('Now in %s', __METHOD__), $data); Log::debug(sprintf('Now in %s', __METHOD__), $data);
$factory = app(TransactionCurrencyFactory::class); $factory = app(TransactionCurrencyFactory::class);
$currency = $factory->find((int) ($data['currency_id'] ?? null), (string) ($data['currency_code'] ?? null)) $currency = $factory->find((int) ($data['currency_id'] ?? null), (string) ($data['currency_code'] ?? null))
?? app('amount')->getPrimaryCurrencyByUserGroup($this->user->userGroup); ?? app('amount')->getPrimaryCurrencyByUserGroup($this->user->userGroup);
@@ -82,8 +83,8 @@ class BillFactory
] ]
); );
} catch (QueryException $e) { } catch (QueryException $e) {
app('log')->error($e->getMessage()); Log::error($e->getMessage());
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
throw new FireflyException('400000: Could not store bill.', 0, $e); throw new FireflyException('400000: Could not store bill.', 0, $e);
} }

View File

@@ -27,6 +27,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log;
/** /**
* Class CategoryFactory * Class CategoryFactory
@@ -43,7 +44,7 @@ class CategoryFactory
$categoryId = (int) $categoryId; $categoryId = (int) $categoryId;
$categoryName = (string) $categoryName; $categoryName = (string) $categoryName;
app('log')->debug(sprintf('Going to find category with ID %d and name "%s"', $categoryId, $categoryName)); Log::debug(sprintf('Going to find category with ID %d and name "%s"', $categoryId, $categoryName));
if ('' === $categoryName && 0 === $categoryId) { if ('' === $categoryName && 0 === $categoryId) {
return null; return null;
@@ -72,8 +73,8 @@ class CategoryFactory
] ]
); );
} catch (QueryException $e) { } catch (QueryException $e) {
app('log')->error($e->getMessage()); Log::error($e->getMessage());
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
throw new FireflyException('400003: Could not store new category.', 0, $e); throw new FireflyException('400003: Could not store new category.', 0, $e);
} }

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use Illuminate\Support\Facades\Log;
/** /**
* Create piggy bank events. * Create piggy bank events.
@@ -36,9 +37,9 @@ class PiggyBankEventFactory
{ {
public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): void public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): void
{ {
app('log')->debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type)); Log::debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type));
if (!$piggyBank instanceof PiggyBank) { if (!$piggyBank instanceof PiggyBank) {
app('log')->debug('Piggy bank is null'); Log::debug('Piggy bank is null');
return; return;
} }
@@ -49,7 +50,7 @@ class PiggyBankEventFactory
$amount = $piggyRepos->getExactAmount($piggyBank, $journal); $amount = $piggyRepos->getExactAmount($piggyBank, $journal);
if (0 === bccomp($amount, '0')) { if (0 === bccomp($amount, '0')) {
app('log')->debug('Amount is zero, will not create event.'); Log::debug('Amount is zero, will not create event.');
return; return;
} }

View File

@@ -92,7 +92,7 @@ class PiggyBankFactory
/** @var PiggyBank $piggyBank */ /** @var PiggyBank $piggyBank */
$piggyBank = PiggyBank::createQuietly($piggyBankData); $piggyBank = PiggyBank::createQuietly($piggyBankData);
} catch (QueryException $e) { } catch (QueryException $e) {
app('log')->error(sprintf('Could not store piggy bank: %s', $e->getMessage()), $piggyBankData); Log::error(sprintf('Could not store piggy bank: %s', $e->getMessage()), $piggyBankData);
throw new FireflyException('400005: Could not store new piggy bank.', 0, $e); throw new FireflyException('400005: Could not store new piggy bank.', 0, $e);
} }
@@ -211,7 +211,7 @@ class PiggyBankFactory
$current = 1; $current = 1;
foreach ($set as $piggyBank) { foreach ($set as $piggyBank) {
if ($piggyBank->order !== $current) { if ($piggyBank->order !== $current) {
app('log')->debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current)); Log::debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current));
$piggyBank->order = $current; $piggyBank->order = $current;
$piggyBank->save(); $piggyBank->save();
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Models\Location;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Models\UserGroup; use FireflyIII\Models\UserGroup;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Facades\Log;
/** /**
* Class TagFactory * Class TagFactory
@@ -40,12 +41,12 @@ class TagFactory
public function findOrCreate(string $tag): ?Tag public function findOrCreate(string $tag): ?Tag
{ {
$tag = trim($tag); $tag = trim($tag);
app('log')->debug(sprintf('Now in TagFactory::findOrCreate("%s")', $tag)); Log::debug(sprintf('Now in TagFactory::findOrCreate("%s")', $tag));
/** @var null|Tag $dbTag */ /** @var null|Tag $dbTag */
$dbTag = $this->user->tags()->where('tag', $tag)->first(); $dbTag = $this->user->tags()->where('tag', $tag)->first();
if (null !== $dbTag) { if (null !== $dbTag) {
app('log')->debug(sprintf('Tag exists (#%d), return it.', $dbTag->id)); Log::debug(sprintf('Tag exists (#%d), return it.', $dbTag->id));
return $dbTag; return $dbTag;
} }
@@ -60,11 +61,11 @@ class TagFactory
] ]
); );
if (!$newTag instanceof Tag) { if (!$newTag instanceof Tag) {
app('log')->error(sprintf('TagFactory::findOrCreate("%s") but tag is unexpectedly NULL!', $tag)); Log::error(sprintf('TagFactory::findOrCreate("%s") but tag is unexpectedly NULL!', $tag));
return null; return null;
} }
app('log')->debug(sprintf('Created new tag #%d ("%s")', $newTag->id, $newTag->tag)); Log::debug(sprintf('Created new tag #%d ("%s")', $newTag->id, $newTag->tag));
return $newTag; return $newTag;
} }

View File

@@ -33,6 +33,7 @@ use FireflyIII\Rules\UniqueIban;
use FireflyIII\Services\Internal\Update\AccountUpdateService; use FireflyIII\Services\Internal\Update\AccountUpdateService;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Log;
/** /**
* Class TransactionFactory * Class TransactionFactory
@@ -96,9 +97,9 @@ class TransactionFactory
/** @var null|Transaction $result */ /** @var null|Transaction $result */
$result = Transaction::create($data); $result = Transaction::create($data);
} catch (QueryException $e) { } catch (QueryException $e) {
app('log')->error(sprintf('Could not create transaction: %s', $e->getMessage()), $data); Log::error(sprintf('Could not create transaction: %s', $e->getMessage()), $data);
app('log')->error($e->getMessage()); Log::error($e->getMessage());
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
throw new FireflyException(sprintf('Query exception when creating transaction: %s', $e->getMessage()), 0, $e); throw new FireflyException(sprintf('Query exception when creating transaction: %s', $e->getMessage()), 0, $e);
} }
@@ -106,7 +107,7 @@ class TransactionFactory
throw new FireflyException('Transaction is NULL.'); throw new FireflyException('Transaction is NULL.');
} }
app('log')->debug( Log::debug(
sprintf( sprintf(
'Created transaction #%d (%s %s, account %s), part of journal #%d', 'Created transaction #%d (%s %s, account %s), part of journal #%d',
$result->id, $result->id,
@@ -138,17 +139,17 @@ class TransactionFactory
private function updateAccountInformation(): void private function updateAccountInformation(): void
{ {
if (!array_key_exists('iban', $this->accountInformation)) { if (!array_key_exists('iban', $this->accountInformation)) {
app('log')->debug('No IBAN information in array, will not update.'); Log::debug('No IBAN information in array, will not update.');
return; return;
} }
if ('' !== (string) $this->account->iban) { if ('' !== (string) $this->account->iban) {
app('log')->debug('Account already has IBAN information, will not update.'); Log::debug('Account already has IBAN information, will not update.');
return; return;
} }
if ($this->account->iban === $this->accountInformation['iban']) { if ($this->account->iban === $this->accountInformation['iban']) {
app('log')->debug('Account already has this IBAN, will not update.'); Log::debug('Account already has this IBAN, will not update.');
return; return;
} }
@@ -157,12 +158,12 @@ class TransactionFactory
'iban' => ['required', new UniqueIban($this->account, $this->account->accountType->type)], 'iban' => ['required', new UniqueIban($this->account, $this->account->accountType->type)],
]); ]);
if ($validator->fails()) { if ($validator->fails()) {
app('log')->debug('Invalid or non-unique IBAN, will not update.'); Log::debug('Invalid or non-unique IBAN, will not update.');
return; return;
} }
app('log')->debug('Will update account with IBAN information.'); Log::debug('Will update account with IBAN information.');
$service = app(AccountUpdateService::class); $service = app(AccountUpdateService::class);
$service->update($this->account, ['iban' => $this->accountInformation['iban']]); $service->update($this->account, ['iban' => $this->accountInformation['iban']]);
} }

View File

@@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\UserGroup; use FireflyIII\Models\UserGroup;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Facades\Log;
/** /**
* Class TransactionGroupFactory * Class TransactionGroupFactory
@@ -55,7 +56,7 @@ class TransactionGroupFactory
*/ */
public function create(array $data): TransactionGroup public function create(array $data): TransactionGroup
{ {
app('log')->debug('Now in TransactionGroupFactory::create()'); Log::debug('Now in TransactionGroupFactory::create()');
$this->journalFactory->setUser($data['user']); $this->journalFactory->setUser($data['user']);
$this->journalFactory->setUserGroup($data['user_group']); $this->journalFactory->setUserGroup($data['user_group']);
$this->journalFactory->setErrorOnHash($data['error_if_duplicate_hash'] ?? false); $this->journalFactory->setErrorOnHash($data['error_if_duplicate_hash'] ?? false);
@@ -63,7 +64,7 @@ class TransactionGroupFactory
try { try {
$collection = $this->journalFactory->create($data); $collection = $this->journalFactory->create($data);
} catch (DuplicateTransactionException $e) { } catch (DuplicateTransactionException $e) {
app('log')->warning('GroupFactory::create() caught journalFactory::create() with a duplicate!'); Log::warning('GroupFactory::create() caught journalFactory::create() with a duplicate!');
throw new DuplicateTransactionException($e->getMessage(), 0, $e); throw new DuplicateTransactionException($e->getMessage(), 0, $e);
} }

View File

@@ -221,10 +221,26 @@ class TransactionJournalFactory
]; ];
Log::debug('Source info:', $sourceInfo); Log::debug('Source info:', $sourceInfo);
Log::debug('Destination info:', $destInfo); Log::debug('Destination info:', $destInfo);
$sourceAccount = $this->getAccount($type->type, 'source', $sourceInfo); $destinationAccount = null;
$destinationAccount = $this->getAccount($type->type, 'destination', $destInfo, $sourceAccount); $sourceAccount = null;
if (TransactionTypeEnum::DEPOSIT->value === $type->type) {
Log::debug('Transaction type is deposit, start with destination first.');
$destinationAccount = $this->getAccount($type->type, 'destination', $destInfo);
$sourceAccount = $this->getAccount($type->type, 'source', $sourceInfo, $destinationAccount);
}
if (TransactionTypeEnum::DEPOSIT->value !== $type->type) {
Log::debug('Transaction type is not deposit, start with source first.');
$sourceAccount = $this->getAccount($type->type, 'source', $sourceInfo);
$destinationAccount = $this->getAccount($type->type, 'destination', $destInfo, $sourceAccount);
}
Log::debug('Done with getAccount(2x)'); Log::debug('Done with getAccount(2x)');
// there is a safety catch here. If either account is NULL, they will be replaced with the cash account.
if (null === $destinationAccount) {
Log::warning('Destination account is NULL, will replace with cash account.');
$destinationAccount = $this->accountRepository->getCashAccount();
}
// this is the moment for a reconciliation sanity check (again). // this is the moment for a reconciliation sanity check (again).
if (TransactionTypeEnum::RECONCILIATION->value === $type->type) { if (TransactionTypeEnum::RECONCILIATION->value === $type->type) {

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Factory;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Models\TransactionJournalMeta;
use Illuminate\Support\Facades\Log;
/** /**
* Class TransactionJournalMetaFactory * Class TransactionJournalMetaFactory
@@ -34,27 +35,27 @@ class TransactionJournalMetaFactory
{ {
public function updateOrCreate(array $data): ?TransactionJournalMeta public function updateOrCreate(array $data): ?TransactionJournalMeta
{ {
// app('log')->debug('In updateOrCreate()'); // Log::debug('In updateOrCreate()');
$value = $data['data']; $value = $data['data'];
/** @var null|TransactionJournalMeta $entry */ /** @var null|TransactionJournalMeta $entry */
$entry = $data['journal']->transactionJournalMeta()->where('name', $data['name'])->first(); $entry = $data['journal']->transactionJournalMeta()->where('name', $data['name'])->first();
if (null === $value && null !== $entry) { if (null === $value && null !== $entry) {
// app('log')->debug('Value is empty, delete meta value.'); // Log::debug('Value is empty, delete meta value.');
$entry->delete(); $entry->delete();
return null; return null;
} }
if ($data['data'] instanceof Carbon) { if ($data['data'] instanceof Carbon) {
app('log')->debug('Is a carbon object.'); Log::debug('Is a carbon object.');
$value = $data['data']->toW3cString(); $value = $data['data']->toW3cString();
} }
if ('' === (string) $value) { if ('' === (string) $value) {
// app('log')->debug('Is an empty string.'); // Log::debug('Is an empty string.');
// don't store blank strings. // don't store blank strings.
if (null !== $entry) { if (null !== $entry) {
app('log')->debug('Will not store empty strings, delete meta value'); Log::debug('Will not store empty strings, delete meta value');
$entry->delete(); $entry->delete();
} }
@@ -62,13 +63,13 @@ class TransactionJournalMetaFactory
} }
if (null === $entry) { if (null === $entry) {
// app('log')->debug('Will create new object.'); // Log::debug('Will create new object.');
app('log')->debug(sprintf('Going to create new meta-data entry to store "%s".', $data['name'])); Log::debug(sprintf('Going to create new meta-data entry to store "%s".', $data['name']));
$entry = new TransactionJournalMeta(); $entry = new TransactionJournalMeta();
$entry->transactionJournal()->associate($data['journal']); $entry->transactionJournal()->associate($data['journal']);
$entry->name = $data['name']; $entry->name = $data['name'];
} }
app('log')->debug('Will update value and return.'); Log::debug('Will update value and return.');
$entry->data = $value; $entry->data = $value;
$entry->save(); $entry->save();

View File

@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Generator\Report\ReportGeneratorInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Throwable; use Throwable;
use Illuminate\Support\Facades\Log;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
@@ -58,8 +59,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
->render() ->render()
; ;
} catch (Throwable $e) { } catch (Throwable $e) {
app('log')->error(sprintf('Cannot render reports.double.report: %s', $e->getMessage())); Log::error(sprintf('Cannot render reports.double.report: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
$result = sprintf('Could not render report view: %s', $e->getMessage()); $result = sprintf('Could not render report view: %s', $e->getMessage());
throw new FireflyException($result, 0, $e); throw new FireflyException($result, 0, $e);

View File

@@ -105,8 +105,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
->render() ->render()
; ;
} catch (Throwable $e) { } catch (Throwable $e) {
app('log')->error(sprintf('Cannot render reports.audit.report: %s', $e->getMessage())); Log::error(sprintf('Cannot render reports.audit.report: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
$result = sprintf('Could not render report view: %s', $e->getMessage()); $result = sprintf('Could not render report view: %s', $e->getMessage());
throw new FireflyException($result, 0, $e); throw new FireflyException($result, 0, $e);
@@ -137,9 +137,12 @@ class MonthReportGenerator implements ReportGeneratorInterface
; ;
$journals = $collector->getExtractedJournals(); $journals = $collector->getExtractedJournals();
$journals = array_reverse($journals, true); $journals = array_reverse($journals, true);
// this call is correct.
Log::debug(sprintf('getAuditReport: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); Log::debug(sprintf('getAuditReport: Call accountsBalancesOptimized with date/time "%s"', $date->toIso8601String()));
$dayBeforeBalance = Steam::finalAccountBalance($account, $date); // 2025-10-08 replace with accountsBalancesOptimized.
// $dayBeforeBalance = Steam::finalAccountBalance($account, $date);
$dayBeforeBalance = Steam::accountsBalancesOptimized(new Collection()->push($account), $date)[$account->id];
$startBalance = $dayBeforeBalance['balance']; $startBalance = $dayBeforeBalance['balance'];
$primaryCurrency = app('amount')->getPrimaryCurrencyByUserGroup($account->user->userGroup); $primaryCurrency = app('amount')->getPrimaryCurrencyByUserGroup($account->user->userGroup);
$currency = $accountRepository->getAccountCurrency($account) ?? $primaryCurrency; $currency = $accountRepository->getAccountCurrency($account) ?? $primaryCurrency;
@@ -176,12 +179,14 @@ class MonthReportGenerator implements ReportGeneratorInterface
// call is correct. // call is correct.
Log::debug(sprintf('getAuditReport end: Call finalAccountBalance with date/time "%s"', $this->end->toIso8601String())); Log::debug(sprintf('getAuditReport end: Call finalAccountBalance with date/time "%s"', $this->end->toIso8601String()));
// 2025-10-08 replace with accountsBalancesOptimized:
return [ return [
'journals' => $journals, 'journals' => $journals,
'currency' => $currency, 'currency' => $currency,
'exists' => 0 !== count($journals), 'exists' => 0 !== count($journals),
'end' => $this->end->isoFormat((string) trans('config.month_and_day_moment_js', [], $locale)), 'end' => $this->end->isoFormat((string) trans('config.month_and_day_moment_js', [], $locale)),
'endBalance' => Steam::finalAccountBalance($account, $this->end)['balance'], // 'endBalance' => Steam::finalAccountBalance($account, $this->end)['balance'],
'endBalance' => Steam::accountsBalancesOptimized(new Collection()->push($account), $this->end)[$account->id]['balance'],
'dayBefore' => $date->isoFormat((string) trans('config.month_and_day_moment_js', [], $locale)), 'dayBefore' => $date->isoFormat((string) trans('config.month_and_day_moment_js', [], $locale)),
'dayBeforeBalance' => $dayBeforeBalance, 'dayBeforeBalance' => $dayBeforeBalance,
]; ];

View File

@@ -30,6 +30,7 @@ use FireflyIII\Generator\Report\ReportGeneratorInterface;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Throwable; use Throwable;
use Illuminate\Support\Facades\Log;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
@@ -72,8 +73,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
->render() ->render()
; ;
} catch (Throwable $e) { } catch (Throwable $e) {
app('log')->error(sprintf('Cannot render reports.account.report: %s', $e->getMessage())); Log::error(sprintf('Cannot render reports.account.report: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
$result = sprintf('Could not render report view: %s', $e->getMessage()); $result = sprintf('Could not render report view: %s', $e->getMessage());
throw new FireflyException($result, 0, $e); throw new FireflyException($result, 0, $e);
@@ -132,7 +133,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
protected function getExpenses(): array protected function getExpenses(): array
{ {
if (0 !== count($this->expenses)) { if (0 !== count($this->expenses)) {
app('log')->debug('Return previous set of expenses.'); Log::debug('Return previous set of expenses.');
return $this->expenses; return $this->expenses;
} }

View File

@@ -30,6 +30,7 @@ use FireflyIII\Generator\Report\ReportGeneratorInterface;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Throwable; use Throwable;
use Illuminate\Support\Facades\Log;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
@@ -73,8 +74,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
->render() ->render()
; ;
} catch (Throwable $e) { } catch (Throwable $e) {
app('log')->error(sprintf('Cannot render reports.category.month: %s', $e->getMessage())); Log::error(sprintf('Cannot render reports.category.month: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
$result = sprintf('Could not render report view: %s', $e->getMessage()); $result = sprintf('Could not render report view: %s', $e->getMessage());
throw new FireflyException($result, 0, $e); throw new FireflyException($result, 0, $e);
@@ -131,7 +132,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
protected function getExpenses(): array protected function getExpenses(): array
{ {
if (0 !== count($this->expenses)) { if (0 !== count($this->expenses)) {
app('log')->debug('Return previous set of expenses.'); Log::debug('Return previous set of expenses.');
return $this->expenses; return $this->expenses;
} }

View File

@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Generator\Report\ReportGeneratorInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Throwable; use Throwable;
use Illuminate\Support\Facades\Log;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
@@ -56,8 +57,8 @@ class MonthReportGenerator implements ReportGeneratorInterface
try { try {
return view('reports.default.month', compact('accountIds', 'reportType'))->with('start', $this->start)->with('end', $this->end)->render(); return view('reports.default.month', compact('accountIds', 'reportType'))->with('start', $this->start)->with('end', $this->end)->render();
} catch (Throwable $e) { } catch (Throwable $e) {
app('log')->error(sprintf('Cannot render reports.default.month: %s', $e->getMessage())); Log::error(sprintf('Cannot render reports.default.month: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
$result = 'Could not render report view.'; $result = 'Could not render report view.';
throw new FireflyException($result, 0, $e); throw new FireflyException($result, 0, $e);

View File

@@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Generator\Report\ReportGeneratorInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Throwable; use Throwable;
use Illuminate\Support\Facades\Log;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
@@ -60,8 +61,8 @@ class MultiYearReportGenerator implements ReportGeneratorInterface
compact('accountIds', 'reportType') compact('accountIds', 'reportType')
)->with('start', $this->start)->with('end', $this->end)->render(); )->with('start', $this->start)->with('end', $this->end)->render();
} catch (Throwable $e) { } catch (Throwable $e) {
app('log')->error(sprintf('Cannot render reports.default.multi-year: %s', $e->getMessage())); Log::error(sprintf('Cannot render reports.default.multi-year: %s', $e->getMessage()));
app('log')->error($e->getTraceAsString()); Log::error($e->getTraceAsString());
$result = sprintf('Could not render report view: %s', $e->getMessage()); $result = sprintf('Could not render report view: %s', $e->getMessage());
throw new FireflyException($result, 0, $e); throw new FireflyException($result, 0, $e);

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