Compare commits

...

593 Commits

Author SHA1 Message Date
github-actions[bot] 453332eae0 Merge pull request #11830 from firefly-iii/release-1772260516
🤖 Automatically merge the PR into the develop branch.
2026-02-28 07:35:25 +01:00
JC5 4407456167 🤖 Auto commit for release 'develop' on 2026-02-28 2026-02-28 07:35:16 +01:00
James Cole 2842432204 Clean up budget amounts. 2026-02-28 07:29:44 +01:00
James Cole 842ec6da47 Add new function to twig. 2026-02-28 07:20:22 +01:00
James Cole ceb5873ba7 Do not break arrays 2026-02-28 07:17:53 +01:00
James Cole 6cfd8273fe Fix middleware for admin area. 2026-02-28 06:15:28 +01:00
github-actions[bot] bd14273201 Merge pull request #11828 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-27 21:55:42 +01:00
github-actions[bot] 2a6ba8f00f Merge pull request #11827 from firefly-iii/release-1772225731
🤖 Automatically merge the PR into the develop branch.
2026-02-27 21:55:38 +01:00
JC5 5986137bb0 🤖 Auto commit for release 'v6.5.1' on 2026-02-27 2026-02-27 21:55:31 +01:00
github-actions[bot] 1f5962cfbc Merge pull request #11826 from firefly-iii/release-1772225098
🤖 Automatically merge the PR into the develop branch.
2026-02-27 21:45:08 +01:00
JC5 f40cb96906 🤖 Auto commit for release 'develop' on 2026-02-27 2026-02-27 21:44:58 +01:00
James Cole 92b1079eb1 Expand changelog. 2026-02-27 21:39:35 +01:00
James Cole 555060ead9 Fix URL, thanks @fabienfitoussi 2026-02-27 21:33:27 +01:00
James Cole d88b728073 Expand middleware. 2026-02-27 21:29:49 +01:00
James Cole 5255a17b38 Fix an issue using an intentionally vague description. 2026-02-27 21:29:38 +01:00
James Cole dad596dc26 Fix #11750 2026-02-27 21:27:18 +01:00
James Cole b357a5d5ea Fix null pointer in available budget calculation. 2026-02-27 21:25:33 +01:00
James Cole ae6adf90ee Fix https://github.com/firefly-iii/firefly-iii/issues/11817 2026-02-26 20:47:10 +01:00
James Cole 4f0b1c9914 Merge branch 'main' into develop 2026-02-25 06:51:21 +01:00
James Cole dc718d6b89 Merge pull request #11808 from CinnamonPyro/feature/add-currency-THB
Add Thai baht to Currency Seeder
2026-02-25 06:29:50 +01:00
Cinnamon Pyro 5252ceeaee Add Thai baht to Currency Seeder
Signed-off-by: Cinnamon Pyro <69516214+CinnamonPyro@users.noreply.github.com>
2026-02-25 11:11:25 +07:00
James Cole 56a1eb6515 Fix echo statement for Data importer version
Signed-off-by: James Cole <james@firefly-iii.org>
2026-02-24 08:07:45 +01:00
github-actions[bot] 62ef3966ed Merge pull request #11799 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-23 20:18:47 +01:00
github-actions[bot] 241d8fd921 Merge pull request #11798 from firefly-iii/release-1771874314
🤖 Automatically merge the PR into the develop branch.
2026-02-23 20:18:41 +01:00
JC5 9028898232 🤖 Auto commit for release 'v6.5.0' on 2026-02-23 2026-02-23 20:18:34 +01:00
James Cole bf12a5631d Expand changelog. 2026-02-23 20:13:47 +01:00
github-actions[bot] 8852bb022b Merge pull request #11797 from firefly-iii/release-1771873461
🤖 Automatically merge the PR into the develop branch.
2026-02-23 20:04:29 +01:00
JC5 03d0d503b0 🤖 Auto commit for release 'develop' on 2026-02-23 2026-02-23 20:04:21 +01:00
James Cole 6b8c8c1b28 Merge pull request #11796 from R1DEN/main
fix operator order for pc_amount bug
2026-02-23 11:41:16 +01:00
R1DEN e43a188af8 fix operator order for pc_amount bug 2026-02-23 11:54:48 +02:00
Sander Dorigo a806bf3b10 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop 2026-02-23 08:19:34 +01:00
Sander Dorigo 9b05c777cd Fix https://github.com/firefly-iii/firefly-iii/issues/11792 2026-02-23 08:08:46 +01:00
github-actions[bot] 532d6b21f8 Merge pull request #11793 from firefly-iii/release-1771830229
🤖 Automatically merge the PR into the develop branch.
2026-02-23 08:03:59 +01:00
JC5 3238441315 🤖 Auto commit for release 'develop' on 2026-02-23 2026-02-23 08:03:49 +01:00
James Cole f75eff173b Merge pull request #11790 from firefly-iii/dependabot/composer/develop/spatie/laravel-html-3.13.0 2026-02-23 06:48:11 +01:00
James Cole b0af654c01 Merge pull request #11791 from firefly-iii/dependabot/composer/develop/spatie/laravel-ignition-2.11.0 2026-02-23 06:47:41 +01:00
dependabot[bot] f1515f6139 Bump spatie/laravel-html from 3.12.3 to 3.13.0
Bumps [spatie/laravel-html](https://github.com/spatie/laravel-html) from 3.12.3 to 3.13.0.
- [Release notes](https://github.com/spatie/laravel-html/releases)
- [Changelog](https://github.com/spatie/laravel-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/spatie/laravel-html/compare/3.12.3...3.13.0)

---
updated-dependencies:
- dependency-name: spatie/laravel-html
  dependency-version: 3.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 05:43:21 +00:00
James Cole 6e7758da05 Merge pull request #11789 from firefly-iii/dependabot/composer/develop/rector/rector-2.3.8 2026-02-23 06:42:11 +01:00
dependabot[bot] 29419cc514 Bump spatie/laravel-ignition from 2.10.0 to 2.11.0
Bumps [spatie/laravel-ignition](https://github.com/spatie/laravel-ignition) from 2.10.0 to 2.11.0.
- [Release notes](https://github.com/spatie/laravel-ignition/releases)
- [Changelog](https://github.com/spatie/laravel-ignition/blob/main/CHANGELOG.md)
- [Commits](https://github.com/spatie/laravel-ignition/compare/2.10.0...2.11.0)

---
updated-dependencies:
- dependency-name: spatie/laravel-ignition
  dependency-version: 2.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:52:50 +00:00
dependabot[bot] 370781b8ae Bump rector/rector from 2.3.7 to 2.3.8
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.3.7 to 2.3.8.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.3.7...2.3.8)

---
updated-dependencies:
- dependency-name: rector/rector
  dependency-version: 2.3.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:52:15 +00:00
James Cole 5a638ba02e Fix some code and add a changelog. 2026-02-22 20:17:01 +01:00
James Cole cf3c836293 Merge pull request #11787 from R1DEN/main
Fix chart API balance carry-forward bug
2026-02-22 20:08:23 +01:00
James Cole 3cd3dafb7f Add backticks to IP addresses. 2026-02-22 17:45:40 +01:00
RiDEN ed3f4f62ee Fix chart API balance carry-forward bug and add missing deleted_at filter
The chart loop used exact-date lookup into the range array, silently
dropping transactions that fell between chart boundary dates when
period > 1D. Replace with a range-walking approach that advances
through all intervening entries.

Also add whereNull('transaction_journals.deleted_at') to
accountsBalancesOptimized() to match the daily-delta query, and fix
a double-space typo in a date format string.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 18:37:00 +02:00
github-actions[bot] 80823cdfe3 Merge pull request #11784 from firefly-iii/release-1771741207
🤖 Automatically merge the PR into the develop branch.
2026-02-22 07:20:14 +01:00
JC5 defaef171e 🤖 Auto commit for release 'develop' on 2026-02-22 2026-02-22 07:20:07 +01:00
James Cole 81f6f22efb Introduce undocumented count endpoint. 2026-02-22 07:05:30 +01:00
github-actions[bot] 4ad2508675 Merge pull request #11781 from firefly-iii/release-1771701858
🤖 Automatically merge the PR into the develop branch.
2026-02-21 20:24:25 +01:00
JC5 35f997be45 🤖 Auto commit for release 'develop' on 2026-02-21 2026-02-21 20:24:18 +01:00
James Cole ad3fec1458 Clean up templates. 2026-02-21 20:18:04 +01:00
github-actions[bot] 25eab80ec3 Merge pull request #11780 from firefly-iii/release-1771686867
🤖 Automatically merge the PR into the develop branch.
2026-02-21 16:14:35 +01:00
JC5 c27e9873b2 🤖 Auto commit for release 'develop' on 2026-02-21 2026-02-21 16:14:27 +01:00
James Cole 84f4f63104 Update changelog. 2026-02-21 16:08:55 +01:00
James Cole 02d37998f9 Merge pull request #11776 from dakennguyen/convert-to-primary-currency-for-charts
Convert to primary currency for charts
2026-02-21 15:44:56 +01:00
James Cole 39c72a60e1 Fix https://github.com/firefly-iii/firefly-iii/issues/11778 2026-02-21 15:42:52 +01:00
Khoa Nguyen 1980f73694 Convert to primary currency for report chart 2026-02-21 13:14:57 +01:00
Khoa Nguyen d135186149 Convert to primary currency for category chart 2026-02-21 13:14:49 +01:00
github-actions[bot] 3e36287374 Merge pull request #11774 from firefly-iii/release-1771667913
🤖 Automatically merge the PR into the develop branch.
2026-02-21 10:58:39 +01:00
JC5 37c4db2ce9 🤖 Auto commit for release 'develop' on 2026-02-21 2026-02-21 10:58:33 +01:00
James Cole 8e6ff3ceaf Fix small issues reported over mail and from the demo site. 2026-02-21 10:53:14 +01:00
James Cole 6e0e32dc6c You can always grab the latest develop release. 2026-02-21 08:05:01 +01:00
github-actions[bot] b0e21dd553 Merge pull request #11773 from firefly-iii/release-1771657248
🤖 Automatically merge the PR into the develop branch.
2026-02-21 08:00:55 +01:00
JC5 88291c5f63 🤖 Auto commit for release 'develop' on 2026-02-21 2026-02-21 08:00:48 +01:00
James Cole a87e10f734 Add a week's delay. 2026-02-21 07:54:23 +01:00
github-actions[bot] 75f42d57f1 Merge pull request #11772 from firefly-iii/release-1771653268
🤖 Automatically merge the PR into the develop branch.
2026-02-21 06:54:36 +01:00
JC5 3f60442281 🤖 Auto commit for release 'develop' on 2026-02-21 2026-02-21 06:54:28 +01:00
James Cole dd14bb1664 Add 10m slack 2026-02-21 06:48:34 +01:00
James Cole 403a2ce2cd Remove weird repeated line from Mago. 2026-02-21 06:47:26 +01:00
James Cole e5366dbf6c Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Services/FireflyIIIOrg/Update/GitHubUpdateRequest.php
2026-02-21 06:44:11 +01:00
James Cole 091f264f3e Remove mago analyse, fix update check. 2026-02-21 06:40:51 +01:00
github-actions[bot] 3ad1420262 Merge pull request #11771 from firefly-iii/release-1771652323
🤖 Automatically merge the PR into the develop branch.
2026-02-21 06:38:50 +01:00
JC5 018f68b789 🤖 Auto commit for release 'develop' on 2026-02-21 2026-02-21 06:38:43 +01:00
James Cole e23d0de8f9 Fix local update check. 2026-02-21 06:31:42 +01:00
James Cole 04c3bf966d Rebuild update request to use GitHub API. 2026-02-21 06:25:18 +01:00
James Cole 681619f732 Remove unused classes 2026-02-20 20:33:36 +01:00
James Cole cab298708c Remove unused enums 2026-02-20 20:33:13 +01:00
James Cole c4392f89d1 Improve code quality, add PHP 8.5 things. 2026-02-20 20:22:13 +01:00
James Cole 36789a310a Tiny changes. 2026-02-20 20:17:10 +01:00
James Cole e92a1b6dda Add new support guide. 2026-02-20 20:03:11 +01:00
James Cole 1d687a632f Add changelog. 2026-02-20 20:01:25 +01:00
github-actions[bot] 1fa4a1bdc8 Merge pull request #11770 from firefly-iii/release-1771612722
🤖 Automatically merge the PR into the develop branch.
2026-02-20 19:38:50 +01:00
JC5 aee53cffb9 🤖 Auto commit for release 'develop' on 2026-02-20 2026-02-20 19:38:42 +01:00
github-actions[bot] 828b965c98 Merge pull request #11769 from firefly-iii/release-1771605618
🤖 Automatically merge the PR into the develop branch.
2026-02-20 17:40:27 +01:00
JC5 c008cd41db 🤖 Auto commit for release 'develop' on 2026-02-20 2026-02-20 17:40:18 +01:00
James Cole accac89ffb Upgrade job to PHP 8.5 2026-02-20 17:35:59 +01:00
James Cole fb79e3b08c Push Firefly III to PHP 8.5 2026-02-20 17:33:53 +01:00
github-actions[bot] db2f804b6a Merge pull request #11767 from firefly-iii/release-1771595862
🤖 Automatically merge the PR into the develop branch.
2026-02-20 14:57:50 +01:00
JC5 986e86ed51 🤖 Auto commit for release 'develop' on 2026-02-20 2026-02-20 14:57:43 +01:00
James Cole 9cbd0380d6 Fix periods and labels, add some debug info. 2026-02-20 14:43:05 +01:00
James Cole f6cd45a44c Make sure that overlapping available budgets are also recalculated, this fixes #11685 2026-02-20 11:23:36 +01:00
github-actions[bot] 0e321ad82a Merge pull request #11765 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-20 08:01:53 +01:00
github-actions[bot] c353a4de95 Merge pull request #11764 from firefly-iii/release-1771570899
🤖 Automatically merge the PR into the develop branch.
2026-02-20 08:01:47 +01:00
JC5 57f828a73c 🤖 Auto commit for release 'v6.4.23' on 2026-02-20 2026-02-20 08:01:39 +01:00
github-actions[bot] 11385b208b Merge pull request #11763 from firefly-iii/release-1771570551
🤖 Automatically merge the PR into the develop branch.
2026-02-20 07:55:59 +01:00
JC5 5584866b96 🤖 Auto commit for release 'develop' on 2026-02-20 2026-02-20 07:55:51 +01:00
James Cole 0b124d875a Update changelog. 2026-02-20 07:51:19 +01:00
James Cole 177cfad862 Fix https://github.com/orgs/firefly-iii/discussions/11736 2026-02-20 07:41:32 +01:00
github-actions[bot] e929cf7cb0 Merge pull request #11762 from firefly-iii/release-1771564191
🤖 Automatically merge the PR into the develop branch.
2026-02-20 06:10:03 +01:00
JC5 528fda08e9 🤖 Auto commit for release 'develop' on 2026-02-20 2026-02-20 06:09:51 +01:00
James Cole 6f605e5fd2 Remove phpstan thing. 2026-02-20 06:08:43 +01:00
James Cole 7c76fc7721 Fix various issues and code quality things. 2026-02-20 06:04:21 +01:00
James Cole 474680dbbf Fix issue with invitee mail. 2026-02-20 05:44:51 +01:00
James Cole 8babc144fe Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-19 20:03:30 +01:00
James Cole 6eb14f8a96 Fix #11752 2026-02-19 19:55:52 +01:00
github-actions[bot] c4786586fb Merge pull request #11760 from firefly-iii/release-1771527037
🤖 Automatically merge the PR into the develop branch.
2026-02-19 19:50:46 +01:00
JC5 a22cc889b9 🤖 Auto commit for release 'develop' on 2026-02-19 2026-02-19 19:50:37 +01:00
James Cole 9ea7bd3b01 Update audit config. 2026-02-19 19:45:49 +01:00
James Cole 8d68cef8a5 Fix #11744 2026-02-19 19:34:22 +01:00
James Cole b383ac1a95 Fix https://github.com/firefly-iii/firefly-iii/issues/11757 2026-02-19 19:27:18 +01:00
James Cole d2bfb2e9df Fix https://github.com/firefly-iii/firefly-iii/issues/11734 2026-02-16 20:40:32 +01:00
github-actions[bot] 0afec28e5f Merge pull request #11743 from firefly-iii/release-1771253383
🤖 Automatically merge the PR into the develop branch.
2026-02-16 15:49:51 +01:00
JC5 e60e0bb99e 🤖 Auto commit for release 'develop' on 2026-02-16 2026-02-16 15:49:43 +01:00
Sander Dorigo 02064445bc Fix missing objects thing 2026-02-16 15:29:13 +01:00
github-actions[bot] 386bb811a8 Merge pull request #11742 from firefly-iii/release-1771230440
🤖 Automatically merge the PR into the develop branch.
2026-02-16 09:27:29 +01:00
JC5 653fa53da2 🤖 Auto commit for release 'develop' on 2026-02-16 2026-02-16 09:27:20 +01:00
Sander Dorigo 63d4572863 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop 2026-02-16 09:22:36 +01:00
Sander Dorigo 9eb31fc777 Remove check for #11735 2026-02-16 09:22:30 +01:00
github-actions[bot] 7fd33035a6 Merge pull request #11741 from firefly-iii/release-1771230058
🤖 Automatically merge the PR into the develop branch.
2026-02-16 09:21:05 +01:00
JC5 5a87f6b2c0 🤖 Auto commit for release 'develop' on 2026-02-16 2026-02-16 09:20:58 +01:00
Sander Dorigo cbebd7928f Fix #11738 2026-02-16 09:16:42 +01:00
github-actions[bot] 73089c2084 Merge pull request #11737 from firefly-iii/release-1771214139
🤖 Automatically merge the PR into the develop branch.
2026-02-16 04:55:46 +01:00
JC5 34260f2a4f 🤖 Auto commit for release 'develop' on 2026-02-16 2026-02-16 04:55:39 +01:00
James Cole c3872aa738 Fix header in changelog. 2026-02-15 19:44:38 +01:00
github-actions[bot] 4bcd163b47 Merge pull request #11732 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-15 19:42:55 +01:00
github-actions[bot] 31d444292f Merge pull request #11731 from firefly-iii/release-1771180963
🤖 Automatically merge the PR into the develop branch.
2026-02-15 19:42:50 +01:00
JC5 a27e21f002 🤖 Auto commit for release 'v6.4.22' on 2026-02-15 2026-02-15 19:42:43 +01:00
github-actions[bot] 0f7118d5b3 Merge pull request #11730 from firefly-iii/release-1771176353
🤖 Automatically merge the PR into the develop branch.
2026-02-15 18:26:02 +01:00
JC5 4f9a1fde5d 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 18:25:54 +01:00
James Cole bc596cb1c2 Update changelog and fix calls during startup. 2026-02-15 18:18:47 +01:00
github-actions[bot] 7110556ef0 Merge pull request #11729 from firefly-iii/release-1771170628
🤖 Automatically merge the PR into the develop branch.
2026-02-15 16:50:35 +01:00
JC5 3e1b703dfc 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 16:50:28 +01:00
James Cole fce0750509 Remove unnecessary package. 2026-02-15 16:43:35 +01:00
github-actions[bot] f5385d0229 Merge pull request #11727 from firefly-iii/release-1771154935
🤖 Automatically merge the PR into the develop branch.
2026-02-15 12:29:02 +01:00
JC5 8599c4a3c1 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 12:28:55 +01:00
James Cole d210e7dcdd Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-15 12:24:46 +01:00
James Cole 8de9e0ba29 Remove checks for null 2026-02-15 12:24:33 +01:00
github-actions[bot] 7fa9e79f2a Merge pull request #11726 from firefly-iii/release-1771154592
🤖 Automatically merge the PR into the develop branch.
2026-02-15 12:23:20 +01:00
JC5 4a5281fd80 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 12:23:13 +01:00
James Cole ad60974430 Update command so it is really the first attempt to connect. 2026-02-15 12:19:10 +01:00
James Cole 195794881b Catch nulls in dates. 2026-02-15 12:11:25 +01:00
James Cole 3e6a997dd5 Catch preferences with no date info. 2026-02-15 12:09:57 +01:00
James Cole 2eedfd9f26 Merge branch 'main' into develop 2026-02-15 12:06:20 +01:00
James Cole 9ec0515bb6 Fix string pointer 2026-02-15 12:06:05 +01:00
James Cole 6b197eecb9 Remove PR update rule from mergify configuration
Removed the rule for automatically updating PRs before merging.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-02-15 11:58:07 +01:00
github-actions[bot] 591c970882 Merge pull request #11725 from firefly-iii/release-1771152972
🤖 Automatically merge the PR into the develop branch.
2026-02-15 11:56:22 +01:00
JC5 15d91dbe1b 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 11:56:12 +01:00
James Cole 6ff87bf447 Add command that first verifies the database connection. Saves some time booting up. 2026-02-15 11:51:04 +01:00
James Cole 147ce154d8 Remove unused file. 2026-02-15 11:25:26 +01:00
James Cole 2c8be33000 Clean up routes and API calls. 2026-02-15 11:25:12 +01:00
github-actions[bot] b472890c84 Merge pull request #11724 from firefly-iii/release-1771138148
🤖 Automatically merge the PR into the develop branch.
2026-02-15 07:49:18 +01:00
JC5 2fabcf5193 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 07:49:08 +01:00
James Cole 5ed4e7aa79 Clean up kernel files and middleware. 2026-02-15 07:41:31 +01:00
James Cole 973caad7e4 Clean up providers 2026-02-15 07:27:28 +01:00
github-actions[bot] d273503a15 Merge pull request #11723 from firefly-iii/release-1771134641
🤖 Automatically merge the PR into the develop branch.
2026-02-15 06:50:49 +01:00
JC5 cc149adb5d 🤖 Auto commit for release 'develop' on 2026-02-15 2026-02-15 06:50:41 +01:00
James Cole ac8bcb786b Fix https://github.com/firefly-iii/firefly-iii/issues/11720 2026-02-15 06:18:52 +01:00
github-actions[bot] 642deefba5 Merge pull request #11718 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-14 20:40:32 +01:00
github-actions[bot] 5b13b64fd7 Merge pull request #11717 from firefly-iii/release-1771098019
🤖 Automatically merge the PR into the develop branch.
2026-02-14 20:40:27 +01:00
JC5 653a64d0a8 🤖 Auto commit for release 'v6.4.21' on 2026-02-14 2026-02-14 20:40:19 +01:00
github-actions[bot] c9dcdc90ec Merge pull request #11716 from firefly-iii/release-1771097648
🤖 Automatically merge the PR into the develop branch.
2026-02-14 20:34:19 +01:00
JC5 1f04888331 🤖 Auto commit for release 'develop' on 2026-02-14 2026-02-14 20:34:08 +01:00
James Cole 28c21ecb7e Update changelog 2026-02-14 20:29:19 +01:00
github-actions[bot] 7382030e61 Merge pull request #11711 from firefly-iii/release-1771075473
🤖 Automatically merge the PR into the develop branch.
2026-02-14 14:24:39 +01:00
JC5 a573e19dbc 🤖 Auto commit for release 'develop' on 2026-02-14 2026-02-14 14:24:33 +01:00
James Cole b152a2c8d9 Fix #11710 2026-02-14 14:20:24 +01:00
github-actions[bot] 7e14c36fc0 Merge pull request #11709 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-14 13:38:49 +01:00
github-actions[bot] 58bfc7f8ce Merge pull request #11708 from firefly-iii/release-1771072714
🤖 Automatically merge the PR into the develop branch.
2026-02-14 13:38:43 +01:00
JC5 6b8c005108 🤖 Auto commit for release 'v6.4.20' on 2026-02-14 2026-02-14 13:38:34 +01:00
James Cole ceb660fd02 Fix missing setting. Restore 8.4 for the moment. Very professional. 2026-02-14 13:33:29 +01:00
James Cole 7fac1e8614 Remove statistics. 2026-02-14 13:25:39 +01:00
github-actions[bot] 809e34f5fe Merge pull request #11707 from firefly-iii/release-1771071314
🤖 Automatically merge the PR into the develop branch.
2026-02-14 13:15:20 +01:00
JC5 73ca57c8c4 🤖 Auto commit for release 'develop' on 2026-02-14 2026-02-14 13:15:14 +01:00
James Cole 63088ffeb1 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-14 13:10:54 +01:00
James Cole 4e88ebd52d Make Firefly III PHP 8.5 only. 2026-02-14 13:10:41 +01:00
github-actions[bot] 85fd38d146 Merge pull request #11706 from firefly-iii/release-1771070819
🤖 Automatically merge the PR into the develop branch.
2026-02-14 13:07:16 +01:00
JC5 e83d7051eb 🤖 Auto commit for release 'develop' on 2026-02-14 2026-02-14 13:06:59 +01:00
James Cole 567f2dae17 Remove problematic comment repetition by Mago. 2026-02-14 13:02:48 +01:00
github-actions[bot] c231ae4016 Merge pull request #11705 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-14 12:55:26 +01:00
github-actions[bot] fb13a4cdcb Merge pull request #11704 from firefly-iii/release-1771070112
🤖 Automatically merge the PR into the develop branch.
2026-02-14 12:55:21 +01:00
JC5 724042e1d8 🤖 Auto commit for release 'v6.4.19' on 2026-02-14 2026-02-14 12:55:12 +01:00
James Cole 84a30c3c8f Missing ltter. 2026-02-14 12:49:16 +01:00
github-actions[bot] 6c9dac831a Merge pull request #11703 from firefly-iii/release-1771069573
🤖 Automatically merge the PR into the develop branch.
2026-02-14 12:46:20 +01:00
JC5 e605ddb779 🤖 Auto commit for release 'develop' on 2026-02-14 2026-02-14 12:46:13 +01:00
James Cole 4b19ed8f07 Add changelog. 2026-02-14 12:41:28 +01:00
James Cole 57bd8e09d4 Fix #11702 2026-02-14 10:31:01 +01:00
github-actions[bot] 32f1a7c9c2 Merge pull request #11701 from firefly-iii/release-1771057524
🤖 Automatically merge the PR into the develop branch.
2026-02-14 09:25:32 +01:00
JC5 fc5b0db43f 🤖 Auto commit for release 'develop' on 2026-02-14 2026-02-14 09:25:24 +01:00
James Cole c2721f3f48 Fix https://github.com/firefly-iii/firefly-iii/issues/11700 2026-02-14 08:18:53 +01:00
James Cole 96291c9bce Fix https://github.com/firefly-iii/firefly-iii/issues/11684 2026-02-14 08:17:19 +01:00
James Cole ab9400aaee Merge branches 'develop' and 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-13 08:05:02 +01:00
James Cole 31d1ee11cb Fix https://github.com/firefly-iii/firefly-iii/issues/11694 2026-02-13 08:04:39 +01:00
github-actions[bot] 694dc3816c Merge pull request #11699 from firefly-iii/release-1770965983
🤖 Automatically merge the PR into the develop branch.
2026-02-13 07:59:49 +01:00
JC5 c647fa7b94 🤖 Auto commit for release 'develop' on 2026-02-13 2026-02-13 07:59:43 +01:00
James Cole 022d59bfdd Fix https://github.com/firefly-iii/firefly-iii/issues/11688 2026-02-13 07:33:30 +01:00
James Cole 057b82b471 fix rename of rules when bill name changes. 2026-02-11 07:00:59 +01:00
github-actions[bot] 2872c6592f Merge pull request #11692 from firefly-iii/release-1770751884
🤖 Automatically merge the PR into the develop branch.
2026-02-10 20:31:31 +01:00
JC5 fa02c15f55 🤖 Auto commit for release 'develop' on 2026-02-10 2026-02-10 20:31:24 +01:00
James Cole c74c8a96b8 Validate directory permissions with a lot of debug logs. 2026-02-10 20:26:41 +01:00
github-actions[bot] 2c2ebae8fa Merge pull request #11691 from firefly-iii/release-1770727195
🤖 Automatically merge the PR into the develop branch.
2026-02-10 13:40:04 +01:00
JC5 aff9afb767 🤖 Auto commit for release 'develop' on 2026-02-10 2026-02-10 13:39:55 +01:00
James Cole c8e95fe131 Fix audit log entry position. 2026-02-09 20:05:38 +01:00
James Cole cef514c22b Merge pull request #11680 from firefly-iii/dependabot/composer/develop/mailersend/laravel-driver-3.0.0 2026-02-09 05:57:03 +01:00
github-actions[bot] 46d2ba3d3b Merge pull request #11681 from firefly-iii/release-1770609440
🤖 Automatically merge the PR into the develop branch.
2026-02-09 04:57:28 +01:00
JC5 45a0504eba 🤖 Auto commit for release 'develop' on 2026-02-09 2026-02-09 04:57:20 +01:00
dependabot[bot] 9711bc1d04 Bump mailersend/laravel-driver from 2.12.0 to 3.0.0
Bumps [mailersend/laravel-driver](https://github.com/mailersend/mailersend-laravel-driver) from 2.12.0 to 3.0.0.
- [Release notes](https://github.com/mailersend/mailersend-laravel-driver/releases)
- [Commits](https://github.com/mailersend/mailersend-laravel-driver/compare/v2.12.0...v3.0.0)

---
updated-dependencies:
- dependency-name: mailersend/laravel-driver
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:52:32 +00:00
James Cole cf2343c0dd Catch errors in DB thing. 2026-02-08 21:07:50 +01:00
James Cole 34097cecf0 Fix viewrange. 2026-02-08 08:29:59 +01:00
github-actions[bot] 8735be2f6b Merge pull request #11676 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-08 08:27:47 +01:00
github-actions[bot] 0e8cc91308 Merge pull request #11675 from firefly-iii/release-1770535655
🤖 Automatically merge the PR into the develop branch.
2026-02-08 08:27:42 +01:00
JC5 5cbb311e4d 🤖 Auto commit for release 'v6.4.18' on 2026-02-08 2026-02-08 08:27:35 +01:00
James Cole c334641b90 Add class reference. 2026-02-08 08:21:24 +01:00
James Cole 4c2356881d Remove unused debug logging. 2026-02-08 08:20:50 +01:00
James Cole d9a0d06712 Clean up some debug logging. 2026-02-08 08:16:33 +01:00
github-actions[bot] 65b9dedc03 Merge pull request #11674 from firefly-iii/release-1770534470
🤖 Automatically merge the PR into the develop branch.
2026-02-08 08:07:56 +01:00
JC5 e46ef138b1 🤖 Auto commit for release 'develop' on 2026-02-08 2026-02-08 08:07:50 +01:00
James Cole f0fdb57754 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-08 08:04:05 +01:00
James Cole 09799582aa Remove debug comments. 2026-02-08 08:03:59 +01:00
github-actions[bot] 850c824da1 Merge pull request #11673 from firefly-iii/release-1770531358
🤖 Automatically merge the PR into the develop branch.
2026-02-08 07:16:05 +01:00
JC5 34160da67a 🤖 Auto commit for release 'develop' on 2026-02-08 2026-02-08 07:15:58 +01:00
James Cole 2848a64c13 Fix sponsorship link. 2026-02-08 07:11:24 +01:00
James Cole 998d6bf874 Fix #11668 2026-02-08 06:49:27 +01:00
James Cole b85200e1f6 Fix #11667 2026-02-08 06:46:14 +01:00
James Cole 6944001887 Fix #11671 2026-02-08 06:22:40 +01:00
github-actions[bot] 154abf1fc0 Merge pull request #11665 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-02-07 07:55:46 +01:00
github-actions[bot] 0113cc1651 Merge pull request #11664 from firefly-iii/release-1770447333
🤖 Automatically merge the PR into the develop branch.
2026-02-07 07:55:40 +01:00
JC5 38b5b656a1 🤖 Auto commit for release 'v6.4.17' on 2026-02-07 2026-02-07 07:55:33 +01:00
github-actions[bot] e74163a7ec Merge pull request #11663 from firefly-iii/release-1770445570
🤖 Automatically merge the PR into the develop branch.
2026-02-07 07:26:17 +01:00
JC5 c60094d231 🤖 Auto commit for release 'develop' on 2026-02-07 2026-02-07 07:26:10 +01:00
James Cole 39d46d469c Fix query parser logging. 2026-02-07 06:53:12 +01:00
github-actions[bot] 6caea5ffa3 Merge pull request #11662 from firefly-iii/release-1770442761
🤖 Automatically merge the PR into the develop branch.
2026-02-07 06:39:28 +01:00
JC5 4024f76a51 🤖 Auto commit for release 'develop' on 2026-02-07 2026-02-07 06:39:21 +01:00
James Cole de84946371 Expand changelog. 2026-02-07 06:33:30 +01:00
James Cole 6d4aca54de Fix #11246 2026-02-07 06:32:11 +01:00
James Cole 256262b2ba Fix #11657 2026-02-07 06:16:23 +01:00
James Cole fb035ba594 Fix #11660 2026-02-07 06:09:41 +01:00
James Cole 20776949a6 Clean up changelog. 2026-02-06 18:32:55 +01:00
github-actions[bot] ad5a8a2934 Merge pull request #11656 from firefly-iii/release-1770398774
🤖 Automatically merge the PR into the develop branch.
2026-02-06 18:26:25 +01:00
JC5 e37ef69491 🤖 Auto commit for release 'develop' on 2026-02-06 2026-02-06 18:26:14 +01:00
James Cole df8a406c58 Fix issue with email change. 2026-02-06 18:12:52 +01:00
James Cole 88d3e01065 Add events for opening balance. 2026-02-06 18:10:41 +01:00
James Cole 7a1c32f1aa Expand changelog. 2026-02-06 15:58:45 +01:00
James Cole 54df0d44f7 Clean up events 2026-02-06 15:47:34 +01:00
James Cole 1f7775032b Fix budgeted amounts. 2026-02-06 15:38:32 +01:00
github-actions[bot] 8cfe1e8047 Merge pull request #11655 from firefly-iii/release-1770383285
🤖 Automatically merge the PR into the develop branch.
2026-02-06 14:08:15 +01:00
JC5 f0be634829 🤖 Auto commit for release 'develop' on 2026-02-06 2026-02-06 14:08:05 +01:00
James Cole 485e1138f8 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-06 14:03:26 +01:00
James Cole 9abf08b3be Fix view range. 2026-02-06 14:02:37 +01:00
github-actions[bot] f08943b926 Merge pull request #11654 from firefly-iii/release-1770382517
🤖 Automatically merge the PR into the develop branch.
2026-02-06 13:55:25 +01:00
JC5 2de9926db8 🤖 Auto commit for release 'develop' on 2026-02-06 2026-02-06 13:55:17 +01:00
James Cole b4d01d464d Clean up more events. 2026-02-06 13:49:50 +01:00
James Cole 229b45c7ad Clean up events for budgets. 2026-02-06 13:47:18 +01:00
James Cole 8e89c5af62 Clean up budget limit events. 2026-02-06 08:33:10 +01:00
James Cole 264fec7a6a Clean up budget limit events. 2026-02-06 08:20:04 +01:00
James Cole d4b1d097fe Clean up events, although handler is still a little sloppy. 2026-02-06 07:23:31 +01:00
James Cole bbd6acb824 Create events and respond to budget limit changes. 2026-02-06 06:24:57 +01:00
James Cole 4e7d12f06b Make sure webhook messages are sent. 2026-02-06 06:04:52 +01:00
James Cole 9811583379 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Http/Controllers/Transaction/DeleteController.php
2026-02-06 05:59:34 +01:00
James Cole 0063cab690 Clean up config. 2026-02-06 05:59:03 +01:00
github-actions[bot] d3add7c92b Merge pull request #11647 from firefly-iii/release-1770268490
🤖 Automatically merge the PR into the develop branch.
2026-02-05 06:14:57 +01:00
JC5 a491e4921f 🤖 Auto commit for release 'develop' on 2026-02-05 2026-02-05 06:14:50 +01:00
James Cole 171bc03668 Fix running balance events. 2026-02-05 06:10:25 +01:00
James Cole dd5476bfc7 Clean up events and filters. 2026-02-05 06:02:32 +01:00
James Cole bc0769358d Clean up update handlers. 2026-02-05 05:51:44 +01:00
James Cole ccf33f1db6 Also include delete event in new event triggers. 2026-02-05 05:47:37 +01:00
github-actions[bot] 35f611b3f2 Merge pull request #11645 from firefly-iii/release-1770234250
🤖 Automatically merge the PR into the develop branch.
2026-02-04 20:44:18 +01:00
JC5 e5d394533c 🤖 Auto commit for release 'develop' on 2026-02-04 2026-02-04 20:44:10 +01:00
James Cole 831d39a41e Catch missing nonce 2026-02-04 20:39:54 +01:00
James Cole 2920a9b9e3 Fix call. 2026-02-04 20:39:01 +01:00
James Cole 5c8204e963 Unify more event handlers. 2026-02-04 20:29:28 +01:00
James Cole d25283f193 Clean up processing for group. 2026-02-04 20:17:47 +01:00
github-actions[bot] 20986e6426 Merge pull request #11644 from firefly-iii/release-1770218546
🤖 Automatically merge the PR into the develop branch.
2026-02-04 16:22:34 +01:00
JC5 9cd0ebe37e 🤖 Auto commit for release 'develop' on 2026-02-04 2026-02-04 16:22:26 +01:00
Sander Dorigo 9c2b83a971 Update event handlers 2026-02-04 16:16:27 +01:00
Sander Dorigo e1d32da409 New event handler object 2026-02-04 08:29:09 +01:00
Sander Dorigo c51df8cd83 Move events to service and repos 2026-02-04 08:18:35 +01:00
github-actions[bot] 9f016aed16 Merge pull request #11643 from firefly-iii/release-1770188788
🤖 Automatically merge the PR into the develop branch.
2026-02-04 08:06:37 +01:00
JC5 27df5ea800 🤖 Auto commit for release 'develop' on 2026-02-04 2026-02-04 08:06:28 +01:00
Sander Dorigo 2d7cdd36f0 Fix null pointer 2026-02-04 08:01:47 +01:00
github-actions[bot] 7888023c1a Merge pull request #11642 from firefly-iii/release-1770187820
🤖 Automatically merge the PR into the develop branch.
2026-02-04 07:50:28 +01:00
JC5 3032118788 🤖 Auto commit for release 'develop' on 2026-02-04 2026-02-04 07:50:20 +01:00
James Cole 89d96ddc17 Remove unused events. 2026-02-04 05:48:51 +01:00
James Cole 97c9937571 Clean up events for groups. 2026-02-04 05:46:19 +01:00
James Cole c46aca0594 Clean up more events. 2026-02-03 21:04:07 +01:00
James Cole 0b33e1ff09 Refactor recalculation service. 2026-02-03 20:43:52 +01:00
James Cole d267d2a0b0 Remove unused event handler. 2026-02-03 20:29:58 +01:00
James Cole f2996dcebe Clean up event handlers and other code. 2026-02-03 20:24:16 +01:00
James Cole ebb6a186cc Add some event handlers. 2026-02-03 18:58:24 +01:00
James Cole 304fae439a Expand listeners and observers. 2026-02-03 05:42:50 +01:00
James Cole 9ca81cf305 Clean up observer. 2026-02-02 20:15:06 +01:00
James Cole cad5fb6d6b Clean up budget limit observer. 2026-02-02 20:13:00 +01:00
James Cole 53efafdbb2 Rename observers 2026-02-02 20:09:23 +01:00
James Cole 7922017288 Rename observers 2026-02-02 20:08:37 +01:00
James Cole 4e910a33dd Clean up events. 2026-02-02 20:02:45 +01:00
James Cole bb031cdeb6 Clean up simple observers. 2026-02-02 19:59:05 +01:00
James Cole 60026bbcba Fix convert to primary amount. 2026-02-02 19:55:18 +01:00
James Cole e96a1850da Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-02-02 19:38:00 +01:00
James Cole bd2a746b8a Add new function. 2026-02-02 19:37:53 +01:00
github-actions[bot] e4a3cbc9da Merge pull request #11640 from firefly-iii/release-1770044183
🤖 Automatically merge the PR into the develop branch.
2026-02-02 15:56:32 +01:00
JC5 18734b0edd 🤖 Auto commit for release 'develop' on 2026-02-02 2026-02-02 15:56:24 +01:00
Sander Dorigo f52b3bf5f5 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop 2026-02-02 15:39:06 +01:00
Sander Dorigo 3abba71f8d Fix null pointer 2026-02-02 15:39:03 +01:00
github-actions[bot] 95bdc87ed7 Merge pull request #11639 from firefly-iii/release-1770040333
🤖 Automatically merge the PR into the develop branch.
2026-02-02 14:52:22 +01:00
JC5 9a66b4017b 🤖 Auto commit for release 'develop' on 2026-02-02 2026-02-02 14:52:13 +01:00
Sander Dorigo 610e3f3ae5 Try to fix null pointer 2026-02-02 14:39:03 +01:00
James Cole a58e70c08b Merge pull request #11632 from mateuszkulapl/main
fix v2 layout dashboard transactions load
2026-02-02 08:42:54 +01:00
mergify[bot] 24c96d40c9 Merge branch 'develop' into main 2026-02-02 03:56:28 +00:00
github-actions[bot] 74ae59910f Merge pull request #11636 from firefly-iii/release-1770004540
🤖 Automatically merge the PR into the develop branch.
2026-02-02 04:55:48 +01:00
JC5 6d49815be9 🤖 Auto commit for release 'develop' on 2026-02-02 2026-02-02 04:55:40 +01:00
mergify[bot] ae680cd41f Merge branch 'develop' into main 2026-02-01 12:11:25 +00:00
mateuszkulapl 5e9ea1ca10 fix v2 layout dashboard transactions load
update transactions function to accept multiple params (page, start, end)
to match usage in loadAccounts (resources/assets/v2/src/pages/dashboard/accounts.js)
2026-02-01 13:05:52 +01:00
James Cole 6f558f424d Clean up notifications. 2026-01-31 11:51:34 +01:00
James Cole 4387876203 Replace lengthy notification calls, simplifies code. 2026-01-31 11:49:04 +01:00
James Cole 1b1ce3e04e Fix more events #11544 2026-01-31 10:41:48 +01:00
James Cole ff64675122 Fix stored account event. 2026-01-31 10:34:26 +01:00
James Cole 1c545b7a74 Merge branch 'main' into develop 2026-01-31 10:27:40 +01:00
James Cole a433ddcd7e Clean up events. 2026-01-31 10:27:12 +01:00
James Cole b0e1b6fe51 Merge pull request #11624 from firefly-iii/dependabot/composer/composer-2f4529dfab
Bump symfony/process from 7.4.3 to 7.4.5 in the composer group across 1 directory
2026-01-29 05:22:35 +01:00
dependabot[bot] f5523e60b6 Bump symfony/process in the composer group across 1 directory
Bumps the composer group with 1 update in the / directory: [symfony/process](https://github.com/symfony/process).


Updates `symfony/process` from 7.4.3 to 7.4.5
- [Release notes](https://github.com/symfony/process/releases)
- [Changelog](https://github.com/symfony/process/blob/8.1/CHANGELOG.md)
- [Commits](https://github.com/symfony/process/compare/v7.4.3...v7.4.5)

---
updated-dependencies:
- dependency-name: symfony/process
  dependency-version: 7.4.5
  dependency-type: indirect
  dependency-group: composer
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-29 04:08:55 +00:00
James Cole e300efe640 Merge pull request #11623 from firefly-iii/dependabot/composer/dot-ci/php-cs-fixer/composer-5ee8f56ee5
Bump symfony/process from 8.0.3 to 8.0.5 in /.ci/php-cs-fixer in the composer group across 1 directory
2026-01-29 05:07:50 +01:00
dependabot[bot] a97f227ddb Bump symfony/process
Bumps the composer group with 1 update in the /.ci/php-cs-fixer directory: [symfony/process](https://github.com/symfony/process).


Updates `symfony/process` from 8.0.3 to 8.0.5
- [Release notes](https://github.com/symfony/process/releases)
- [Changelog](https://github.com/symfony/process/blob/8.1/CHANGELOG.md)
- [Commits](https://github.com/symfony/process/compare/v8.0.3...v8.0.5)

---
updated-dependencies:
- dependency-name: symfony/process
  dependency-version: 8.0.5
  dependency-type: indirect
  dependency-group: composer
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-28 21:29:36 +00:00
github-actions[bot] 5f8d7049b5 Merge pull request #11622 from firefly-iii/release-1769628396
🤖 Automatically merge the PR into the develop branch.
2026-01-28 20:26:45 +01:00
JC5 7e80f78f2e 🤖 Auto commit for release 'develop' on 2026-01-28 2026-01-28 20:26:36 +01:00
James Cole ad922745c4 Fix #11620 2026-01-28 20:22:11 +01:00
github-actions[bot] 40abe74dc1 Merge pull request #11621 from firefly-iii/release-1769627627
🤖 Automatically merge the PR into the develop branch.
2026-01-28 20:13:55 +01:00
JC5 e5d2c4d163 🤖 Auto commit for release 'develop' on 2026-01-28 2026-01-28 20:13:48 +01:00
James Cole 2851053900 Fix nullpointer. 2026-01-28 20:08:32 +01:00
James Cole b2f6ce1277 Merge pull request #11615 from nick322/feat/11614 2026-01-28 19:38:31 +01:00
Nick Huang 340b0661ba feat(#11614): Add New Taiwan Dollar to Currency Seeder 2026-01-28 15:57:52 +08:00
github-actions[bot] be18f11f8c Merge pull request #11613 from firefly-iii/release-1769573331
🤖 Automatically merge the PR into the develop branch.
2026-01-28 05:08:59 +01:00
JC5 2f8ee67b31 🤖 Auto commit for release 'develop' on 2026-01-28 2026-01-28 05:08:52 +01:00
James Cole 1ecf55165e Merge branch 'main' into develop 2026-01-28 05:02:30 +01:00
James Cole 5aceccde4a Fix method call. 2026-01-28 05:02:14 +01:00
James Cole abfaee5a55 Merge pull request #11612 from firefly-iii/dependabot/composer/composer-63bdf6e023 2026-01-28 04:17:00 +01:00
dependabot[bot] fa65cc7ee2 Bump phpunit/phpunit in the composer group across 1 directory
Bumps the composer group with 1 update in the / directory: [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit).


Updates `phpunit/phpunit` from 12.5.6 to 12.5.8
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/12.5.8/ChangeLog-12.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/12.5.6...12.5.8)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-version: 12.5.8
  dependency-type: direct:development
  dependency-group: composer
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 22:40:18 +00:00
James Cole d64f1d0c18 Do not report ModelNotFoundException 2026-01-27 20:18:04 +01:00
github-actions[bot] 31206ce56c Merge pull request #11608 from firefly-iii/release-1769541194
🤖 Automatically merge the PR into the develop branch.
2026-01-27 20:13:21 +01:00
JC5 e4e9a09522 🤖 Auto commit for release 'develop' on 2026-01-27 2026-01-27 20:13:14 +01:00
James Cole 11303dc6e2 Merge branch 'main' into develop 2026-01-27 20:08:54 +01:00
James Cole 993f5cd292 Add language files. 2026-01-27 20:08:43 +01:00
github-actions[bot] cc0854c712 Merge pull request #11607 from firefly-iii/release-1769540197
🤖 Automatically merge the PR into the develop branch.
2026-01-27 19:56:46 +01:00
JC5 5c6aee0037 🤖 Auto commit for release 'develop' on 2026-01-27 2026-01-27 19:56:37 +01:00
James Cole 391f8c34cc Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-27 19:50:53 +01:00
James Cole db6ed26d5a Fix bad pointer 2026-01-27 19:50:46 +01:00
github-actions[bot] eece951036 Merge pull request #11606 from firefly-iii/release-1769539261
🤖 Automatically merge the PR into the develop branch.
2026-01-27 19:41:10 +01:00
JC5 3d7a62293b 🤖 Auto commit for release 'develop' on 2026-01-27 2026-01-27 19:41:01 +01:00
James Cole 2691dbe438 Add flag. 2026-01-27 19:36:35 +01:00
James Cole fe971ec611 Add new setting. 2026-01-27 19:35:14 +01:00
github-actions[bot] 9e4c5435f0 Merge pull request #11605 from firefly-iii/release-1769538639
🤖 Automatically merge the PR into the develop branch.
2026-01-27 19:30:49 +01:00
JC5 cdb2b91813 🤖 Auto commit for release 'develop' on 2026-01-27 2026-01-27 19:30:39 +01:00
James Cole f4cf158d21 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Factory/TransactionJournalFactory.php
2026-01-27 19:25:56 +01:00
James Cole b19f1d0353 Restore use of NullArrayObject 2026-01-27 19:25:23 +01:00
github-actions[bot] eb2c612476 Merge pull request #11604 from firefly-iii/release-1769534159
🤖 Automatically merge the PR into the develop branch.
2026-01-27 18:16:08 +01:00
JC5 e89eede8a0 🤖 Auto commit for release 'develop' on 2026-01-27 2026-01-27 18:15:59 +01:00
James Cole 00e09c4bd9 Fix #11601 2026-01-27 18:08:52 +01:00
James Cole 33e63434a3 Fix null pointers 2026-01-27 18:04:31 +01:00
James Cole 1b68e5374a Fix nulls 2026-01-27 18:04:16 +01:00
James Cole f93e55f9b0 Fix null pointer. 2026-01-27 18:03:39 +01:00
James Cole 4a3f62df89 Fix call to old object. 2026-01-27 18:02:47 +01:00
James Cole 0c5ac39d5e Update composer packages 2026-01-27 18:00:17 +01:00
github-actions[bot] ccb44d6fbd Merge pull request #11595 from firefly-iii/release-1769407906
🤖 Automatically merge the PR into the develop branch.
2026-01-26 07:11:54 +01:00
JC5 b9fe074080 🤖 Auto commit for release 'develop' on 2026-01-26 2026-01-26 07:11:46 +01:00
James Cole 033281ff51 Fix routes and add batch finish command. 2026-01-26 06:56:10 +01:00
github-actions[bot] 5e8d23ba91 Merge pull request #11592 from firefly-iii/release-1769398904
🤖 Automatically merge the PR into the develop branch.
2026-01-26 04:41:52 +01:00
JC5 35509f19ad 🤖 Auto commit for release 'develop' on 2026-01-26 2026-01-26 04:41:44 +01:00
github-actions[bot] 5e56eeb22e Merge pull request #11591 from firefly-iii/release-1769370043
🤖 Automatically merge the PR into the develop branch.
2026-01-25 20:40:53 +01:00
JC5 e921bb3ebe 🤖 Auto commit for release 'develop' on 2026-01-25 2026-01-25 20:40:43 +01:00
James Cole 353cd0f4f1 Try to fix call to trusted proxies 2026-01-25 20:36:25 +01:00
James Cole 1376ed16cf Rename file. 2026-01-25 20:32:10 +01:00
github-actions[bot] 36646b9c05 Merge pull request #11590 from firefly-iii/release-1769368675
🤖 Automatically merge the PR into the develop branch.
2026-01-25 20:18:02 +01:00
JC5 0b20c9d53b 🤖 Auto commit for release 'develop' on 2026-01-25 2026-01-25 20:17:55 +01:00
James Cole b91d8661bc Clean up authentication. 2026-01-25 20:13:53 +01:00
James Cole b684f3fc70 Merge pull request #11589 from mateuszkulapl/dark-mode-improvements
apply user-selected light/dark mode to form elements (checkboxes, date picker) #8613 #7620
2026-01-25 19:20:16 +01:00
mergify[bot] c8a235b0b0 Merge branch 'develop' into dark-mode-improvements 2026-01-25 18:14:52 +00:00
mateuszkulapl 229db34d13 fix: apply user-selected light/dark mode to form elements (checkboxes, date picker) #8613 #7620 2026-01-25 18:45:19 +01:00
github-actions[bot] 744ad968e7 Merge pull request #11587 from firefly-iii/release-1769360073
🤖 Automatically merge the PR into the develop branch.
2026-01-25 17:54:41 +01:00
JC5 9b04d09dfc 🤖 Auto commit for release 'develop' on 2026-01-25 2026-01-25 17:54:33 +01:00
James Cole 66c899af62 Overrule middleware 2026-01-25 17:50:19 +01:00
github-actions[bot] 4779dd8d0d Merge pull request #11586 from firefly-iii/release-1769358688
🤖 Automatically merge the PR into the develop branch.
2026-01-25 17:31:34 +01:00
JC5 c47cc7ddc4 🤖 Auto commit for release 'develop' on 2026-01-25 2026-01-25 17:31:28 +01:00
James Cole a97d46506b Config from the right place? 2026-01-25 17:27:27 +01:00
github-actions[bot] 2db4daa069 Merge pull request #11585 from firefly-iii/release-1769357347
🤖 Automatically merge the PR into the develop branch.
2026-01-25 17:09:14 +01:00
JC5 7f07d266f1 🤖 Auto commit for release 'develop' on 2026-01-25 2026-01-25 17:09:07 +01:00
github-actions[bot] 158081395b Merge pull request #11583 from firefly-iii/release-1769334926
🤖 Automatically merge the PR into the develop branch.
2026-01-25 10:55:33 +01:00
JC5 34a7fd3ef0 🤖 Auto commit for release 'develop' on 2026-01-25 2026-01-25 10:55:27 +01:00
James Cole 96aafacf43 Fix processing transactions in events. 2026-01-25 10:47:30 +01:00
James Cole 035d599910 Fix processing new transactions. 2026-01-25 10:22:02 +01:00
James Cole f5a929d72e Clean up a bunch of code and improve transaction store events 2026-01-25 09:02:47 +01:00
James Cole 22b97ce8ef Clean up middleware and kernel files. 2026-01-24 20:36:20 +01:00
James Cole 832019792f Improve listeners 2026-01-24 19:02:18 +01:00
James Cole 76b8ff18b0 Transaction events for #11544 2026-01-24 18:52:07 +01:00
James Cole 8c0a82ac0a Add support for batch submission. 2026-01-24 18:34:49 +01:00
James Cole 7edc386cdd Fix strict types 2026-01-24 16:47:17 +01:00
James Cole 5437d07ec2 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Providers/EventServiceProvider.php
2026-01-24 16:46:08 +01:00
James Cole ef3a1401dd Remove more events for #11544 2026-01-24 16:45:28 +01:00
github-actions[bot] aa6169e314 Merge pull request #11582 from firefly-iii/release-1769259448
🤖 Automatically merge the PR into the develop branch.
2026-01-24 13:57:36 +01:00
JC5 4a4f1ff055 🤖 Auto commit for release 'develop' on 2026-01-24 2026-01-24 13:57:28 +01:00
James Cole 844470bf08 Move more events #11544 2026-01-24 13:52:35 +01:00
James Cole 92e985a9b8 Move more events #11544 2026-01-24 13:44:02 +01:00
James Cole 70e11098af Move more events #11544 2026-01-24 13:33:40 +01:00
James Cole e76ab21091 Fix #11563 2026-01-24 07:17:19 +01:00
github-actions[bot] 87644923cf Merge pull request #11581 from firefly-iii/release-1769199015
🤖 Automatically merge the PR into the develop branch.
2026-01-23 21:10:26 +01:00
JC5 c46e9519c2 🤖 Auto commit for release 'develop' on 2026-01-23 2026-01-23 21:10:15 +01:00
github-actions[bot] 775933c3e8 Merge pull request #11580 from firefly-iii/release-1769183303
🤖 Automatically merge the PR into the develop branch.
2026-01-23 16:48:32 +01:00
JC5 5e316a1f05 🤖 Auto commit for release 'develop' on 2026-01-23 2026-01-23 16:48:23 +01:00
github-actions[bot] 857fe8ed76 Merge pull request #11579 from firefly-iii/release-1769181522
🤖 Automatically merge the PR into the develop branch.
2026-01-23 16:18:50 +01:00
JC5 2cca32d021 🤖 Auto commit for release 'develop' on 2026-01-23 2026-01-23 16:18:42 +01:00
James Cole 09c4f4702d Missing return statement 2026-01-23 16:13:33 +01:00
James Cole a44f0f362f Catch on user login. 2026-01-23 16:12:49 +01:00
James Cole b147c5abc6 Merge branch 'main' into develop 2026-01-23 15:16:48 +01:00
James Cole 099e60a2fa Do format. 2026-01-23 15:16:41 +01:00
github-actions[bot] 9685b47126 Merge pull request #11578 from firefly-iii/release-1769177668
🤖 Automatically merge the PR into the develop branch.
2026-01-23 15:14:37 +01:00
JC5 eeeba86d38 🤖 Auto commit for release 'develop' on 2026-01-23 2026-01-23 15:14:29 +01:00
James Cole 8f15a32bd6 Autoformat lol 2026-01-23 15:09:50 +01:00
James Cole ae1347c550 Auto fix issues. 2026-01-23 15:09:36 +01:00
James Cole e215d550b5 More refactoring for #11544 2026-01-23 15:06:35 +01:00
James Cole 203a80147a Refactor a bunch of events for #11544 2026-01-23 14:53:54 +01:00
James Cole fa6c7e77bc Refactor events for #11544 2026-01-23 13:58:57 +01:00
James Cole c47be06043 Remove overflow. 2026-01-22 19:56:36 +01:00
James Cole eb4b6cbfc5 Remove duplicates 2026-01-22 19:56:27 +01:00
github-actions[bot] 1c844bab23 Merge pull request #11571 from firefly-iii/release-1769021222
🤖 Automatically merge the PR into the develop branch.
2026-01-21 19:47:11 +01:00
JC5 b3ee8dccd5 🤖 Auto commit for release 'develop' on 2026-01-21 2026-01-21 19:47:02 +01:00
James Cole 41108e81a0 Remove unexpected exit call. 2026-01-21 19:42:27 +01:00
James Cole 8dba928dca Add autocomplete=off 2026-01-21 11:35:01 +01:00
James Cole 0955daf21f Merge pull request #11569 from gian21391/develop
Fix layout overflow issues with long content in v1 and v2 layouts
2026-01-21 11:31:48 +01:00
Gianluca Martino de79a757cb Adding CSS properties to v1 and v2 layouts. 2026-01-20 23:31:40 -08:00
github-actions[bot] 39531a2132 Merge pull request #11567 from firefly-iii/release-1768973599
🤖 Automatically merge the PR into the develop branch.
2026-01-21 06:33:28 +01:00
JC5 90b546e2eb 🤖 Auto commit for release 'develop' on 2026-01-21 2026-01-21 06:33:19 +01:00
James Cole b535c5b6a1 Back to jquery 3.x 2026-01-21 06:28:26 +01:00
James Cole 54f1ef0e21 Update view and audit logs for #11399 2026-01-21 06:26:48 +01:00
github-actions[bot] e1ada04d07 Merge pull request #11566 from firefly-iii/release-1768939586
🤖 Automatically merge the PR into the develop branch.
2026-01-20 21:06:33 +01:00
JC5 61cc480c03 🤖 Auto commit for release 'develop' on 2026-01-20 2026-01-20 21:06:26 +01:00
James Cole 889b25e85d Merge branch 'main' into develop 2026-01-20 21:02:06 +01:00
James Cole f9f365153a Update build job. 2026-01-20 21:01:37 +01:00
github-actions[bot] 62c676157f Merge pull request #11565 from firefly-iii/release-1768939166
🤖 Automatically merge the PR into the develop branch.
2026-01-20 20:59:34 +01:00
JC5 24df659ecb 🤖 Auto commit for release 'develop' on 2026-01-20 2026-01-20 20:59:26 +01:00
James Cole 9180cdbc66 Add error box. 2026-01-20 20:55:35 +01:00
github-actions[bot] 7a6245f246 Merge pull request #11564 from firefly-iii/release-1768934499
🤖 Automatically merge the PR into the develop branch.
2026-01-20 19:41:46 +01:00
JC5 e156a4eedc 🤖 Auto commit for release 'develop' on 2026-01-20 2026-01-20 19:41:39 +01:00
James Cole c63fead216 Add jquery. 2026-01-20 19:37:11 +01:00
github-actions[bot] d9c09fe566 Merge pull request #11562 from firefly-iii/release-1768885025
🤖 Automatically merge the PR into the develop branch.
2026-01-20 05:57:12 +01:00
JC5 0686d86ef8 🤖 Auto commit for release 'develop' on 2026-01-20 2026-01-20 05:57:05 +01:00
James Cole 7c2aea31fe Update jquery 2026-01-20 05:49:14 +01:00
James Cole bb0af2396e Merge pull request #11551 from firefly-iii/dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-20 05:08:52 +01:00
Gianluca Martino 417a97c26c Avoiding the overflow of the content in the transaction list when a very long description is present. 2026-01-19 15:29:41 -08:00
mergify[bot] 4718ee9723 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 19:24:23 +00:00
github-actions[bot] 55c762d55a Merge pull request #11558 from firefly-iii/release-1768850616
🤖 Automatically merge the PR into the develop branch.
2026-01-19 20:23:44 +01:00
JC5 734df18f4e 🤖 Auto commit for release 'develop' on 2026-01-19 2026-01-19 20:23:36 +01:00
mergify[bot] 11537c4922 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 19:20:14 +00:00
James Cole 30205d828a Merge pull request #11552 from firefly-iii/dependabot/npm_and_yarn/develop/jquery-4.0.0
Bump jquery from 3.7.1 to 4.0.0
2026-01-19 20:19:30 +01:00
mergify[bot] 6b2d724a5b Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 19:18:17 +00:00
mergify[bot] 9c0eb8a028 Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 19:18:01 +00:00
James Cole 103a6d1b15 Expand events for #11544 2026-01-19 20:17:16 +01:00
mergify[bot] 99403ab9f6 Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 19:11:10 +00:00
mergify[bot] 5980ac0b64 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 19:11:07 +00:00
James Cole b9e5851e38 Remove unused class #11411 2026-01-19 20:09:53 +01:00
mergify[bot] 6da02065b7 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 19:08:57 +00:00
mergify[bot] eab18ed2f2 Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 19:08:53 +00:00
James Cole 67d18e4b62 Clean up latest MFA handler #11455 2026-01-19 20:08:15 +01:00
mergify[bot] 41da3a014f Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 19:02:51 +00:00
mergify[bot] 71774905b0 Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 19:02:47 +00:00
James Cole 48f886d17c Replace multiple failures alert #11544 2026-01-19 20:02:20 +01:00
James Cole e28df272b5 Replace multiple failures alert #11544 2026-01-19 20:02:08 +01:00
mergify[bot] c7f4c40435 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 18:57:51 +00:00
mergify[bot] 95e98cfeca Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 18:57:47 +00:00
James Cole 095d31fbe1 Replace multiple failures alert #11544 2026-01-19 19:57:09 +01:00
mergify[bot] 8db08cc623 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 18:50:19 +00:00
mergify[bot] 27044aeecf Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 18:50:15 +00:00
James Cole 8bd7752e2b Clean up more MFA event handlers #11544 2026-01-19 19:49:50 +01:00
James Cole ee24d55554 Clean up more MFA event handlers #11544 2026-01-19 19:49:34 +01:00
mergify[bot] 8e8e0ab67d Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 18:43:54 +00:00
mergify[bot] 740a14972a Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 18:43:44 +00:00
James Cole c6667c2293 Continued. #11544 2026-01-19 19:43:23 +01:00
James Cole 8327a3d670 Enabled MFA notifications #11544 2026-01-19 19:43:06 +01:00
mergify[bot] 4278d59d05 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 18:37:08 +00:00
mergify[bot] 5534bedde0 Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 18:37:02 +00:00
James Cole 83fe7f6f6d MFA disabled #11544 2026-01-19 19:36:21 +01:00
mergify[bot] 669bb20228 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 18:33:07 +00:00
mergify[bot] e41dbdc3a7 Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 18:33:03 +00:00
James Cole 670f98eb66 Merge branch 'main' into develop 2026-01-19 19:32:21 +01:00
mergify[bot] 3229011035 Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 06:56:35 +00:00
mergify[bot] 7e02bee90b Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 06:56:31 +00:00
github-actions[bot] be6801654f Merge pull request #11555 from firefly-iii/release-1768805748
🤖 Automatically merge the PR into the develop branch.
2026-01-19 07:55:56 +01:00
JC5 93fe1f5558 🤖 Auto commit for release 'develop' on 2026-01-19 2026-01-19 07:55:48 +01:00
James Cole d12fd40a57 Merge pull request #11554 from firefly-iii/JC5-patch-2
Update PHP version setup in release workflow
2026-01-19 07:52:00 +01:00
James Cole 4405b2ac8f Update PHP version setup in release workflow
Set default PHP version to 8.4 if not provided.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-01-19 07:51:49 +01:00
mergify[bot] cc99abefac Merge branch 'develop' into dependabot/npm_and_yarn/develop/i18next-chained-backend-5.0.0 2026-01-19 06:03:18 +00:00
mergify[bot] bbbc8492db Merge branch 'develop' into dependabot/npm_and_yarn/develop/jquery-4.0.0 2026-01-19 06:03:13 +00:00
James Cole ba5b6ff694 Merge pull request #11550 from firefly-iii/dependabot/composer/develop/larastan/larastan-3.9.0 2026-01-19 07:02:34 +01:00
dependabot[bot] edb8f811af Bump jquery from 3.7.1 to 4.0.0
Bumps [jquery](https://github.com/jquery/jquery) from 3.7.1 to 4.0.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Changelog](https://github.com/jquery/jquery/blob/main/changelog.md)
- [Commits](https://github.com/jquery/jquery/compare/3.7.1...4.0.0)

---
updated-dependencies:
- dependency-name: jquery
  dependency-version: 4.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-19 04:09:35 +00:00
dependabot[bot] d79d1a3317 Bump i18next-chained-backend from 4.6.3 to 5.0.0
Bumps [i18next-chained-backend](https://github.com/i18next/i18next-chained-backend) from 4.6.3 to 5.0.0.
- [Changelog](https://github.com/i18next/i18next-chained-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-chained-backend/compare/v4.6.3...v5.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-19 04:09:22 +00:00
dependabot[bot] 492aec0652 Bump larastan/larastan from 3.8.1 to 3.9.0
Bumps [larastan/larastan](https://github.com/larastan/larastan) from 3.8.1 to 3.9.0.
- [Release notes](https://github.com/larastan/larastan/releases)
- [Changelog](https://github.com/larastan/larastan/blob/3.x/RELEASE.md)
- [Commits](https://github.com/larastan/larastan/compare/v3.8.1...v3.9.0)

---
updated-dependencies:
- dependency-name: larastan/larastan
  dependency-version: 3.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-19 04:09:13 +00:00
James Cole c81bb44552 Fix #11546 2026-01-18 13:32:05 +01:00
James Cole 0431c95b49 Move rule actions for rule events. #11544 2026-01-18 12:13:11 +01:00
James Cole 6408db5414 Remove unused class #11544 2026-01-18 12:08:05 +01:00
James Cole 5de88a70f8 Remove piggy bank event handler and replace name event. #11544 2026-01-18 12:07:03 +01:00
James Cole 968da83c67 Migrate PiggyBankAmountIsChanged handler to listener #11544 2026-01-18 12:00:41 +01:00
James Cole e77b4ee4a6 Rename to PiggyBankAmountIsChanged for #11544 2026-01-18 11:58:20 +01:00
James Cole a36c775bd2 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-18 11:57:23 +01:00
James Cole 7773862eb9 Remove unused class. #11544 2026-01-18 11:57:17 +01:00
github-actions[bot] ae107b1776 Merge pull request #11545 from firefly-iii/release-1768729993
🤖 Automatically merge the PR into the develop branch.
2026-01-18 10:53:20 +01:00
JC5 d1b167447b 🤖 Auto commit for release 'develop' on 2026-01-18 2026-01-18 10:53:13 +01:00
James Cole a08ba43c23 For multiple subscriptions payment missed warning #11544 2026-01-18 10:17:50 +01:00
James Cole 64325fbce7 Remove unused class #11544 2026-01-18 10:12:39 +01:00
James Cole aeac59e851 Subscription reminder for extension or ending. https://github.com/firefly-iii/firefly-iii/issues/11544 2026-01-18 10:11:26 +01:00
James Cole 151be7df8a Fix #11541 2026-01-18 06:07:50 +01:00
github-actions[bot] 040bd0f6e3 Merge pull request #11540 from firefly-iii/release-1768662669
🤖 Automatically merge the PR into the develop branch.
2026-01-17 16:11:15 +01:00
JC5 a859ca4e38 🤖 Auto commit for release 'develop' on 2026-01-17 2026-01-17 16:11:09 +01:00
James Cole 95c62d783a Fix https://github.com/orgs/firefly-iii/discussions/11538 2026-01-17 16:02:59 +01:00
github-actions[bot] e7b67bc85e Merge pull request #11536 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-01-17 08:54:06 +01:00
github-actions[bot] 208f13ee75 Merge pull request #11535 from firefly-iii/release-1768636434
🤖 Automatically merge the PR into the develop branch.
2026-01-17 08:54:01 +01:00
JC5 437eecc1c9 🤖 Auto commit for release 'v6.4.16' on 2026-01-17 2026-01-17 08:53:54 +01:00
James Cole 1d34d81389 Remove double line from changelog. 2026-01-17 07:22:40 +01:00
github-actions[bot] 30844e99d4 Merge pull request #11534 from firefly-iii/release-1768630688
🤖 Automatically merge the PR into the develop branch.
2026-01-17 07:18:14 +01:00
JC5 d734449f63 🤖 Auto commit for release 'develop' on 2026-01-17 2026-01-17 07:18:08 +01:00
James Cole 69a9e3a198 Clean up account deletion and balance recalculation. 2026-01-17 07:12:14 +01:00
James Cole 3ad2f8c750 Expand changelog. 2026-01-17 07:03:29 +01:00
James Cole 2166839768 Fix #11475 2026-01-17 07:03:18 +01:00
James Cole 8ecb9d7774 Fix #11508 2026-01-17 06:58:33 +01:00
James Cole 8814fb0806 Fix https://github.com/orgs/firefly-iii/discussions/11509 2026-01-16 09:02:37 +01:00
James Cole 7481c8d4c0 Fix https://github.com/firefly-iii/firefly-iii/issues/11531 2026-01-16 07:34:20 +01:00
James Cole 1e618fbf6d Sort alphabetically https://github.com/orgs/firefly-iii/discussions/11524 2026-01-15 05:59:33 +01:00
James Cole 8b322dc903 Sort alphabetically https://github.com/orgs/firefly-iii/discussions/11524 2026-01-15 05:56:18 +01:00
github-actions[bot] 812b0e6940 Merge pull request #11520 from firefly-iii/release-1768367445
🤖 Automatically merge the PR into the develop branch.
2026-01-14 06:10:53 +01:00
JC5 9070856b9c 🤖 Auto commit for release 'develop' on 2026-01-14 2026-01-14 06:10:45 +01:00
James Cole 84082d38f2 Ignore AppServiceProvider 2026-01-14 06:05:34 +01:00
James Cole 822352827a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-14 06:00:47 +01:00
github-actions[bot] 7c1b550c2c Merge pull request #11518 from firefly-iii/release-1768366825
🤖 Automatically merge the PR into the develop branch.
2026-01-14 06:00:33 +01:00
JC5 94a25d3137 🤖 Auto commit for release 'develop' on 2026-01-14 2026-01-14 06:00:25 +01:00
James Cole 4c95ab49f4 Cannot be static. 2026-01-14 05:56:08 +01:00
github-actions[bot] be87a24b8f Merge pull request #11517 from firefly-iii/release-1768334732
🤖 Automatically merge the PR into the develop branch.
2026-01-13 21:05:40 +01:00
JC5 f6032d5502 🤖 Auto commit for release 'develop' on 2026-01-13 2026-01-13 21:05:32 +01:00
James Cole 7dcfb68fca Fix parse issue. 2026-01-13 20:59:54 +01:00
James Cole 419c796eac Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-13 20:54:44 +01:00
James Cole 1d5733adba Experimental command 2026-01-13 20:54:31 +01:00
github-actions[bot] c589360ad9 Merge pull request #11516 from firefly-iii/release-1768333294
🤖 Automatically merge the PR into the develop branch.
2026-01-13 20:41:40 +01:00
JC5 d4687fb34f 🤖 Auto commit for release 'develop' on 2026-01-13 2026-01-13 20:41:34 +01:00
github-actions[bot] 9c4159ca3d Merge pull request #11515 from firefly-iii/release-1768333066
🤖 Automatically merge the PR into the develop branch.
2026-01-13 20:37:53 +01:00
JC5 93507c8b96 🤖 Auto commit for release 'develop' on 2026-01-13 2026-01-13 20:37:46 +01:00
James Cole 23d49a4194 Code clean up and restoration using Mago. 2026-01-13 20:37:41 +01:00
James Cole 858c44fbce Reset fix. 2026-01-13 20:32:42 +01:00
James Cole 95a6543a94 Fix config 2026-01-13 05:26:12 +01:00
James Cole 855d40cf2f Update lock file 2026-01-13 05:25:11 +01:00
James Cole 7d0fec6326 Mago config 2026-01-13 05:25:01 +01:00
James Cole ebd7dca6a9 Do some code cleanup courtesy of Mago. 2026-01-13 05:14:58 +01:00
James Cole 1d41fc9845 Do some code cleanup courtesy of Mago. 2026-01-13 05:13:01 +01:00
github-actions[bot] fe9ae9c810 Merge pull request #11505 from firefly-iii/release-1768204215
🤖 Automatically merge the PR into the develop branch.
2026-01-12 08:50:22 +01:00
JC5 84600c5208 🤖 Auto commit for release 'develop' on 2026-01-12 2026-01-12 08:50:15 +01:00
James Cole f7e89cab0a Fix #11502 2026-01-11 17:18:31 +01:00
James Cole 8195630a6e Fix #11501 2026-01-11 10:12:48 +01:00
github-actions[bot] d5bf80a0cb Merge pull request #11498 from firefly-iii/release-1768068342
🤖 Automatically merge the PR into the develop branch.
2026-01-10 19:05:49 +01:00
JC5 ef1c64096d 🤖 Auto commit for release 'develop' on 2026-01-10 2026-01-10 19:05:42 +01:00
James Cole ef35eaffb4 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-10 18:28:21 +01:00
James Cole 869ee7c735 Add info 2026-01-10 18:28:10 +01:00
James Cole 6c534f01eb Catch null pointer. 2026-01-10 18:26:58 +01:00
github-actions[bot] 3a9d89b53d Merge pull request #11497 from firefly-iii/release-1768064652
🤖 Automatically merge the PR into the develop branch.
2026-01-10 18:04:21 +01:00
JC5 badff64cfd 🤖 Auto commit for release 'develop' on 2026-01-10 2026-01-10 18:04:12 +01:00
James Cole abacfa212e Throw a 410. Don't report it. 2026-01-10 18:00:18 +01:00
github-actions[bot] add2e859c4 Merge pull request #11496 from firefly-iii/release-1768064331
🤖 Automatically merge the PR into the develop branch.
2026-01-10 17:58:57 +01:00
JC5 92f6421fc4 🤖 Auto commit for release 'develop' on 2026-01-10 2026-01-10 17:58:51 +01:00
James Cole f350c19ec1 Add some debug info. 2026-01-10 17:52:45 +01:00
James Cole 8170804d74 No error, just 404. 2026-01-10 17:50:54 +01:00
James Cole 4400f6217d Add debug logging. 2026-01-10 17:50:47 +01:00
James Cole e223cea74e Add more feedback. 2026-01-10 17:42:51 +01:00
James Cole 2f62e11338 Add some info on the user's input. 2026-01-10 17:38:03 +01:00
github-actions[bot] d96c7931d6 Merge pull request #11494 from firefly-iii/release-1768053858
🤖 Automatically merge the PR into the develop branch.
2026-01-10 15:04:28 +01:00
JC5 2ab105a902 🤖 Auto commit for release 'develop' on 2026-01-10 2026-01-10 15:04:18 +01:00
James Cole 7ced1f8cf3 Add debug logging for https://github.com/orgs/firefly-iii/discussions/11431 2026-01-10 14:35:14 +01:00
James Cole 03364d9530 More strict check on transaction journal type. 2026-01-10 08:19:10 +01:00
James Cole 1f75612741 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-10 08:16:47 +01:00
James Cole a141cf6e67 Remove bills from transfers in more places. 2026-01-10 08:16:41 +01:00
James Cole c97fb07e8d Group tags by date. 2026-01-10 07:37:22 +01:00
James Cole 9833dd49a9 Merge pull request #11483 from pilipovicn/add-rsd-currency 2026-01-09 11:59:26 +01:00
embedded b76f4fe7b9 Add Serbian Dinar to Currency Seeder 2026-01-09 11:32:04 +01:00
James Cole 6c114e2ffc Throw better error 2026-01-09 06:07:50 +01:00
James Cole bd396673ed Fix bad header exception. 2026-01-09 05:58:05 +01:00
James Cole ad72bc1722 Fix #11479 2026-01-09 05:57:55 +01:00
James Cole 466b42200d Fix #11473 2026-01-07 20:53:44 +01:00
github-actions[bot] 067112904e Merge pull request #11467 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-01-06 21:05:43 +01:00
github-actions[bot] fc371e27b7 Merge pull request #11466 from firefly-iii/release-1767729927
🤖 Automatically merge the PR into the develop branch.
2026-01-06 21:05:36 +01:00
JC5 52b14b46a2 🤖 Auto commit for release 'v6.4.15' on 2026-01-06 2026-01-06 21:05:27 +01:00
James Cole 5260b770bb Clean up changelog. 2026-01-06 21:01:07 +01:00
github-actions[bot] 226c4c8f8e Merge pull request #11464 from firefly-iii/release-1767729551
🤖 Automatically merge the PR into the develop branch.
2026-01-06 20:59:17 +01:00
JC5 9ebafe64f1 🤖 Auto commit for release 'develop' on 2026-01-06 2026-01-06 20:59:11 +01:00
James Cole ffa618101d Update changelog. 2026-01-06 20:55:08 +01:00
James Cole 280e531a76 Fix #11396 2026-01-06 20:43:11 +01:00
James Cole f542a3fd88 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-01-06 20:38:46 +01:00
James Cole 581d67a92c Fix #11399 2026-01-06 20:38:41 +01:00
github-actions[bot] a00e8b976c Merge pull request #11458 from firefly-iii/release-1767598313
🤖 Automatically merge the PR into the develop branch.
2026-01-05 08:32:02 +01:00
JC5 e5b3c3e6bd 🤖 Auto commit for release 'develop' on 2026-01-05 2026-01-05 08:31:53 +01:00
James Cole 4d7f63273e Fix #11449 2026-01-04 20:21:41 +01:00
James Cole 04553f6fc5 Fix #11443 2026-01-03 14:46:39 +01:00
James Cole 54676715c0 Create new request for search. 2026-01-02 16:38:46 +01:00
github-actions[bot] 637d8e050a Merge pull request #11376 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2025-12-16 06:42:25 +01:00
1227 changed files with 39632 additions and 37535 deletions
+4 -1
View File
@@ -26,6 +26,7 @@ $paths = [
$current . '/../../config',
$current . '/../../routes',
$current . '/../../tests',
$current . '/../../resources/lang/en_US',
];
$finder = PhpCsFixer\Finder::create()
@@ -40,7 +41,9 @@ return $config->setRules(
[
// rule sets
'@PHP83Migration' => true,
'@PHP8x3Migration' => true,
'@PHP8x4Migration' => true,
'@PHP8x5Migration' => true,
'@PhpCsFixer' => true,
'@PhpCsFixer:risky' => true,
'@PSR12' => true,
+1
View File
@@ -1,5 +1,6 @@
{
"require": {
"php": ">=8.5.0",
"friendsofphp/php-cs-fixer": "^3.12"
}
}
+78 -64
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "f1e0b38af4ded66da271a99d2bff5be8",
"content-hash": "35b5ad9b3c4e1ffe78ef9bec73987499",
"packages": [
{
"name": "clue/ndjson-react",
@@ -402,16 +402,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.92.3",
"version": "v3.94.2",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8"
"reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8",
"reference": "2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7787ceff91365ba7d623ec410b8f429cdebb4f63",
"reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63",
"shasum": ""
},
"require": {
@@ -428,7 +428,7 @@
"react/event-loop": "^1.5",
"react/socket": "^1.16",
"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 || ^8.0",
"symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
"symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
@@ -442,18 +442,18 @@
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
},
"require-dev": {
"facile-it/paraunit": "^1.3.1 || ^2.7",
"infection/infection": "^0.31.0",
"justinrainbow/json-schema": "^6.5",
"keradus/cli-executor": "^2.2",
"facile-it/paraunit": "^1.3.1 || ^2.7.1",
"infection/infection": "^0.32.3",
"justinrainbow/json-schema": "^6.6.4",
"keradus/cli-executor": "^2.3",
"mikey179/vfsstream": "^1.6.12",
"php-coveralls/php-coveralls": "^2.9",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
"phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34",
"php-coveralls/php-coveralls": "^2.9.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7",
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51",
"symfony/polyfill-php85": "^1.33",
"symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0",
"symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0"
"symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4",
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
@@ -494,7 +494,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.3"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.2"
},
"funding": [
{
@@ -502,7 +502,7 @@
"type": "github"
}
],
"time": "2025-12-18T10:45:02+00:00"
"time": "2026-02-20T16:13:53+00:00"
},
{
"name": "psr/container",
@@ -1185,29 +1185,29 @@
},
{
"name": "sebastian/diff",
"version": "7.0.0",
"version": "8.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "7ab1ea946c012266ca32390913653d844ecd085f"
"reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f",
"reference": "7ab1ea946c012266ca32390913653d844ecd085f",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"shasum": ""
},
"require": {
"php": ">=8.3"
"php": ">=8.4"
},
"require-dev": {
"phpunit/phpunit": "^12.0",
"phpunit/phpunit": "^13.0",
"symfony/process": "^7.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "7.0-dev"
"dev-main": "8.0-dev"
}
},
"autoload": {
@@ -1240,28 +1240,40 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/7.0.0"
"source": "https://github.com/sebastianbergmann/diff/tree/8.0.0"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
},
{
"url": "https://liberapay.com/sebastianbergmann",
"type": "liberapay"
},
{
"url": "https://thanks.dev/u/gh/sebastianbergmann",
"type": "thanks_dev"
},
{
"url": "https://tidelift.com/funding/github/packagist/sebastian/diff",
"type": "tidelift"
}
],
"time": "2025-02-07T04:55:46+00:00"
"time": "2026-02-06T04:42:27+00:00"
},
{
"name": "symfony/console",
"version": "v8.0.3",
"version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587"
"reference": "488285876e807a4777f074041d8bb508623419fa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/6145b304a5c1ea0bdbd0b04d297a5864f9a7d587",
"reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587",
"url": "https://api.github.com/repos/symfony/console/zipball/488285876e807a4777f074041d8bb508623419fa",
"reference": "488285876e807a4777f074041d8bb508623419fa",
"shasum": ""
},
"require": {
@@ -1318,7 +1330,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v8.0.3"
"source": "https://github.com/symfony/console/tree/v8.0.6"
},
"funding": [
{
@@ -1338,7 +1350,7 @@
"type": "tidelift"
}
],
"time": "2025-12-23T14:52:06+00:00"
"time": "2026-02-25T16:59:43+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -1409,16 +1421,16 @@
},
{
"name": "symfony/event-dispatcher",
"version": "v8.0.0",
"version": "v8.0.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "573f95783a2ec6e38752979db139f09fec033f03"
"reference": "99301401da182b6cfaa4700dbe9987bb75474b47"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03",
"reference": "573f95783a2ec6e38752979db139f09fec033f03",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99301401da182b6cfaa4700dbe9987bb75474b47",
"reference": "99301401da182b6cfaa4700dbe9987bb75474b47",
"shasum": ""
},
"require": {
@@ -1470,7 +1482,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v8.0.0"
"source": "https://github.com/symfony/event-dispatcher/tree/v8.0.4"
},
"funding": [
{
@@ -1490,7 +1502,7 @@
"type": "tidelift"
}
],
"time": "2025-10-30T14:17:19+00:00"
"time": "2026-01-05T11:45:55+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -1570,16 +1582,16 @@
},
{
"name": "symfony/filesystem",
"version": "v8.0.1",
"version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "d937d400b980523dc9ee946bb69972b5e619058d"
"reference": "7bf9162d7a0dff98d079b72948508fa48018a770"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d",
"reference": "d937d400b980523dc9ee946bb69972b5e619058d",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/7bf9162d7a0dff98d079b72948508fa48018a770",
"reference": "7bf9162d7a0dff98d079b72948508fa48018a770",
"shasum": ""
},
"require": {
@@ -1616,7 +1628,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v8.0.1"
"source": "https://github.com/symfony/filesystem/tree/v8.0.6"
},
"funding": [
{
@@ -1636,20 +1648,20 @@
"type": "tidelift"
}
],
"time": "2025-12-01T09:13:36+00:00"
"time": "2026-02-25T16:59:43+00:00"
},
{
"name": "symfony/finder",
"version": "v8.0.3",
"version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12"
"reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/dd3a2953570a283a2ba4e17063bb98c734cf5b12",
"reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12",
"url": "https://api.github.com/repos/symfony/finder/zipball/441404f09a54de6d1bd6ad219e088cdf4c91f97c",
"reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c",
"shasum": ""
},
"require": {
@@ -1684,7 +1696,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v8.0.3"
"source": "https://github.com/symfony/finder/tree/v8.0.6"
},
"funding": [
{
@@ -1704,7 +1716,7 @@
"type": "tidelift"
}
],
"time": "2025-12-23T14:52:06+00:00"
"time": "2026-01-29T09:41:02+00:00"
},
{
"name": "symfony/options-resolver",
@@ -2358,16 +2370,16 @@
},
{
"name": "symfony/process",
"version": "v8.0.3",
"version": "v8.0.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "0cbbd88ec836f8757641c651bb995335846abb78"
"reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/0cbbd88ec836f8757641c651bb995335846abb78",
"reference": "0cbbd88ec836f8757641c651bb995335846abb78",
"url": "https://api.github.com/repos/symfony/process/zipball/b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674",
"reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674",
"shasum": ""
},
"require": {
@@ -2399,7 +2411,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v8.0.3"
"source": "https://github.com/symfony/process/tree/v8.0.5"
},
"funding": [
{
@@ -2419,7 +2431,7 @@
"type": "tidelift"
}
],
"time": "2025-12-19T10:01:18+00:00"
"time": "2026-01-26T15:08:38+00:00"
},
{
"name": "symfony/service-contracts",
@@ -2576,16 +2588,16 @@
},
{
"name": "symfony/string",
"version": "v8.0.1",
"version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc"
"reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/ba65a969ac918ce0cc3edfac6cdde847eba231dc",
"reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc",
"url": "https://api.github.com/repos/symfony/string/zipball/6c9e1108041b5dce21a9a4984b531c4923aa9ec4",
"reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4",
"shasum": ""
},
"require": {
@@ -2642,7 +2654,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v8.0.1"
"source": "https://github.com/symfony/string/tree/v8.0.6"
},
"funding": [
{
@@ -2662,7 +2674,7 @@
"type": "tidelift"
}
],
"time": "2025-12-01T09:13:36+00:00"
"time": "2026-02-09T10:14:57+00:00"
}
],
"packages-dev": [],
@@ -2671,7 +2683,9 @@
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {},
"platform": {
"php": ">=8.5.0"
},
"platform-dev": {},
"plugin-api-version": "2.9.0"
}
+9 -1
View File
@@ -14,7 +14,15 @@ SITE_OWNER=mail@example.com
# Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it.
# If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE
#
# Avoid the "#" character in your APP_KEY, it may break things.
# Try to avoid special characters like #, < and > in your app key. This string does not need full entropy
# When in doubt, follow the link below and pick one.
#
# https://www.random.org/strings/?num=5&len=32&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new
#
# If you are a fancy linux nerd like me, use this command:
#
# head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
#
#
APP_KEY=SomeRandomStringOf32CharsExactly
+3 -3
View File
@@ -4,9 +4,9 @@ body:
- type: checkboxes
attributes:
label: Support guidelines
description: Please read the support guidelines before proceeding.
description: Thank you for reading the support guidelines before proceeding.
options:
- label: I've read the <!-- MZ2udTpin6FL --> [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
- label: I'm smart and I read the <!-- MZ2udTpin6FL --> [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
required: true
- type: checkboxes
@@ -29,7 +29,7 @@ body:
attributes:
label: Debug information
description: Please provide the table from the /debug page. Do not add backticks or quotes.
placeholder: The output from the /debug page
placeholder: The output from the /debug page or "N/A"
validations:
required: true
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

-7
View File
@@ -1,11 +1,4 @@
pull_request_rules:
- name: Make sure PR are up to date before merging
description: This automatically updates PRs when they are out-of-date with the
base branch to avoid semantic conflicts (next step is using a merge
queue).
conditions: []
actions:
update:
- name: Close all on main
conditions:
- base=main
+11 -9
View File
@@ -1,20 +1,22 @@
<!--
Thank you for submitting new code to Firefly III, or any of the related projects. Please read the following rules carefully.
- Please do not submit solutions for problems that are not already reported in an issue.
- Unfortunately, Firefly III can't be your learning experience. If you're new to all of this, please open an issue first.
- Please do not open PRs to "discuss" possible solutions or to "get feedback" on your code. I simply don't have time for that.
- Pull requests for the MAIN branch will be closed.
- DO NOT include translated strings in your PR.
- PRs (or parts thereof) that only fix issues inside code comments will not be accepted.
Please TALK TO ME FIRST before you open a PR.
If it feels necessary to open an issue first, please do so, before you open a PR.
1. If you fix a problem that has no ticket, talk to me FIRST.
2. If you introduce new financial solutions or concepts, talk to me FIRST.
3. If your PR is more than 25 lines, talk to me FIRST.
4. If you used AI to write your PR, talk to me FIRST.
5. If you fix spelling or code comments, talk to me FIRST.
Wanna talk to me? Open a GitHub Issue, Discussion, or send me an email: james@firefly-iii.org
See also: https://docs.firefly-iii.org/explanation/support/#contributing-code
-->
@JC5
This PR fixes issue # (if relevant).
This PR fixes issue # <!-- mandatory field! -->.
Changes in this pull request:
@@ -41,7 +41,7 @@ jobs:
DDNOV="${DDNOV:1}"
echo "Firefly III version is ${{ steps.ff3version.outputs.release }}, without v is $FFNOV"
echo "Data importer version is ${{ steps.ff3version.outputs.release }}, without v is $FFNOV"
echo "Data importer version is ${{ steps.ff3version.outputs.release }}, without v is $DDNOV"
# user includes no debug info at all, and does not mention current version.
# user includes no debug info at all, but does mention current version
+7 -3
View File
@@ -10,7 +10,7 @@ on:
phpversion:
description: 'PHP version'
required: true
default: '8.4'
default: '8.5'
schedule:
- cron: '0 3 * * MON'
@@ -42,7 +42,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ github.event.inputs.phpversion }}
php-version: ${{ github.event.inputs.phpversion || '8.5' }}
extensions: mbstring, intl, zip, bcmath
- name: Switch and pull
run: |
@@ -170,10 +170,14 @@ jobs:
npm run prod --workspace=v1
npm run build --workspace=v2
npm update
- name: Setup Mago
uses: nhedger/setup-mago@v1
- name: Run CI
run: |
rm -rf vendor composer.lock
composer update --no-dev --no-scripts --no-plugins -q
composer update --no-scripts --no-plugins -q
mago format || true
# mago analyze --reporting-format=github || true
sudo chown -R runner:docker resources/lang
.ci/phpcs.sh || true
- name: Calculate variables
+10
View File
@@ -3,6 +3,16 @@
Over time, many people have contributed to Firefly III. Their efforts are not always visible, but always remembered and appreciated.
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
## 2026
- Cinnamon Pyro
- R1DEN
- RiDEN
- Khoa Nguyen
- Nick Huang
- mateuszkulapl
- Gianluca Martino
- embedded
## 2025
- Diego Algorta
- Jihad
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\AccountTypeEnum;
@@ -32,11 +31,11 @@ use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Debug\Timer;
use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Http\Api\AccountFilter;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/**
@@ -51,7 +50,7 @@ class AccountController extends Controller
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
/** @var array<int, string> */
private array $balanceTypes;
private array $balanceTypes;
private AccountRepositoryInterface $repository;
/**
@@ -60,16 +59,14 @@ class AccountController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
$this->balanceTypes = [AccountTypeEnum::ASSET->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value];
}
@@ -82,25 +79,17 @@ class AccountController extends Controller
*/
public function accounts(AutocompleteApiRequest $request): JsonResponse
{
Log::debug('Before All.');
[
'types' => $types,
'query' => $query,
'date' => $date,
'limit' => $limit,
]
= $request->attributes->all();
// Log::debug('Before All.');
['types' => $types, 'query' => $query, 'date' => $date, 'limit' => $limit] = $request->attributes->all();
$date ??= today(config('app.timezone'));
// set date to end-of-day for account balance. so it is at $date 23:59:59
$date->endOfDay();
$return = [];
$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);
$return = [];
$result = $this->repository->searchAccount((string) $query, $types, $limit);
$allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary);
/** @var Account $account */
foreach ($result as $account) {
@@ -118,17 +107,17 @@ class AccountController extends Controller
}
$return[] = [
'id' => (string)$account->id,
'id' => (string) $account->id,
'name' => $account->name,
'name_with_balance' => $nameWithBalance,
'active' => $account->active,
'type' => $account->accountType->type,
'currency_id' => (string)$useCurrency->id,
'currency_id' => (string) $useCurrency->id,
'currency_name' => $useCurrency->name,
'currency_code' => $useCurrency->code,
'currency_symbol' => $useCurrency->symbol,
'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_code' => $currency->code,
'account_currency_symbol' => $currency->symbol,
@@ -137,17 +126,13 @@ class AccountController extends Controller
}
// custom order.
usort(
$return,
static function (array $left, array $right): int {
$order = [AccountTypeEnum::ASSET->value, AccountTypeEnum::REVENUE->value, AccountTypeEnum::EXPENSE->value];
$posA = (int)array_search($left['type'], $order, true);
$posB = (int)array_search($right['type'], $order, true);
usort($return, static function (array $left, array $right): int {
$order = [AccountTypeEnum::ASSET->value, AccountTypeEnum::REVENUE->value, AccountTypeEnum::EXPENSE->value];
$posA = (int) array_search($left['type'], $order, true);
$posB = (int) array_search($right['type'], $order, true);
return $posA - $posB;
}
);
$timer->stop(sprintf('AC accounts "%s"', $query));
return $posA - $posB;
});
return response()->api($return);
}
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class BillController
@@ -46,16 +46,14 @@ class BillController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -65,13 +63,7 @@ class BillController extends Controller
public function bills(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchBill($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(
static fn (Bill $item): array => [
'id' => (string) $item->id,
'name' => $item->name,
'active' => $item->active,
]
);
$filtered = $result->map(static fn (Bill $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
return response()->api($filtered->toArray());
}
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class BudgetController
@@ -46,16 +46,14 @@ class BudgetController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -65,13 +63,7 @@ class BudgetController extends Controller
public function budgets(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchBudget($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(
static fn (Budget $item): array => [
'id' => (string) $item->id,
'name' => $item->name,
'active' => $item->active,
]
);
$filtered = $result->map(static fn (Budget $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
return response()->api($filtered->toArray());
}
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class CategoryController
@@ -46,16 +46,14 @@ class CategoryController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -65,12 +63,7 @@ class CategoryController extends Controller
public function categories(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchCategory($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(
static fn (Category $item): array => [
'id' => (string) $item->id,
'name' => $item->name,
]
);
$filtered = $result->map(static fn (Category $item): array => ['id' => (string) $item->id, 'name' => $item->name]);
return response()->api($filtered->toArray());
}
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use Deprecated;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
@@ -33,6 +32,7 @@ use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class CurrencyController
@@ -48,16 +48,14 @@ class CurrencyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(CurrencyRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(CurrencyRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\ObjectGroup;
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class ObjectGroupController
@@ -46,16 +46,14 @@ class ObjectGroupController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -69,11 +67,7 @@ class ObjectGroupController extends Controller
/** @var ObjectGroup $objectGroup */
foreach ($result as $objectGroup) {
$return[] = [
'id' => (string) $objectGroup->id,
'name' => $objectGroup->title,
'title' => $objectGroup->title,
];
$return[] = ['id' => (string) $objectGroup->id, 'name' => $objectGroup->title, 'title' => $objectGroup->title];
}
return response()->api($return);
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
@@ -34,13 +33,14 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Support\Facades\Amount;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class PiggyBankController
*/
class PiggyBankController extends Controller
{
private AccountRepositoryInterface $accountRepository;
private AccountRepositoryInterface $accountRepository;
private PiggyBankRepositoryInterface $piggyRepository;
protected array $acceptedRoles = [UserRoleEnum::READ_PIGGY_BANKS];
@@ -50,19 +50,17 @@ class PiggyBankController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->piggyRepository = app(PiggyBankRepositoryInterface::class);
$this->accountRepository = app(AccountRepositoryInterface::class);
$this->piggyRepository->setUser($this->user);
$this->piggyRepository->setUserGroup($this->userGroup);
$this->accountRepository->setUser($this->user);
$this->accountRepository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->piggyRepository = app(PiggyBankRepositoryInterface::class);
$this->accountRepository = app(AccountRepositoryInterface::class);
$this->piggyRepository->setUser($this->user);
$this->piggyRepository->setUserGroup($this->userGroup);
$this->accountRepository->setUser($this->user);
$this->accountRepository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
public function piggyBanks(AutocompleteApiRequest $request): JsonResponse
@@ -84,6 +82,7 @@ class PiggyBankController extends Controller
'currency_decimal_places' => $currency->decimal_places,
'object_group_id' => null === $objectGroup ? null : (string) $objectGroup->id,
'object_group_title' => $objectGroup?->title,
'object_group_order' => $objectGroup?->order,
];
}
@@ -108,7 +107,7 @@ class PiggyBankController extends Controller
'%s (%s / %s)',
$piggy->name,
Amount::formatAnything($currency, $currentAmount, false),
Amount::formatAnything($currency, $piggy->target_amount, false),
Amount::formatAnything($currency, $piggy->target_amount, false)
),
'currency_id' => (string) $currency->id,
'currency_name' => $currency->name,
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class RecurrenceController
@@ -46,16 +46,14 @@ class RecurrenceController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
public function recurring(AutocompleteApiRequest $request): JsonResponse
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class RuleController
@@ -38,7 +38,7 @@ use Illuminate\Http\JsonResponse;
class RuleController extends Controller
{
private RuleRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_RULES];
protected array $acceptedRoles = [UserRoleEnum::READ_RULES];
/**
* RuleController constructor.
@@ -46,16 +46,14 @@ class RuleController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(RuleRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(RuleRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
public function rules(AutocompleteApiRequest $request): JsonResponse
@@ -66,7 +64,7 @@ class RuleController extends Controller
/** @var Rule $rule */
foreach ($rules as $rule) {
$response[] = [
'id' => (string)$rule->id,
'id' => (string) $rule->id,
'name' => $rule->title,
'description' => $rule->description,
'active' => $rule->active,
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class RuleGroupController
@@ -46,16 +46,14 @@ class RuleGroupController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(RuleGroupRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(RuleGroupRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
public function ruleGroups(AutocompleteApiRequest $request): JsonResponse
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class TagController
@@ -46,16 +46,14 @@ class TagController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
public function tags(AutocompleteApiRequest $request): JsonResponse
@@ -65,11 +63,7 @@ class TagController extends Controller
/** @var Tag $tag */
foreach ($result as $tag) {
$array[] = [
'id' => (string) $tag->id,
'name' => $tag->tag,
'tag' => $tag->tag,
];
$array[] = ['id' => (string) $tag->id, 'name' => $tag->tag, 'tag' => $tag->tag];
}
return response()->api($array);
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteTransactionApiRequest;
@@ -34,6 +33,7 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
/**
@@ -43,7 +43,7 @@ class TransactionController extends Controller
{
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private TransactionGroupRepositoryInterface $groupRepository;
private JournalRepositoryInterface $repository;
private JournalRepositoryInterface $repository;
/**
* TransactionController constructor.
@@ -51,19 +51,17 @@ class TransactionController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(JournalRepositoryInterface::class);
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->groupRepository->setUser($this->user);
$this->groupRepository->setUserGroup($this->userGroup);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(JournalRepositoryInterface::class);
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
$this->repository->setUser($this->user);
$this->repository->setUserGroup($this->userGroup);
$this->groupRepository->setUser($this->user);
$this->groupRepository->setUserGroup($this->userGroup);
return $next($request);
}
);
return $next($request);
});
}
public function transactions(AutocompleteTransactionApiRequest $request): JsonResponse
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteApiRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class TransactionTypeController
@@ -46,14 +46,12 @@ class TransactionTypeController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(TransactionTypeRepositoryInterface::class);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(TransactionTypeRepositoryInterface::class);
return $next($request);
}
);
return $next($request);
});
}
public function transactionTypes(AutocompleteApiRequest $request): JsonResponse
@@ -64,11 +62,7 @@ class TransactionTypeController extends Controller
/** @var TransactionType $type */
foreach ($types as $type) {
// different key for consistency.
$array[] = [
'id' => (string) $type->id,
'name' => $type->type,
'type' => $type->type,
];
$array[] = ['id' => (string) $type->id, 'name' => $type->type, 'type' => $type->type];
}
return response()->api($array);
@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
use FireflyIII\Enums\UserRoleEnum;
@@ -49,9 +50,9 @@ class AccountController extends Controller
use CleansChartData;
use CollectsAccountsFromFilter;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private array $chartData = [];
private array $chartData = [];
private AccountRepositoryInterface $repository;
/**
@@ -60,16 +61,14 @@ class AccountController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->validateUserGroup($request);
$this->repository->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
$this->middleware(function (Request $request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->validateUserGroup($request);
$this->repository->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -115,14 +114,14 @@ class AccountController extends Controller
'label' => $account->name,
// the currency that belongs to the account.
'currency_id' => (string)$currency->id,
'currency_id' => (string) $currency->id,
'currency_name' => $currency->name,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
// the primary currency
'primary_currency_id' => (string)$this->primaryCurrency->id,
'primary_currency_id' => (string) $this->primaryCurrency->id,
// the default currency of the user (could be the same!)
'date' => $params['start']->toAtomString(),
@@ -136,7 +135,7 @@ class AccountController extends Controller
];
if ($this->convertToPrimary) {
$currentSet['pc_entries'] = [];
$currentSet['primary_currency_id'] = (string)$this->primaryCurrency->id;
$currentSet['primary_currency_id'] = (string) $this->primaryCurrency->id;
$currentSet['primary_currency_code'] = $this->primaryCurrency->code;
$currentSet['primary_currency_symbol'] = $this->primaryCurrency->symbol;
$currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places;
@@ -144,23 +143,29 @@ class AccountController extends Controller
}
// create array of values to collect.
$rangeDates = array_map(static fn (string $d): Carbon => Carbon::createFromFormat('Y-m-d', $d)->startOfDay(), array_keys($range));
$rangeVals = array_values($range);
$rangeIdx = 0;
$rangeCount = count($rangeDates);
while ($currentStart <= $params['end']) {
$format = $currentStart->format('Y-m-d');
$label = $currentStart->toAtomString();
$balance = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous;
$previous = $balance;
$currentSet['entries'][$label] = $balance;
// do the same for the primary currency balance, if relevant:
$pcBalance = null;
if ($this->convertToPrimary) {
$pcBalance = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious;
$pcPrevious = $pcBalance;
$currentSet['pc_entries'][$label] = $pcBalance;
// Advance through all range entries up to current chart date
while ($rangeIdx < $rangeCount && $rangeDates[$rangeIdx] <= $currentStart) {
$previous = $rangeVals[$rangeIdx]['balance'];
if ($this->convertToPrimary) {
$pcPrevious = $rangeVals[$rangeIdx]['pc_balance'];
}
++$rangeIdx;
}
$currentSet['entries'][$label] = $previous;
if ($this->convertToPrimary) {
$currentSet['pc_entries'][$label] = $pcPrevious;
}
$currentStart = Navigation::addPeriod($currentStart, $period);
// $currentStart->addDay();
}
$this->chartData[] = $currentSet;
}
@@ -1,6 +1,5 @@
<?php
/*
* BalanceController.php
* Copyright (c) 2025 james@firefly-iii.org
@@ -25,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
use FireflyIII\Enums\TransactionTypeEnum;
@@ -37,6 +35,7 @@ use FireflyIII\Support\Http\Api\AccountBalanceGrouped;
use FireflyIII\Support\Http\Api\CleansChartData;
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class BalanceController
@@ -45,10 +44,11 @@ class BalanceController extends Controller
{
use CleansChartData;
use CollectsAccountsFromFilter;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private array $chartData = [];
private GroupCollectorInterface $collector;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private array $chartData = [];
private GroupCollectorInterface $collector;
private AccountRepositoryInterface $repository;
// private TransactionCurrency $default;
@@ -56,19 +56,17 @@ class BalanceController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class);
$this->collector = app(GroupCollectorInterface::class);
$this->repository->setUserGroup($this->userGroup);
$this->collector->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
$this->collector->setUser($this->user);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class);
$this->collector = app(GroupCollectorInterface::class);
$this->repository->setUserGroup($this->userGroup);
$this->collector->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
$this->collector->setUser($this->user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -89,10 +87,16 @@ class BalanceController extends Controller
// get journals for entire period:
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
$this->collector
->setRange($queryParameters['start'], $queryParameters['end'])
->withAccountInformation()
->setXorAccounts($accounts)
->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::RECONCILIATION->value, TransactionTypeEnum::TRANSFER->value])
->setTypes([
TransactionTypeEnum::WITHDRAWAL->value,
TransactionTypeEnum::DEPOSIT->value,
TransactionTypeEnum::RECONCILIATION->value,
TransactionTypeEnum::TRANSFER->value,
])
;
$journals = $this->collector->getExtractedJournals();
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use Illuminate\Http\Request;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
@@ -36,13 +35,14 @@ use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Facades\Steam;
use FireflyIII\Support\Http\Api\CleansChartData;
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use FireflyIII\Support\Facades\Steam;
/**
* Class BudgetController
@@ -52,32 +52,30 @@ class BudgetController extends Controller
use CleansChartData;
use ValidatesUserGroupTrait;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
protected OperationsRepositoryInterface $opsRepository;
private BudgetLimitRepositoryInterface $blRepository;
private array $currencies = [];
private BudgetRepositoryInterface $repository;
private BudgetLimitRepositoryInterface $blRepository;
private array $currencies = [];
private BudgetRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository->setUserGroup($this->userGroup);
$this->opsRepository->setUserGroup($this->userGroup);
$this->blRepository->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
$this->opsRepository->setUser($this->user);
$this->blRepository->setUser($this->user);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository->setUserGroup($this->userGroup);
$this->opsRepository->setUserGroup($this->userGroup);
$this->blRepository->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
$this->opsRepository->setUser($this->user);
$this->blRepository->setUser($this->user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -106,6 +104,48 @@ class BudgetController extends Controller
return response()->json($this->clean($data));
}
private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit
{
$amount = '0';
$limit = null;
$converter = new ExchangeRateConverter();
/** @var BudgetLimit $current */
foreach ($limits as $current) {
if ($this->convertToPrimary) {
if ($current->transaction_currency_id === $this->primaryCurrency->id) {
// simply add it.
$amount = bcadd($amount, (string) $current->amount);
Log::debug(sprintf('Set amount in limit to %s', $amount));
}
if ($current->transaction_currency_id !== $this->primaryCurrency->id) {
// convert and then add it.
$converted = $converter->convert($current->transactionCurrency, $this->primaryCurrency, $current->start_date, $current->amount);
$amount = bcadd($amount, $converted);
Log::debug(sprintf(
'Budgeted in limit #%d: %s %s, converted to %s %s',
$current->id,
$current->transactionCurrency->code,
$current->amount,
$this->primaryCurrency->code,
$converted
));
Log::debug(sprintf('Set amount in limit to %s', $amount));
}
}
if ($current->transaction_currency_id === $currencyId) {
$limit = $current;
}
}
if (null !== $limit && $this->convertToPrimary) {
// convert and add all amounts.
$limit->amount = Steam::positive($amount);
Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount));
}
return $limit;
}
/**
* @throws FireflyException
*/
@@ -158,18 +198,17 @@ class BudgetController extends Controller
$rows[] = $row;
}
// is always an array
$return = [];
foreach ($rows as $row) {
$current = [
'label' => $budget->name,
'currency_id' => (string)$row['currency_id'],
'currency_id' => (string) $row['currency_id'],
'currency_name' => $row['currency_name'],
'currency_code' => $row['currency_code'],
'currency_decimal_places' => $row['currency_decimal_places'],
'primary_currency_id' => (string)$this->primaryCurrency->id,
'primary_currency_id' => (string) $this->primaryCurrency->id,
'primary_currency_name' => $this->primaryCurrency->name,
'primary_currency_code' => $this->primaryCurrency->code,
'primary_currency_symbol' => $this->primaryCurrency->symbol,
@@ -181,12 +220,7 @@ class BudgetController extends Controller
'end_date' => $row['end'],
'yAxisID' => 0,
'type' => 'bar',
'entries' => [
'budgeted' => $row['budgeted'],
'spent' => $row['spent'],
'left' => $row['left'],
'overspent' => $row['overspent'],
],
'entries' => ['budgeted' => $row['budgeted'], 'spent' => $row['spent'], 'left' => $row['left'], 'overspent' => $row['overspent']],
'pc_entries' => [
'budgeted' => $row['pc_budgeted'],
'spent' => $row['pc_spent'],
@@ -233,11 +267,11 @@ class BudgetController extends Controller
foreach ($spent as $currencyId => $block) {
$this->currencies[$currencyId] ??= Amount::getTransactionCurrencyById($currencyId);
$return[$currencyId] ??= [
'currency_id' => (string)$currencyId,
'currency_id' => (string) $currencyId,
'currency_code' => $block['currency_code'],
'currency_name' => $block['currency_name'],
'currency_symbol' => $block['currency_symbol'],
'currency_decimal_places' => (int)$block['currency_decimal_places'],
'currency_decimal_places' => (int) $block['currency_decimal_places'],
'start' => $start->toAtomString(),
'end' => $end->toAtomString(),
'budgeted' => '0',
@@ -251,46 +285,11 @@ class BudgetController extends Controller
/** @var array $journal */
foreach ($currentBudgetArray['transaction_journals'] as $journal) {
/** @var numeric-string $amount */
$amount = (string)$journal['amount'];
$amount = (string) $journal['amount'];
$return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], $amount);
}
}
return $return;
}
private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit
{
$amount = '0';
$limit = null;
$converter = new ExchangeRateConverter();
/** @var BudgetLimit $current */
foreach ($limits as $current) {
if ($this->convertToPrimary) {
if ($current->transaction_currency_id === $this->primaryCurrency->id) {
// simply add it.
$amount = bcadd($amount, (string)$current->amount);
Log::debug(sprintf('Set amount in limit to %s', $amount));
}
if ($current->transaction_currency_id !== $this->primaryCurrency->id) {
// convert and then add it.
$converted = $converter->convert($current->transactionCurrency, $this->primaryCurrency, $current->start_date, $current->amount);
$amount = bcadd($amount, $converted);
Log::debug(sprintf('Budgeted in limit #%d: %s %s, converted to %s %s', $current->id, $current->transactionCurrency->code, $current->amount, $this->primaryCurrency->code, $converted));
Log::debug(sprintf('Set amount in limit to %s', $amount));
}
}
if ($current->transaction_currency_id === $currencyId) {
$limit = $current;
}
}
if (null !== $limit && $this->convertToPrimary) {
// convert and add all amounts.
$limit->amount = Steam::positive($amount);
Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount));
}
return $limit;
}
}
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use Illuminate\Http\Request;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
@@ -40,6 +39,7 @@ use FireflyIII\Support\Http\Api\CleansChartData;
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/**
@@ -52,25 +52,23 @@ class CategoryController extends Controller
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
private AccountRepositoryInterface $accountRepos;
private AccountRepositoryInterface $accountRepos;
private CurrencyRepositoryInterface $currencyRepos;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->accountRepos = app(AccountRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
$this->accountRepos->setUserGroup($this->userGroup);
$this->currencyRepos->setUserGroup($this->userGroup);
$this->accountRepos->setUser($this->user);
$this->currencyRepos->setUser($this->user);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->accountRepos = app(AccountRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
$this->accountRepos->setUserGroup($this->userGroup);
$this->currencyRepos->setUserGroup($this->userGroup);
$this->accountRepos->setUser($this->user);
$this->currencyRepos->setUser($this->user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -88,7 +86,12 @@ class CategoryController extends Controller
/** @var Carbon $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 = [];
$return = [];
$converter = new ExchangeRateConverter();
@@ -104,7 +107,7 @@ class CategoryController extends Controller
/** @var array $journal */
foreach ($journals as $journal) {
// find journal:
$journalCurrencyId = (int)$journal['currency_id'];
$journalCurrencyId = (int) $journal['currency_id'];
$type = $journal['transaction_type_type'];
$currency = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId);
$currencies[$journalCurrencyId] = $currency;
@@ -113,7 +116,7 @@ class CategoryController extends Controller
$currencyCode = $currency->code;
$currencySymbol = $currency->symbol;
$currencyDecimalPlaces = $currency->decimal_places;
$amount = Steam::positive((string)$journal['amount']);
$amount = Steam::positive((string) $journal['amount']);
$pcAmount = null;
// overrule if necessary:
@@ -130,18 +133,17 @@ class CategoryController extends Controller
Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $pcAmount));
}
$categoryName = $journal['category_name'] ?? (string)trans('firefly.no_category');
$categoryName = $journal['category_name'] ?? (string) trans('firefly.no_category');
$key = sprintf('%s-%s', $categoryName, $currencyCode);
// create arrays
$return[$key] ??= [
'label' => $categoryName,
'currency_id' => (string)$currencyId,
'currency_id' => (string) $currencyId,
'currency_name' => $currencyName,
'currency_code' => $currencyCode,
'currency_symbol' => $currencySymbol,
'currency_decimal_places' => $currencyDecimalPlaces,
'primary_currency_id' => (string)$this->primaryCurrency->id,
'primary_currency_id' => (string) $this->primaryCurrency->id,
'primary_currency_name' => $this->primaryCurrency->name,
'primary_currency_code' => $this->primaryCurrency->code,
'primary_currency_symbol' => $this->primaryCurrency->symbol,
@@ -151,14 +153,8 @@ class CategoryController extends Controller
'end_date' => $end->toAtomString(),
'yAxisID' => 0,
'type' => 'bar',
'entries' => [
'spent' => '0',
'earned' => '0',
],
'pc_entries' => [
'spent' => '0',
'earned' => '0',
],
'entries' => ['spent' => '0', 'earned' => '0'],
'pc_entries' => ['spent' => '0', 'earned' => '0'],
];
// add monies
@@ -182,7 +178,10 @@ class CategoryController extends Controller
$return = array_values($return);
// order by amount
usort($return, static fn (array $a, array $b): int => ((float)$a['entries']['spent'] + (float)$a['entries']['earned']) < ((float)$b['entries']['spent'] + (float)$b['entries']['earned']) ? 1 : -1);
usort($return, static fn (array $a, array $b): int => ((float) $a['entries']['spent'] + (float) $a['entries']['earned'])
< ((float) $b['entries']['spent'] + (float) $b['entries']['earned'])
? 1
: -1);
return response()->json($this->clean($return));
}
+93 -93
View File
@@ -24,9 +24,9 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use Deprecated;
use Carbon\Carbon;
use Carbon\Exceptions\InvalidFormatException;
use Deprecated;
use FireflyIII\Exceptions\BadHttpHeaderException;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Support\Facades\Amount;
@@ -63,15 +63,16 @@ abstract class Controller extends BaseController
use ValidatesRequests;
use ValidatesUserGroupTrait;
protected const string CONTENT_TYPE = 'application/vnd.api+json';
protected const string JSON_CONTENT_TYPE = 'application/json';
protected array $accepts = ['application/json', 'application/vnd.api+json'];
protected const string CONTENT_TYPE = 'application/vnd.api+json';
protected const string JSON_CONTENT_TYPE = 'application/json';
protected bool $convertToPrimary = false;
protected array $accepts = ['application/json', 'application/vnd.api+json'];
protected bool $convertToPrimary = false;
protected TransactionCurrency $primaryCurrency;
/** @deprecated use Request classes */
protected ParameterBag $parameters;
protected ParameterBag $parameters;
/**
* Controller constructor.
@@ -79,96 +80,22 @@ abstract class Controller extends BaseController
public function __construct()
{
// get global parameters
$this->middleware(
function ($request, $next) {
$this->parameters = $this->getParameters();
if (auth()->check()) {
$language = Steam::getLanguage();
$this->convertToPrimary = Amount::convertToPrimary();
$this->primaryCurrency = Amount::getPrimaryCurrency();
app()->setLocale($language);
}
// filter down what this endpoint accepts.
if (!$request->accepts($this->accepts)) {
throw new BadHttpHeaderException(sprintf('Sorry, Accept header "%s" is not something this endpoint can provide.', $request->header('Accept')));
}
return $next($request);
$this->middleware(function ($request, $next) {
$this->parameters = $this->getParameters();
if (auth()->check()) {
$language = Steam::getLanguage();
$this->convertToPrimary = Amount::convertToPrimary();
$this->primaryCurrency = Amount::getPrimaryCurrency();
app()->setLocale($language);
}
);
}
#[Deprecated(message: <<<'TXT'
use Request classes
Method to grab all parameters from the URL
TXT)]
private function getParameters(): ParameterBag
{
$bag = new ParameterBag();
$page = (int)request()->get('page');
$page = min(max(1, $page), 2 ** 16);
$bag->set('page', $page);
// filter down what this endpoint accepts.
if (!$request->accepts($this->accepts)) {
throw new BadHttpHeaderException(sprintf('Sorry, Accept header "%s" is not something this endpoint can provide.', $request->header('Accept')));
}
// some date fields:
$dates = ['start', 'end', 'date'];
foreach ($dates as $field) {
$date = null;
try {
$date = request()->query->get($field);
} catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
}
$obj = null;
if (null !== $date) {
try {
$obj = Carbon::parse((string)$date, config('app.timezone'));
} catch (InvalidFormatException $e) {
// don't care
Log::warning(sprintf('Ignored invalid date "%s" in API controller parameter check: %s', substr((string)$date, 0, 20), $e->getMessage()));
}
}
if ($obj instanceof Carbon) {
$bag->set($field, $obj);
}
}
// integer fields:
$integers = ['limit'];
foreach ($integers as $integer) {
try {
$value = request()->query->get($integer);
} catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer));
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
$value = null;
}
if (null !== $value) {
$value = (int)$value;
$value = min(max(1, $value), 2 ** 16);
$bag->set($integer, $value);
}
if (null === $value
&& 'limit' === $integer // @phpstan-ignore-line
&& auth()->check()) {
// set default for user:
/** @var User $user */
$user = auth()->user();
$pageSize = (int)Preferences::getForUser($user, 'listPageSize', 50)->data;
$bag->set($integer, $pageSize);
}
}
// sort fields:
return $bag;
// return $this->getSortParameters($bag);
return $next($request);
});
}
/**
@@ -241,4 +168,77 @@ abstract class Controller extends BaseController
return $manager->createData($resource)->toArray();
}
#[Deprecated(message: <<<'TXT'
use Request classes
Method to grab all parameters from the URL
TXT)]
private function getParameters(): ParameterBag
{
$bag = new ParameterBag();
$page = (int) request()->get('page');
$page = min(max(1, $page), 2 ** 16);
$bag->set('page', $page);
// some date fields:
$dates = ['start', 'end', 'date'];
foreach ($dates as $field) {
$date = null;
try {
$date = request()->query->get($field);
} catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
}
$obj = null;
if (null !== $date) {
try {
$obj = Carbon::parse((string) $date, config('app.timezone'));
} catch (InvalidFormatException $e) {
// don't care
Log::warning(sprintf('Ignored invalid date "%s" in API controller parameter check: %s', substr((string) $date, 0, 20), $e->getMessage()));
}
}
if ($obj instanceof Carbon) {
$bag->set($field, $obj);
}
}
// integer fields:
$integers = ['limit'];
foreach ($integers as $integer) {
try {
$value = request()->query->get($integer);
} catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer));
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
$value = null;
}
if (null !== $value) {
$value = (int) $value;
$value = min(max(1, $value), 2 ** 16);
$bag->set($integer, $value);
}
if (
null === $value
&& 'limit' === $integer // @phpstan-ignore-line
&& auth()->check()
) {
// set default for user:
/** @var User $user */
$user = auth()->user();
$pageSize = (int) Preferences::getForUser($user, 'listPageSize', 50)->data;
$bag->set($integer, $pageSize);
}
}
// sort fields:
return $bag;
// return $this->getSortParameters($bag);
}
}
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data\Bulk;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\Bulk\TransactionRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class TransactionController
@@ -51,16 +51,14 @@ class TransactionController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUserGroup($this->userGroup);
$this->repository->setUser($this->user);
return $next($request);
}
);
return $next($request);
});
}
public function update(TransactionRequest $request): JsonResponse
+103 -75
View File
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\DestroyRequest;
use FireflyIII\Enums\AccountTypeEnum;
@@ -49,6 +48,7 @@ use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
use FireflyIII\Services\Internal\Destroy\JournalDestroyService;
use FireflyIII\Support\Facades\Preferences;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/**
@@ -63,13 +63,11 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
return $next($request);
}
);
return $next($request);
});
}
public function destroy(DestroyRequest $request): JsonResponse
@@ -77,10 +75,40 @@ class DestroyController extends Controller
$objects = $request->getObjects();
$this->unused = $request->boolean('unused');
$allExceptAssets = [AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::REVENUE->value];
$all = [AccountTypeEnum::ASSET->value, AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::RECONCILIATION->value];
$allExceptAssets = [
AccountTypeEnum::BENEFICIARY->value,
AccountTypeEnum::CASH->value,
AccountTypeEnum::CREDITCARD->value,
AccountTypeEnum::DEFAULT->value,
AccountTypeEnum::EXPENSE->value,
AccountTypeEnum::IMPORT->value,
AccountTypeEnum::INITIAL_BALANCE->value,
AccountTypeEnum::LIABILITY_CREDIT->value,
AccountTypeEnum::RECONCILIATION->value,
AccountTypeEnum::REVENUE->value,
];
$all = [
AccountTypeEnum::ASSET->value,
AccountTypeEnum::BENEFICIARY->value,
AccountTypeEnum::CASH->value,
AccountTypeEnum::CREDITCARD->value,
AccountTypeEnum::DEBT->value,
AccountTypeEnum::DEFAULT->value,
AccountTypeEnum::EXPENSE->value,
AccountTypeEnum::IMPORT->value,
AccountTypeEnum::INITIAL_BALANCE->value,
AccountTypeEnum::LIABILITY_CREDIT->value,
AccountTypeEnum::LOAN->value,
AccountTypeEnum::MORTGAGE->value,
AccountTypeEnum::RECONCILIATION->value,
];
$liabilities = [AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::CREDITCARD->value];
$transactions = [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value, TransactionTypeEnum::RECONCILIATION->value];
$transactions = [
TransactionTypeEnum::WITHDRAWAL->value,
TransactionTypeEnum::DEPOSIT->value,
TransactionTypeEnum::TRANSFER->value,
TransactionTypeEnum::RECONCILIATION->value,
];
match ($objects) {
'budgets' => $this->destroyBudgets(),
@@ -101,7 +129,7 @@ class DestroyController extends Controller
'withdrawals' => $this->destroyTransactions([TransactionTypeEnum::WITHDRAWAL->value]),
'deposits' => $this->destroyTransactions([TransactionTypeEnum::DEPOSIT->value]),
'transfers' => $this->destroyTransactions([TransactionTypeEnum::TRANSFER->value]),
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))
};
Preferences::mark();
@@ -109,70 +137,6 @@ class DestroyController extends Controller
return response()->json([], 204);
}
private function destroyBudgets(): void
{
/** @var AvailableBudgetRepositoryInterface $abRepository */
$abRepository = app(AvailableBudgetRepositoryInterface::class);
$abRepository->destroyAll();
/** @var BudgetLimitRepositoryInterface $blRepository */
$blRepository = app(BudgetLimitRepositoryInterface::class);
$blRepository->destroyAll();
/** @var BudgetRepositoryInterface $budgetRepository */
$budgetRepository = app(BudgetRepositoryInterface::class);
$budgetRepository->destroyAll();
}
private function destroyBills(): void
{
/** @var BillRepositoryInterface $repository */
$repository = app(BillRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyPiggyBanks(): void
{
/** @var PiggyBankRepositoryInterface $repository */
$repository = app(PiggyBankRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyRules(): void
{
/** @var RuleGroupRepositoryInterface $repository */
$repository = app(RuleGroupRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyRecurringTransactions(): void
{
/** @var RecurringRepositoryInterface $repository */
$repository = app(RecurringRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyCategories(): void
{
/** @var CategoryRepositoryInterface $categoryRepos */
$categoryRepos = app(CategoryRepositoryInterface::class);
$categoryRepos->destroyAll();
}
private function destroyTags(): void
{
/** @var TagRepositoryInterface $tagRepository */
$tagRepository = app(TagRepositoryInterface::class);
$tagRepository->destroyAll();
}
private function destroyObjectGroups(): void
{
/** @var ObjectGroupRepositoryInterface $repository */
$repository = app(ObjectGroupRepositoryInterface::class);
$repository->deleteAll();
}
/**
* @param array<int, string> $types
*/
@@ -201,6 +165,70 @@ class DestroyController extends Controller
}
}
private function destroyBills(): void
{
/** @var BillRepositoryInterface $repository */
$repository = app(BillRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyBudgets(): void
{
/** @var AvailableBudgetRepositoryInterface $abRepository */
$abRepository = app(AvailableBudgetRepositoryInterface::class);
$abRepository->destroyAll();
/** @var BudgetLimitRepositoryInterface $blRepository */
$blRepository = app(BudgetLimitRepositoryInterface::class);
$blRepository->destroyAll();
/** @var BudgetRepositoryInterface $budgetRepository */
$budgetRepository = app(BudgetRepositoryInterface::class);
$budgetRepository->destroyAll();
}
private function destroyCategories(): void
{
/** @var CategoryRepositoryInterface $categoryRepos */
$categoryRepos = app(CategoryRepositoryInterface::class);
$categoryRepos->destroyAll();
}
private function destroyObjectGroups(): void
{
/** @var ObjectGroupRepositoryInterface $repository */
$repository = app(ObjectGroupRepositoryInterface::class);
$repository->deleteAll();
}
private function destroyPiggyBanks(): void
{
/** @var PiggyBankRepositoryInterface $repository */
$repository = app(PiggyBankRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyRecurringTransactions(): void
{
/** @var RecurringRepositoryInterface $repository */
$repository = app(RecurringRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyRules(): void
{
/** @var RuleGroupRepositoryInterface $repository */
$repository = app(RuleGroupRepositoryInterface::class);
$repository->destroyAll();
}
private function destroyTags(): void
{
/** @var TagRepositoryInterface $tagRepository */
$tagRepository = app(TagRepositoryInterface::class);
$tagRepository->destroyAll();
}
/**
* @param array<int, string> $types
*/
@@ -24,12 +24,12 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data\Export;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Support\Export\ExportDataGenerator;
use Illuminate\Http\Request;
use Illuminate\Http\Response as LaravelResponse;
use Safe\Exceptions\DatetimeException;
@@ -49,16 +49,14 @@ class ExportController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->exporter = app(ExportDataGenerator::class);
$this->exporter->setUserGroup($this->userGroup);
$this->exporter->setUser($this->user);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
$this->exporter = app(ExportDataGenerator::class);
$this->exporter->setUserGroup($this->userGroup);
$this->exporter->setUser($this->user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -74,33 +72,6 @@ class ExportController extends Controller
return $this->returnExport('accounts');
}
/**
* @throws FireflyException
* @throws DatetimeException
*/
private function returnExport(string $key): LaravelResponse
{
$date = date('Y-m-d-H-i-s');
$fileName = sprintf('%s-export-%s.csv', $date, $key);
$data = $this->exporter->export();
/** @var LaravelResponse $response */
$response = response($data[$key]);
$response
->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream')
->header('Content-Disposition', 'attachment; filename='.$fileName)
->header('Content-Transfer-Encoding', 'binary')
->header('Connection', 'Keep-Alive')
->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public')
->header('Content-Length', (string) strlen((string) $data[$key]))
;
return $response;
}
/**
* @throws DatetimeException
* @throws FireflyException
@@ -206,4 +177,31 @@ class ExportController extends Controller
return $this->returnExport('transactions');
}
/**
* @throws FireflyException
* @throws DatetimeException
*/
private function returnExport(string $key): LaravelResponse
{
$date = date('Y-m-d-H-i-s');
$fileName = sprintf('%s-export-%s.csv', $date, $key);
$data = $this->exporter->export();
/** @var LaravelResponse $response */
$response = response($data[$key]);
$response
->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream')
->header('Content-Disposition', 'attachment; filename='.$fileName)
->header('Content-Transfer-Encoding', 'binary')
->header('Connection', 'Keep-Alive')
->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public')
->header('Content-Length', (string) strlen((string) $data[$key]))
;
return $response;
}
}
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Account;
@@ -40,6 +39,7 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class PurgeController
@@ -51,13 +51,11 @@ class PurgeController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->validateUserGroup($request);
$this->middleware(function (Request $request, $next) {
$this->validateUserGroup($request);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -42,7 +42,7 @@ class AccountController extends Controller
use ApiSupport;
private OperationsRepositoryInterface $opsRepository;
private AccountRepositoryInterface $repository;
private AccountRepositoryInterface $repository;
/**
* AccountController constructor.
@@ -50,18 +50,16 @@ class AccountController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
$user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function asset(GenericRequest $request): JsonResponse
@@ -46,15 +46,13 @@ class BillController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$user = auth()->user();
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
$user = auth()->user();
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -97,7 +95,14 @@ class BillController extends Controller
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
$field = 'foreign_amount';
}
Log::debug(sprintf('Journal #%d in bill #%d will use %s (%s %s)', $journal['transaction_group_id'], $billId, $field, $currencyCode, $journal[$field] ?? '0'));
Log::debug(sprintf(
'Journal #%d in bill #%d will use %s (%s %s)',
$journal['transaction_group_id'],
$billId,
$field,
$currencyCode,
$journal[$field] ?? '0'
));
$key = sprintf('%d-%d', $billId, $currencyId);
@@ -38,9 +38,9 @@ use Illuminate\Support\Collection;
*/
class BudgetController extends Controller
{
private NoBudgetRepositoryInterface $noRepository;
private NoBudgetRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
private BudgetRepositoryInterface $repository;
private BudgetRepositoryInterface $repository;
/**
* AccountController constructor.
@@ -48,19 +48,17 @@ class BudgetController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(BudgetRepositoryInterface::class);
$this->noRepository = app(NoBudgetRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
$this->middleware(function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(BudgetRepositoryInterface::class);
$this->noRepository = app(NoBudgetRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function budget(GenericRequest $request): JsonResponse
@@ -40,7 +40,7 @@ class CategoryController extends Controller
{
private NoCategoryRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
private CategoryRepositoryInterface $repository;
private CategoryRepositoryInterface $repository;
/**
* AccountController constructor.
@@ -48,19 +48,17 @@ class CategoryController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(CategoryRepositoryInterface::class);
$this->noRepository = app(NoCategoryRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
$this->middleware(function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(CategoryRepositoryInterface::class);
$this->noRepository = app(NoCategoryRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function category(GenericRequest $request): JsonResponse
@@ -73,7 +73,6 @@ class PeriodController extends Controller
$amount = $journal['amount'];
}
$response[$currencyId] ??= [
'difference' => '0',
'difference_float' => 0,
@@ -46,14 +46,12 @@ class TagController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -42,7 +42,7 @@ class AccountController extends Controller
use ApiSupport;
private OperationsRepositoryInterface $opsRepository;
private AccountRepositoryInterface $repository;
private AccountRepositoryInterface $repository;
/**
* AccountController constructor.
@@ -50,18 +50,16 @@ class AccountController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
$user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function asset(GenericRequest $request): JsonResponse
@@ -40,7 +40,7 @@ class CategoryController extends Controller
{
private NoCategoryRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
private CategoryRepositoryInterface $repository;
private CategoryRepositoryInterface $repository;
/**
* AccountController constructor.
@@ -48,19 +48,17 @@ class CategoryController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(CategoryRepositoryInterface::class);
$this->noRepository = app(NoCategoryRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
$this->middleware(function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(CategoryRepositoryInterface::class);
$this->noRepository = app(NoCategoryRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function category(GenericRequest $request): JsonResponse
@@ -46,15 +46,13 @@ class TagController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$user = auth()->user();
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
$user = auth()->user();
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -100,7 +98,6 @@ class TagController extends Controller
];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
}
return response()->json(array_values($response));
@@ -161,7 +158,10 @@ class TagController extends Controller
'currency_id' => (string) $foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'],
];
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], Steam::positive($journal['foreign_amount']));
$response[$foreignKey]['difference'] = bcadd(
(string) $response[$foreignKey]['difference'],
Steam::positive($journal['foreign_amount'])
);
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
}
}
@@ -45,15 +45,13 @@ class AccountController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$user = auth()->user();
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user);
$this->middleware(function ($request, $next) {
$user = auth()->user();
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function asset(GenericRequest $request): JsonResponse
@@ -40,7 +40,7 @@ class CategoryController extends Controller
{
private NoCategoryRepositoryInterface $noRepository;
private OperationsRepositoryInterface $opsRepository;
private CategoryRepositoryInterface $repository;
private CategoryRepositoryInterface $repository;
/**
* AccountController constructor.
@@ -48,19 +48,17 @@ class CategoryController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(CategoryRepositoryInterface::class);
$this->noRepository = app(NoCategoryRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
$this->middleware(function ($request, $next) {
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository = app(CategoryRepositoryInterface::class);
$this->noRepository = app(NoCategoryRepositoryInterface::class);
$user = auth()->user();
$this->opsRepository->setUser($user);
$this->repository->setUser($user);
$this->noRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function category(GenericRequest $request): JsonResponse
@@ -74,7 +74,6 @@ class PeriodController extends Controller
];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
}
return response()->json(array_values($response));
@@ -46,15 +46,13 @@ class TagController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$user = auth()->user();
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
$user = auth()->user();
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
public function noTag(GenericRequest $request): JsonResponse
@@ -66,7 +64,6 @@ class TagController extends Controller
$convertToPrimary = Amount::convertToPrimary();
$primary = Amount::getPrimaryCurrency();
// collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
@@ -98,7 +95,6 @@ class TagController extends Controller
];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
}
return response()->json(array_values($response));
@@ -45,14 +45,12 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Account;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Generic\PaginationDateRangeRequest;
use FireflyIII\Api\V1\Requests\Models\Transaction\ListRequest;
use FireflyIII\Api\V1\Requests\PaginationRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account;
@@ -60,37 +60,31 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
public function attachments(PaginationRequest $request, Account $account): JsonResponse
{
$manager = $this->getManager();
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
$collection = $this->repository->getAttachments($account);
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$collection = $this->repository->getAttachments($account);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -99,35 +93,31 @@ class ListController extends Controller
public function piggyBanks(PaginationRequest $request, Account $account): JsonResponse
{
// create some objects:
$manager = $this->getManager();
$manager = $this->getManager();
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
// get list of piggy banks. Count it and split it.
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice($offset, $limit);
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice($offset, $limit);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new PiggyBankEnrichment();
$admin = auth()->user();
$enrichment = new PiggyBankEnrichment();
$enrichment->setUser($admin);
$piggyBanks = $enrichment->enrich($piggyBanks);
$piggyBanks = $enrichment->enrich($piggyBanks);
// make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer = app(PiggyBankTransformer::class);
// $transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -136,14 +126,14 @@ class ListController extends Controller
/**
* Show all transaction groups related to the account.
*/
public function transactions(PaginationDateRangeRequest $request, Account $account): JsonResponse
public function transactions(ListRequest $request, Account $account): JsonResponse
{
[
'limit' => $limit,
'page' => $page,
'start' => $start,
'end' => $end,
'types' => $types,
'limit' => $limit,
'page' => $page,
'start' => $start,
'end' => $end,
'types' => $types,
] = $request->attributes->all();
$manager = $this->getManager();
@@ -55,14 +55,12 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -80,8 +78,7 @@ class ShowController extends Controller
'start' => $start,
'end' => $end,
'date' => $date,
]
= $request->attributes->all();
] = $request->attributes->all();
// get list of accounts. Count it and split it.
$this->repository->resetAccountOrder();
$collection = $this->repository->getAccountsByType($types, $sort);
@@ -127,25 +124,22 @@ class ShowController extends Controller
// get list of accounts. Count it and split it.
$this->repository->resetAccountOrder();
$account->refresh();
$manager = $this->getManager();
['start' => $start,
'end' => $end,
'date' => $date,] = $request->attributes->all();
$manager = $this->getManager();
['start' => $start, 'end' => $end, 'date' => $date] = $request->attributes->all();
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new AccountEnrichment();
$admin = auth()->user();
$enrichment = new AccountEnrichment();
$enrichment->setDate($date);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$enrichment->setUser($admin);
$account = $enrichment->enrichSingle($account);
$account = $enrichment->enrichSingle($account);
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
$transformer = app(AccountTransformer::class);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
@@ -48,14 +48,12 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -51,14 +51,12 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -48,16 +48,14 @@ class DestroyController extends Controller
{
parent::__construct();
$this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']);
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -55,16 +55,14 @@ class ShowController extends Controller
{
parent::__construct();
$this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']);
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -123,11 +121,7 @@ class ShowController extends Controller
*/
public function index(PaginationRequest $request): JsonResponse
{
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
@@ -135,21 +129,21 @@ class ShowController extends Controller
throw new NotFoundHttpException();
}
$manager = $this->getManager();
$manager = $this->getManager();
// get list of attachments. Count it and split it.
$collection = $this->repository->get();
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$collection = $this->repository->get();
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.attachments.index').$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -53,16 +53,14 @@ class StoreController extends Controller
{
parent::__construct();
$this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']);
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -50,16 +50,14 @@ class UpdateController extends Controller
{
parent::__construct();
$this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']);
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -50,16 +50,14 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->abRepository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->abRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -70,35 +68,29 @@ class ShowController extends Controller
*/
public function index(PaginationDateRangeRequest $request): JsonResponse
{
$manager = $this->getManager();
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
'start' => $start,
'end' => $end,
] = $request->attributes->all();
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page, 'start' => $start, 'end' => $end] = $request->attributes->all();
// get list of available budgets. Count it and split it.
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice($offset, $limit);
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice($offset, $limit);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment();
$admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment();
$enrichment->setUser($admin);
$availableBudgets = $enrichment->enrich($availableBudgets);
$availableBudgets = $enrichment->enrich($availableBudgets);
// make paginator:
$paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer = app(AvailableBudgetTransformer::class);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -126,7 +118,6 @@ class ShowController extends Controller
$enrichment->setUser($admin);
$availableBudget = $enrichment->enrichSingle($availableBudget);
$resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -43,14 +43,12 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -56,14 +56,12 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -74,25 +72,21 @@ class ListController extends Controller
*/
public function attachments(PaginationRequest $request, Bill $bill): JsonResponse
{
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getAttachments($bill);
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getAttachments($bill);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -106,24 +100,20 @@ class ListController extends Controller
*/
public function rules(PaginationRequest $request, Bill $bill): JsonResponse
{
[
'limit' => $limit,
'offset' => $offset,
'page' => $page,
] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice($offset, $limit);
$manager = $this->getManager();
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams());
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$resource = new FractalCollection($rules, $transformer, 'rules');
$transformer = app(RuleTransformer::class);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -137,22 +127,16 @@ class ListController extends Controller
*/
public function transactions(PaginationDateRangeRequest $request, Bill $bill): JsonResponse
{
[
'limit' => $limit,
'page' => $page,
'types' => $types,
'start' => $start,
'end' => $end,
] = $request->attributes->all();
['limit' => $limit, 'page' => $page, 'types' => $types, 'start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// include source + destination account name and type.
@@ -175,18 +159,18 @@ class ListController extends Controller
}
// get paginator.
$paginator = $collector->getPaginatedGroups();
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams());
// enrich
$enrichment = new TransactionGroupEnrichment();
$enrichment = new TransactionGroupEnrichment();
$enrichment->setUser($admin);
$transactions = $enrichment->enrich($paginator->getCollection());
$transactions = $enrichment->enrich($paginator->getCollection());
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer = app(TransactionGroupTransformer::class);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -51,14 +51,12 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -69,34 +67,28 @@ class ShowController extends Controller
*/
public function index(PaginationDateRangeRequest $request): JsonResponse
{
[
'limit' => $limit,
'offset' => $offset,
'start' => $start,
'end' => $end,
'page' => $page,
] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'start' => $start, 'end' => $end, 'page' => $page] = $request->attributes->all();
$this->repository->correctOrder();
$bills = $this->repository->getBills();
$manager = $this->getManager();
$count = $bills->count();
$bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
$bills = $this->repository->getBills();
$manager = $this->getManager();
$count = $bills->count();
$bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$bills = $enrichment->enrich($bills);
$bills = $enrichment->enrich($bills);
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer = app(BillTransformer::class);
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -110,26 +102,23 @@ class ShowController extends Controller
*/
public function show(DateRangeRequest $request, Bill $bill): JsonResponse
{
[
'start' => $start,
'end' => $end,
] = $request->attributes->all();
['start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
$manager = $this->getManager();
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$bill = $enrichment->enrichSingle($bill);
$bill = $enrichment->enrichSingle($bill);
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer = app(BillTransformer::class);
$resource = new Item($bill, $transformer, 'bills');
$resource = new Item($bill, $transformer, 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
@@ -50,14 +50,12 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -43,14 +43,12 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -49,7 +49,7 @@ class ListController extends Controller
use TransactionFilter;
private BudgetLimitRepositoryInterface $blRepository;
private BudgetRepositoryInterface $repository;
private BudgetRepositoryInterface $repository;
/**
* ListController constructor.
@@ -57,16 +57,14 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->blRepository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->blRepository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -120,7 +118,6 @@ class ListController extends Controller
$enrichment->setUser($admin);
$budgetLimits = $enrichment->enrich($budgetLimits);
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
@@ -43,7 +43,7 @@ use League\Fractal\Resource\Item;
class ShowController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
private BudgetRepositoryInterface $repository;
private BudgetRepositoryInterface $repository;
/**
* ListController constructor.
@@ -51,16 +51,14 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->blRepository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->blRepository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
public function update(UpdateRequest $request, Budget $budget): JsonResponse
@@ -46,16 +46,14 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,7 +47,7 @@ use League\Fractal\Resource\Item;
class ShowController extends Controller
{
private BudgetLimitRepositoryInterface $blRepository;
private BudgetRepositoryInterface $repository;
private BudgetRepositoryInterface $repository;
/**
* BudgetLimitController constructor.
@@ -55,18 +55,16 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser($user);
$this->blRepository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser($user);
$this->blRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -88,7 +86,6 @@ class ShowController extends Controller
/** @var Budget $budget */
$budget = $enrichment->enrichSingle($budget);
$manager = $this->getManager();
$manager->parseIncludes('budget');
$pageSize = $this->parameters->get('limit');
@@ -47,16 +47,14 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -52,16 +52,14 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -43,14 +43,12 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -54,14 +54,12 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -49,14 +49,12 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
use Illuminate\Http\Request;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest;
@@ -35,26 +34,26 @@ use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DestroyController extends Controller
{
use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
private ExchangeRateRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
$this->middleware(function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
return $next($request);
}
);
return $next($request);
});
}
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
@@ -64,13 +63,6 @@ class DestroyController extends Controller
return response()->json([], 204);
}
public function destroySingleById(CurrencyExchangeRate $exchangeRate): JsonResponse
{
$this->repository->deleteRate($exchangeRate);
return response()->json([], 204);
}
public function destroySingleByDate(TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse
{
$exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date);
@@ -83,4 +75,11 @@ class DestroyController extends Controller
return response()->json([], 204);
}
public function destroySingleById(CurrencyExchangeRate $exchangeRate): JsonResponse
{
$this->repository->deleteRate($exchangeRate);
return response()->json([], 204);
}
}
@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
use Illuminate\Http\Request;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\ExchangeRateTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
/**
@@ -41,20 +41,19 @@ class IndexController extends Controller
use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
private ExchangeRateRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
$this->middleware(function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
return $next($request);
}
);
return $next($request);
});
}
public function index(): JsonResponse
@@ -67,9 +66,6 @@ class IndexController extends Controller
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return response()->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
}
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
use Illuminate\Http\Request;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Enums\UserRoleEnum;
@@ -34,6 +33,7 @@ use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\ExchangeRateTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -45,20 +45,19 @@ class ShowController extends Controller
use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
private ExchangeRateRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
$this->middleware(function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
return $next($request);
}
);
return $next($request);
});
}
public function show(TransactionCurrency $from, TransactionCurrency $to): JsonResponse
@@ -73,21 +72,7 @@ class ShowController extends Controller
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
public function showSingleById(CurrencyExchangeRate $exchangeRate): JsonResponse
{
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return response()->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
public function showSingleByDate(TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse
@@ -100,9 +85,14 @@ class ShowController extends Controller
throw new NotFoundHttpException();
}
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return response()->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
public function showSingleById(CurrencyExchangeRate $exchangeRate): JsonResponse
{
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response()->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
}
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
use Illuminate\Http\Request;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreByCurrenciesRequest;
@@ -38,6 +37,7 @@ use FireflyIII\Support\Facades\Amount;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\ExchangeRateTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
@@ -45,83 +45,20 @@ class StoreController extends Controller
{
use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
private ExchangeRateRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
$this->middleware(function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
return $next($request);
}
);
}
public function storeByCurrencies(StoreByCurrenciesRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
{
$data = $request->getAll();
$collection = new Collection();
foreach ($data as $date => $rate) {
$date = Carbon::createFromFormat('Y-m-d', $date);
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
if ($existing instanceof CurrencyExchangeRate) {
// update existing rate.
$existing = $this->repository->updateExchangeRate($existing, $rate);
$collection->push($existing);
continue;
}
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
$collection->push($new);
}
$count = $collection->count();
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
public function storeByDate(StoreByDateRequest $request, Carbon $date): JsonResponse
{
$data = $request->getAll();
$from = $request->getFromCurrency();
$collection = new Collection();
foreach ($data['rates'] as $key => $rate) {
$to = Amount::getTransactionCurrencyByCode($key);
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
if ($existing instanceof CurrencyExchangeRate) {
// update existing rate.
$existing = $this->repository->updateExchangeRate($existing, $rate);
$collection->push($existing);
continue;
}
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
$collection->push($new);
}
$count = $collection->count();
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return $next($request);
});
}
public function store(StoreRequest $request): JsonResponse
@@ -145,9 +82,60 @@ class StoreController extends Controller
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $rate, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return response()->api($this->jsonApiObject(self::RESOURCE_KEY, $rate, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
public function storeByCurrencies(StoreByCurrenciesRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
{
$data = $request->getAll();
$collection = new Collection();
foreach ($data as $date => $rate) {
$date = Carbon::createFromFormat('Y-m-d', $date);
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
if ($existing instanceof CurrencyExchangeRate) {
// update existing rate.
$existing = $this->repository->updateExchangeRate($existing, $rate);
$collection->push($existing);
continue;
}
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
$collection->push($new);
}
$count = $collection->count();
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
public function storeByDate(StoreByDateRequest $request, Carbon $date): JsonResponse
{
$data = $request->getAll();
$from = $request->getFromCurrency();
$collection = new Collection();
foreach ($data['rates'] as $key => $rate) {
$to = Amount::getTransactionCurrencyByCode($key);
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
if ($existing instanceof CurrencyExchangeRate) {
// update existing rate.
$existing = $this->repository->updateExchangeRate($existing, $rate);
$collection->push($existing);
continue;
}
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
$collection->push($new);
}
$count = $collection->count();
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
}
@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
use Illuminate\Http\Request;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest;
@@ -35,41 +34,27 @@ use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\ExchangeRateTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class UpdateController extends Controller
{
use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
public const string RESOURCE_KEY = 'exchange-rates';
protected array $acceptedRoles = [UserRoleEnum::OWNER];
private ExchangeRateRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
$this->middleware(function (Request $request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
return $next($request);
}
);
}
public function updateById(UpdateRequest $request, CurrencyExchangeRate $exchangeRate): JsonResponse
{
$date = $request->getDate();
$rate = $request->getRate();
$exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return $next($request);
});
}
public function updateByDate(UpdateRequest $request, TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse
@@ -84,9 +69,17 @@ class UpdateController extends Controller
$transformer = new ExchangeRateTransformer();
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
return response()->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
public function updateById(UpdateRequest $request, CurrencyExchangeRate $exchangeRate): JsonResponse
{
$date = $request->getDate();
$rate = $request->getRate();
$exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response()->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}
}
@@ -44,16 +44,14 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -50,16 +50,14 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -48,16 +48,14 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -46,16 +46,14 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ObjectGroupRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -43,14 +43,12 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -51,14 +51,12 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -49,14 +49,12 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -114,7 +112,6 @@ class ShowController extends Controller
$enrichment->setUser($admin);
$piggyBank = $enrichment->enrichSingle($piggyBank);
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters);
@@ -47,14 +47,12 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -43,14 +43,12 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -52,14 +52,12 @@ class ListController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -49,14 +49,12 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -47,14 +47,12 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -1,6 +1,7 @@
<?php
declare(strict_types=1);
/*
* TriggerController.php
* Copyright (c) 2025 james@firefly-iii.org
@@ -50,44 +51,40 @@ class TriggerController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
public function trigger(SingleDateRequest $request, Recurrence $recurrence): JsonResponse
{
// find recurrence occurrence for this date and trigger it.
// grab the date from the last time the recurrence fired:
$backupDate = $recurrence->latest_date;
$date = $request->getDate();
$backupDate = $recurrence->latest_date;
$date = $request->getDate();
// fire the recurring cron job on the given date, then post-date the created transaction.
Log::info(sprintf('Trigger: will now fire recurring cron job task for date "%s".', $date->format('Y-m-d H:i:s')));
/** @var CreateRecurringTransactions $job */
$job = app(CreateRecurringTransactions::class);
$job = app(CreateRecurringTransactions::class);
$job->setRecurrences(new Collection()->push($recurrence));
$job->setDate($date);
$job->setForce(false);
$job->handle();
Log::debug('Done with recurrence.');
$groups = $job->getGroups();
$groups = $job->getGroups();
$this->repository->markGroupsAsNow($groups);
$recurrence->latest_date = $backupDate;
$recurrence->latest_date_tz = $backupDate?->format('e');
$recurrence->save();
$recurrence = $this->repository->setLatestDate($recurrence, $backupDate);
Preferences::mark();
// enrich groups and return them:
$paginator = new LengthAwarePaginator(new Collection(), 0, 1);
$paginator = new LengthAwarePaginator(new Collection(), 0, 1);
if ($groups->count() > 0) {
/** @var User $admin */
$admin = auth()->user();
@@ -95,28 +92,24 @@ class TriggerController extends Controller
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
->setIds($groups->pluck('id')->toArray())
->withAPIInformation()
;
$collector->setUser($admin)->setIds($groups->pluck('id')->toArray())->withAPIInformation();
$paginator = $collector->getPaginatedGroups();
}
$manager = $this->getManager();
$manager = $this->getManager();
$paginator->setPath(route('api.v1.recurrences.trigger', [$recurrence->id]).$this->buildParams());
// enrich
$admin = auth()->user();
$enrichment = new TransactionGroupEnrichment();
$admin = auth()->user();
$enrichment = new TransactionGroupEnrichment();
$enrichment->setUser($admin);
$transactions = $enrichment->enrich($paginator->getCollection());
$transactions = $enrichment->enrich($paginator->getCollection());
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -47,14 +47,12 @@ class UpdateController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
$this->middleware(function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -44,17 +44,15 @@ class DestroyController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -41,8 +41,6 @@ class ExpressionController extends Controller
*/
public function validateExpression(ValidateExpressionRequest $request): JsonResponse
{
return response()->json([
'valid' => true,
]);
return response()->json(['valid' => true]);
}
}
@@ -48,17 +48,15 @@ class ShowController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -45,17 +45,15 @@ class StoreController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -52,17 +52,15 @@ class TriggerController extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->middleware(function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
return $next($request);
}
);
return $next($request);
});
}
/**
@@ -80,15 +78,15 @@ class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && '' !== $parameters['accounts']) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// file the rule(s)
@@ -134,15 +132,15 @@ class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && is_array($parameters['accounts']) && count($parameters['accounts']) > 0) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// fire the rule(s)

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