Compare commits

..

108 Commits

Author SHA1 Message Date
James Cole
e8618047bd More readable fix for division by zero error. 2024-03-31 08:40:47 +02:00
James Cole
f104b76f73 Merge pull request #8735 from mansuf/develop
Fix `Division error by zero` in budget views
2024-03-31 08:37:09 +02:00
Rahman Yusuf
cb701d8506 Fix Division error by zero in budget views 2024-03-31 12:03:54 +07:00
James Cole
70a334c56e Merge branch 'main' into develop 2024-03-31 03:16:54 +02:00
github-actions
e6b2db1e29 Auto commit for release 'develop' on 2024-03-31 2024-03-31 03:14:08 +02:00
James Cole
e8dffa0052 Update script version 2024-03-31 03:09:00 +02:00
James Cole
c4f0512f39 Run another composer, and dump the autoload files. 2024-03-31 03:06:58 +02:00
James Cole
3268019d0c Fix #8732 2024-03-31 01:24:18 +01:00
James Cole
a0ef6a1fc8 Fix https://github.com/firefly-iii/firefly-iii/issues/8725 2024-03-30 09:56:51 +01:00
James Cole
99d0098b20 Merge branch 'main' into develop 2024-03-28 05:59:30 +01:00
James Cole
a7a54c042c Touch and exclude tar name 2024-03-28 05:53:31 +01:00
github-actions
c44e48a793 Auto commit for release 'develop' on 2024-03-28 2024-03-28 04:10:19 +01:00
James Cole
53b501ca73 Add tar.gz file 2024-03-27 20:04:14 +01:00
James Cole
322f70bcca Merge branch 'main' into develop
# Conflicts:
#	.github/workflows/release.yml
2024-03-27 07:10:24 +01:00
James Cole
35559c077b Update text in output. 2024-03-27 06:59:48 +01:00
github-actions
590ffe7c76 Auto commit for release 'develop' on 2024-03-27 2024-03-27 06:58:44 +01:00
James Cole
8a2d8f148e Expand text under development release 2024-03-27 06:50:39 +01:00
James Cole
4f0e15e07d Expand text in dev release. 2024-03-27 06:49:56 +01:00
James Cole
7463861e0c Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2024-03-26 07:40:51 +01:00
James Cole
1e70fa28be Fix https://github.com/firefly-iii/firefly-iii/issues/8648 2024-03-26 07:37:21 +01:00
github-actions
26c6ca470b Auto commit for release 'develop' on 2024-03-26 2024-03-26 07:37:05 +01:00
James Cole
5e54034e0e Merge branch 'main' into develop
# Conflicts:
#	.github/workflows/release.yml
2024-03-26 07:32:26 +01:00
James Cole
25873ef734 add npm update. 2024-03-26 07:31:33 +01:00
James Cole
1092b04b22 Merge branch 'main' into develop 2024-03-26 07:30:27 +01:00
James Cole
01ce74dd72 Expand release script with shasum 2024-03-26 07:30:15 +01:00
James Cole
41430d8386 Fix bill box and hover CSS 2024-03-26 07:25:36 +01:00
James Cole
01eb19169c Merge pull request #8714 from firefly-iii/dependabot/npm_and_yarn/develop/vite-4.5.3 2024-03-25 07:08:14 +01:00
dependabot[bot]
cfaa7d7c68 Bump vite from 4.5.2 to 4.5.3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.2 to 4.5.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.3/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-25 03:13:52 +00:00
github-actions
14d3312a10 Auto commit for release 'develop' on 2024-03-25 2024-03-25 04:10:34 +01:00
James Cole
87be478dd8 Expand dashboard view 2024-03-24 16:22:27 +01:00
James Cole
0b6877a20e Fix null pointer 2024-03-24 14:11:30 +01:00
James Cole
7186f0ef60 Improve boxes 2024-03-24 14:10:07 +01:00
James Cole
538933691e Add sort column to account overview. and some css fixes 2024-03-24 13:24:48 +01:00
James Cole
46c49ddbd8 Add translations, fix error message. 2024-03-24 12:07:26 +01:00
James Cole
bcfb134b6e Clean up 2024-03-24 11:43:37 +01:00
James Cole
57981f1cf9 Read and remember sort order by URL 2024-03-24 11:08:24 +01:00
James Cole
0310186fb7 Expand accounts page. 2024-03-23 20:37:15 +01:00
James Cole
4dcb38290e Better inline editor. 2024-03-23 15:20:49 +01:00
James Cole
2f5c37048b Update vite.config.js
Add relative path.

Signed-off-by: James Cole <james@firefly-iii.org>
2024-03-21 13:44:51 +01:00
github-actions
370c8b16ae Auto commit for release 'develop' on 2024-03-21 2024-03-21 04:11:26 +01:00
github-actions
af0555592a Auto commit for release 'v6.1.12' on 2024-03-20 2024-03-20 17:55:25 +01:00
James Cole
9c07ddaed6 Replace shitty Laravel Passport command. 2024-03-20 17:48:13 +01:00
James Cole
bb7355a566 Fix https://github.com/orgs/firefly-iii/discussions/8696 2024-03-20 17:32:06 +01:00
James Cole
1d48347f8c Update release notes for new version. 2024-03-20 17:28:56 +01:00
James Cole
060b76ca9c Replace command in composer.json 2024-03-20 11:45:56 +01:00
James Cole
2b2b9b6f7a Drop duplicate index 2024-03-20 06:14:32 +01:00
James Cole
f3dd05a0c0 Move jobs to better times. 2024-03-20 06:12:56 +01:00
James Cole
47a91aa273 Exclude file from release. 2024-03-19 17:52:00 +01:00
github-actions
41bc236603 Auto commit for release 'v6.1.11' on 2024-03-19 2024-03-19 17:44:55 +01:00
James Cole
65349451ea Update changelog. 2024-03-19 17:39:54 +01:00
James Cole
e77b6a55a4 Merge branch 'main' into develop 2024-03-19 17:33:49 +01:00
James Cole
2379bcff11 git Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop 2024-03-19 14:28:46 +01:00
James Cole
7133156fa1 add empty dir 2024-03-19 14:28:40 +01:00
github-actions
a59176689d Auto commit for release 'develop' on 2024-03-19 2024-03-19 14:23:12 +01:00
James Cole
bc2d8f3dfb Deleted generated JS 2024-03-19 14:06:57 +01:00
James Cole
ddf89a9d5a remove build dir 2024-03-19 11:10:05 +01:00
James Cole
7daaba17f6 Update git ignore file 2024-03-19 10:23:17 +01:00
James Cole
9cb5b1384f Remove generated files 2024-03-19 10:23:01 +01:00
github-actions
7d13263482 Auto commit for release 'develop' on 2024-03-18 2024-03-18 21:08:27 +01:00
James Cole
d9ff252915 Unignore files 2024-03-18 21:03:17 +01:00
James Cole
51ba550251 Ignore generated files. 2024-03-18 20:29:09 +01:00
James Cole
fd21c467ad Remove generated files. 2024-03-18 20:28:58 +01:00
github-actions
9aa90650b4 Auto commit for release 'develop' on 2024-03-18 2024-03-18 20:25:30 +01:00
James Cole
d892257e8b Add artifact. 2024-03-18 20:19:18 +01:00
James Cole
db0dbcfcf1 Disable exchange rates by default. 2024-03-18 06:20:33 +01:00
James Cole
f591996f04 Remove deferrable interface 2024-03-18 06:14:17 +01:00
James Cole
b08d385586 Merge pull request #8683 from firefly-iii/dependabot/npm_and_yarn/develop/axios-1.6.8 2024-03-18 05:45:38 +01:00
James Cole
20ef22f67e Merge pull request #8682 from firefly-iii/dependabot/npm_and_yarn/develop/sass-1.72.0 2024-03-18 05:45:31 +01:00
James Cole
c888baf542 Merge pull request #8681 from firefly-iii/dependabot/npm_and_yarn/develop/date-fns-3.6.0 2024-03-18 05:45:22 +01:00
dependabot[bot]
8b0af3f666 Bump axios from 1.6.7 to 1.6.8
Bumps [axios](https://github.com/axios/axios) from 1.6.7 to 1.6.8.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.7...v1.6.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-18 03:07:58 +00:00
dependabot[bot]
7043e1e7c0 Bump sass from 1.71.1 to 1.72.0
Bumps [sass](https://github.com/sass/dart-sass) from 1.71.1 to 1.72.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.71.1...1.72.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-18 03:07:43 +00:00
dependabot[bot]
c5854eba23 Bump date-fns from 3.3.1 to 3.6.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 3.3.1 to 3.6.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v3.3.1...v3.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-18 03:07:29 +00:00
github-actions
ddf1a8cebb Auto commit for release 'develop' on 2024-03-18 2024-03-18 01:30:56 +01:00
James Cole
7dcaf167e9 Replace blade template with twig template 2024-03-17 15:54:18 +01:00
James Cole
b359d51d3a Fix code and tests. 2024-03-17 12:26:56 +01:00
James Cole
3913fa5086 Restore old behavior 2024-03-17 12:00:28 +01:00
James Cole
ab2772abe0 Remove deferrable. 2024-03-17 11:44:58 +01:00
James Cole
bc7875b17b Add stub component. 2024-03-17 09:30:26 +01:00
James Cole
4938fa9990 Add stub component. 2024-03-17 09:29:49 +01:00
James Cole
84df2c80ee Fix missing var 2024-03-17 09:27:04 +01:00
James Cole
dc17060754 Remove deferrable. 2024-03-17 09:24:50 +01:00
James Cole
e2fa81dddc Remove deferrable. 2024-03-17 09:24:25 +01:00
James Cole
182dfc95fe Remove deferrable. 2024-03-17 09:23:44 +01:00
James Cole
c8979b6c33 Remove deferrable. 2024-03-17 09:23:12 +01:00
James Cole
ab872e8912 Remove deferrable. 2024-03-17 09:22:45 +01:00
James Cole
d36b94fabf Remove deferrable. 2024-03-17 09:22:13 +01:00
James Cole
e3d4ceaecb Merge branch 'main' into develop 2024-03-17 09:19:26 +01:00
James Cole
e3a6e5b788 Upgrade to laravel 11 2024-03-17 09:19:01 +01:00
James Cole
57235c0e00 Merge pull request #8675 from firefly-iii/dependabot/npm_and_yarn/follow-redirects-1.15.6 2024-03-17 07:43:18 +01:00
dependabot[bot]
2298c3ddaf Bump follow-redirects from 1.15.5 to 1.15.6
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.5 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 23:39:53 +00:00
James Cole
7224f1be6f Small code cleanup. 2024-03-16 23:06:16 +01:00
James Cole
1bd3019c16 Small code cleanup. 2024-03-16 22:57:48 +01:00
James Cole
f0fa21dead First version of line edit. 2024-03-16 22:00:25 +01:00
James Cole
845eaed8d7 Code cleanup. 2024-03-16 11:27:07 +01:00
James Cole
b3649cd4d0 Add migration routine for https://github.com/firefly-iii/firefly-iii/pull/8650 2024-03-16 07:03:50 +01:00
James Cole
55f14c587b New funding file. 2024-03-16 06:33:31 +01:00
James Cole
441a8a8408 Some code cleanup 2024-03-16 06:28:21 +01:00
James Cole
060c9648f1 Fix https://github.com/firefly-iii/firefly-iii/issues/8668 2024-03-16 06:25:56 +01:00
James Cole
7680c8733f Expand. include discussions. 2024-03-16 06:09:10 +01:00
James Cole
5a0af5c93b Fix https://github.com/firefly-iii/firefly-iii/issues/8672 2024-03-15 06:13:40 +01:00
James Cole
f4b066add1 Fix https://github.com/firefly-iii/firefly-iii/issues/8671 2024-03-14 21:20:30 +01:00
github-actions
9ecb414b02 Auto commit for release 'develop' on 2024-03-14 2024-03-14 01:29:53 +01:00
James Cole
ad4f908c24 CI will stop complaining about code base, bi-weekly release picks this up. 2024-03-13 06:52:16 +01:00
James Cole
025f739442 Reformat some code. 2024-03-13 06:51:31 +01:00
James Cole
6df7354c48 Rebuild frontend cause lazy. 2024-03-13 06:51:22 +01:00
James Cole
3f77c845ca Add last activity column 2024-03-13 06:50:08 +01:00
James Cole
d4771f7a5c Remove old configuration file. 2024-03-13 06:29:39 +01:00
James Cole
ec4e2bfa4f Fix https://github.com/firefly-iii/firefly-iii/issues/8663 2024-03-12 20:36:31 +01:00
409 changed files with 4646 additions and 3972 deletions

View File

@@ -8,16 +8,16 @@
"packages": [ "packages": [
{ {
"name": "composer/pcre", "name": "composer/pcre",
"version": "3.1.2", "version": "3.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/pcre.git", "url": "https://github.com/composer/pcre.git",
"reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace" "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/4775f35b2d70865807c89d32c8e7385b86eb0ace", "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
"reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace", "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -59,7 +59,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/composer/pcre/issues", "issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.1.2" "source": "https://github.com/composer/pcre/tree/3.1.3"
}, },
"funding": [ "funding": [
{ {
@@ -75,7 +75,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-07T15:38:35+00:00" "time": "2024-03-19T10:26:25+00:00"
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
@@ -160,16 +160,16 @@
}, },
{ {
"name": "composer/xdebug-handler", "name": "composer/xdebug-handler",
"version": "3.0.3", "version": "3.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/xdebug-handler.git", "url": "https://github.com/composer/xdebug-handler.git",
"reference": "ced299686f41dce890debac69273b47ffe98a40c" "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"reference": "ced299686f41dce890debac69273b47ffe98a40c", "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -180,7 +180,7 @@
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.0",
"phpstan/phpstan-strict-rules": "^1.1", "phpstan/phpstan-strict-rules": "^1.1",
"symfony/phpunit-bridge": "^6.0" "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -204,9 +204,9 @@
"performance" "performance"
], ],
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/xdebug-handler/issues", "issues": "https://github.com/composer/xdebug-handler/issues",
"source": "https://github.com/composer/xdebug-handler/tree/3.0.3" "source": "https://github.com/composer/xdebug-handler/tree/3.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -222,20 +222,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-25T21:32:43+00:00" "time": "2024-03-26T18:29:49+00:00"
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.51.0", "version": "v3.52.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "127fa74f010da99053e3f5b62672615b72dd6efd" "reference": "6e77207f0d851862ceeb6da63e6e22c01b1587bc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/6e77207f0d851862ceeb6da63e6e22c01b1587bc",
"reference": "127fa74f010da99053e3f5b62672615b72dd6efd", "reference": "6e77207f0d851862ceeb6da63e6e22c01b1587bc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -306,7 +306,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.52.1"
}, },
"funding": [ "funding": [
{ {
@@ -314,7 +314,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-02-28T19:50:06+00:00" "time": "2024-03-19T21:02:43+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",

View File

@@ -111,7 +111,10 @@ PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null PGSQL_SSL_CRL_FILE=null
# more PostgreSQL settings # For postgresql 15 and up, setting this to public will no longer work as expected, becasuse the
# 'public' schema is without grants. This can be worked around by having a super user grant those
# necessary privileges, but in security conscious setups that's not viable.
# You will need to set this to the schema you want to use.
PGSQL_SCHEMA=public PGSQL_SCHEMA=public
# If you're looking for performance improvements, you could install memcached or redis # If you're looking for performance improvements, you could install memcached or redis
@@ -184,6 +187,11 @@ SEND_REPORT_JOURNALS=true
# Since this involves an external service, it's optional and disabled by default. # Since this involves an external service, it's optional and disabled by default.
ENABLE_EXTERNAL_MAP=false ENABLE_EXTERNAL_MAP=false
#
# Enable or disable exchange rate conversion. This function isn't used yet by Firefly III
#
ENABLE_EXCHANGE_RATES=false
# Set this value to true if you want Firefly III to download currency exchange rates # Set this value to true if you want Firefly III to download currency exchange rates
# from the internet. These rates are hosted by the creator of Firefly III inside # from the internet. These rates are hosted by the creator of Firefly III inside
# an Azure Storage Container. # an Azure Storage Container.

4
.github/funding.yml vendored
View File

@@ -1,4 +1,6 @@
# These are supported funding model platforms # Firefly III sponsor options
github: jc5 github: jc5
patreon: JC5 patreon: JC5
ko_fi: jamesc5
liberapay: JC5

View File

@@ -7,7 +7,7 @@ permissions:
on: on:
schedule: schedule:
- cron: '0 0 * * *' - cron: '0 1 * * *'
workflow_dispatch: workflow_dispatch:
jobs: jobs:
prune: prune:

View File

@@ -3,7 +3,7 @@ name: 'Issues - Lock old issues'
on: on:
workflow_dispatch: workflow_dispatch:
schedule: schedule:
- cron: '0 0 * * *' - cron: '0 2 * * *'
concurrency: concurrency:
group: lock-threads group: lock-threads
@@ -18,11 +18,12 @@ jobs:
permissions: permissions:
issues: write issues: write
pull-requests: write pull-requests: write
discussions: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: dessant/lock-threads@v5 - uses: dessant/lock-threads@v5
with: with:
github-token: ${{ github.token }} issue-inactive-days: 21
issue-inactive-days: 7 pr-inactive-days: 21
pr-inactive-days: 7 discussion-inactive-days: 21
log-output: true log-output: true

View File

@@ -8,7 +8,7 @@ on:
required: true required: true
default: 'develop' default: 'develop'
schedule: schedule:
- cron: '15 0 * * MON,THU' - cron: '0 3 * * MON,THU'
jobs: jobs:
build: build:
@@ -51,7 +51,7 @@ jobs:
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
- name: Cleanup translations - name: Cleanup translations
id: cleanup-transactions id: cleanup-transactions
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:crowdin-warning' action: 'ff3:crowdin-warning'
output: '' output: ''
@@ -60,7 +60,7 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Cleanup changelog - name: Cleanup changelog
id: cleanup-changelog id: cleanup-changelog
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:changelog' action: 'ff3:changelog'
output: '' output: ''
@@ -69,7 +69,7 @@ jobs:
GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }} GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }}
- name: Extract changelog - name: Extract changelog
id: extract-changelog id: extract-changelog
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:extract-changelog' action: 'ff3:extract-changelog'
output: 'output' output: 'output'
@@ -78,7 +78,7 @@ jobs:
GH_TOKEN: "" GH_TOKEN: ""
- name: Replace version - name: Replace version
id: replace-version id: replace-version
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:version' action: 'ff3:version'
output: '' output: ''
@@ -88,7 +88,7 @@ jobs:
FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }} FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
- name: Generate JSON v1 - name: Generate JSON v1
id: json-v1 id: json-v1
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:json-translations v1' action: 'ff3:json-translations v1'
output: '' output: ''
@@ -97,7 +97,7 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Generate JSON v2 - name: Generate JSON v2
id: json-v2 id: json-v2
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:json-translations v2' action: 'ff3:json-translations v2'
output: '' output: ''
@@ -106,7 +106,7 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Code cleanup - name: Code cleanup
id: code-cleanup id: code-cleanup
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:code' action: 'ff3:code'
output: '' output: ''
@@ -115,12 +115,12 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Build new JS - name: Build new JS
run: | run: |
pwd
npm install npm install
npm update
npm run build npm run build
- name: Build old JS - name: Build old JS
id: old-js id: old-js
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:old-js' action: 'ff3:old-js'
output: '' output: ''
@@ -141,8 +141,20 @@ jobs:
git config user.email 41898282+github-actions[bot]@users.noreply.github.com git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git config advice.addIgnoredFile false git config advice.addIgnoredFile false
# update composer (again)
composer validate --strict
composer update --no-dev --no-scripts --no-plugins
composer dump-autoload
releaseName=$version
zipName=FireflyIII-$version.zip
tarName=FireflyIII-$version.tar.gz
if [[ "develop" == "$version" ]]; then if [[ "develop" == "$version" ]]; then
[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0; [[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
releaseName=$version-$(date +'%Y%m%d')
zipName=FireflyIII-develop.zip
tarName=FireflyIII-develop.tar.gz
fi fi
git add -A git add -A
@@ -152,19 +164,64 @@ jobs:
git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
git push git push
# zip and tar everything
zip -rq $zipName . -x "*.git*" "*.ci*" "*.github*" "*node_modules*" "*output.txt*"
touch $tarName
tar --exclude=$tarName --exclude='./.git' --exclude='./.ci' --exclude='./.github' --exclude='./node_modules' --exclude='./output.txt' -czf $tarName .
# add sha256 sum
sha256sum -b $zipName > $zipName.sha256
sha256sum -b $tarName > $tarName.sha256
if [[ "develop" == "$version" ]]; then if [[ "develop" == "$version" ]]; then
echo "Create nightly release." # add text to output.txt (instructions)
git tag -a $version-$(date +'%Y%m%d') -m "Nightly development release '$version' on $(date +'%Y-%m-%d')"
git push origin $version-$(date +'%Y%m%d')
gh release create $version-$(date +'%Y%m%d') -p --verify-tag \
-t "Development release for $(date +'%Y-%m-%d')" \
-n "Bi-weekly development release of Firefly III with the latest fixes, translations and features. This release was created on **$(date +'%Y-%m-%d')** and may contain bugs. Use at your own risk. Docker users can find this release under the \`develop\` tag."
else
echo "Create default release."
git tag -a $version -m "Here be changelog"
git push origin $version
gh release create $version -F output.txt -t "$version" --verify-tag
rm output.txt rm output.txt
echo "Bi-weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt
echo "" >> output.txt
echo "This release was created on **$(date +'%Y-%m-%d')** and may contain unexpected bugs. Data loss is rare but is not impossible." >> output.txt
echo "" >> output.txt
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
echo "" >> output.txt
echo ":warning: Please be careful with this pre-release, as is may not work as expected." >> output.txt
# create the release:
echo "Create nightly release."
git tag -a $releaseName -m "Nightly development release '$version' on $(date +'%Y-%m-%d')"
git push origin $releaseName
gh release create $releaseName -p --verify-tag \
-t "Development release for $(date +'%Y-%m-%d')" \
-F output.txt
# add zip file to release.
gh release upload $releaseName $zipName
gh release upload $releaseName $tarName
# add sha256 sum to release
gh release upload $releaseName $zipName.sha256
gh release upload $releaseName $tarName.sha256
# rm output.txt again
rm output.txt
else
# add text to output.txt (more instructions)
echo '' >> output.txt
echo '### Instructions' >> output.txt
echo '' >> output.txt
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
echo "Create default release."
git tag -a $releaseName -m "Here be changelog"
git push origin $releaseName
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag
# add zip file to release.
gh release upload $releaseName $zipName
# add sha256 sum to release
gh release upload $releaseName $zipName.sha256
rm output.txt
rm $zipName
rm $zipName.sha256
git checkout develop git checkout develop
git merge main git merge main
git push git push

View File

@@ -45,15 +45,6 @@ jobs:
- name: Install Composer dependencies - name: Install Composer dependencies
run: composer install --prefer-dist --no-interaction --no-progress --no-scripts run: composer install --prefer-dist --no-interaction --no-progress --no-scripts
- name: PHPStan
run: .ci/phpstan.sh
- name: PHPMD
run: .ci/phpmd.sh
- name: PHP CS Fixer
run: .ci/phpcs.sh
- name: "Create database file" - name: "Create database file"
run: touch storage/database/database.sqlite run: touch storage/database/database.sqlite

View File

@@ -1,7 +1,7 @@
name: "Issues - Mark and close stale issues" name: "Issues - Mark and close stale issues"
on: on:
schedule: schedule:
- cron: "30 1 * * *" - cron: "0 4 * * *"
workflow_dispatch: workflow_dispatch:
permissions: permissions:
@@ -18,16 +18,16 @@ jobs:
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: > stale-issue-message: >
Hi there! Hi there!
This is an automatic reply. `Share and enjoy` This is an automatic reply. `Share and enjoy`
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.
Thank you for your contributions. Thank you for your contributions.
stale-pr-message: > stale-pr-message: >
Hi there! Hi there!
This is an automatic reply. `Share and enjoy` This is an automatic reply. `Share and enjoy`
This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.

3
.gitignore vendored
View File

@@ -7,3 +7,6 @@ yarn-error.log
.env .env
/.ci/php-cs-fixer/vendor /.ci/php-cs-fixer/vendor
coverage.xml coverage.xml
# ignore generated files.
public/build

View File

@@ -281,7 +281,7 @@ class BasicController extends Controller
$spentInCurrency = $row['sum']; $spentInCurrency = $row['sum'];
$leftToSpend = bcadd($amount, $spentInCurrency); $leftToSpend = bcadd($amount, $spentInCurrency);
$days = $today->diffInDays($end) + 1; $days = (int)$today->diffInDays($end, true) + 1;
$perDay = '0'; $perDay = '0';
if (0 !== $days && bccomp($leftToSpend, '0') > -1) { if (0 !== $days && bccomp($leftToSpend, '0') > -1) {
$perDay = bcdiv($leftToSpend, (string)$days); $perDay = bcdiv($leftToSpend, (string)$days);

View File

@@ -46,7 +46,7 @@ class DateRequest extends FormRequest
{ {
$start = $this->getCarbonDate('start'); $start = $this->getCarbonDate('start');
$end = $this->getCarbonDate('end'); $end = $this->getCarbonDate('end');
if ($start->diffInYears($end) > 5) { if ($start->diffInYears($end, true) > 5) {
throw new FireflyException('Date range out of range.'); throw new FireflyException('Date range out of range.');
} }

View File

@@ -0,0 +1,79 @@
<?php
/*
* UpdateController.php
* Copyright (c) 2024 james@firefly-iii.org.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V2\Controllers\Model\Account;
use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Model\Account\UpdateRequest;
use FireflyIII\Models\Account;
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
use FireflyIII\Transformers\V2\AccountTransformer;
use Illuminate\Http\JsonResponse;
class UpdateController extends Controller
{
public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
// new way of user group validation
$userGroup = $this->validateUserGroup($request);
if (null !== $userGroup) {
$this->repository->setUserGroup($userGroup);
}
return $next($request);
}
);
}
/**
* TODO this endpoint is not yet reachable.
*/
public function update(UpdateRequest $request, Account $account): JsonResponse
{
app('log')->debug(sprintf('Now in %s', __METHOD__));
$data = $request->getUpdateData();
$data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type);
$account = $this->repository->update($account, $data);
$account->refresh();
app('preferences')->mark();
$transformer = new AccountTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject('accounts', $account, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
}

View File

@@ -298,7 +298,7 @@ class BasicController extends Controller
app('log')->debug(sprintf('Amount left is %s', $left)); app('log')->debug(sprintf('Amount left is %s', $left));
// how much left per day? // how much left per day?
$days = $today->diffInDays($end) + 1; $days = (int) $today->diffInDays($end, true) + 1;
$perDay = '0'; $perDay = '0';
$perDayNative = '0'; $perDayNative = '0';
if (0 !== $days && bccomp($left, '0') > -1) { if (0 !== $days && bccomp($left, '0') > -1) {

View File

@@ -0,0 +1,116 @@
<?php
/*
* UpdateRequest.php
* Copyright (c) 2024 james@firefly-iii.org.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V2\Request\Model\Account;
use FireflyIII\Models\Account;
use FireflyIII\Models\Location;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\UniqueAccountNumber;
use FireflyIII\Rules\UniqueIban;
use FireflyIII\Support\Request\AppendsLocationData;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
use AppendsLocationData;
use ChecksLogin;
use ConvertsDataTypes;
/**
* TODO is a duplicate of the v1 update thing.
*/
public function getUpdateData(): array
{
$fields = [
'name' => ['name', 'convertString'],
'active' => ['active', 'boolean'],
'include_net_worth' => ['include_net_worth', 'boolean'],
'account_type_name' => ['type', 'convertString'],
'virtual_balance' => ['virtual_balance', 'convertString'],
'iban' => ['iban', 'convertString'],
'BIC' => ['bic', 'convertString'],
'account_number' => ['account_number', 'convertString'],
'account_role' => ['account_role', 'convertString'],
'liability_type' => ['liability_type', 'convertString'],
'opening_balance' => ['opening_balance', 'convertString'],
'opening_balance_date' => ['opening_balance_date', 'convertDateTime'],
'cc_type' => ['credit_card_type', 'convertString'],
'cc_monthly_payment_date' => ['monthly_payment_date', 'convertDateTime'],
'notes' => ['notes', 'stringWithNewlines'],
'interest' => ['interest', 'convertString'],
'interest_period' => ['interest_period', 'convertString'],
'order' => ['order', 'convertInteger'],
'currency_id' => ['currency_id', 'convertInteger'],
'currency_code' => ['currency_code', 'convertString'],
'liability_direction' => ['liability_direction', 'convertString'],
'liability_amount' => ['liability_amount', 'convertString'],
'liability_start_date' => ['liability_start_date', 'date'],
];
$data = $this->getAllData($fields);
return $this->appendLocationData($data, null);
}
/**
* TODO is a duplicate of the v1 UpdateRequest method.
*
* The rules that the incoming request must be matched against.
*/
public function rules(): array
{
/** @var Account $account */
$account = $this->route()->parameter('account');
$accountRoles = implode(',', config('firefly.accountRoles'));
$types = implode(',', array_keys(config('firefly.subTitlesByIdentifier')));
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
$rules = [
'name' => sprintf('min:1|max:1024|uniqueAccountForUser:%d', $account->id),
'type' => sprintf('in:%s', $types),
'iban' => ['iban', 'nullable', new UniqueIban($account, $this->convertString('type'))],
'bic' => 'bic|nullable',
'account_number' => ['min:1', 'max:255', 'nullable', new UniqueAccountNumber($account, $this->convertString('type'))],
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
'virtual_balance' => 'numeric|nullable',
'order' => 'numeric|nullable',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
'active' => [new IsBoolean()],
'include_net_worth' => [new IsBoolean()],
'account_role' => sprintf('in:%s|nullable|required_if:type,asset', $accountRoles),
'credit_card_type' => sprintf('in:%s|nullable|required_if:account_role,ccAsset', $ccPaymentTypes),
'monthly_payment_date' => 'date|nullable|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage',
'liability_direction' => 'required_if:type,liability|in:credit,debit',
'interest' => 'required_if:type,liability|min:0|max:100|numeric',
'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly',
'notes' => 'min:0|max:32768',
];
return Location::requestRules($rules);
}
}

View File

@@ -53,40 +53,40 @@ class ForceDecimalSize extends Command
{ {
use ShowsFriendlyMessages; use ShowsFriendlyMessages;
protected $description = 'This command resizes DECIMAL columns in MySQL or PostgreSQL and correct amounts (only MySQL).'; protected $description = 'This command resizes DECIMAL columns in MySQL or PostgreSQL and correct amounts (only MySQL).';
protected $signature = 'firefly-iii:force-decimal-size'; protected $signature = 'firefly-iii:force-decimal-size';
private string $cast; private string $cast;
private array $classes private array $classes
= [ = [
'accounts' => Account::class, 'accounts' => Account::class,
'auto_budgets' => AutoBudget::class, 'auto_budgets' => AutoBudget::class,
'available_budgets' => AvailableBudget::class, 'available_budgets' => AvailableBudget::class,
'bills' => Bill::class, 'bills' => Bill::class,
'budget_limits' => BudgetLimit::class, 'budget_limits' => BudgetLimit::class,
'piggy_bank_events' => PiggyBankEvent::class, 'piggy_bank_events' => PiggyBankEvent::class,
'piggy_bank_repetitions' => PiggyBankRepetition::class, 'piggy_bank_repetitions' => PiggyBankRepetition::class,
'piggy_banks' => PiggyBank::class, 'piggy_banks' => PiggyBank::class,
'recurrences_transactions' => RecurrenceTransaction::class, 'recurrences_transactions' => RecurrenceTransaction::class,
'transactions' => Transaction::class, 'transactions' => Transaction::class,
]; ];
private string $operator; private string $operator;
private string $regularExpression; private string $regularExpression;
private array $tables private array $tables
= [ = [
'accounts' => ['virtual_balance'], 'accounts' => ['virtual_balance'],
'auto_budgets' => ['amount'], 'auto_budgets' => ['amount'],
'available_budgets' => ['amount'], 'available_budgets' => ['amount'],
'bills' => ['amount_min', 'amount_max'], 'bills' => ['amount_min', 'amount_max'],
'budget_limits' => ['amount'], 'budget_limits' => ['amount'],
'currency_exchange_rates' => ['rate', 'user_rate'], 'currency_exchange_rates' => ['rate', 'user_rate'],
'limit_repetitions' => ['amount'], 'limit_repetitions' => ['amount'],
'piggy_bank_events' => ['amount'], 'piggy_bank_events' => ['amount'],
'piggy_bank_repetitions' => ['currentamount'], 'piggy_bank_repetitions' => ['currentamount'],
'piggy_banks' => ['targetamount'], 'piggy_banks' => ['targetamount'],
'recurrences_transactions' => ['amount', 'foreign_amount'], 'recurrences_transactions' => ['amount', 'foreign_amount'],
'transactions' => ['amount', 'foreign_amount'], 'transactions' => ['amount', 'foreign_amount'],
]; ];
/** /**
* Execute the console command. * Execute the console command.

View File

@@ -0,0 +1,65 @@
<?php
declare(strict_types=1);
/*
* LaravelPassportKeys.php
* Copyright (c) 2024 james@firefly-iii.org.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
namespace FireflyIII\Console\Commands\System;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan;
use Symfony\Component\Console\Command\Command as CommandAlias;
class LaravelPassportKeys extends Command
{
use ShowsFriendlyMessages;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'firefly-iii:laravel-passport-keys';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Calls the Laravel "passport:keys" but doesn\'t exit 1.';
/**
* Execute the console command.
*/
public function handle()
{
Artisan::call('passport:keys --no-interaction', []);
$result = Artisan::output();
if (str_contains($result, 'Encryption keys already exist')) {
$this->friendlyInfo('Encryption keys exist already.');
return CommandAlias::SUCCESS;
}
$this->friendlyPositive('Encryption keys have been created, nice!');
return CommandAlias::SUCCESS;
}
}

View File

@@ -1,7 +1,7 @@
<?php <?php
/** /*
* ApplyRules.php * ApplyRules.php
* Copyright (c) 2020 james@firefly-iii.org * Copyright (c) 2024 james@firefly-iii.org.
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
* *
@@ -16,7 +16,7 @@
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /*
* Cron.php * Cron.php
* Copyright (c) 2020 james@firefly-iii.org * Copyright (c) 2024 james@firefly-iii.org.
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
* *
@@ -17,7 +17,7 @@
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see https://www.gnu.org/licenses/.
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -110,7 +110,7 @@ class AppendBudgetLimitPeriods extends Command
return 'daily'; return 'daily';
} }
// is weekly // is weekly
if ('1' === $limit->start_date->format('N') && '7' === $limit->end_date->format('N') && 6 === $limit->end_date->diffInDays($limit->start_date)) { if ('1' === $limit->start_date->format('N') && '7' === $limit->end_date->format('N') && 6 === (int)$limit->end_date->diffInDays($limit->start_date, true)) {
return 'weekly'; return 'weekly';
} }
@@ -129,7 +129,7 @@ class AppendBudgetLimitPeriods extends Command
if ( if (
in_array($limit->start_date->format('j-n'), $start, true) // start of quarter in_array($limit->start_date->format('j-n'), $start, true) // start of quarter
&& in_array($limit->end_date->format('j-n'), $end, true) // end of quarter && in_array($limit->end_date->format('j-n'), $end, true) // end of quarter
&& 2 === $limit->start_date->diffInMonths($limit->end_date) && 2 === (int)$limit->start_date->diffInMonths($limit->end_date, true)
) { ) {
return 'quarterly'; return 'quarterly';
} }
@@ -139,7 +139,7 @@ class AppendBudgetLimitPeriods extends Command
if ( if (
in_array($limit->start_date->format('j-n'), $start, true) // start of quarter in_array($limit->start_date->format('j-n'), $start, true) // start of quarter
&& in_array($limit->end_date->format('j-n'), $end, true) // end of quarter && in_array($limit->end_date->format('j-n'), $end, true) // end of quarter
&& 5 === $limit->start_date->diffInMonths($limit->end_date) && 5 === (int)$limit->start_date->diffInMonths($limit->end_date, true)
) { ) {
return 'half_year'; return 'half_year';
} }

View File

@@ -0,0 +1,182 @@
<?php
declare(strict_types=1);
/*
* MigrateRuleActions.php
* Copyright (c) 2024 james@firefly-iii.org.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
namespace FireflyIII\Console\Commands\Upgrade;
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
use FireflyIII\Models\RuleAction;
use Illuminate\Console\Command;
class MigrateRuleActions extends Command
{
use ShowsFriendlyMessages;
public const string CONFIG_NAME = '610_migrate_rule_actions';
protected $description = 'Migrate rule actions away from expression engine';
protected $signature = 'firefly-iii:migrate-rule-actions {--F|force : Force the execution of this command.}';
/**
* Execute the console command.
*/
public function handle(): int
{
if ($this->isExecuted() && true !== $this->option('force')) {
$this->friendlyInfo('This command has already been executed.');
return 0;
}
if (false === config('firefly.feature_flags.expression_engine')) {
$this->friendlyInfo('Expression engine is not enabled. Nothing to do.');
return 0;
}
$this->replaceEqualSign();
$this->replaceObsoleteActions();
return 0;
}
private function isExecuted(): bool
{
$configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false);
if (null !== $configVar) {
return (bool)$configVar->data;
}
return false;
}
private function replaceEqualSign(): void
{
$count = 0;
$actions = RuleAction::get();
/** @var RuleAction $action */
foreach ($actions as $action) {
if (str_starts_with($action->action_value, '=')) {
$action->action_value = sprintf('%s%s', '\=', substr($action->action_value, 1));
$action->save();
++$count;
}
}
if ($count > 0) {
$this->friendlyInfo(sprintf('Upgrading %d rule action(s) for the new expression engine.', $count));
}
if (0 === $count) {
$this->friendlyInfo('All rule actions are up to date.');
}
}
private function replaceObsoleteActions(): void
{
$obsolete = [
'append_description',
'prepend_description',
'append_notes',
'prepend_notes',
'append_descr_to_notes',
'append_notes_to_descr',
'move_descr_to_notes',
'move_notes_to_descr',
];
$actions = RuleAction::whereIn('action_type', $obsolete)->get();
/** @var RuleAction $action */
foreach ($actions as $action) {
$oldType = $action->action_type;
switch ($action->action_type) {
default:
$this->friendlyError(sprintf('Cannot deal with action type "%s", skip it.', $action->action_type));
break;
case 'append_description':
$action->action_type = 'set_description';
$action->action_value = sprintf('=description~"%s"', str_replace('"', '\"', $action->action_value));
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'prepend_description':
$action->action_type = 'set_description';
$action->action_value = sprintf('="%s"~description', str_replace('"', '\"', $action->action_value));
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'append_notes':
$action->action_type = 'set_notes';
$action->action_value = sprintf('=notes~"%s"', str_replace('"', '\"', $action->action_value));
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'prepend_notes':
$action->action_type = 'set_notes';
$action->action_value = sprintf('="%s"~notes', str_replace('"', '\"', $action->action_value));
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'append_descr_to_notes':
$action->action_type = 'set_notes';
$action->action_value = '=notes~" "~description';
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'append_notes_to_descr':
$action->action_type = 'set_description';
$action->action_value = '=description~" "~notes';
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'move_descr_to_notes':
$action->action_type = 'set_notes';
$action->action_value = '=description';
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
case 'move_notes_to_descr':
$action->action_type = 'set_description';
$action->action_value = '=notes';
$action->save();
$this->friendlyInfo(sprintf('Upgraded action #%d from "%s" to "%s".', $action->id, $oldType, $action->action_type));
break;
}
}
}
}

View File

@@ -63,6 +63,7 @@ class UpgradeDatabase extends Command
'firefly-iii:upgrade-liabilities', 'firefly-iii:upgrade-liabilities',
'firefly-iii:liabilities-600', 'firefly-iii:liabilities-600',
'firefly-iii:budget-limit-periods', 'firefly-iii:budget-limit-periods',
'firefly-iii:migrate-rule-actions',
'firefly-iii:restore-oauth-keys', 'firefly-iii:restore-oauth-keys',
// also just in case, some integrity commands: // also just in case, some integrity commands:
'firefly-iii:create-group-memberships', 'firefly-iii:create-group-memberships',

View File

@@ -26,11 +26,11 @@ class UpgradeSkeleton extends Command
{ {
$start = microtime(true); $start = microtime(true);
if ($this->isExecuted() && true !== $this->option('force')) { if ($this->isExecuted() && true !== $this->option('force')) {
$this->info('FRIENDLY This command has already been executed.'); $this->friendlyInfo('This command has already been executed.');
return 0; return 0;
} }
$this->warn('Congrats, you found the skeleton command. Boo!'); $this->friendlyWarning('Congrats, you found the skeleton command. Boo!');
//$this->markAsExecuted(); //$this->markAsExecuted();

View File

@@ -40,12 +40,12 @@ class ReportGeneratorFactory
{ {
$period = 'Month'; $period = 'Month';
// more than two months date difference means year report. // more than two months date difference means year report.
if ($start->diffInMonths($end) > 1) { if ($start->diffInMonths($end, true) > 1) {
$period = 'Year'; $period = 'Year';
} }
// more than one year date difference means multi year report. // more than one year date difference means multi-year report.
if ($start->diffInMonths($end) > 12) { if ($start->diffInMonths($end, true) > 12) {
$period = 'MultiYear'; $period = 'MultiYear';
} }

View File

@@ -405,7 +405,7 @@ class UserEventHandler
} }
// clean up old entries (6 months) // clean up old entries (6 months)
$carbon = Carbon::createFromFormat('Y-m-d H:i:s', $preference[$index]['time']); $carbon = Carbon::createFromFormat('Y-m-d H:i:s', $preference[$index]['time']);
if (false !== $carbon && $carbon->diffInMonths(today()) > 6) { if (false !== $carbon && $carbon->diffInMonths(today(), true) > 6) {
app('log')->debug(sprintf('Entry for %s is very old, remove it.', $row['ip'])); app('log')->debug(sprintf('Entry for %s is very old, remove it.', $row['ip']));
unset($preference[$index]); unset($preference[$index]);
} }

View File

@@ -236,7 +236,9 @@ class AttachmentHelper implements AttachmentHelperInterface
$fileObject->rewind(); $fileObject->rewind();
if (0 === $file->getSize()) { if (0 === $file->getSize()) {
throw new FireflyException('Cannot upload empty or non-existent file.'); $this->errors->add('attachments', trans('validation.file_zero_length'));
return null;
} }
$content = (string)$fileObject->fread($file->getSize()); $content = (string)$fileObject->fread($file->getSize());

View File

@@ -75,7 +75,7 @@ class ReconcileController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* */ * */
public function reconcile(Account $account, Carbon $start = null, Carbon $end = null) public function reconcile(Account $account, ?Carbon $start = null, ?Carbon $end = null)
{ {
if (!$this->isEditableAccount($account)) { if (!$this->isEditableAccount($account)) {
return $this->redirectAccountToAccount($account); return $this->redirectAccountToAccount($account);

View File

@@ -75,7 +75,7 @@ class ShowController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* */ * */
public function show(Request $request, Account $account, Carbon $start = null, Carbon $end = null) public function show(Request $request, Account $account, ?Carbon $start = null, ?Carbon $end = null)
{ {
$objectType = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type)); $objectType = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type));

View File

@@ -85,7 +85,7 @@ class IndexController extends Controller
* *
* @throws FireflyException * @throws FireflyException
* */ * */
public function index(Carbon $start = null, Carbon $end = null) public function index(?Carbon $start = null, ?Carbon $end = null)
{ {
$this->abRepository->cleanup(); $this->abRepository->cleanup();
app('log')->debug(sprintf('Start of IndexController::index("%s", "%s")', $start?->format('Y-m-d'), $end?->format('Y-m-d'))); app('log')->debug(sprintf('Start of IndexController::index("%s", "%s")', $start?->format('Y-m-d'), $end?->format('Y-m-d')));

View File

@@ -75,7 +75,7 @@ class ShowController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function noBudget(Request $request, Carbon $start = null, Carbon $end = null) public function noBudget(Request $request, ?Carbon $start = null, ?Carbon $end = null)
{ {
// @var Carbon $start // @var Carbon $start
$start ??= session('start'); $start ??= session('start');

View File

@@ -70,7 +70,7 @@ class NoCategoryController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function show(Request $request, Carbon $start = null, Carbon $end = null) public function show(Request $request, ?Carbon $start = null, ?Carbon $end = null)
{ {
app('log')->debug('Start of noCategory()'); app('log')->debug('Start of noCategory()');
// @var Carbon $start // @var Carbon $start

View File

@@ -71,7 +71,7 @@ class ShowController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function show(Request $request, Category $category, Carbon $start = null, Carbon $end = null) public function show(Request $request, Category $category, ?Carbon $start = null, ?Carbon $end = null)
{ {
// @var Carbon $start // @var Carbon $start
$start ??= session('start', today(config('app.timezone'))->startOfMonth()); $start ??= session('start', today(config('app.timezone'))->startOfMonth());

View File

@@ -143,7 +143,7 @@ class ReportController extends Controller
$cache->addProperty($accounts); $cache->addProperty($accounts);
$cache->addProperty($end); $cache->addProperty($end);
if ($cache->has()) { if ($cache->has()) {
return response()->json($cache->get()); // return response()->json($cache->get());
} }
app('log')->debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray()); app('log')->debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray());
@@ -220,11 +220,14 @@ class ReportController extends Controller
$currentEnd = app('navigation')->endOfPeriod($currentEnd, $preferredRange); $currentEnd = app('navigation')->endOfPeriod($currentEnd, $preferredRange);
} }
while ($currentStart <= $currentEnd) { while ($currentStart <= $currentEnd) {
$key = $currentStart->format($format); $key = $currentStart->format($format);
$title = $currentStart->isoFormat($titleFormat); $title = $currentStart->isoFormat($titleFormat);
$income['entries'][$title] = app('steam')->bcround($currency[$key]['earned'] ?? '0', $currency['currency_decimal_places']); // #8663 make sure the period exists in the data previously collected.
$expense['entries'][$title] = app('steam')->bcround($currency[$key]['spent'] ?? '0', $currency['currency_decimal_places']); if (array_key_exists($key, $currency)) {
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); $income['entries'][$title] = app('steam')->bcround($currency[$key]['earned'] ?? '0', $currency['currency_decimal_places']);
$expense['entries'][$title] = app('steam')->bcround($currency[$key]['spent'] ?? '0', $currency['currency_decimal_places']);
}
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0);
} }
$chartData[] = $income; $chartData[] = $income;

View File

@@ -89,7 +89,7 @@ class HomeController extends Controller
$label = $request->get('label'); $label = $request->get('label');
$isCustomRange = false; $isCustomRange = false;
app('log')->debug('Received dateRange', ['start' => $stringStart, 'end' => $stringEnd, 'label' => $request->get('label')]); app('log')->debug('dateRange: Received dateRange', ['start' => $stringStart, 'end' => $stringEnd, 'label' => $request->get('label')]);
// check if the label is "everything" or "Custom range" which will betray // check if the label is "everything" or "Custom range" which will betray
// a possible problem with the budgets. // a possible problem with the budgets.
if ($label === (string)trans('firefly.everything') || $label === (string)trans('firefly.customRange')) { if ($label === (string)trans('firefly.everything') || $label === (string)trans('firefly.customRange')) {
@@ -97,10 +97,10 @@ class HomeController extends Controller
app('log')->debug('Range is now marked as "custom".'); app('log')->debug('Range is now marked as "custom".');
} }
$diff = $start->diffInDays($end) + 1; $diff = $start->diffInDays($end, true) + 1;
if ($diff > 50) { if ($diff > 366) {
$request->session()->flash('warning', (string)trans('firefly.warning_much_data', ['days' => $diff])); $request->session()->flash('warning', (string)trans('firefly.warning_much_data', ['days' => (int)$diff]));
} }
$request->session()->put('is_custom_range', $isCustomRange); $request->session()->put('is_custom_range', $isCustomRange);

View File

@@ -113,7 +113,7 @@ class BoxController extends Controller
$spentAmount = $spent[$currency->id]['sum'] ?? '0'; $spentAmount = $spent[$currency->id]['sum'] ?? '0';
app('log')->debug(sprintf('Spent for default currency for all budgets in this period: %s', $spentAmount)); app('log')->debug(sprintf('Spent for default currency for all budgets in this period: %s', $spentAmount));
$days = $today->between($start, $end) ? $today->diffInDays($start) + 1 : $end->diffInDays($start) + 1; $days = (int)($today->between($start, $end) ? $today->diffInDays($start, true) + 1 : $end->diffInDays($start, true) + 1);
app('log')->debug(sprintf('Number of days left: %d', $days)); app('log')->debug(sprintf('Number of days left: %d', $days));
$spentPerDay = bcdiv($spentAmount, (string)$days); $spentPerDay = bcdiv($spentAmount, (string)$days);
app('log')->debug(sprintf('Available to spend per day: %s', $spentPerDay)); app('log')->debug(sprintf('Available to spend per day: %s', $spentPerDay));
@@ -130,7 +130,7 @@ class BoxController extends Controller
$boxTitle = (string)trans('firefly.left_to_spend'); $boxTitle = (string)trans('firefly.left_to_spend');
$activeDaysLeft = $this->activeDaysLeft($start, $end); // see method description. $activeDaysLeft = $this->activeDaysLeft($start, $end); // see method description.
$display = 1; // not overspent $display = 1; // not overspent
$leftPerDayAmount = bcdiv($leftToSpendAmount, (string)$activeDaysLeft); $leftPerDayAmount = 0 === (int) $activeDaysLeft ? $leftToSpendAmount : bcdiv($leftToSpendAmount, (string)$activeDaysLeft);
app('log')->debug(sprintf('Left to spend per day is %s', $leftPerDayAmount)); app('log')->debug(sprintf('Left to spend per day is %s', $leftPerDayAmount));
} }
} }

View File

@@ -38,7 +38,7 @@ class IntroController extends Controller
/** /**
* Returns the introduction wizard for a page. * Returns the introduction wizard for a page.
*/ */
public function getIntroSteps(string $route, string $specificPage = null): JsonResponse public function getIntroSteps(string $route, ?string $specificPage = null): JsonResponse
{ {
app('log')->debug(sprintf('getIntroSteps for route "%s" and page "%s"', $route, $specificPage)); app('log')->debug(sprintf('getIntroSteps for route "%s" and page "%s"', $route, $specificPage));
$specificPage ??= ''; $specificPage ??= '';
@@ -91,7 +91,7 @@ class IntroController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function postEnable(string $route, string $specialPage = null): JsonResponse public function postEnable(string $route, ?string $specialPage = null): JsonResponse
{ {
$specialPage ??= ''; $specialPage ??= '';
$route = str_replace('.', '_', $route); $route = str_replace('.', '_', $route);
@@ -111,7 +111,7 @@ class IntroController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function postFinished(string $route, string $specialPage = null): JsonResponse public function postFinished(string $route, ?string $specialPage = null): JsonResponse
{ {
$specialPage ??= ''; $specialPage ??= '';
$key = 'shown_demo_'.$route; $key = 'shown_demo_'.$route;

View File

@@ -67,7 +67,7 @@ class ReconcileController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function overview(Request $request, Account $account = null, Carbon $start = null, Carbon $end = null): JsonResponse public function overview(Request $request, ?Account $account = null, ?Carbon $start = null, ?Carbon $end = null): JsonResponse
{ {
$startBalance = $request->get('startBalance'); $startBalance = $request->get('startBalance');
$endBalance = $request->get('endBalance'); $endBalance = $request->get('endBalance');
@@ -177,7 +177,7 @@ class ReconcileController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(Account $account, Carbon $start = null, Carbon $end = null) public function transactions(Account $account, ?Carbon $start = null, ?Carbon $end = null)
{ {
if (null === $start || null === $end) { if (null === $start || null === $end) {
throw new FireflyException('Invalid dates submitted.'); throw new FireflyException('Invalid dates submitted.');

View File

@@ -76,7 +76,7 @@ class CreateController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function create(Request $request, RuleGroup $ruleGroup = null) public function create(Request $request, ?RuleGroup $ruleGroup = null)
{ {
$this->createDefaultRuleGroup(); $this->createDefaultRuleGroup();
$preFilled = [ $preFilled = [

View File

@@ -215,7 +215,7 @@ class TagController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function show(Request $request, Tag $tag, Carbon $start = null, Carbon $end = null) public function show(Request $request, Tag $tag, ?Carbon $start = null, ?Carbon $end = null)
{ {
// default values: // default values:
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
@@ -312,6 +312,9 @@ class TagController extends Controller
if (count($this->attachmentsHelper->getMessages()->get('attachments')) > 0) { if (count($this->attachmentsHelper->getMessages()->get('attachments')) > 0) {
$request->session()->flash('info', $this->attachmentsHelper->getMessages()->get('attachments')); $request->session()->flash('info', $this->attachmentsHelper->getMessages()->get('attachments'));
} }
if (count($this->attachmentsHelper->getErrors()->get('attachments')) > 0) {
$request->session()->flash('error', $this->attachmentsHelper->getErrors()->get('attachments'));
}
$redirect = redirect($this->getPreviousUrl('tags.create.url')); $redirect = redirect($this->getPreviousUrl('tags.create.url'));
if (1 === (int)$request->get('create_another')) { if (1 === (int)$request->get('create_another')) {
session()->put('tags.create.fromStore', true); session()->put('tags.create.fromStore', true);
@@ -347,6 +350,9 @@ class TagController extends Controller
if (count($this->attachmentsHelper->getMessages()->get('attachments')) > 0) { if (count($this->attachmentsHelper->getMessages()->get('attachments')) > 0) {
$request->session()->flash('info', $this->attachmentsHelper->getMessages()->get('attachments')); $request->session()->flash('info', $this->attachmentsHelper->getMessages()->get('attachments'));
} }
if (count($this->attachmentsHelper->getErrors()->get('attachments')) > 0) {
$request->session()->flash('error', $this->attachmentsHelper->getErrors()->get('attachments'));
}
$redirect = redirect($this->getPreviousUrl('tags.edit.url')); $redirect = redirect($this->getPreviousUrl('tags.edit.url'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int)$request->get('return_to_edit')) {
session()->put('tags.edit.fromUpdate', true); session()->put('tags.edit.fromUpdate', true);

View File

@@ -69,7 +69,7 @@ class IndexController extends Controller
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function index(Request $request, string $objectType, Carbon $start = null, Carbon $end = null) public function index(Request $request, string $objectType, ?Carbon $start = null, ?Carbon $end = null)
{ {
if ('transfers' === $objectType) { if ('transfers' === $objectType) {
$objectType = 'transfer'; $objectType = 'transfer';

View File

@@ -34,10 +34,10 @@ class TrustProxies extends Middleware
// After... // After...
protected $headers protected $headers
= Request::HEADER_X_FORWARDED_FOR | = Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB; Request::HEADER_X_FORWARDED_AWS_ELB;
/** /**
* TrustProxies constructor. * TrustProxies constructor.

View File

@@ -128,7 +128,7 @@ class WarnAboutBills implements ShouldQueue
$today = clone $this->date; $today = clone $this->date;
$carbon = clone $bill->{$field}; $carbon = clone $bill->{$field};
return $today->diffInDays($carbon, false); return (int) $today->diffInDays($carbon);
} }
private function sendWarning(Bill $bill, string $field): void private function sendWarning(Bill $bill, string $field): void

View File

@@ -122,13 +122,13 @@ class Account extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'user_id' => 'integer', 'user_id' => 'integer',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'active' => 'boolean', 'active' => 'boolean',
'encrypted' => 'boolean', 'encrypted' => 'boolean',
]; ];
protected $fillable = ['user_id', 'user_group_id', 'account_type_id', 'name', 'active', 'virtual_balance', 'iban']; protected $fillable = ['user_id', 'user_group_id', 'account_type_id', 'name', 'active', 'virtual_balance', 'iban'];

View File

@@ -59,9 +59,9 @@ class AccountMeta extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
]; ];
protected $fillable = ['account_id', 'name', 'data']; protected $fillable = ['account_id', 'name', 'data'];

View File

@@ -72,9 +72,9 @@ class AccountType extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
]; ];
protected $fillable = ['type']; protected $fillable = ['type'];

View File

@@ -97,11 +97,11 @@ class Attachment extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'uploaded' => 'boolean', 'uploaded' => 'boolean',
]; ];
protected $fillable = ['attachable_id', 'attachable_type', 'user_id', 'md5', 'filename', 'mime', 'title', 'description', 'size', 'uploaded']; protected $fillable = ['attachable_id', 'attachable_type', 'user_id', 'md5', 'filename', 'mime', 'title', 'description', 'size', 'uploaded'];

View File

@@ -80,13 +80,13 @@ class AvailableBudget extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'start_date' => 'date', 'start_date' => 'date',
'end_date' => 'date', 'end_date' => 'date',
'transaction_currency_id' => 'int', 'transaction_currency_id' => 'int',
]; ];
protected $fillable = ['user_id', 'user_group_id', 'transaction_currency_id', 'amount', 'start_date', 'end_date']; protected $fillable = ['user_id', 'user_group_id', 'transaction_currency_id', 'amount', 'start_date', 'end_date'];

View File

@@ -114,36 +114,36 @@ class Bill extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'date' => 'date', 'date' => 'date',
'end_date' => 'date', 'end_date' => 'date',
'extension_date' => 'date', 'extension_date' => 'date',
'skip' => 'int', 'skip' => 'int',
'automatch' => 'boolean', 'automatch' => 'boolean',
'active' => 'boolean', 'active' => 'boolean',
'name_encrypted' => 'boolean', 'name_encrypted' => 'boolean',
'match_encrypted' => 'boolean', 'match_encrypted' => 'boolean',
]; ];
protected $fillable protected $fillable
= [ = [
'name', 'name',
'match', 'match',
'amount_min', 'amount_min',
'user_id', 'user_id',
'user_group_id', 'user_group_id',
'amount_max', 'amount_max',
'date', 'date',
'repeat_freq', 'repeat_freq',
'skip', 'skip',
'automatch', 'automatch',
'active', 'active',
'transaction_currency_id', 'transaction_currency_id',
'end_date', 'end_date',
'extension_date', 'extension_date',
]; ];
protected $hidden = ['amount_min_encrypted', 'amount_max_encrypted', 'name_encrypted', 'match_encrypted']; protected $hidden = ['amount_min_encrypted', 'amount_max_encrypted', 'name_encrypted', 'match_encrypted'];

View File

@@ -97,12 +97,12 @@ class Budget extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'active' => 'boolean', 'active' => 'boolean',
'encrypted' => 'boolean', 'encrypted' => 'boolean',
]; ];
protected $fillable = ['user_id', 'name', 'active', 'order', 'user_group_id']; protected $fillable = ['user_id', 'name', 'active', 'order', 'user_group_id'];

View File

@@ -74,18 +74,18 @@ class BudgetLimit extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'start_date' => 'date', 'start_date' => 'date',
'end_date' => 'date', 'end_date' => 'date',
'auto_budget' => 'boolean', 'auto_budget' => 'boolean',
]; ];
protected $dispatchesEvents protected $dispatchesEvents
= [ = [
'created' => Created::class, 'created' => Created::class,
'updated' => Updated::class, 'updated' => Updated::class,
'deleted' => Deleted::class, 'deleted' => Deleted::class,
]; ];
protected $fillable = ['budget_id', 'start_date', 'end_date', 'amount', 'transaction_currency_id']; protected $fillable = ['budget_id', 'start_date', 'end_date', 'amount', 'transaction_currency_id'];

View File

@@ -86,11 +86,11 @@ class Category extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'encrypted' => 'boolean', 'encrypted' => 'boolean',
]; ];
protected $fillable = ['user_id', 'user_group_id', 'name']; protected $fillable = ['user_id', 'user_group_id', 'name'];

View File

@@ -62,10 +62,10 @@ class Configuration extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
]; ];
/** @var string The table to store the data in */ /** @var string The table to store the data in */
protected $table = 'configuration'; protected $table = 'configuration';

View File

@@ -82,13 +82,13 @@ class CurrencyExchangeRate extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'user_id' => 'int', 'user_id' => 'int',
'from_currency_id' => 'int', 'from_currency_id' => 'int',
'to_currency_id' => 'int', 'to_currency_id' => 'int',
'date' => 'datetime', 'date' => 'datetime',
]; ];
protected $fillable = ['user_id', 'from_currency_id', 'to_currency_id', 'date', 'rate']; protected $fillable = ['user_id', 'from_currency_id', 'to_currency_id', 'date', 'rate'];
public function fromCurrency(): BelongsTo public function fromCurrency(): BelongsTo

View File

@@ -70,9 +70,9 @@ class InvitedUser extends Model
protected $casts protected $casts
= [ = [
'expires' => 'datetime', 'expires' => 'datetime',
'redeemed' => 'boolean', 'redeemed' => 'boolean',
]; ];
protected $fillable = ['user_id', 'email', 'invite_code', 'expires', 'redeemed']; protected $fillable = ['user_id', 'email', 'invite_code', 'expires', 'redeemed'];
/** /**

View File

@@ -72,11 +72,11 @@ class LinkType extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'editable' => 'boolean', 'editable' => 'boolean',
]; ];
protected $fillable = ['name', 'inward', 'outward', 'editable']; protected $fillable = ['name', 'inward', 'outward', 'editable'];

View File

@@ -74,13 +74,13 @@ class Location extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'zoomLevel' => 'int', 'zoomLevel' => 'int',
'latitude' => 'float', 'latitude' => 'float',
'longitude' => 'float', 'longitude' => 'float',
]; ];
protected $fillable = ['locatable_id', 'locatable_type', 'latitude', 'longitude', 'zoom_level']; protected $fillable = ['locatable_id', 'locatable_type', 'latitude', 'longitude', 'zoom_level'];

View File

@@ -69,10 +69,10 @@ class Note extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
]; ];
protected $fillable = ['title', 'text', 'noteable_id', 'noteable_type']; protected $fillable = ['title', 'text', 'noteable_id', 'noteable_type'];

View File

@@ -79,11 +79,11 @@ class ObjectGroup extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'user_id' => 'integer', 'user_id' => 'integer',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
]; ];
protected $fillable = ['title', 'order', 'user_id', 'user_group_id']; protected $fillable = ['title', 'order', 'user_id', 'user_group_id'];
/** /**

View File

@@ -92,15 +92,15 @@ class PiggyBank extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'startdate' => 'date', 'startdate' => 'date',
'targetdate' => 'date', 'targetdate' => 'date',
'order' => 'int', 'order' => 'int',
'active' => 'boolean', 'active' => 'boolean',
'encrypted' => 'boolean', 'encrypted' => 'boolean',
]; ];
protected $fillable = ['name', 'account_id', 'order', 'targetamount', 'startdate', 'targetdate', 'active']; protected $fillable = ['name', 'account_id', 'order', 'targetamount', 'startdate', 'targetdate', 'active'];

View File

@@ -63,10 +63,10 @@ class PiggyBankEvent extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'date' => 'date', 'date' => 'date',
]; ];
protected $fillable = ['piggy_bank_id', 'transaction_journal_id', 'date', 'amount']; protected $fillable = ['piggy_bank_id', 'transaction_journal_id', 'date', 'amount'];

View File

@@ -64,11 +64,11 @@ class PiggyBankRepetition extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'startdate' => 'date', 'startdate' => 'date',
'targetdate' => 'date', 'targetdate' => 'date',
]; ];
protected $fillable = ['piggy_bank_id', 'startdate', 'targetdate', 'currentamount']; protected $fillable = ['piggy_bank_id', 'startdate', 'targetdate', 'currentamount'];

View File

@@ -63,10 +63,10 @@ class Preference extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'data' => 'array', 'data' => 'array',
]; ];
protected $fillable = ['user_id', 'data', 'name']; protected $fillable = ['user_id', 'data', 'name'];

View File

@@ -104,19 +104,19 @@ class Recurrence extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'title' => 'string', 'title' => 'string',
'id' => 'int', 'id' => 'int',
'description' => 'string', 'description' => 'string',
'first_date' => 'date', 'first_date' => 'date',
'repeat_until' => 'date', 'repeat_until' => 'date',
'latest_date' => 'date', 'latest_date' => 'date',
'repetitions' => 'int', 'repetitions' => 'int',
'active' => 'bool', 'active' => 'bool',
'apply_rules' => 'bool', 'apply_rules' => 'bool',
]; ];
protected $fillable protected $fillable
= ['user_id', 'transaction_type_id', 'title', 'description', 'first_date', 'repeat_until', 'latest_date', 'repetitions', 'apply_rules', 'active']; = ['user_id', 'transaction_type_id', 'title', 'description', 'first_date', 'repeat_until', 'latest_date', 'repetitions', 'apply_rules', 'active'];

View File

@@ -67,12 +67,12 @@ class RecurrenceMeta extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'name' => 'string', 'name' => 'string',
'value' => 'string', 'value' => 'string',
]; ];
protected $fillable = ['recurrence_id', 'name', 'value']; protected $fillable = ['recurrence_id', 'name', 'value'];

View File

@@ -76,14 +76,14 @@ class RecurrenceRepetition extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'repetition_type' => 'string', 'repetition_type' => 'string',
'repetition_moment' => 'string', 'repetition_moment' => 'string',
'repetition_skip' => 'int', 'repetition_skip' => 'int',
'weekend' => 'int', 'weekend' => 'int',
]; ];
protected $fillable = ['recurrence_id', 'weekend', 'repetition_type', 'repetition_moment', 'repetition_skip']; protected $fillable = ['recurrence_id', 'weekend', 'repetition_type', 'repetition_moment', 'repetition_skip'];

View File

@@ -91,25 +91,25 @@ class RecurrenceTransaction extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'amount' => 'string', 'amount' => 'string',
'foreign_amount' => 'string', 'foreign_amount' => 'string',
'description' => 'string', 'description' => 'string',
]; ];
protected $fillable protected $fillable
= [ = [
'recurrence_id', 'recurrence_id',
'transaction_currency_id', 'transaction_currency_id',
'foreign_currency_id', 'foreign_currency_id',
'source_id', 'source_id',
'destination_id', 'destination_id',
'amount', 'amount',
'foreign_amount', 'foreign_amount',
'description', 'description',
]; ];
/** @var string The table to store the data in */ /** @var string The table to store the data in */
protected $table = 'recurrences_transactions'; protected $table = 'recurrences_transactions';

View File

@@ -67,12 +67,12 @@ class RecurrenceTransactionMeta extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'name' => 'string', 'name' => 'string',
'value' => 'string', 'value' => 'string',
]; ];
protected $fillable = ['rt_id', 'name', 'value']; protected $fillable = ['rt_id', 'name', 'value'];

View File

@@ -62,9 +62,9 @@ class Role extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
]; ];
protected $fillable = ['name', 'display_name', 'description']; protected $fillable = ['name', 'display_name', 'description'];

View File

@@ -95,15 +95,15 @@ class Rule extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'active' => 'boolean', 'active' => 'boolean',
'order' => 'int', 'order' => 'int',
'stop_processing' => 'boolean', 'stop_processing' => 'boolean',
'id' => 'int', 'id' => 'int',
'strict' => 'boolean', 'strict' => 'boolean',
]; ];
protected $fillable = ['rule_group_id', 'order', 'active', 'title', 'description', 'user_id', 'strict']; protected $fillable = ['rule_group_id', 'order', 'active', 'title', 'description', 'user_id', 'strict'];

View File

@@ -69,12 +69,12 @@ class RuleAction extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'active' => 'boolean', 'active' => 'boolean',
'order' => 'int', 'order' => 'int',
'stop_processing' => 'boolean', 'stop_processing' => 'boolean',
]; ];
protected $fillable = ['rule_id', 'action_type', 'action_value', 'order', 'active', 'stop_processing']; protected $fillable = ['rule_id', 'action_type', 'action_value', 'order', 'active', 'stop_processing'];
@@ -85,6 +85,10 @@ class RuleAction extends Model
return (string)$this->action_value; return (string)$this->action_value;
} }
if (true === config('firefly.feature_flags.expression_engine') && str_starts_with($this->action_value, '\=')) {
// return literal string.
return substr($this->action_value, 1);
}
$expr = new ActionExpression($this->action_value); $expr = new ActionExpression($this->action_value);
try { try {

View File

@@ -85,13 +85,13 @@ class RuleGroup extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'active' => 'boolean', 'active' => 'boolean',
'stop_processing' => 'boolean', 'stop_processing' => 'boolean',
'order' => 'int', 'order' => 'int',
]; ];
protected $fillable = ['user_id', 'user_group_id', 'stop_processing', 'order', 'title', 'description', 'active']; protected $fillable = ['user_id', 'user_group_id', 'stop_processing', 'order', 'title', 'description', 'active'];

View File

@@ -66,12 +66,12 @@ class RuleTrigger extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'active' => 'boolean', 'active' => 'boolean',
'order' => 'int', 'order' => 'int',
'stop_processing' => 'boolean', 'stop_processing' => 'boolean',
]; ];
protected $fillable = ['rule_id', 'trigger_type', 'trigger_value', 'order', 'active', 'stop_processing']; protected $fillable = ['rule_id', 'trigger_type', 'trigger_value', 'order', 'active', 'stop_processing'];

View File

@@ -93,14 +93,14 @@ class Tag extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'date' => 'date', 'date' => 'date',
'zoomLevel' => 'int', 'zoomLevel' => 'int',
'latitude' => 'float', 'latitude' => 'float',
'longitude' => 'float', 'longitude' => 'float',
]; ];
protected $fillable = ['user_id', 'user_group_id', 'tag', 'date', 'description', 'tagMode']; protected $fillable = ['user_id', 'user_group_id', 'tag', 'date', 'description', 'tagMode'];

View File

@@ -99,28 +99,28 @@ class Transaction extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'identifier' => 'int', 'identifier' => 'int',
'encrypted' => 'boolean', // model does not have these fields though 'encrypted' => 'boolean', // model does not have these fields though
'bill_name_encrypted' => 'boolean', 'bill_name_encrypted' => 'boolean',
'reconciled' => 'boolean', 'reconciled' => 'boolean',
'date' => 'datetime', 'date' => 'datetime',
]; ];
protected $fillable protected $fillable
= [ = [
'account_id', 'account_id',
'transaction_journal_id', 'transaction_journal_id',
'description', 'description',
'amount', 'amount',
'identifier', 'identifier',
'transaction_currency_id', 'transaction_currency_id',
'foreign_currency_id', 'foreign_currency_id',
'foreign_amount', 'foreign_amount',
'reconciled', 'reconciled',
]; ];
protected $hidden = ['encrypted']; protected $hidden = ['encrypted'];

View File

@@ -89,12 +89,12 @@ class TransactionCurrency extends Model
public ?bool $userGroupEnabled; public ?bool $userGroupEnabled;
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'decimal_places' => 'int', 'decimal_places' => 'int',
'enabled' => 'bool', 'enabled' => 'bool',
]; ];
protected $fillable = ['name', 'code', 'symbol', 'decimal_places', 'enabled']; protected $fillable = ['name', 'code', 'symbol', 'decimal_places', 'enabled'];

View File

@@ -78,13 +78,13 @@ class TransactionGroup extends Model
protected $casts protected $casts
= [ = [
'id' => 'integer', 'id' => 'integer',
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'title' => 'string', 'title' => 'string',
'date' => 'datetime', 'date' => 'datetime',
]; ];
protected $fillable = ['user_id', 'user_group_id', 'title']; protected $fillable = ['user_id', 'user_group_id', 'title'];

View File

@@ -138,32 +138,32 @@ class TransactionJournal extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
'date' => 'datetime', 'date' => 'datetime',
'interest_date' => 'date', 'interest_date' => 'date',
'book_date' => 'date', 'book_date' => 'date',
'process_date' => 'date', 'process_date' => 'date',
'order' => 'int', 'order' => 'int',
'tag_count' => 'int', 'tag_count' => 'int',
'encrypted' => 'boolean', 'encrypted' => 'boolean',
'completed' => 'boolean', 'completed' => 'boolean',
]; ];
protected $fillable protected $fillable
= [ = [
'user_id', 'user_id',
'user_group_id', 'user_group_id',
'transaction_type_id', 'transaction_type_id',
'bill_id', 'bill_id',
'tag_count', 'tag_count',
'transaction_currency_id', 'transaction_currency_id',
'description', 'description',
'completed', 'completed',
'order', 'order',
'date', 'date',
]; ];
protected $hidden = ['encrypted']; protected $hidden = ['encrypted'];

View File

@@ -71,9 +71,9 @@ class TransactionJournalLink extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
]; ];
/** @var string The table to store the data in */ /** @var string The table to store the data in */
protected $table = 'journal_links'; protected $table = 'journal_links';

View File

@@ -69,10 +69,10 @@ class TransactionJournalMeta extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
]; ];
protected $fillable = ['transaction_journal_id', 'name', 'data', 'hash']; protected $fillable = ['transaction_journal_id', 'name', 'data', 'hash'];

View File

@@ -73,10 +73,10 @@ class TransactionType extends Model
protected $casts protected $casts
= [ = [
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'deleted_at' => 'datetime', 'deleted_at' => 'datetime',
]; ];
protected $fillable = ['type']; protected $fillable = ['type'];
/** /**

View File

@@ -93,11 +93,11 @@ class Webhook extends Model
protected $casts protected $casts
= [ = [
'active' => 'boolean', 'active' => 'boolean',
'trigger' => 'integer', 'trigger' => 'integer',
'response' => 'integer', 'response' => 'integer',
'delivery' => 'integer', 'delivery' => 'integer',
]; ];
protected $fillable = ['active', 'trigger', 'response', 'delivery', 'user_id', 'user_group_id', 'url', 'title', 'secret']; protected $fillable = ['active', 'trigger', 'response', 'delivery', 'user_id', 'user_group_id', 'url', 'title', 'secret'];
public static function getDeliveries(): array public static function getDeliveries(): array

View File

@@ -25,10 +25,9 @@ namespace FireflyIII\Providers;
use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Laravel\Passport\Passport;
use Laravel\Sanctum\Sanctum;
/** /**
* Class AppServiceProvider * Class AppServiceProvider
@@ -65,9 +64,14 @@ class AppServiceProvider extends ServiceProvider
return ''; return '';
}); });
Blade::if('partialroute', function (string $route) { Blade::if('partialroute', function (string $route, string $firstParam = '') {
$name = \Route::getCurrentRoute()->getName() ?? ''; $name = Route::getCurrentRoute()->getName() ?? '';
if (str_contains($name, $route)) { if ('' === $firstParam && str_contains($name, $route)) {
return true;
}
$params = Route::getCurrentRoute()->parameters() ?? [];
$objectType = $params['objectType'] ?? '';
if ($objectType === $firstParam && str_contains($name, $route)) {
return true; return true;
} }
@@ -80,7 +84,7 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function register(): void public function register(): void
{ {
Passport::ignoreMigrations(); // Passport::ignoreMigrations();
Sanctum::ignoreMigrations(); // Sanctum::ignoreMigrations();
} }
} }

View File

@@ -122,7 +122,7 @@ class BudgetLimitRepository implements BudgetLimitRepositoryInterface
$budgetLimit->delete(); $budgetLimit->delete();
} }
public function getAllBudgetLimitsByCurrency(TransactionCurrency $currency, Carbon $start = null, Carbon $end = null): Collection public function getAllBudgetLimitsByCurrency(TransactionCurrency $currency, ?Carbon $start = null, ?Carbon $end = null): Collection
{ {
return $this->getAllBudgetLimits($start, $end)->filter( return $this->getAllBudgetLimits($start, $end)->filter(
static function (BudgetLimit $budgetLimit) use ($currency) { static function (BudgetLimit $budgetLimit) use ($currency) {
@@ -131,7 +131,7 @@ class BudgetLimitRepository implements BudgetLimitRepositoryInterface
); );
} }
public function getAllBudgetLimits(Carbon $start = null, Carbon $end = null): Collection public function getAllBudgetLimits(?Carbon $start = null, ?Carbon $end = null): Collection
{ {
// both are NULL: // both are NULL:
if (null === $start && null === $end) { if (null === $start && null === $end) {
@@ -198,7 +198,7 @@ class BudgetLimitRepository implements BudgetLimitRepositoryInterface
; ;
} }
public function getBudgetLimits(Budget $budget, Carbon $start = null, Carbon $end = null): Collection public function getBudgetLimits(Budget $budget, ?Carbon $start = null, ?Carbon $end = null): Collection
{ {
if (null === $end && null === $start) { if (null === $end && null === $start) {
return $budget->budgetlimits()->with(['transactionCurrency'])->orderBy('budget_limits.start_date', 'DESC')->get(['budget_limits.*']); return $budget->budgetlimits()->with(['transactionCurrency'])->orderBy('budget_limits.start_date', 'DESC')->get(['budget_limits.*']);

View File

@@ -57,11 +57,11 @@ interface BudgetLimitRepositoryInterface
/** /**
* TODO this method is not multi currency aware. * TODO this method is not multi currency aware.
*/ */
public function getAllBudgetLimits(Carbon $start = null, Carbon $end = null): Collection; public function getAllBudgetLimits(?Carbon $start = null, ?Carbon $end = null): Collection;
public function getAllBudgetLimitsByCurrency(TransactionCurrency $currency, Carbon $start = null, Carbon $end = null): Collection; public function getAllBudgetLimitsByCurrency(TransactionCurrency $currency, ?Carbon $start = null, ?Carbon $end = null): Collection;
public function getBudgetLimits(Budget $budget, Carbon $start = null, Carbon $end = null): Collection; public function getBudgetLimits(Budget $budget, ?Carbon $start = null, ?Carbon $end = null): Collection;
public function setUser(null|Authenticatable|User $user): void; public function setUser(null|Authenticatable|User $user): void;

View File

@@ -132,7 +132,7 @@ class BudgetRepository implements BudgetRepositoryInterface
continue; continue;
} }
$total = $limit->start_date->diffInDays($limit->end_date) + 1; // include the day itself. $total = $limit->start_date->diffInDays($limit->end_date, true) + 1; // include the day itself.
$days = $this->daysInOverlap($limit, $start, $end); $days = $this->daysInOverlap($limit, $start, $end);
$amount = bcmul(bcdiv($limit->amount, (string)$total), (string)$days); $amount = bcmul(bcdiv($limit->amount, (string)$total), (string)$days);
$return[$currencyCode]['sum'] = bcadd($return[$currencyCode]['sum'], $amount); $return[$currencyCode]['sum'] = bcadd($return[$currencyCode]['sum'], $amount);
@@ -183,21 +183,21 @@ class BudgetRepository implements BudgetRepositoryInterface
// |-----------| // |-----------|
// |----------------| // |----------------|
if ($start->gte($limit->start_date) && $end->lte($limit->end_date)) { if ($start->gte($limit->start_date) && $end->lte($limit->end_date)) {
return $start->diffInDays($end) + 1; // add one day return (int) $start->diffInDays($end, true) + 1; // add one day
} }
// limit starts earlier and limit ends first: // limit starts earlier and limit ends first:
// |-----------| // |-----------|
// |-------| // |-------|
if ($limit->start_date->lte($start) && $limit->end_date->lte($end)) { if ($limit->start_date->lte($start) && $limit->end_date->lte($end)) {
// return days in the range $start-$limit_end // return days in the range $start-$limit_end
return $start->diffInDays($limit->end_date) + 1; // add one day, the day itself return (int) $start->diffInDays($limit->end_date, true) + 1; // add one day, the day itself
} }
// limit starts later and limit ends earlier // limit starts later and limit ends earlier
// |-----------| // |-----------|
// |-------| // |-------|
if ($limit->start_date->gte($start) && $limit->end_date->gte($end)) { if ($limit->start_date->gte($start) && $limit->end_date->gte($end)) {
// return days in the range $limit_start - $end // return days in the range $limit_start - $end
return $limit->start_date->diffInDays($end) + 1; // add one day, the day itself return (int) $limit->start_date->diffInDays($end, true) + 1; // add one day, the day itself
} }
return 0; return 0;
@@ -438,7 +438,7 @@ class BudgetRepository implements BudgetRepositoryInterface
* *
* @param null|int $budgetId |null * @param null|int $budgetId |null
*/ */
public function find(int $budgetId = null): ?Budget public function find(?int $budgetId = null): ?Budget
{ {
return $this->user->budgets()->find($budgetId); return $this->user->budgets()->find($budgetId);
} }

View File

@@ -61,7 +61,7 @@ interface BudgetRepositoryInterface
public function destroyAutoBudget(Budget $budget): void; public function destroyAutoBudget(Budget $budget): void;
public function find(int $budgetId = null): ?Budget; public function find(?int $budgetId = null): ?Budget;
public function findBudget(?int $budgetId, ?string $budgetName): ?Budget; public function findBudget(?int $budgetId, ?string $budgetName): ?Budget;

View File

@@ -51,7 +51,7 @@ class OperationsRepository implements OperationsRepositoryInterface
$total = '0'; $total = '0';
$count = 0; $count = 0;
foreach ($budget->budgetlimits as $limit) { foreach ($budget->budgetlimits as $limit) {
$diff = $limit->start_date->diffInDays($limit->end_date); $diff = (int) $limit->start_date->diffInDays($limit->end_date, true);
$diff = 0 === $diff ? 1 : $diff; $diff = 0 === $diff ? 1 : $diff;
$amount = $limit->amount; $amount = $limit->amount;
$perDay = bcdiv($amount, (string)$diff); $perDay = bcdiv($amount, (string)$diff);

View File

@@ -44,7 +44,7 @@ class LinkTypeRepository implements LinkTypeRepositoryInterface
return $linkType->transactionJournalLinks()->count(); return $linkType->transactionJournalLinks()->count();
} }
public function destroy(LinkType $linkType, LinkType $moveTo = null): bool public function destroy(LinkType $linkType, ?LinkType $moveTo = null): bool
{ {
if (null !== $moveTo) { if (null !== $moveTo) {
TransactionJournalLink::where('link_type_id', $linkType->id)->update(['link_type_id' => $moveTo->id]); TransactionJournalLink::where('link_type_id', $linkType->id)->update(['link_type_id' => $moveTo->id]);
@@ -113,7 +113,7 @@ class LinkTypeRepository implements LinkTypeRepositoryInterface
/** /**
* Returns all the journal links (of a specific type). * Returns all the journal links (of a specific type).
*/ */
public function getJournalLinks(LinkType $linkType = null): Collection public function getJournalLinks(?LinkType $linkType = null): Collection
{ {
$query = TransactionJournalLink::with(['source', 'destination']) $query = TransactionJournalLink::with(['source', 'destination'])
->leftJoin('transaction_journals as source_journals', 'journal_links.source_id', '=', 'source_journals.id') ->leftJoin('transaction_journals as source_journals', 'journal_links.source_id', '=', 'source_journals.id')
@@ -225,7 +225,7 @@ class LinkTypeRepository implements LinkTypeRepositoryInterface
return LinkType::find($linkTypeId); return LinkType::find($linkTypeId);
} }
public function findByName(string $name = null): ?LinkType public function findByName(?string $name = null): ?LinkType
{ {
if (null === $name) { if (null === $name) {
return null; return null;

View File

@@ -37,7 +37,7 @@ interface LinkTypeRepositoryInterface
{ {
public function countJournals(LinkType $linkType): int; public function countJournals(LinkType $linkType): int;
public function destroy(LinkType $linkType, LinkType $moveTo = null): bool; public function destroy(LinkType $linkType, ?LinkType $moveTo = null): bool;
public function destroyLink(TransactionJournalLink $link): bool; public function destroyLink(TransactionJournalLink $link): bool;
@@ -46,7 +46,7 @@ interface LinkTypeRepositoryInterface
/** /**
* Find link type by name. * Find link type by name.
*/ */
public function findByName(string $name = null): ?LinkType; public function findByName(?string $name = null): ?LinkType;
/** /**
* Check if link exists between journals. * Check if link exists between journals.
@@ -65,7 +65,7 @@ interface LinkTypeRepositoryInterface
*/ */
public function getJournalIds(LinkType $linkType): array; public function getJournalIds(LinkType $linkType): array;
public function getJournalLinks(LinkType $linkType = null): Collection; public function getJournalLinks(?LinkType $linkType = null): Collection;
/** /**
* Return list of existing connections. * Return list of existing connections.

View File

@@ -301,7 +301,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
if (null !== $piggyBank->targetdate && $repetition->currentamount < $piggyBank->targetamount) { if (null !== $piggyBank->targetdate && $repetition->currentamount < $piggyBank->targetamount) {
$now = today(config('app.timezone')); $now = today(config('app.timezone'));
$startDate = null !== $piggyBank->startdate && $piggyBank->startdate->gte($now) ? $piggyBank->startdate : $now; $startDate = null !== $piggyBank->startdate && $piggyBank->startdate->gte($now) ? $piggyBank->startdate : $now;
$diffInMonths = $startDate->diffInMonths($piggyBank->targetdate, false); $diffInMonths = (int) $startDate->diffInMonths($piggyBank->targetdate);
$remainingAmount = bcsub($piggyBank->targetamount, $repetition->currentamount); $remainingAmount = bcsub($piggyBank->targetamount, $repetition->currentamount);
// more than 1 month to go and still need money to save: // more than 1 month to go and still need money to save:

View File

@@ -202,7 +202,7 @@ class RecurringRepository implements RecurringRepositoryInterface
/** /**
* Returns the journals created for this recurrence, possibly limited by time. * Returns the journals created for this recurrence, possibly limited by time.
*/ */
public function getJournalCount(Recurrence $recurrence, Carbon $start = null, Carbon $end = null): int public function getJournalCount(Recurrence $recurrence, ?Carbon $start = null, ?Carbon $end = null): int
{ {
$query = TransactionJournal::leftJoin('journal_meta', 'journal_meta.transaction_journal_id', '=', 'transaction_journals.id') $query = TransactionJournal::leftJoin('journal_meta', 'journal_meta.transaction_journal_id', '=', 'transaction_journals.id')
->where('transaction_journals.user_id', $recurrence->user_id) ->where('transaction_journals.user_id', $recurrence->user_id)
@@ -476,7 +476,7 @@ class RecurringRepository implements RecurringRepositoryInterface
if (false === $repDate) { if (false === $repDate) {
$repDate = clone $today; $repDate = clone $today;
} }
$diffInYears = $today->diffInYears($repDate); $diffInYears = (int) $today->diffInYears($repDate, true);
$repDate->addYears($diffInYears); // technically not necessary. $repDate->addYears($diffInYears); // technically not necessary.
$string = $repDate->isoFormat((string)trans('config.month_and_day_no_year_js')); $string = $repDate->isoFormat((string)trans('config.month_and_day_no_year_js'));

View File

@@ -83,7 +83,7 @@ interface RecurringRepositoryInterface
/** /**
* Returns the count of journals created for this recurrence, possibly limited by time. * Returns the count of journals created for this recurrence, possibly limited by time.
*/ */
public function getJournalCount(Recurrence $recurrence, Carbon $start = null, Carbon $end = null): int; public function getJournalCount(Recurrence $recurrence, ?Carbon $start = null, ?Carbon $end = null): int;
/** /**
* Get journal ID's for journals created by this recurring transaction. * Get journal ID's for journals created by this recurring transaction.

View File

@@ -28,6 +28,7 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Services\Internal\Update\AccountUpdateService;
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -239,15 +240,19 @@ class AccountRepository implements AccountRepositoryInterface
public function getAccountsByType(array $types, ?array $sort = []): Collection public function getAccountsByType(array $types, ?array $sort = []): Collection
{ {
$sortable = ['name', 'active']; // TODO yes this is a duplicate array. $sortable = ['name', 'active']; // TODO yes this is a duplicate array.
$res = array_intersect([AccountType::ASSET, AccountType::MORTGAGE, AccountType::LOAN, AccountType::DEBT], $types); $res = array_intersect([AccountType::ASSET, AccountType::MORTGAGE, AccountType::LOAN, AccountType::DEBT], $types);
$query = $this->userGroup->accounts(); $query = $this->userGroup->accounts();
if (0 !== count($types)) { if (0 !== count($types)) {
$query->accountTypeIn($types); $query->accountTypeIn($types);
} }
// add sort parameters. At this point they're filtered to allowed fields to sort by: // add sort parameters. At this point they're filtered to allowed fields to sort by:
$hasActiveColumn = array_key_exists('active', $sort);
if (count($sort) > 0) { if (count($sort) > 0) {
if (false === $hasActiveColumn) {
$query->orderBy('accounts.active', 'DESC');
}
foreach ($sort as $column => $direction) { foreach ($sort as $column => $direction) {
if (in_array($column, $sortable, true)) { if (in_array($column, $sortable, true)) {
$query->orderBy(sprintf('accounts.%s', $column), $direction); $query->orderBy(sprintf('accounts.%s', $column), $direction);
@@ -257,9 +262,9 @@ class AccountRepository implements AccountRepositoryInterface
if (0 === count($sort)) { if (0 === count($sort)) {
if (0 !== count($res)) { if (0 !== count($res)) {
$query->orderBy('accounts.order', 'ASC'); $query->orderBy('accounts.active', 'DESC');
} }
$query->orderBy('accounts.active', 'DESC'); $query->orderBy('accounts.order', 'ASC');
$query->orderBy('accounts.name', 'ASC'); $query->orderBy('accounts.name', 'ASC');
} }
@@ -291,4 +296,13 @@ class AccountRepository implements AccountRepositoryInterface
return $dbQuery->take($limit)->get(['accounts.*']); return $dbQuery->take($limit)->get(['accounts.*']);
} }
#[\Override]
public function update(Account $account, array $data): Account
{
/** @var AccountUpdateService $service */
$service = app(AccountUpdateService::class);
return $service->update($account, $data);
}
} }

View File

@@ -73,4 +73,6 @@ interface AccountRepositoryInterface
public function setUser(User $user): void; public function setUser(User $user): void;
public function setUserGroup(UserGroup $userGroup): void; public function setUserGroup(UserGroup $userGroup): void;
public function update(Account $account, array $data): Account;
} }

View File

@@ -40,7 +40,7 @@ class Amount
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = null): string public function formatAnything(TransactionCurrency $format, string $amount, ?bool $coloured = null): string
{ {
return $this->formatFlat($format->symbol, $format->decimal_places, $amount, $coloured); return $this->formatFlat($format->symbol, $format->decimal_places, $amount, $coloured);
} }
@@ -53,7 +53,7 @@ class Amount
* *
* @SuppressWarnings(PHPMD.MissingImport) * @SuppressWarnings(PHPMD.MissingImport)
*/ */
public function formatFlat(string $symbol, int $decimalPlaces, string $amount, bool $coloured = null): string public function formatFlat(string $symbol, int $decimalPlaces, string $amount, ?bool $coloured = null): string
{ {
$locale = app('steam')->getLocale(); $locale = app('steam')->getLocale();
$rounded = app('steam')->bcround($amount, $decimalPlaces); $rounded = app('steam')->bcround($amount, $decimalPlaces);

View File

@@ -120,4 +120,12 @@ class RemoteUserProvider implements UserProvider
throw new FireflyException(sprintf('C) Did not implement %s', __METHOD__)); throw new FireflyException(sprintf('C) Did not implement %s', __METHOD__));
} }
#[\Override]
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false): void
{
app('log')->debug(sprintf('Now at %s', __METHOD__));
throw new FireflyException(sprintf('Did not implement %s', __METHOD__));
}
} }

View File

@@ -34,6 +34,10 @@ class EitherConfigKey
{ {
public static array $static public static array $static
= [ = [
// currency conversion
'cer.enabled',
// firefly iii settings
'firefly.version', 'firefly.version',
'firefly.api_version', 'firefly.api_version',
'firefly.default_location', 'firefly.default_location',

View File

@@ -113,7 +113,7 @@ class WholePeriodChartGenerator
protected function calculateStep(Carbon $start, Carbon $end): string protected function calculateStep(Carbon $start, Carbon $end): string
{ {
$step = '1D'; $step = '1D';
$months = $start->diffInMonths($end); $months = $start->diffInMonths($end, true);
if ($months > 3) { if ($months > 3) {
$step = '1W'; $step = '1W';
} }

View File

@@ -40,7 +40,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function amountNoCurrency(string $name, $value = null, array $options = null): string public function amountNoCurrency(string $name, $value = null, ?array $options = null): string
{ {
$options ??= []; $options ??= [];
$label = $this->label($name, $options); $label = $this->label($name, $options);
@@ -71,7 +71,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function checkbox(string $name, int $value = null, $checked = null, array $options = null): string public function checkbox(string $name, ?int $value = null, $checked = null, ?array $options = null): string
{ {
$options ??= []; $options ??= [];
$value ??= 1; $value ??= 1;
@@ -106,7 +106,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function date(string $name, $value = null, array $options = null): string public function date(string $name, $value = null, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -129,7 +129,7 @@ class ExpandedForm
/** /**
* @throws FireflyException * @throws FireflyException
*/ */
public function file(string $name, array $options = null): string public function file(string $name, ?array $options = null): string
{ {
$options ??= []; $options ??= [];
$label = $this->label($name, $options); $label = $this->label($name, $options);
@@ -153,7 +153,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function integer(string $name, $value = null, array $options = null): string public function integer(string $name, $value = null, ?array $options = null): string
{ {
$options ??= []; $options ??= [];
$label = $this->label($name, $options); $label = $this->label($name, $options);
@@ -179,7 +179,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function location(string $name, $value = null, array $options = null): string public function location(string $name, $value = null, ?array $options = null): string
{ {
$options ??= []; $options ??= [];
$label = $this->label($name, $options); $label = $this->label($name, $options);
@@ -227,7 +227,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function objectGroup($value = null, array $options = null): string public function objectGroup($value = null, ?array $options = null): string
{ {
$name = 'object_group'; $name = 'object_group';
$label = $this->label($name, $options); $label = $this->label($name, $options);
@@ -272,7 +272,7 @@ class ExpandedForm
/** /**
* @throws FireflyException * @throws FireflyException
*/ */
public function password(string $name, array $options = null): string public function password(string $name, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -297,7 +297,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function percentage(string $name, $value = null, array $options = null): string public function percentage(string $name, $value = null, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -323,7 +323,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function staticText(string $name, $value, array $options = null): string public function staticText(string $name, $value, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -346,7 +346,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function text(string $name, $value = null, array $options = null): string public function text(string $name, $value = null, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -370,7 +370,7 @@ class ExpandedForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function textarea(string $name, $value = null, array $options = null): string public function textarea(string $name, $value = null, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);

View File

@@ -43,7 +43,7 @@ class AccountForm
/** /**
* Grouped dropdown list of all accounts that are valid as the destination of a withdrawal. * Grouped dropdown list of all accounts that are valid as the destination of a withdrawal.
*/ */
public function activeDepositDestinations(string $name, mixed $value = null, array $options = null): string public function activeDepositDestinations(string $name, mixed $value = null, ?array $options = null): string
{ {
$types = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN, AccountType::REVENUE]; $types = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN, AccountType::REVENUE];
$repository = $this->getAccountRepository(); $repository = $this->getAccountRepository();
@@ -55,7 +55,7 @@ class AccountForm
return $this->select($name, $grouped, $value, $options); return $this->select($name, $grouped, $value, $options);
} }
private function getAccountsGrouped(array $types, AccountRepositoryInterface $repository = null): array private function getAccountsGrouped(array $types, ?AccountRepositoryInterface $repository = null): array
{ {
if (null === $repository) { if (null === $repository) {
$repository = $this->getAccountRepository(); $repository = $this->getAccountRepository();
@@ -89,7 +89,7 @@ class AccountForm
/** /**
* Grouped dropdown list of all accounts that are valid as the destination of a withdrawal. * Grouped dropdown list of all accounts that are valid as the destination of a withdrawal.
*/ */
public function activeWithdrawalDestinations(string $name, mixed $value = null, array $options = null): string public function activeWithdrawalDestinations(string $name, mixed $value = null, ?array $options = null): string
{ {
$types = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN, AccountType::EXPENSE]; $types = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN, AccountType::EXPENSE];
$repository = $this->getAccountRepository(); $repository = $this->getAccountRepository();
@@ -107,7 +107,7 @@ class AccountForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function assetAccountCheckList(string $name, array $options = null): string public function assetAccountCheckList(string $name, ?array $options = null): string
{ {
$options ??= []; $options ??= [];
$label = $this->label($name, $options); $label = $this->label($name, $options);
@@ -138,7 +138,7 @@ class AccountForm
* *
* @param mixed $value * @param mixed $value
*/ */
public function assetAccountList(string $name, $value = null, array $options = null): string public function assetAccountList(string $name, $value = null, ?array $options = null): string
{ {
$types = [AccountType::ASSET, AccountType::DEFAULT]; $types = [AccountType::ASSET, AccountType::DEFAULT];
$grouped = $this->getAccountsGrouped($types); $grouped = $this->getAccountsGrouped($types);
@@ -151,7 +151,7 @@ class AccountForm
* *
* @param mixed $value * @param mixed $value
*/ */
public function longAccountList(string $name, $value = null, array $options = null): string public function longAccountList(string $name, $value = null, ?array $options = null): string
{ {
$types = [AccountType::ASSET, AccountType::DEFAULT, AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN]; $types = [AccountType::ASSET, AccountType::DEFAULT, AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN];
$grouped = $this->getAccountsGrouped($types); $grouped = $this->getAccountsGrouped($types);

View File

@@ -42,7 +42,7 @@ class CurrencyForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function amount(string $name, $value = null, array $options = null): string public function amount(string $name, $value = null, ?array $options = null): string
{ {
return $this->currencyField($name, 'amount', $value, $options); return $this->currencyField($name, 'amount', $value, $options);
} }
@@ -50,7 +50,7 @@ class CurrencyForm
/** /**
* @throws FireflyException * @throws FireflyException
*/ */
protected function currencyField(string $name, string $view, mixed $value = null, array $options = null): string protected function currencyField(string $name, string $view, mixed $value = null, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -106,7 +106,7 @@ class CurrencyForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
public function balanceAll(string $name, $value = null, array $options = null): string public function balanceAll(string $name, $value = null, ?array $options = null): string
{ {
return $this->allCurrencyField($name, 'balance', $value, $options); return $this->allCurrencyField($name, 'balance', $value, $options);
} }
@@ -118,7 +118,7 @@ class CurrencyForm
* *
* @throws FireflyException * @throws FireflyException
*/ */
protected function allCurrencyField(string $name, string $view, $value = null, array $options = null): string protected function allCurrencyField(string $name, string $view, $value = null, ?array $options = null): string
{ {
$label = $this->label($name, $options); $label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options); $options = $this->expandOptionArray($name, $label, $options);
@@ -173,7 +173,7 @@ class CurrencyForm
* *
* @param mixed $value * @param mixed $value
*/ */
public function currencyList(string $name, $value = null, array $options = null): string public function currencyList(string $name, $value = null, ?array $options = null): string
{ {
/** @var CurrencyRepositoryInterface $currencyRepos */ /** @var CurrencyRepositoryInterface $currencyRepos */
$currencyRepos = app(CurrencyRepositoryInterface::class); $currencyRepos = app(CurrencyRepositoryInterface::class);
@@ -195,7 +195,7 @@ class CurrencyForm
* *
* @param mixed $value * @param mixed $value
*/ */
public function currencyListEmpty(string $name, $value = null, array $options = null): string public function currencyListEmpty(string $name, $value = null, ?array $options = null): string
{ {
/** @var CurrencyRepositoryInterface $currencyRepos */ /** @var CurrencyRepositoryInterface $currencyRepos */
$currencyRepos = app(CurrencyRepositoryInterface::class); $currencyRepos = app(CurrencyRepositoryInterface::class);

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