mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2026-06-09 11:55:07 +00:00
Compare commits
241 Commits
develop-20
...
develop-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f6ab2ef96 | ||
|
|
439994f64c | ||
|
|
1336b05f48 | ||
|
|
0885fb6319 | ||
|
|
7a28365f7f | ||
|
|
1b68b592c8 | ||
|
|
d37f6ad6b7 | ||
|
|
ac54acfdde | ||
|
|
b7eef25635 | ||
|
|
9dcd6bc516 | ||
|
|
11ac6dd090 | ||
|
|
05fd28e147 | ||
|
|
72fe670289 | ||
|
|
377123d41f | ||
|
|
c421315465 | ||
|
|
8805e05e07 | ||
|
|
2ba082c787 | ||
|
|
b1f32406cc | ||
|
|
17839d9a34 | ||
|
|
3d8f059f38 | ||
|
|
24af9f0e24 | ||
|
|
ce0d785819 | ||
|
|
3534367662 | ||
|
|
028a6fdd75 | ||
|
|
8d442ae1a4 | ||
|
|
b275e80571 | ||
|
|
92ea572151 | ||
|
|
9cc7747123 | ||
|
|
344bac5af0 | ||
|
|
e7cccd6aa1 | ||
|
|
f3f69ac95e | ||
|
|
40a308779a | ||
|
|
51cbe00d20 | ||
|
|
9e7013f498 | ||
|
|
41ca780790 | ||
|
|
4475a52f20 | ||
|
|
4865123d59 | ||
|
|
30fd28b928 | ||
|
|
88b74a4aab | ||
|
|
891f5cb42b | ||
|
|
502b0bb74b | ||
|
|
51b9802862 | ||
|
|
66af080b09 | ||
|
|
6192454c5a | ||
|
|
c9e533097c | ||
|
|
3c6d3069d9 | ||
|
|
11694d2667 | ||
|
|
6541ac6f34 | ||
|
|
0fd42ea43f | ||
|
|
db73ae39d1 | ||
|
|
972d75dc41 | ||
|
|
7891c24f5c | ||
|
|
7fa4d67a3f | ||
|
|
bd2e830637 | ||
|
|
b1bb0b1e84 | ||
|
|
673e3a21f9 | ||
|
|
a240074343 | ||
|
|
12baa27de9 | ||
|
|
9e60d0ca0d | ||
|
|
a86039aa78 | ||
|
|
2c14a605e4 | ||
|
|
3b94e0479a | ||
|
|
c08e3c8797 | ||
|
|
1678c15905 | ||
|
|
37a3444816 | ||
|
|
008c9b4d8f | ||
|
|
1c21154799 | ||
|
|
b8c05d6f26 | ||
|
|
85998cd3d7 | ||
|
|
67a048c279 | ||
|
|
b81943fad6 | ||
|
|
9ee1b4587c | ||
|
|
7579ae2615 | ||
|
|
c002cb795d | ||
|
|
f00852aa6a | ||
|
|
3e26f21bc4 | ||
|
|
195fb6cdb7 | ||
|
|
034280ca17 | ||
|
|
c5ce9fd1e2 | ||
|
|
3d64f7fe08 | ||
|
|
f2efb69b76 | ||
|
|
7499a414f4 | ||
|
|
8b0f790a56 | ||
|
|
b70ed32952 | ||
|
|
9e511c822e | ||
|
|
fa6c123595 | ||
|
|
ec1dfca2b5 | ||
|
|
bebd3b189e | ||
|
|
e3319dca5d | ||
|
|
a38cb85f55 | ||
|
|
0226673a01 | ||
|
|
7816f1be9b | ||
|
|
5878173e80 | ||
|
|
45c30f11bc | ||
|
|
fea97efdbf | ||
|
|
fe0e8796ca | ||
|
|
e83c5b9f86 | ||
|
|
9558f05947 | ||
|
|
f3d6bb0fb5 | ||
|
|
57010cd2e0 | ||
|
|
9436eeacaf | ||
|
|
7ddf395ea9 | ||
|
|
492c55bd76 | ||
|
|
894dea5c9c | ||
|
|
fecf12790d | ||
|
|
883c083860 | ||
|
|
e059753c43 | ||
|
|
0bac0aaaee | ||
|
|
2a68c48e2a | ||
|
|
c394034876 | ||
|
|
7bd91048ea | ||
|
|
d64bca7700 | ||
|
|
7d768cfa23 | ||
|
|
fd50fbf193 | ||
|
|
134c232f45 | ||
|
|
ce603f50d8 | ||
|
|
3b7bff4c57 | ||
|
|
1485f99579 | ||
|
|
7d24783c49 | ||
|
|
c4ee3598e1 | ||
|
|
8cf8e91448 | ||
|
|
28f2de0df7 | ||
|
|
86adf11263 | ||
|
|
045f875041 | ||
|
|
f781e9f2b6 | ||
|
|
5eb52812f0 | ||
|
|
916abd8464 | ||
|
|
6baca9510f | ||
|
|
5c22a40849 | ||
|
|
51e994056a | ||
|
|
984e735bc1 | ||
|
|
c1a271d9c4 | ||
|
|
0f9a2f010c | ||
|
|
ed9557aaa0 | ||
|
|
1cc471fcc4 | ||
|
|
6c27424bfe | ||
|
|
38576f7fe0 | ||
|
|
5b80a5bdbe | ||
|
|
0202f4abd9 | ||
|
|
615d568479 | ||
|
|
2ace0d3f23 | ||
|
|
42204f8dc1 | ||
|
|
cfac8fa569 | ||
|
|
04704392f3 | ||
|
|
4b9bbc9d6a | ||
|
|
f24f535d39 | ||
|
|
3a9ac03358 | ||
|
|
4ac7fec5f6 | ||
|
|
b6759c3fa0 | ||
|
|
4a83b1e3e5 | ||
|
|
4b701dfc4c | ||
|
|
b2997d0a5a | ||
|
|
fd8722e401 | ||
|
|
e46153330a | ||
|
|
525f0c752a | ||
|
|
13e4160e85 | ||
|
|
7806d63f91 | ||
|
|
8c620b6536 | ||
|
|
e47ce30579 | ||
|
|
7e6eadc047 | ||
|
|
dae4f6f351 | ||
|
|
8c8af51bc4 | ||
|
|
a5e1cba39c | ||
|
|
96d56ad723 | ||
|
|
e4b1c3045e | ||
|
|
e974594fe3 | ||
|
|
c93a2dc23a | ||
|
|
639efee78a | ||
|
|
eb4971fec6 | ||
|
|
0c63a3380d | ||
|
|
edd30b2d42 | ||
|
|
a4f6c2b748 | ||
|
|
5fc90e0f76 | ||
|
|
e8ab7d8a93 | ||
|
|
e73d04bc0f | ||
|
|
c0eca4298a | ||
|
|
dafb43393a | ||
|
|
ba8155a391 | ||
|
|
9e4329ebfc | ||
|
|
60e2645e54 | ||
|
|
33a9e5b3f0 | ||
|
|
cd0290475b | ||
|
|
45528cf7d3 | ||
|
|
7cfd21362a | ||
|
|
f91063c88b | ||
|
|
30c1f4c13d | ||
|
|
39be5075eb | ||
|
|
714133dad5 | ||
|
|
1caf639b85 | ||
|
|
33ad34a719 | ||
|
|
dca1d962af | ||
|
|
1ebff22785 | ||
|
|
8b14a11969 | ||
|
|
7b0e40543b | ||
|
|
ea57a0a8c8 | ||
|
|
62ee37f631 | ||
|
|
c96cc8d941 | ||
|
|
0e97b4a6b8 | ||
|
|
3de7cfd3bf | ||
|
|
a6fd805202 | ||
|
|
541e1ac7b4 | ||
|
|
1c6b8af3a3 | ||
|
|
b33b22e0b3 | ||
|
|
30cce327e8 | ||
|
|
994e3dae18 | ||
|
|
b065150968 | ||
|
|
d18e9ffad0 | ||
|
|
fad5438909 | ||
|
|
4799c3c97f | ||
|
|
0a4d401f57 | ||
|
|
f890f55864 | ||
|
|
a2189a8577 | ||
|
|
e81af7e051 | ||
|
|
32250ddc1a | ||
|
|
a9723a85d1 | ||
|
|
28fd3600b2 | ||
|
|
4df332e0d5 | ||
|
|
f72e168a0d | ||
|
|
a567280d1b | ||
|
|
420f436fb6 | ||
|
|
10a6d96134 | ||
|
|
9ee2d4d487 | ||
|
|
66b6e057f2 | ||
|
|
fade8cc41e | ||
|
|
7690042ab7 | ||
|
|
ef6ffb6f2d | ||
|
|
a158e4596c | ||
|
|
e6f616880a | ||
|
|
c57233a5f7 | ||
|
|
c1816e2136 | ||
|
|
fdcf73b775 | ||
|
|
502c392331 | ||
|
|
5af66155f8 | ||
|
|
fa9e4be353 | ||
|
|
7b7cc784d1 | ||
|
|
ee92f3bbe5 | ||
|
|
30c2625c6a | ||
|
|
2a90258cdb | ||
|
|
929bb0e5f3 | ||
|
|
91ca3f38eb | ||
|
|
b4b67b0759 |
396
.ci/php-cs-fixer/composer.lock
generated
396
.ci/php-cs-fixer/composer.lock
generated
@@ -294,42 +294,42 @@
|
||||
},
|
||||
{
|
||||
"name": "ergebnis/agent-detector",
|
||||
"version": "1.1.1",
|
||||
"version": "1.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ergebnis/agent-detector.git",
|
||||
"reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64"
|
||||
"reference": "e211f17928c8b95a51e06040792d57f5462fb271"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64",
|
||||
"reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64",
|
||||
"url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271",
|
||||
"reference": "e211f17928c8b95a51e06040792d57f5462fb271",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ergebnis/composer-normalize": "^2.50.0",
|
||||
"ergebnis/composer-normalize": "^2.51.0",
|
||||
"ergebnis/license": "^2.7.0",
|
||||
"ergebnis/php-cs-fixer-config": "^6.60.2",
|
||||
"ergebnis/phpstan-rules": "^2.13.1",
|
||||
"ergebnis/phpunit-slow-test-detector": "^2.24.0",
|
||||
"ergebnis/rector-rules": "^1.16.0",
|
||||
"ergebnis/rector-rules": "^1.18.1",
|
||||
"fakerphp/faker": "^1.24.1",
|
||||
"infection/infection": "^0.26.6",
|
||||
"phpstan/extension-installer": "^1.4.3",
|
||||
"phpstan/phpstan": "^2.1.46",
|
||||
"phpstan/phpstan": "^2.1.54",
|
||||
"phpstan/phpstan-deprecation-rules": "^2.0.4",
|
||||
"phpstan/phpstan-phpunit": "^2.0.16",
|
||||
"phpstan/phpstan-strict-rules": "^2.0.10",
|
||||
"phpunit/phpunit": "^9.6.34",
|
||||
"rector/rector": "^2.4.1"
|
||||
"rector/rector": "^2.4.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "1.0-dev"
|
||||
"dev-main": "1.2-dev"
|
||||
},
|
||||
"composer-normalize": {
|
||||
"indent-size": 2,
|
||||
@@ -359,7 +359,7 @@
|
||||
"security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md",
|
||||
"source": "https://github.com/ergebnis/agent-detector"
|
||||
},
|
||||
"time": "2026-04-10T13:45:13+00:00"
|
||||
"time": "2026-05-07T08:19:07+00:00"
|
||||
},
|
||||
{
|
||||
"name": "evenement/evenement",
|
||||
@@ -471,23 +471,23 @@
|
||||
},
|
||||
{
|
||||
"name": "friendsofphp/php-cs-fixer",
|
||||
"version": "v3.95.1",
|
||||
"version": "v3.95.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||
"reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065"
|
||||
"reference": "3f8f68856837a77e1f1d870354eca3c8747f2f72"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065",
|
||||
"reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065",
|
||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3f8f68856837a77e1f1d870354eca3c8747f2f72",
|
||||
"reference": "3f8f68856837a77e1f1d870354eca3c8747f2f72",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"clue/ndjson-react": "^1.3",
|
||||
"composer/semver": "^3.4",
|
||||
"composer/xdebug-handler": "^3.0.5",
|
||||
"ergebnis/agent-detector": "^1.1.1",
|
||||
"ergebnis/agent-detector": "^1.2",
|
||||
"ext-filter": "*",
|
||||
"ext-hash": "*",
|
||||
"ext-json": "*",
|
||||
@@ -504,16 +504,16 @@
|
||||
"symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
|
||||
"symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
|
||||
"symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0",
|
||||
"symfony/polyfill-mbstring": "^1.33",
|
||||
"symfony/polyfill-php80": "^1.33",
|
||||
"symfony/polyfill-php81": "^1.33",
|
||||
"symfony/polyfill-php84": "^1.33",
|
||||
"symfony/polyfill-mbstring": "^1.37",
|
||||
"symfony/polyfill-php80": "^1.37",
|
||||
"symfony/polyfill-php81": "^1.37",
|
||||
"symfony/polyfill-php84": "^1.37",
|
||||
"symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0",
|
||||
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"facile-it/paraunit": "^1.3.1 || ^2.8.0",
|
||||
"infection/infection": "^0.32.6",
|
||||
"facile-it/paraunit": "^1.3.1 || ^2.11.0",
|
||||
"infection/infection": "^0.32.7",
|
||||
"justinrainbow/json-schema": "^6.8.0",
|
||||
"keradus/cli-executor": "^2.3",
|
||||
"mikey179/vfsstream": "^1.6.12",
|
||||
@@ -521,9 +521,9 @@
|
||||
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8",
|
||||
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8",
|
||||
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55",
|
||||
"symfony/polyfill-php85": "^1.33",
|
||||
"symfony/polyfill-php85": "^1.37",
|
||||
"symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8",
|
||||
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8"
|
||||
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.11"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-dom": "For handling output formats in XML",
|
||||
@@ -564,7 +564,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1"
|
||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -572,7 +572,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2026-04-12T17:00:09+00:00"
|
||||
"time": "2026-06-03T18:02:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/container",
|
||||
@@ -1255,16 +1255,16 @@
|
||||
},
|
||||
{
|
||||
"name": "sebastian/diff",
|
||||
"version": "8.1.0",
|
||||
"version": "8.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/diff.git",
|
||||
"reference": "9c957d730257f49c873f3761674559bd90098a7d"
|
||||
"reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/9c957d730257f49c873f3761674559bd90098a7d",
|
||||
"reference": "9c957d730257f49c873f3761674559bd90098a7d",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47",
|
||||
"reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1277,7 +1277,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "8.1-dev"
|
||||
"dev-main": "8.3-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -1310,7 +1310,7 @@
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/diff/issues",
|
||||
"security": "https://github.com/sebastianbergmann/diff/security/policy",
|
||||
"source": "https://github.com/sebastianbergmann/diff/tree/8.1.0"
|
||||
"source": "https://github.com/sebastianbergmann/diff/tree/8.3.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1330,27 +1330,33 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-04-05T12:02:33+00:00"
|
||||
"time": "2026-05-15T04:58:09+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "5b66d385dc58f69652e56f78a4184615e3f2b7f7"
|
||||
"reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/5b66d385dc58f69652e56f78a4184615e3f2b7f7",
|
||||
"reference": "5b66d385dc58f69652e56f78a4184615e3f2b7f7",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/f5a856c6ecb56b3c21ed94a5b7bf940d857d110a",
|
||||
"reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4",
|
||||
"php": ">=8.4.1",
|
||||
"symfony/deprecation-contracts": "^2.5|^3",
|
||||
"symfony/polyfill-mbstring": "^1.0",
|
||||
"symfony/polyfill-php85": "^1.32",
|
||||
"symfony/service-contracts": "^2.5|^3",
|
||||
"symfony/string": "^7.4|^8.0"
|
||||
"symfony/string": "^7.4.6|^8.0.6"
|
||||
},
|
||||
"conflict": {
|
||||
"symfony/dependency-injection": "<8.1",
|
||||
"symfony/event-dispatcher": "<8.1"
|
||||
},
|
||||
"provide": {
|
||||
"psr/log-implementation": "1.0|2.0|3.0"
|
||||
@@ -1358,14 +1364,18 @@
|
||||
"require-dev": {
|
||||
"psr/log": "^1|^2|^3",
|
||||
"symfony/config": "^7.4|^8.0",
|
||||
"symfony/dependency-injection": "^7.4|^8.0",
|
||||
"symfony/event-dispatcher": "^7.4|^8.0",
|
||||
"symfony/dependency-injection": "^8.1",
|
||||
"symfony/event-dispatcher": "^8.1",
|
||||
"symfony/filesystem": "^7.4|^8.0",
|
||||
"symfony/http-foundation": "^7.4|^8.0",
|
||||
"symfony/http-kernel": "^7.4|^8.0",
|
||||
"symfony/lock": "^7.4|^8.0",
|
||||
"symfony/messenger": "^7.4|^8.0",
|
||||
"symfony/mime": "^7.4|^8.0",
|
||||
"symfony/process": "^7.4|^8.0",
|
||||
"symfony/stopwatch": "^7.4|^8.0",
|
||||
"symfony/uid": "^7.4|^8.0",
|
||||
"symfony/validator": "^7.4|^8.0",
|
||||
"symfony/var-dumper": "^7.4|^8.0"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -1400,7 +1410,7 @@
|
||||
"terminal"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/console/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/console/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1420,20 +1430,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/deprecation-contracts",
|
||||
"version": "v3.6.0",
|
||||
"version": "v3.7.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/deprecation-contracts.git",
|
||||
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
|
||||
"reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
|
||||
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
|
||||
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b",
|
||||
"reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1446,7 +1456,7 @@
|
||||
"name": "symfony/contracts"
|
||||
},
|
||||
"branch-alias": {
|
||||
"dev-main": "3.6-dev"
|
||||
"dev-main": "3.7-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -1471,7 +1481,7 @@
|
||||
"description": "A generic function and convention to trigger deprecation notices",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
|
||||
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1482,29 +1492,34 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-25T14:21:43+00:00"
|
||||
"time": "2026-04-13T15:52:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6"
|
||||
"reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f662acc6ab22a3d6d716dcb44c381c6002940df6",
|
||||
"reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f249ae3f680958b6f1f9dd76e5747cf0695b4102",
|
||||
"reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4",
|
||||
"php": ">=8.4.1",
|
||||
"symfony/deprecation-contracts": "^2.5|^3",
|
||||
"symfony/event-dispatcher-contracts": "^2.5|^3"
|
||||
},
|
||||
"conflict": {
|
||||
@@ -1552,7 +1567,7 @@
|
||||
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/event-dispatcher/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/event-dispatcher/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1572,20 +1587,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher-contracts",
|
||||
"version": "v3.6.0",
|
||||
"version": "v3.7.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
|
||||
"reference": "59eb412e93815df44f05f342958efa9f46b1e586"
|
||||
"reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
|
||||
"reference": "59eb412e93815df44f05f342958efa9f46b1e586",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32",
|
||||
"reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1599,7 +1614,7 @@
|
||||
"name": "symfony/contracts"
|
||||
},
|
||||
"branch-alias": {
|
||||
"dev-main": "3.6-dev"
|
||||
"dev-main": "3.7-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -1632,7 +1647,7 @@
|
||||
"standards"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
|
||||
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1643,29 +1658,34 @@
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-25T14:21:43+00:00"
|
||||
"time": "2026-01-05T13:30:16+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/filesystem",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/filesystem.git",
|
||||
"reference": "66b769ae743ce2d13e435528fbef4af03d623e5a"
|
||||
"reference": "99aec13b82b4967ec5088222c4a3ecca955949c2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/66b769ae743ce2d13e435528fbef4af03d623e5a",
|
||||
"reference": "66b769ae743ce2d13e435528fbef4af03d623e5a",
|
||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2",
|
||||
"reference": "99aec13b82b4967ec5088222c4a3ecca955949c2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4",
|
||||
"php": ">=8.4.1",
|
||||
"symfony/deprecation-contracts": "^2.5|^3",
|
||||
"symfony/polyfill-ctype": "~1.8",
|
||||
"symfony/polyfill-mbstring": "~1.8"
|
||||
},
|
||||
@@ -1698,7 +1718,7 @@
|
||||
"description": "Provides basic utilities for the filesystem",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/filesystem/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/filesystem/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1718,24 +1738,24 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
"reference": "8da41214757b87d97f181e3d14a4179286151007"
|
||||
"reference": "58d2e767a66052c1487356f953445634a8194c64"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007",
|
||||
"reference": "8da41214757b87d97f181e3d14a4179286151007",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/58d2e767a66052c1487356f953445634a8194c64",
|
||||
"reference": "58d2e767a66052c1487356f953445634a8194c64",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4"
|
||||
"php": ">=8.4.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/filesystem": "^7.4|^8.0"
|
||||
@@ -1766,7 +1786,7 @@
|
||||
"description": "Finds files and directories via an intuitive fluent interface",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/finder/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/finder/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1786,24 +1806,24 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/options-resolver",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/options-resolver.git",
|
||||
"reference": "b48bce0a70b914f6953dafbd10474df232ed4de8"
|
||||
"reference": "88f9c561f678a02d54b897014049fa839e33ff82"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/b48bce0a70b914f6953dafbd10474df232ed4de8",
|
||||
"reference": "b48bce0a70b914f6953dafbd10474df232ed4de8",
|
||||
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/88f9c561f678a02d54b897014049fa839e33ff82",
|
||||
"reference": "88f9c561f678a02d54b897014049fa839e33ff82",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4",
|
||||
"php": ">=8.4.1",
|
||||
"symfony/deprecation-contracts": "^2.5|^3"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -1837,7 +1857,7 @@
|
||||
"options"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/options-resolver/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/options-resolver/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1857,11 +1877,11 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.37.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||
@@ -1920,7 +1940,7 @@
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1944,16 +1964,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-grapheme",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.38.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||
"reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df"
|
||||
"reference": "e9247d281d694a5120554d9afaf54e070e88a603"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df",
|
||||
"reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",
|
||||
"reference": "e9247d281d694a5120554d9afaf54e070e88a603",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2002,7 +2022,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2022,20 +2042,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-04-10T16:19:22+00:00"
|
||||
"time": "2026-05-26T05:58:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.38.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
|
||||
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
|
||||
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
|
||||
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2087,7 +2107,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2107,20 +2127,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2026-05-25T13:48:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.38.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315"
|
||||
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315",
|
||||
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92",
|
||||
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2172,7 +2192,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2192,11 +2212,11 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-04-10T17:25:58+00:00"
|
||||
"time": "2026-05-26T12:51:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php80",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.37.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||
@@ -2256,7 +2276,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2280,16 +2300,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php81",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.38.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php81.git",
|
||||
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
|
||||
"reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
|
||||
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
|
||||
"reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2336,7 +2356,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2356,20 +2376,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2026-05-26T12:45:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php84",
|
||||
"version": "v1.36.0",
|
||||
"version": "v1.38.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php84.git",
|
||||
"reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06"
|
||||
"reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06",
|
||||
"reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
|
||||
"reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2416,7 +2436,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php84/tree/v1.36.0"
|
||||
"source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2436,24 +2456,104 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-04-10T18:47:49+00:00"
|
||||
"time": "2026-05-26T12:51:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v8.0.8",
|
||||
"name": "symfony/polyfill-php85",
|
||||
"version": "v1.38.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc"
|
||||
"url": "https://github.com/symfony/polyfill-php85.git",
|
||||
"reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc",
|
||||
"reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1",
|
||||
"reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4"
|
||||
"php": ">=7.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"thanks": {
|
||||
"url": "https://github.com/symfony/polyfill",
|
||||
"name": "symfony/polyfill"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Php85\\": ""
|
||||
},
|
||||
"classmap": [
|
||||
"Resources/stubs"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
|
||||
"homepage": "https://symfony.com",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"polyfill",
|
||||
"portable",
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/nicolas-grekas",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-05-26T02:25:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
|
||||
"reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4.1"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -2481,7 +2581,7 @@
|
||||
"description": "Executes commands in sub-processes",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/process/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/process/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2501,20 +2601,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/service-contracts",
|
||||
"version": "v3.6.1",
|
||||
"version": "v3.7.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/service-contracts.git",
|
||||
"reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
|
||||
"reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
|
||||
"reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
|
||||
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a",
|
||||
"reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2532,7 +2632,7 @@
|
||||
"name": "symfony/contracts"
|
||||
},
|
||||
"branch-alias": {
|
||||
"dev-main": "3.6-dev"
|
||||
"dev-main": "3.7-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -2568,7 +2668,7 @@
|
||||
"standards"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
|
||||
"source": "https://github.com/symfony/service-contracts/tree/v3.7.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2588,24 +2688,24 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2025-07-15T11:30:57+00:00"
|
||||
"time": "2026-03-28T09:44:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/stopwatch",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/stopwatch.git",
|
||||
"reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3"
|
||||
"reference": "21c07b026905d596e8379caeb115d87aa479499d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/85954ed72d5440ea4dc9a10b7e49e01df766ffa3",
|
||||
"reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3",
|
||||
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/21c07b026905d596e8379caeb115d87aa479499d",
|
||||
"reference": "21c07b026905d596e8379caeb115d87aa479499d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4",
|
||||
"php": ">=8.4.1",
|
||||
"symfony/service-contracts": "^2.5|^3"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -2634,7 +2734,7 @@
|
||||
"description": "Provides a way to profile code",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/stopwatch/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/stopwatch/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2654,24 +2754,24 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/string",
|
||||
"version": "v8.0.8",
|
||||
"version": "v8.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/string.git",
|
||||
"reference": "ae9488f874d7603f9d2dfbf120203882b645d963"
|
||||
"reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963",
|
||||
"reference": "ae9488f874d7603f9d2dfbf120203882b645d963",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9",
|
||||
"reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.4",
|
||||
"php": ">=8.4.1",
|
||||
"symfony/polyfill-ctype": "^1.8",
|
||||
"symfony/polyfill-intl-grapheme": "^1.33",
|
||||
"symfony/polyfill-intl-normalizer": "^1.0",
|
||||
@@ -2724,7 +2824,7 @@
|
||||
"utf8"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/string/tree/v8.0.8"
|
||||
"source": "https://github.com/symfony/string/tree/v8.1.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2744,7 +2844,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-30T15:14:47+00:00"
|
||||
"time": "2026-05-29T05:06:50+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
|
||||
8
.github/ISSUE_TEMPLATE/fr.yml
vendored
8
.github/ISSUE_TEMPLATE/fr.yml
vendored
@@ -12,6 +12,14 @@ body:
|
||||
required: true
|
||||
- label: I've used [the search](https://github.com/firefly-iii/firefly-iii/issues?q=is%3Aissue) and this has not been requested before.
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Use of AI
|
||||
description: AI agents like Claude and CoPilot are not reliable tools. Do not use them.
|
||||
options:
|
||||
- label: I'm a real person and wrote this bug without assistance from AI.
|
||||
required: true
|
||||
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
||||
6
.github/contributing.md
vendored
6
.github/contributing.md
vendored
@@ -1,3 +1,5 @@
|
||||
# [Contributing guidelines](https://docs.firefly-iii.org/explanation/support/#contributing-code)
|
||||
# Contributing guidelines
|
||||
|
||||
[Contributing guidelines](https://docs.firefly-iii.org/explanation/support/#contributing-code)
|
||||
This repository is part of "Firefly III", by being either a main repository for code, a supporting repository with guidelines and documentation, or a repository with tools and secondary code.
|
||||
|
||||
The [contribution guidelines](https://docs.firefly-iii.org/explanation/contributing/) for this repository are the same as they are for ALL Firefly III related repositories, and they can be found in [the Firefly III documentation](https://docs.firefly-iii.org/explanation/contributing/).
|
||||
|
||||
4
.github/pull_request_template.md
vendored
4
.github/pull_request_template.md
vendored
@@ -38,9 +38,11 @@ Example: Fixes #1234. See also #3456.
|
||||
|
||||
#### AI usage disclosure
|
||||
<!--
|
||||
If AI tools were involved in creating this PR, please check all boxes that apply
|
||||
If AI tools were involved in creating this PR, please check all boxes that apply
|
||||
below and make sure that you adhere to our Automated Contributions Policy:
|
||||
https://docs.firefly-iii.org/explanation/support/#automated-contributions-policy
|
||||
|
||||
If you remove or skip this disclosure, your PR may be ignored.
|
||||
-->
|
||||
I used AI assistance for:
|
||||
- [ ] Code generation (e.g., when writing an implementation or fixing a bug)
|
||||
|
||||
11
.github/security.md
vendored
11
.github/security.md
vendored
@@ -3,9 +3,18 @@
|
||||
Firefly III is an application to manage your personal finances. As such, the developer has adopted this security
|
||||
disclosure and response policy to ensure that critical issues are responsibly handled.
|
||||
|
||||
## AI-generated security advisories
|
||||
|
||||
> [!WARNING]
|
||||
> Due to a large number of irrelevant, noisy and uninformed AI-generated security advisories coming my way, reporting any the following security issues may result in a permanent ban from the Firefly III organization on GitHub.
|
||||
|
||||
1. Any SSRF in any user provided URL field (webhooks, ntfy, SimpleFIN, Slack). It's by design that users may set-up any URL they want, be it internal, private or non-existing.
|
||||
2. Any XSS issue without a viable attack tree. If you can find a spot where Firefly III or the associated tools render unescaped data, it's not a security issue unless you can show me an actual attack that gets that data into the system.
|
||||
3. Any issue that is not true. AI models have already *hallucinated* security issues in Firefly III. They've referred to **non-existing** functions, templates and files. Including line numbers and code excerpts. Validate your findings before you report them to me.
|
||||
|
||||
## Supported versions
|
||||
|
||||
Only the latest Firefly III release is maintained. Applicable fixes, including security fixes, will not backported to
|
||||
Only the latest Firefly III release is maintained. Applicable fixes, including security fixes, will not be backported to
|
||||
older release branches. Please refer to [releases.md](https://github.com/firefly-iii/firefly-iii/blob/main/releases.md) for details.
|
||||
|
||||
## Reporting a vulnerability - private disclosure process
|
||||
|
||||
2
.github/workflows/depsreview.yml
vendored
2
.github/workflows/depsreview.yml
vendored
@@ -13,4 +13,4 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: 'Dependency review'
|
||||
uses: actions/dependency-review-action@v4
|
||||
uses: actions/dependency-review-action@v5
|
||||
|
||||
2
.github/workflows/lock.yml
vendored
2
.github/workflows/lock.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
discussions: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: JC5/lock-threads@v6.0.6
|
||||
- uses: dessant/lock-threads@main
|
||||
with:
|
||||
issue-inactive-days: 21
|
||||
pr-inactive-days: 21
|
||||
|
||||
61
.github/workflows/pr-reply-no-disclosure.yml
vendored
Normal file
61
.github/workflows/pr-reply-no-disclosure.yml
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
name: 'PRs - Check for AI disclosure'
|
||||
|
||||
# the workflow to execute on is comments that are newly created
|
||||
on:
|
||||
pull_request:
|
||||
types: [ opened ]
|
||||
|
||||
# permissions needed for reacting to IssueOps commands on issues and PRs
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
checks: read
|
||||
|
||||
jobs:
|
||||
respond:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: |
|
||||
BODY=$(gh pr view $NUMBER --json body)
|
||||
AUTHOR=$(gh pr view $NUMBER --json author)
|
||||
|
||||
if [[ $AUTHOR == *"app/dependabot"* ]]; then
|
||||
echo "Is dependabot, stop"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Not dependabot!"
|
||||
|
||||
# $BODY must contain one of these four uses.
|
||||
if [[ $BODY != *"Code generation"* &&
|
||||
$BODY != *"Test/benchmark generation"* &&
|
||||
$BODY != *"Documentation"* &&
|
||||
$BODY != *"Research and understanding"* &&
|
||||
$BODY != *"I used AI assistance for"* ]]; then
|
||||
MESSAGE="Hi there!
|
||||
|
||||
This is an automated reply. \`Share and enjoy\`
|
||||
|
||||
You triggered an automated reply, because it seems you removed or changed the AI assistance disclosure from the PR template. Without a valid disclosure, your PR cannot be processed.
|
||||
|
||||
Even if you did not use AI, this disclosure must be present. Please reply to your PR and explain your use of AI in any or all of the following areas:
|
||||
|
||||
1. Code generation (e.g., when writing an implementation or fixing a bug)
|
||||
2. Test/benchmark generation
|
||||
3. Documentation (including examples)
|
||||
4. Research and understanding
|
||||
|
||||
There cannot be interaction with your PR without this disclosure.
|
||||
|
||||
If the disclosure is present but the bot did not pick up on it, please accept my apologies for the intrusion. Contrary to other bots, this one is just a simple \`bash\` script and it may be wrong."
|
||||
|
||||
gh pr comment "$NUMBER" --body "$MESSAGE"
|
||||
echo "Triggered on AI disclosure missing."
|
||||
exit 0
|
||||
fi
|
||||
echo "It has the disclosure"
|
||||
env:
|
||||
NUMBER: ${{ github.event.pull_request.number }}
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
11
.github/workflows/release.yml
vendored
11
.github/workflows/release.yml
vendored
@@ -99,11 +99,6 @@ jobs:
|
||||
env:
|
||||
FIREFLY_III_ROOT: /github/workspace
|
||||
GH_TOKEN: ''
|
||||
- name: Setup Mago
|
||||
uses: nhedger/setup-mago@v1
|
||||
with:
|
||||
version: "latest"
|
||||
working-directory: "."
|
||||
- name: Run CI
|
||||
run: |
|
||||
cp .env.example .env
|
||||
@@ -113,17 +108,19 @@ jobs:
|
||||
|
||||
# format code.
|
||||
echo "Will now run Mago Format"
|
||||
mago format
|
||||
./vendor/bin/mago format
|
||||
sudo chown -R runner:docker resources/lang
|
||||
echo "Will now run PHPCS"
|
||||
.ci/phpcs.sh
|
||||
|
||||
# lint and check
|
||||
echo "Will now run Mago Lint"
|
||||
mago lint
|
||||
./vendor/bin/mago lint
|
||||
echo "Will now run PHPstan"
|
||||
.ci/phpstan.sh
|
||||
rm .env
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Crowdin action
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
|
||||
@@ -4,6 +4,8 @@ Over time, many people have contributed to Firefly III. Their efforts are not al
|
||||
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
|
||||
|
||||
## 2026
|
||||
- iaohkut
|
||||
- tasnim0tantawi
|
||||
- Joe Longendyke
|
||||
- Daniel Holøien
|
||||
- Matthew Grove
|
||||
|
||||
@@ -87,8 +87,7 @@ final class BalanceController extends Controller
|
||||
|
||||
// get journals for entire period:
|
||||
|
||||
$this->collector
|
||||
->setRange($queryParameters['start'], $queryParameters['end'])
|
||||
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
|
||||
->withAccountInformation()
|
||||
->setXorAccounts($accounts)
|
||||
->setTypes([
|
||||
|
||||
@@ -179,9 +179,9 @@ final class CategoryController extends Controller
|
||||
|
||||
// order by amount
|
||||
usort($return, static fn (array $a, array $b): int => ((float) $a['entries']['spent'] + (float) $a['entries']['earned'])
|
||||
< ((float) $b['entries']['spent'] + (float) $b['entries']['earned'])
|
||||
? 1
|
||||
: -1);
|
||||
< ((float) $b['entries']['spent'] + (float) $b['entries']['earned'])
|
||||
? 1
|
||||
: -1);
|
||||
|
||||
return response()->json($this->clean($return));
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ final class PurgeController extends Controller
|
||||
Rule::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
||||
|
||||
// notes (this will actually purge EVERYBODY's deleted notes)
|
||||
Note::onlyTrashed()->forceDelete();
|
||||
Note::query()->onlyTrashed()->forceDelete();
|
||||
|
||||
// recurring transactions
|
||||
Recurrence::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
||||
|
||||
@@ -158,10 +158,7 @@ final class TagController extends Controller
|
||||
'currency_id' => (string) $foreignCurrencyId,
|
||||
'currency_code' => $journal['foreign_currency_code'],
|
||||
];
|
||||
$response[$foreignKey]['difference'] = bcadd(
|
||||
(string) $response[$foreignKey]['difference'],
|
||||
Steam::positive($journal['foreign_amount'])
|
||||
);
|
||||
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], Steam::positive($journal['foreign_amount']));
|
||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,10 +155,7 @@ final class TagController extends Controller
|
||||
'currency_id' => (string) $foreignCurrencyId,
|
||||
'currency_code' => $journal['foreign_currency_code'],
|
||||
];
|
||||
$response[$foreignKey]['difference'] = bcadd(
|
||||
(string) $response[$foreignKey]['difference'],
|
||||
Steam::positive($journal['foreign_amount'])
|
||||
);
|
||||
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], Steam::positive($journal['foreign_amount']));
|
||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,8 +59,9 @@ final class DestroyController extends Controller
|
||||
|
||||
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
||||
{
|
||||
$first = Carbon::create(1970, 1, 1);
|
||||
$this->repository->deleteRates($from, $to);
|
||||
event(new DestroyedCurrencyExchangeRate($from, $to, $this->validateUserGroup($request)));
|
||||
event(new DestroyedCurrencyExchangeRate($from, $to, $this->validateUserGroup($request), $first));
|
||||
|
||||
return response()->json([], 204);
|
||||
}
|
||||
@@ -74,7 +75,7 @@ final class DestroyController extends Controller
|
||||
if (!$exchangeRate instanceof CurrencyExchangeRate) {
|
||||
throw new FireflyException('Bla');
|
||||
}
|
||||
event(new DestroyedCurrencyExchangeRate($from, $to, $this->validateUserGroup($request)));
|
||||
event(new DestroyedCurrencyExchangeRate($from, $to, $this->validateUserGroup($request), $date));
|
||||
|
||||
return response()->json([], 204);
|
||||
}
|
||||
@@ -85,7 +86,7 @@ final class DestroyController extends Controller
|
||||
$to = $exchangeRate->toCurrency;
|
||||
$this->repository->deleteRate($exchangeRate);
|
||||
|
||||
event(new DestroyedCurrencyExchangeRate($from, $to, $this->validateUserGroup($request)));
|
||||
event(new DestroyedCurrencyExchangeRate($from, $to, $this->validateUserGroup($request), $exchangeRate->date));
|
||||
|
||||
return response()->json([], 204);
|
||||
}
|
||||
|
||||
@@ -95,7 +95,9 @@ final class StoreController extends Controller
|
||||
$transactionGroup = $this->groupRepository->store($data);
|
||||
} catch (DuplicateTransactionException $e) {
|
||||
Log::warning('Caught a duplicate transaction. Return error message.');
|
||||
$validator = Validator::make(['transactions' => [['description' => $e->getMessage()]]], ['transactions.0.description' => new IsDuplicateTransaction()]);
|
||||
$validator = Validator::make(['transactions' => [['description' => $e->getMessage()]]], [
|
||||
'transactions.0.description' => new IsDuplicateTransaction(),
|
||||
]);
|
||||
|
||||
throw new ValidationException($validator);
|
||||
} catch (FireflyException $e) {
|
||||
|
||||
@@ -31,7 +31,7 @@ use FireflyIII\Enums\WebhookResponse;
|
||||
use FireflyIII\Enums\WebhookTrigger;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Support\Binder\EitherConfigKey;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
@@ -128,7 +128,7 @@ final class ConfigurationController extends Controller
|
||||
$data = $request->getAll();
|
||||
$shortName = str_replace('configuration.', '', $name);
|
||||
|
||||
FireflyConfig::set($shortName, $data['value']);
|
||||
AppConfiguration::set($shortName, $data['value']);
|
||||
|
||||
// get updated config:
|
||||
$newConfig = $this->getDynamicConfiguration();
|
||||
@@ -148,17 +148,17 @@ final class ConfigurationController extends Controller
|
||||
*/
|
||||
private function getDynamicConfiguration(): array
|
||||
{
|
||||
$isDemoSite = FireflyConfig::get('is_demo_site', false);
|
||||
$updateCheck = FireflyConfig::get('permission_update_check', -1);
|
||||
$singleUser = FireflyConfig::get('single_user_mode', true);
|
||||
$lastCheck = FireflyConfig::get('last_update_check', 1);
|
||||
$enableExchangeRates = FireflyConfig::get('enable_exchange_rates', config('cer.enabled'));
|
||||
$useRunningBalance = FireflyConfig::get('use_running_balance', true);
|
||||
$enableExternalMap = FireflyConfig::get('enable_external_map', false);
|
||||
$enableExternalRates = FireflyConfig::get('enable_external_rates', false);
|
||||
$allowWebhooks = FireflyConfig::get('allow_webhooks', false);
|
||||
$enableBatchProcessing = FireflyConfig::get('enable_batch_processing', false);
|
||||
$validUrlProtocols = FireflyConfig::get('valid_url_protocols', 'http,https');
|
||||
$isDemoSite = AppConfiguration::get('is_demo_site', false);
|
||||
$updateCheck = AppConfiguration::get('permission_update_check', -1);
|
||||
$singleUser = AppConfiguration::get('single_user_mode', true);
|
||||
$lastCheck = AppConfiguration::get('last_update_check', 1);
|
||||
$enableExchangeRates = AppConfiguration::get('enable_exchange_rates', config('cer.enabled'));
|
||||
$useRunningBalance = AppConfiguration::get('use_running_balance', true);
|
||||
$enableExternalMap = AppConfiguration::get('enable_external_map', false);
|
||||
$enableExternalRates = AppConfiguration::get('enable_external_rates', false);
|
||||
$allowWebhooks = AppConfiguration::get('allow_webhooks', false);
|
||||
$enableBatchProcessing = AppConfiguration::get('enable_batch_processing', false);
|
||||
$validUrlProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'));
|
||||
|
||||
return [
|
||||
'is_demo_site' => $isDemoSite?->data,
|
||||
@@ -171,7 +171,7 @@ final class ConfigurationController extends Controller
|
||||
'enable_external_rates' => $enableExternalRates?->data,
|
||||
'allow_webhooks' => $allowWebhooks?->data,
|
||||
'enable_batch_processing' => $enableBatchProcessing?->data,
|
||||
'valid_url_protocols' => $validUrlProtocols->data ?? 'http,https',
|
||||
'valid_url_protocols' => $validUrlProtocols->data ?? config('firefly.valid_url_protocols'),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\System;
|
||||
|
||||
use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Api\V1\Requests\System\CronRequest;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\Http\Controllers\CronRunner;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
@@ -51,7 +51,7 @@ final class CronController extends Controller
|
||||
$return = [];
|
||||
$return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']);
|
||||
$return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']);
|
||||
if (true === FireflyConfig::get('enable_external_rates', config('cer.download_enabled'))->data) {
|
||||
if (true === AppConfiguration::get('enable_external_rates', config('cer.download_enabled'))->data) {
|
||||
$return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']);
|
||||
}
|
||||
$return['bill_notifications'] = $this->billWarningCronJob($config['force'], $config['date']);
|
||||
|
||||
@@ -30,7 +30,7 @@ use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookAttempt;
|
||||
use FireflyIII\Models\WebhookMessage;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Transformers\WebhookAttemptTransformer;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
@@ -71,7 +71,7 @@ final class AttemptController extends Controller
|
||||
if ($message->webhook_id !== $webhook->id) {
|
||||
throw new FireflyException('200040: Webhook and webhook message are no match');
|
||||
}
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf(
|
||||
'User lists webhook attempts of webhook #%d and message #%d, but webhooks are DISABLED.',
|
||||
$webhook->id,
|
||||
@@ -119,7 +119,7 @@ final class AttemptController extends Controller
|
||||
throw new FireflyException('200041: Webhook message and webhook attempt are no match');
|
||||
}
|
||||
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf(
|
||||
'User views single webhook attempt #%d of webhook #%d and message #%d, but webhooks are DISABLED',
|
||||
$attempt->id,
|
||||
|
||||
@@ -30,7 +30,7 @@ use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookAttempt;
|
||||
use FireflyIII\Models\WebhookMessage;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\Facades\Preferences;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
@@ -62,7 +62,7 @@ final class DestroyController extends Controller
|
||||
*/
|
||||
public function destroy(Webhook $webhook): JsonResponse
|
||||
{
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d. but webhooks are DISABLED.', $webhook->id));
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
@@ -92,7 +92,7 @@ final class DestroyController extends Controller
|
||||
throw new FireflyException('200041: Webhook message and webhook attempt are no match');
|
||||
}
|
||||
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf(
|
||||
'User tries to destroy webhook #%d, message #%d, attempt #%d, but webhooks are DISABLED.',
|
||||
$webhook->id,
|
||||
@@ -125,7 +125,7 @@ final class DestroyController extends Controller
|
||||
throw new FireflyException('200040: Webhook and webhook message are no match');
|
||||
}
|
||||
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf('User tries to destroy webhook #%d, message #%d, but webhooks are DISABLED.', $webhook->id, $message->id));
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
|
||||
@@ -29,7 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Models\WebhookMessage;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Transformers\WebhookMessageTransformer;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
@@ -65,7 +65,7 @@ final class MessageController extends Controller
|
||||
*/
|
||||
public function index(Webhook $webhook): JsonResponse
|
||||
{
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf('User tries to view messages of webhook #%d, but webhooks are DISABLED.', $webhook->id));
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
@@ -105,7 +105,7 @@ final class MessageController extends Controller
|
||||
if ($message->webhook_id !== $webhook->id) {
|
||||
throw new FireflyException('200040: Webhook and webhook message are no match');
|
||||
}
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->warning(sprintf('User tries to view message #%d of webhook #%d, but webhooks are DISABLED.', $message->id, $webhook->id));
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
|
||||
@@ -31,7 +31,7 @@ use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
|
||||
use FireflyIII\Models\TransactionGroup;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||
use FireflyIII\Transformers\WebhookTransformer;
|
||||
use FireflyIII\User;
|
||||
@@ -72,7 +72,7 @@ final class ShowController extends Controller
|
||||
*/
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->info('User tries to view all webhooks, but webhooks are DISABLED.');
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
@@ -114,7 +114,7 @@ final class ShowController extends Controller
|
||||
*/
|
||||
public function show(Webhook $webhook): JsonResponse
|
||||
{
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->info(sprintf('User tries to view webhook #%d, but webhooks are DISABLED.', $webhook->id));
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
@@ -146,7 +146,7 @@ final class ShowController extends Controller
|
||||
*/
|
||||
public function triggerTransaction(Webhook $webhook, TransactionGroup $group): JsonResponse
|
||||
{
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->info(sprintf(
|
||||
'User tries to trigger webhook #%d on transaction group #%d, but webhooks are DISABLED.',
|
||||
$webhook->id,
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Webhook;
|
||||
use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Api\V1\Requests\Models\Webhook\CreateRequest;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||
use FireflyIII\Transformers\WebhookTransformer;
|
||||
use FireflyIII\User;
|
||||
@@ -63,7 +63,7 @@ final class StoreController extends Controller
|
||||
public function store(CreateRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->getData();
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->info('User tries to store new webhook, but webhooks are DISABLED.', $data);
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
|
||||
@@ -28,7 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Jobs\SendWebhookMessage;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
@@ -57,7 +57,7 @@ final class SubmitController extends Controller
|
||||
*/
|
||||
public function submit(Webhook $webhook): JsonResponse
|
||||
{
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->info(sprintf('User tries to submit webhook #%d, but webhooks are DISABLED.', $webhook->id));
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
|
||||
@@ -28,7 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Api\V1\Requests\Models\Webhook\UpdateRequest;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||
use FireflyIII\Transformers\WebhookTransformer;
|
||||
use FireflyIII\User;
|
||||
@@ -62,7 +62,7 @@ final class UpdateController extends Controller
|
||||
public function update(Webhook $webhook, UpdateRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->getData();
|
||||
if (false === FireflyConfig::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
if (false === AppConfiguration::get('allow_webhooks', config('firefly.allow_webhooks'))->data) {
|
||||
Log::channel('audit')->info(sprintf('User tries to update webhook #%d, but webhooks are DISABLED.', $webhook->id), $data);
|
||||
|
||||
throw new NotFoundHttpException('Webhooks are not enabled.');
|
||||
|
||||
@@ -59,6 +59,6 @@ class AutocompleteRequest extends FormRequest
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return ['date' => 'date|after:1970-01-02|before:2038-01-17'];
|
||||
return ['date' => ['date', 'after:1970-01-02', 'before:2038-01-17']];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,11 +60,11 @@ class ChartRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'start' => 'required|date|after:1970-01-02|before:2038-01-17|before_or_equal:end',
|
||||
'end' => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start',
|
||||
'start' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17', 'before_or_equal:end'],
|
||||
'end' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17', 'after_or_equal:start'],
|
||||
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
|
||||
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
||||
'accounts' => 'nullable|array',
|
||||
'accounts' => ['nullable', 'array'],
|
||||
'accounts.*' => 'exists:accounts,id',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -46,14 +46,11 @@ class MoveTransactionsRequest extends FormRequest
|
||||
return ['original_account' => $this->convertInteger('original_account'), 'destination_account' => $this->convertInteger('destination_account')];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'original_account' => 'required|different:destination_account|belongsToUser:accounts,id',
|
||||
'destination_account' => 'required|different:original_account|belongsToUser:accounts,id',
|
||||
'original_account' => ['required', 'different:destination_account', 'belongsToUser:accounts,id'],
|
||||
'destination_account' => ['required', 'different:original_account', 'belongsToUser:accounts,id'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,6 @@ class ExportRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['type' => 'in:csv', 'accounts' => 'min:1|max:32768', 'start' => 'date|before:end', 'end' => 'date|after:start'];
|
||||
return ['type' => 'in:csv', 'accounts' => ['min:1', 'max:32768'], 'start' => ['date', 'before:end'], 'end' => ['date', 'after:start']];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,6 +55,6 @@ class SameDateRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
|
||||
return ['start' => ['required', 'date'], 'end' => ['required', 'date', 'after_or_equal:start']];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,6 @@ class SingleDateRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['date' => 'required|date|after:1970-01-02|before:2038-01-17'];
|
||||
return ['date' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17']];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ class GenericRequest extends FormRequest
|
||||
$this->bills = new Collection();
|
||||
$this->tags = new Collection();
|
||||
|
||||
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
|
||||
return ['start' => ['required', 'date'], 'end' => ['required', 'date', 'after_or_equal:start']];
|
||||
}
|
||||
|
||||
private function parseAccounts(): void
|
||||
|
||||
@@ -99,29 +99,29 @@ class StoreRequest extends FormRequest
|
||||
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
|
||||
$type = $this->convertString('type');
|
||||
$rules = [
|
||||
'name' => 'required|max:1024|min:1|uniqueAccountForUser',
|
||||
'name' => ['required', 'max:1024', 'min:1', 'uniqueAccountForUser'],
|
||||
'type' => sprintf('required|max:1024|min:1|in:%s', $types),
|
||||
'iban' => ['iban', 'nullable', new UniqueIban(null, $type)],
|
||||
'bic' => 'bic|nullable',
|
||||
'bic' => ['bic', 'nullable'],
|
||||
'account_number' => ['min:1', 'max:255', 'nullable', new UniqueAccountNumber(null, $type)],
|
||||
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
|
||||
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
|
||||
'virtual_balance' => 'numeric|nullable',
|
||||
'order' => 'numeric|nullable',
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
||||
'opening_balance' => ['numeric', 'required_with:opening_balance_date', 'nullable'],
|
||||
'opening_balance_date' => ['date', 'required_with:opening_balance', 'nullable'],
|
||||
'virtual_balance' => ['numeric', 'nullable'],
|
||||
'order' => ['numeric', 'nullable'],
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:3', 'exists:transaction_currencies,code'],
|
||||
'active' => [new IsBoolean()],
|
||||
'include_net_worth' => [new IsBoolean()],
|
||||
'account_role' => sprintf('nullable|in:%s|required_if:type,asset', $accountRoles),
|
||||
'credit_card_type' => sprintf('nullable|in:%s|required_if:account_role,ccAsset', $ccPaymentTypes),
|
||||
'monthly_payment_date' => 'nullable|date|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
|
||||
'liability_type' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:loan,debt,mortgage',
|
||||
'monthly_payment_date' => ['nullable', 'date', 'required_if:account_role,ccAsset', 'required_if:credit_card_type,monthlyFull'],
|
||||
'liability_type' => ['nullable', 'required_if:type,liability', 'required_if:type,liabilities', 'in:loan,debt,mortgage'],
|
||||
'liability_amount' => ['required_with:liability_start_date', new IsValidPositiveAmount()],
|
||||
'liability_start_date' => 'required_with:liability_amount|date',
|
||||
'liability_direction' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:credit,debit',
|
||||
'interest' => 'min:0|max:100|numeric',
|
||||
'liability_start_date' => ['required_with:liability_amount', 'date'],
|
||||
'liability_direction' => ['nullable', 'required_if:type,liability', 'required_if:type,liabilities', 'in:credit,debit'],
|
||||
'interest' => ['min:0', 'max:100', 'numeric'],
|
||||
'interest_period' => sprintf('nullable|in:%s', implode(',', config('firefly.interest_periods'))),
|
||||
'notes' => 'min:0|max:32768',
|
||||
'notes' => ['min:0', 'max:32768'],
|
||||
];
|
||||
|
||||
return Location::requestRules($rules);
|
||||
|
||||
@@ -95,24 +95,24 @@ class UpdateRequest extends FormRequest
|
||||
'name' => sprintf('min:1|max:1024|uniqueAccountForUser:%d', $account->id),
|
||||
'type' => sprintf('in:%s', $types),
|
||||
'iban' => ['iban', 'nullable', new UniqueIban($account, $this->convertString('type'))],
|
||||
'bic' => 'bic|nullable',
|
||||
'bic' => ['bic', 'nullable'],
|
||||
'account_number' => ['min:1', 'max:255', 'nullable', new UniqueAccountNumber($account, $this->convertString('type'))],
|
||||
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
|
||||
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
|
||||
'virtual_balance' => 'numeric|nullable',
|
||||
'order' => 'numeric|nullable',
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||
'opening_balance' => ['numeric', 'required_with:opening_balance_date', 'nullable'],
|
||||
'opening_balance_date' => ['date', 'required_with:opening_balance', 'nullable'],
|
||||
'virtual_balance' => ['numeric', 'nullable'],
|
||||
'order' => ['numeric', 'nullable'],
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'active' => [new IsBoolean()],
|
||||
'include_net_worth' => [new IsBoolean()],
|
||||
'account_role' => sprintf('in:%s|nullable|required_if:type,asset', $accountRoles),
|
||||
'credit_card_type' => sprintf('in:%s|nullable|required_if:account_role,ccAsset', $ccPaymentTypes),
|
||||
'monthly_payment_date' => 'date|nullable|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
|
||||
'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage',
|
||||
'liability_direction' => 'required_if:type,liability|in:credit,debit',
|
||||
'interest' => 'required_if:type,liability|min:0|max:100|numeric',
|
||||
'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly',
|
||||
'notes' => 'min:0|max:32768',
|
||||
'monthly_payment_date' => ['date', 'nullable', 'required_if:account_role,ccAsset', 'required_if:credit_card_type,monthlyFull'],
|
||||
'liability_type' => ['required_if:type,liability', 'in:loan,debt,mortgage'],
|
||||
'liability_direction' => ['required_if:type,liability', 'in:credit,debit'],
|
||||
'interest' => ['required_if:type,liability', 'min:0', 'max:100', 'numeric'],
|
||||
'interest_period' => ['required_if:type,liability', 'in:daily,monthly,yearly'],
|
||||
'notes' => ['min:0', 'max:32768'],
|
||||
];
|
||||
|
||||
return Location::requestRules($rules);
|
||||
|
||||
@@ -64,9 +64,9 @@ class StoreRequest extends FormRequest
|
||||
$model = $this->convertString('attachable_type');
|
||||
|
||||
return [
|
||||
'filename' => 'required|min:1|max:255',
|
||||
'filename' => ['required', 'min:1', 'max:255'],
|
||||
'title' => ['min:1', 'max:255'],
|
||||
'notes' => 'min:1|max:32768',
|
||||
'notes' => ['min:1', 'max:32768'],
|
||||
'attachable_type' => sprintf('required|in:%s', $models),
|
||||
'attachable_id' => ['required', 'numeric', new IsValidAttachmentModel($model)],
|
||||
];
|
||||
|
||||
@@ -68,7 +68,7 @@ class UpdateRequest extends FormRequest
|
||||
return [
|
||||
'filename' => ['min:1', 'max:255'],
|
||||
'title' => ['min:1', 'max:255'],
|
||||
'notes' => 'min:1|max:32768',
|
||||
'notes' => ['min:1', 'max:32768'],
|
||||
'attachable_type' => sprintf('in:%s', $models),
|
||||
'attachable_id' => ['numeric', new IsValidAttachmentModel($model)],
|
||||
];
|
||||
|
||||
@@ -65,11 +65,11 @@ class Request extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'end' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -77,18 +77,18 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'min:1|max:255|uniqueObjectForUser:bills,name',
|
||||
'name' => ['min:1', 'max:255', 'uniqueObjectForUser:bills,name'],
|
||||
'amount_min' => ['required', new IsValidPositiveAmount()],
|
||||
'amount_max' => ['required', new IsValidPositiveAmount()],
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||
'date' => 'date|required|after:1970-01-02|before:2038-01-17',
|
||||
'end_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17',
|
||||
'extension_date' => 'nullable|date|after:date|after:1970-01-02|before:2038-01-17',
|
||||
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly|required',
|
||||
'skip' => 'min:0|max:31|numeric',
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'date' => ['date', 'required', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end_date' => ['nullable', 'date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'extension_date' => ['nullable', 'date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'repeat_freq' => ['in:weekly,monthly,quarterly,half-year,yearly', 'required'],
|
||||
'skip' => ['min:0', 'max:31', 'numeric'],
|
||||
'active' => [new IsBoolean()],
|
||||
'notes' => 'nullable|min:1|max:32768',
|
||||
'notes' => ['nullable', 'min:1', 'max:32768'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -81,15 +81,15 @@ class UpdateRequest extends FormRequest
|
||||
'name' => sprintf('min:1|max:255|uniqueObjectForUser:bills,name,%d', $bill->id),
|
||||
'amount_min' => ['nullable', new IsValidPositiveAmount()],
|
||||
'amount_max' => ['nullable', new IsValidPositiveAmount()],
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'end_date' => 'date|after:date|after:1970-01-02|before:2038-01-17',
|
||||
'extension_date' => 'date|after:date|after:1970-01-02|before:2038-01-17',
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'date' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end_date' => ['date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'extension_date' => ['date', 'after:date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'repeat_freq' => 'in:weekly,monthly,quarterly,half-year,yearly',
|
||||
'skip' => 'min:0|max:31|numeric',
|
||||
'skip' => ['min:0', 'max:31', 'numeric'],
|
||||
'active' => [new IsBoolean()],
|
||||
'notes' => 'min:1|max:32768',
|
||||
'notes' => ['min:1', 'max:32768'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -75,11 +75,11 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|min:1|max:255|uniqueObjectForUser:budgets,name',
|
||||
'name' => ['required', 'min:1', 'max:255', 'uniqueObjectForUser:budgets,name'],
|
||||
'active' => [new IsBoolean()],
|
||||
'currency_id' => 'exists:transaction_currencies,id',
|
||||
'currency_code' => 'exists:transaction_currencies,code',
|
||||
'notes' => 'nullable|min:1|max:32768',
|
||||
'notes' => ['nullable', 'min:1', 'max:32768'],
|
||||
// auto budget info
|
||||
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
|
||||
'auto_budget_amount' => [
|
||||
@@ -88,7 +88,12 @@ class StoreRequest extends FormRequest
|
||||
'required_if:auto_budget_type,adjusted',
|
||||
new IsValidPositiveAmount(),
|
||||
],
|
||||
'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover|required_if:auto_budget_type,adjusted',
|
||||
'auto_budget_period' => [
|
||||
'in:daily,weekly,monthly,quarterly,half_year,yearly',
|
||||
'required_if:auto_budget_type,reset',
|
||||
'required_if:auto_budget_type,rollover',
|
||||
'required_if:auto_budget_type,adjusted',
|
||||
],
|
||||
|
||||
// webhooks
|
||||
'fire_webhooks' => [new IsBoolean()],
|
||||
|
||||
@@ -85,7 +85,7 @@ class UpdateRequest extends FormRequest
|
||||
return [
|
||||
'name' => sprintf('min:1|max:100|uniqueObjectForUser:budgets,name,%d', $budget->id),
|
||||
'active' => [new IsBoolean()],
|
||||
'notes' => 'nullable|min:1|max:32768',
|
||||
'notes' => ['nullable', 'min:1', 'max:32768'],
|
||||
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
|
||||
'auto_budget_currency_id' => 'exists:transaction_currencies,id',
|
||||
'auto_budget_currency_code' => 'exists:transaction_currencies,code',
|
||||
|
||||
@@ -71,12 +71,12 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'start' => 'required|before:end|date',
|
||||
'end' => 'required|after:start|date',
|
||||
'start' => ['required', 'before:end', 'date'],
|
||||
'end' => ['required', 'after:start', 'date'],
|
||||
'amount' => ['required', new IsValidPositiveAmount()],
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||
'notes' => 'nullable|min:0|max:32768',
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'notes' => ['nullable', 'min:0', 'max:32768'],
|
||||
|
||||
// webhooks
|
||||
'fire_webhooks' => [new IsBoolean()],
|
||||
|
||||
@@ -73,12 +73,12 @@ class UpdateRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'end' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||
'notes' => 'nullable|min:0|max:32768',
|
||||
'currency_id' => ['numeric', 'exists:transaction_currencies,id'],
|
||||
'currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'notes' => ['nullable', 'min:0', 'max:32768'],
|
||||
|
||||
// webhooks
|
||||
'fire_webhooks' => [new IsBoolean()],
|
||||
|
||||
@@ -51,6 +51,6 @@ class StoreRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['name' => 'required|min:1|max:100|uniqueObjectForUser:categories,name'];
|
||||
return ['name' => ['required', 'min:1', 'max:100', 'uniqueObjectForUser:categories,name']];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ class StoreByCurrenciesRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['*' => 'required|numeric|min:0.0000000001'];
|
||||
return ['*' => ['required', 'numeric', 'min:0.0000000001']];
|
||||
}
|
||||
|
||||
public function withValidator(Validator $validator): void
|
||||
|
||||
@@ -54,12 +54,14 @@ class StoreByDateRequest extends FormRequest
|
||||
|
||||
/**
|
||||
* The rules that the incoming request must be matched against.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['from' => 'required|exists:transaction_currencies,code', 'rates' => 'required|array', 'rates.*' => 'required|numeric|min:0.0000000001'];
|
||||
return [
|
||||
'from' => ['required', 'exists:transaction_currencies,code'],
|
||||
'rates' => ['required', 'array'],
|
||||
'rates.*' => ['required', 'numeric', 'min:0.0000000001'],
|
||||
];
|
||||
}
|
||||
|
||||
public function withValidator(Validator $validator): void
|
||||
|
||||
@@ -64,10 +64,10 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||
'rate' => 'required|numeric|gt:0',
|
||||
'from' => 'required|exists:transaction_currencies,code',
|
||||
'to' => 'required|exists:transaction_currencies,code',
|
||||
'date' => ['required', 'date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'rate' => ['required', 'numeric', 'gt:0'],
|
||||
'from' => ['required', 'exists:transaction_currencies,code'],
|
||||
'to' => ['required', 'exists:transaction_currencies,code'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,10 +52,10 @@ class UpdateRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'rate' => 'required|numeric|gt:0',
|
||||
'from' => 'nullable|exists:transaction_currencies,code',
|
||||
'to' => 'nullable|exists:transaction_currencies,code',
|
||||
'date' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'rate' => ['required', 'numeric', 'gt:0'],
|
||||
'from' => ['nullable', 'exists:transaction_currencies,code'],
|
||||
'to' => ['nullable', 'exists:transaction_currencies,code'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class StoreRequest extends FormRequest
|
||||
*/
|
||||
public function getAll(): array
|
||||
{
|
||||
$fields = ['order' => ['order', 'convertInteger']];
|
||||
$fields = ['order' => ['order', 'convertInteger']];
|
||||
$data = $this->getAllData($fields);
|
||||
$data['name'] = $this->convertString('name');
|
||||
$data['accounts'] = $this->parseAccounts($this->get('accounts'));
|
||||
@@ -71,18 +71,18 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|min:1|max:255|uniquePiggyBankForUser',
|
||||
'name' => ['required', 'min:1', 'max:255', 'uniquePiggyBankForUser'],
|
||||
'accounts' => 'required',
|
||||
'accounts.*' => 'array|required',
|
||||
'accounts.*.account_id' => 'required|numeric|belongsToUser:accounts,id',
|
||||
'accounts.*' => ['array', 'required'],
|
||||
'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'],
|
||||
'accounts.*.current_amount' => ['numeric', new IsValidZeroOrMoreAmount()],
|
||||
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
|
||||
'object_group_id' => ['numeric', 'belongsToUser:object_groups,id'],
|
||||
'object_group_title' => ['min:1', 'max:255'],
|
||||
'target_amount' => ['required', new IsValidZeroOrMoreAmount()],
|
||||
'start_date' => 'required|date|after:1970-01-01|before:2038-01-17',
|
||||
'transaction_currency_id' => 'exists:transaction_currencies,id|required_without:transaction_currency_code',
|
||||
'transaction_currency_code' => 'exists:transaction_currencies,code|required_without:transaction_currency_id',
|
||||
'target_date' => 'date|nullable|after:start_date',
|
||||
'start_date' => ['required', 'date', 'after:1970-01-01', 'before:2038-01-17'],
|
||||
'transaction_currency_id' => ['exists:transaction_currencies,id', 'required_without:transaction_currency_code'],
|
||||
'transaction_currency_code' => ['exists:transaction_currencies,code', 'required_without:transaction_currency_id'],
|
||||
'target_date' => ['date', 'nullable', 'after:start_date'],
|
||||
'notes' => 'max:65000',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -79,17 +79,17 @@ class UpdateRequest extends FormRequest
|
||||
'name' => 'min:1|max:255|uniquePiggyBankForUser:'.$piggyBank->id,
|
||||
'current_amount' => ['nullable', new LessThanPiggyTarget(), new IsValidPositiveAmount()],
|
||||
'target_amount' => ['nullable', new IsValidZeroOrMoreAmount()],
|
||||
'start_date' => 'date|nullable',
|
||||
'target_date' => 'date|nullable|after:start_date',
|
||||
'start_date' => ['date', 'nullable'],
|
||||
'target_date' => ['date', 'nullable', 'after:start_date'],
|
||||
'notes' => 'max:65000',
|
||||
'accounts' => 'array',
|
||||
'accounts.*' => 'array',
|
||||
'accounts.*.account_id' => ['required', 'numeric', 'belongsToUser:accounts,id'],
|
||||
'accounts.*.current_amount' => ['numeric', 'nullable', new IsValidZeroOrMoreAmount(true), new IsEnoughInAccounts($piggyBank, $this->getAll())],
|
||||
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
|
||||
'object_group_id' => ['numeric', 'belongsToUser:object_groups,id'],
|
||||
'object_group_title' => ['min:1', 'max:255'],
|
||||
'transaction_currency_id' => 'exists:transaction_currencies,id|nullable',
|
||||
'transaction_currency_code' => 'exists:transaction_currencies,code|nullable',
|
||||
'transaction_currency_id' => ['exists:transaction_currencies,id', 'nullable'],
|
||||
'transaction_currency_code' => ['exists:transaction_currencies,code', 'nullable'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,40 +78,40 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'type' => 'required|in:withdrawal,transfer,deposit',
|
||||
'title' => 'required|min:1|max:255|uniqueObjectForUser:recurrences,title',
|
||||
'description' => 'min:1|max:32768',
|
||||
'first_date' => 'required|date',
|
||||
'type' => ['required', 'in:withdrawal,transfer,deposit'],
|
||||
'title' => ['required', 'min:1', 'max:255', 'uniqueObjectForUser:recurrences,title'],
|
||||
'description' => ['min:1', 'max:32768'],
|
||||
'first_date' => ['required', 'date'],
|
||||
'apply_rules' => [new IsBoolean()],
|
||||
'active' => [new IsBoolean()],
|
||||
'repeat_until' => 'nullable|date',
|
||||
'nr_of_repetitions' => 'nullable|numeric|min:1|max:31',
|
||||
'repeat_until' => ['nullable', 'date'],
|
||||
'nr_of_repetitions' => ['nullable', 'numeric', 'min:1', 'max:255'],
|
||||
|
||||
'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly',
|
||||
'repetitions.*.moment' => 'min:0|max:10',
|
||||
'repetitions.*.skip' => 'nullable|numeric|min:0|max:31',
|
||||
'repetitions.*.weekend' => 'numeric|min:1|max:4',
|
||||
'repetitions.*.type' => ['required', 'in:daily,weekly,ndom,monthly,yearly'],
|
||||
'repetitions.*.moment' => ['min:0', 'max:10'],
|
||||
'repetitions.*.skip' => ['nullable', 'numeric', 'min:0', 'max:31'],
|
||||
'repetitions.*.weekend' => ['numeric', 'min:1', 'max:4'],
|
||||
|
||||
'transactions.*.description' => 'required|min:1|max:255',
|
||||
'transactions.*.description' => ['required', 'min:1', 'max:255'],
|
||||
'transactions.*.amount' => ['required', new IsValidPositiveAmount()],
|
||||
'transactions.*.foreign_amount' => ['nullable', new IsValidPositiveAmount()],
|
||||
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||
'transactions.*.currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||
'transactions.*.currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
|
||||
'transactions.*.currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'transactions.*.foreign_currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
|
||||
'transactions.*.foreign_currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.source_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.destination_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
|
||||
|
||||
// new and updated fields:
|
||||
'transactions.*.budget_id' => ['nullable', 'mustExist:budgets,id', new BelongsUser()],
|
||||
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.category_id' => ['nullable', 'mustExist:categories,id', new BelongsUser()],
|
||||
'transactions.*.category_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.piggy_bank_id' => ['nullable', 'numeric', 'mustExist:piggy_banks,id', new BelongsUser()],
|
||||
'transactions.*.piggy_bank_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.tags' => 'nullable|min:1|max:255',
|
||||
'transactions.*.tags' => ['nullable', 'min:1', 'max:255'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ class UpdateRequest extends FormRequest
|
||||
];
|
||||
$reps = $this->getRepetitionData();
|
||||
$transactions = $this->getTransactionData();
|
||||
$return = ['recurrence' => $this->getAllData($fields)];
|
||||
$return = ['recurrence' => $this->getAllData($fields)];
|
||||
if (null !== $reps) {
|
||||
$return['repetitions'] = $reps;
|
||||
}
|
||||
@@ -89,38 +89,38 @@ class UpdateRequest extends FormRequest
|
||||
|
||||
return [
|
||||
'title' => sprintf('min:1|max:255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id),
|
||||
'description' => 'min:1|max:32768',
|
||||
'first_date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'description' => ['min:1', 'max:32768'],
|
||||
'first_date' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'apply_rules' => [new IsBoolean()],
|
||||
'active' => [new IsBoolean()],
|
||||
'repeat_until' => 'nullable|date',
|
||||
'nr_of_repetitions' => 'nullable|numeric|min:1|max:31',
|
||||
'repeat_until' => ['nullable', 'date'],
|
||||
'nr_of_repetitions' => ['nullable', 'numeric', 'min:1', 'max:255'],
|
||||
|
||||
'repetitions.*.type' => 'in:daily,weekly,ndom,monthly,yearly',
|
||||
'repetitions.*.moment' => 'min:0|max:10|numeric',
|
||||
'repetitions.*.skip' => 'nullable|numeric|min:0|max:31',
|
||||
'repetitions.*.weekend' => 'nullable|numeric|min:1|max:4',
|
||||
'repetitions.*.moment' => ['min:0', 'max:10', 'numeric'],
|
||||
'repetitions.*.skip' => ['nullable', 'numeric', 'min:0', 'max:31'],
|
||||
'repetitions.*.weekend' => ['nullable', 'numeric', 'min:1', 'max:4'],
|
||||
|
||||
'transactions.*.description' => ['min:1', 'max:255'],
|
||||
'transactions.*.amount' => [new IsValidPositiveAmount()],
|
||||
'transactions.*.foreign_amount' => ['nullable', new IsValidPositiveAmount()],
|
||||
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||
'transactions.*.currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||
'transactions.*.currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
|
||||
'transactions.*.currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'transactions.*.foreign_currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
|
||||
'transactions.*.foreign_currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.source_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.destination_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
|
||||
|
||||
// new and updated fields:
|
||||
'transactions.*.budget_id' => ['nullable', 'mustExist:budgets,id', new BelongsUser()],
|
||||
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.category_id' => ['nullable', 'mustExist:categories,id', new BelongsUser()],
|
||||
'transactions.*.category_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.piggy_bank_id' => ['nullable', 'numeric', 'mustExist:piggy_banks,id', new BelongsUser()],
|
||||
'transactions.*.piggy_bank_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.tags' => 'nullable|min:1|max:255',
|
||||
'transactions.*.tags' => ['nullable', 'min:1', 'max:255'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -80,11 +80,11 @@ class StoreRequest extends FormRequest
|
||||
$contextActions = implode(',', config('firefly.context-rule-actions'));
|
||||
|
||||
return [
|
||||
'title' => 'required|min:1|max:100|uniqueObjectForUser:rules,title',
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'rule_group_id' => 'belongsToUser:rule_groups|required_without:rule_group_title',
|
||||
'rule_group_title' => 'nullable|min:1|max:255|required_without:rule_group_id|belongsToUser:rule_groups,title',
|
||||
'trigger' => 'required|in:store-journal,update-journal,manual-activation',
|
||||
'title' => ['required', 'min:1', 'max:100', 'uniqueObjectForUser:rules,title'],
|
||||
'description' => ['min:1', 'max:32768', 'nullable'],
|
||||
'rule_group_id' => ['belongsToUser:rule_groups', 'required_without:rule_group_title'],
|
||||
'rule_group_title' => ['nullable', 'min:1', 'max:255', 'required_without:rule_group_id', 'belongsToUser:rule_groups,title'],
|
||||
'trigger' => ['required', 'in:store-journal,update-journal,manual-activation'],
|
||||
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
|
||||
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024',
|
||||
'triggers.*.stop_processing' => [new IsBoolean()],
|
||||
|
||||
@@ -47,10 +47,10 @@ class TestRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'accounts' => '',
|
||||
'accounts.*' => 'required|exists:accounts,id|belongsToUser:accounts',
|
||||
'accounts.*' => ['required', 'exists:accounts,id', 'belongsToUser:accounts'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -47,10 +47,10 @@ class TriggerRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'accounts' => '',
|
||||
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
||||
'accounts.*' => ['exists:accounts,id', 'belongsToUser:accounts'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -91,9 +91,9 @@ class UpdateRequest extends FormRequest
|
||||
|
||||
return [
|
||||
'title' => sprintf('min:1|max:100|uniqueObjectForUser:rules,title,%d', $rule->id),
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'description' => ['min:1', 'max:32768', 'nullable'],
|
||||
'rule_group_id' => 'belongsToUser:rule_groups',
|
||||
'rule_group_title' => 'nullable|min:1|max:255|belongsToUser:rule_groups,title',
|
||||
'rule_group_title' => ['nullable', 'min:1', 'max:255', 'belongsToUser:rule_groups,title'],
|
||||
'trigger' => 'in:store-journal,update-journal,manual-activation',
|
||||
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
|
||||
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024',
|
||||
@@ -106,7 +106,7 @@ class UpdateRequest extends FormRequest
|
||||
'strict' => [new IsBoolean()],
|
||||
'stop_processing' => [new IsBoolean()],
|
||||
'active' => [new IsBoolean()],
|
||||
'order' => 'numeric|min:1|max:2048',
|
||||
'order' => ['numeric', 'min:1', 'max:2048'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -67,8 +67,8 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'title' => 'required|min:1|max:100|uniqueObjectForUser:rule_groups,title',
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'title' => ['required', 'min:1', 'max:100', 'uniqueObjectForUser:rule_groups,title'],
|
||||
'description' => ['min:1', 'max:32768', 'nullable'],
|
||||
'active' => [new IsBoolean()],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -47,10 +47,10 @@ class TestRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'start' => 'date|after:1970-01-02|before:2038-01-17',
|
||||
'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17',
|
||||
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'accounts' => '',
|
||||
'accounts.*' => 'exists:accounts,id|belongsToUser:accounts',
|
||||
'accounts.*' => ['exists:accounts,id', 'belongsToUser:accounts'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,10 @@ class TriggerRequest extends FormRequest
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return ['start' => 'date|after:1970-01-02|before:2038-01-17', 'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17'];
|
||||
return [
|
||||
'start' => ['date', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'end' => ['date', 'after_or_equal:start', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
];
|
||||
}
|
||||
|
||||
private function getAccounts(): array
|
||||
|
||||
@@ -66,7 +66,7 @@ class UpdateRequest extends FormRequest
|
||||
|
||||
return [
|
||||
'title' => 'min:1|max:100|uniqueObjectForUser:rule_groups,title,'.$ruleGroup->id,
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'description' => ['min:1', 'max:32768', 'nullable'],
|
||||
'active' => [new IsBoolean()],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -62,9 +62,9 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
$rules = [
|
||||
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
|
||||
'description' => 'min:1|nullable|max:32768',
|
||||
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
|
||||
'tag' => ['required', 'min:1', 'uniqueObjectForUser:tags,tag', 'max:1024'],
|
||||
'description' => ['min:1', 'nullable', 'max:32768'],
|
||||
'date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
];
|
||||
|
||||
return Location::requestRules($rules);
|
||||
|
||||
@@ -63,8 +63,8 @@ class UpdateRequest extends FormRequest
|
||||
$tag = $this->route()->parameter('tagOrId');
|
||||
$rules = [
|
||||
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,'.$tag->id,
|
||||
'description' => 'min:1|nullable|max:32768',
|
||||
'date' => 'date|nullable|after:1970-01-02|before:2038-01-17',
|
||||
'description' => ['min:1', 'nullable', 'max:32768'],
|
||||
'date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
];
|
||||
|
||||
return Location::requestRules($rules);
|
||||
|
||||
@@ -30,7 +30,7 @@ use FireflyIII\Rules\IsBoolean;
|
||||
use FireflyIII\Rules\IsDateOrTime;
|
||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\NullArrayObject;
|
||||
use FireflyIII\Support\Request\AppendsLocationData;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
@@ -81,12 +81,12 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
Log::debug('Collect rules of TransactionStoreRequest');
|
||||
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
$locationRules = Location::requestRules([]);
|
||||
|
||||
return [
|
||||
// basic fields for group:
|
||||
'group_title' => 'min:1|max:1000|nullable',
|
||||
'group_title' => ['min:1', 'max:1000', 'nullable'],
|
||||
'error_if_duplicate_hash' => [new IsBoolean()],
|
||||
'fire_webhooks' => [new IsBoolean()],
|
||||
'apply_rules' => [new IsBoolean()],
|
||||
@@ -97,42 +97,42 @@ class StoreRequest extends FormRequest
|
||||
'transactions.*.zoom_level' => $locationRules['zoom_level'],
|
||||
|
||||
// transaction rules (in array for splits):
|
||||
'transactions.*.type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
|
||||
'transactions.*.type' => ['required', 'in:withdrawal,deposit,transfer,opening-balance,reconciliation'],
|
||||
'transactions.*.date' => ['required', new IsDateOrTime()],
|
||||
'transactions.*.order' => 'numeric|min:0',
|
||||
'transactions.*.order' => ['numeric', 'min:0'],
|
||||
|
||||
// currency info
|
||||
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
||||
'transactions.*.currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
|
||||
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
||||
'transactions.*.foreign_currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
|
||||
'transactions.*.currency_id' => ['numeric', 'exists:transaction_currencies,id', 'nullable'],
|
||||
'transactions.*.currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code', 'nullable'],
|
||||
'transactions.*.foreign_currency_id' => ['numeric', 'exists:transaction_currencies,id', 'nullable'],
|
||||
'transactions.*.foreign_currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code', 'nullable'],
|
||||
|
||||
// amount
|
||||
'transactions.*.amount' => ['required', new IsValidPositiveAmount()],
|
||||
'transactions.*.foreign_amount' => ['nullable', new IsValidZeroOrMoreAmount()],
|
||||
|
||||
// description
|
||||
'transactions.*.description' => 'nullable|min:1|max:1000',
|
||||
'transactions.*.description' => ['nullable', 'min:1', 'max:1000'],
|
||||
|
||||
// source of transaction
|
||||
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.source_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.source_iban' => 'min:1|max:255|nullable|iban',
|
||||
'transactions.*.source_number' => 'min:1|max:255|nullable',
|
||||
'transactions.*.source_bic' => 'min:1|max:255|nullable|bic',
|
||||
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.source_iban' => ['min:1', 'max:255', 'nullable', 'iban'],
|
||||
'transactions.*.source_number' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.source_bic' => ['min:1', 'max:255', 'nullable', 'bic'],
|
||||
|
||||
// destination of transaction
|
||||
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.destination_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.destination_iban' => 'min:1|max:255|nullable|iban',
|
||||
'transactions.*.destination_number' => 'min:1|max:255|nullable',
|
||||
'transactions.*.destination_bic' => 'min:1|max:255|nullable|bic',
|
||||
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.destination_iban' => ['min:1', 'max:255', 'nullable', 'iban'],
|
||||
'transactions.*.destination_number' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.destination_bic' => ['min:1', 'max:255', 'nullable', 'bic'],
|
||||
|
||||
// budget, category, bill and piggy
|
||||
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser()],
|
||||
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser(), 'nullable'],
|
||||
'transactions.*.category_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser()],
|
||||
'transactions.*.bill_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser()],
|
||||
@@ -140,34 +140,34 @@ class StoreRequest extends FormRequest
|
||||
|
||||
// other interesting fields
|
||||
'transactions.*.reconciled' => [new IsBoolean()],
|
||||
'transactions.*.notes' => 'min:1|max:32768|nullable',
|
||||
'transactions.*.tags' => 'min:0|max:255',
|
||||
'transactions.*.tags.*' => 'min:0|max:255',
|
||||
'transactions.*.notes' => ['min:1', 'max:32768', 'nullable'],
|
||||
'transactions.*.tags' => ['min:0', 'max:255'],
|
||||
'transactions.*.tags.*' => ['min:0', 'max:255'],
|
||||
|
||||
// meta info fields
|
||||
'transactions.*.internal_reference' => 'min:1|max:255|nullable',
|
||||
'transactions.*.external_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.recurrence_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.bunq_payment_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.internal_reference' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.external_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.recurrence_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.bunq_payment_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.external_url' => sprintf('min:1|max:255|nullable|url:%s', $validProtocols),
|
||||
|
||||
// SEPA fields:
|
||||
'transactions.*.sepa_cc' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ct_op' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ct_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_db' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_country' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ep' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ci' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_batch_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_cc' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ct_op' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ct_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_db' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_country' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ep' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ci' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_batch_id' => ['min:1', 'max:255', 'nullable'],
|
||||
|
||||
// dates
|
||||
'transactions.*.interest_date' => 'date|nullable',
|
||||
'transactions.*.book_date' => 'date|nullable',
|
||||
'transactions.*.process_date' => 'date|nullable',
|
||||
'transactions.*.due_date' => 'date|nullable',
|
||||
'transactions.*.payment_date' => 'date|nullable',
|
||||
'transactions.*.invoice_date' => 'date|nullable',
|
||||
'transactions.*.interest_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.book_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.process_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.due_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.payment_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.invoice_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ use FireflyIII\Rules\IsBoolean;
|
||||
use FireflyIII\Rules\IsDateOrTime;
|
||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use FireflyIII\Validation\GroupValidation;
|
||||
@@ -141,80 +141,80 @@ class UpdateRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
Log::debug(sprintf('Now in %s', __METHOD__));
|
||||
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
|
||||
return [
|
||||
// basic fields for group:
|
||||
'group_title' => 'min:1|max:1000|nullable',
|
||||
'group_title' => ['min:1', 'max:1000', 'nullable'],
|
||||
'apply_rules' => [new IsBoolean()],
|
||||
|
||||
// transaction rules (in array for splits):
|
||||
'transactions.*.type' => 'in:withdrawal,deposit,transfer,opening-balance,reconciliation',
|
||||
'transactions.*.date' => [new IsDateOrTime()],
|
||||
'transactions.*.order' => 'numeric|min:0',
|
||||
'transactions.*.order' => ['numeric', 'min:0'],
|
||||
|
||||
// group id:
|
||||
'transactions.*.transaction_journal_id' => ['nullable', 'numeric', new BelongsUser()],
|
||||
|
||||
// currency info
|
||||
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
||||
'transactions.*.currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
|
||||
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||
'transactions.*.currency_id' => ['numeric', 'exists:transaction_currencies,id', 'nullable'],
|
||||
'transactions.*.currency_code' => ['min:3', 'max:51', 'exists:transaction_currencies,code', 'nullable'],
|
||||
'transactions.*.foreign_currency_id' => ['nullable', 'numeric', 'exists:transaction_currencies,id'],
|
||||
'transactions.*.foreign_currency_code' => ['nullable', 'min:3', 'max:51', 'exists:transaction_currencies,code'],
|
||||
|
||||
// amount
|
||||
'transactions.*.amount' => [new IsValidPositiveAmount()],
|
||||
'transactions.*.foreign_amount' => ['nullable', new IsValidZeroOrMoreAmount()],
|
||||
|
||||
// description
|
||||
'transactions.*.description' => 'nullable|min:1|max:1000',
|
||||
'transactions.*.description' => ['nullable', 'min:1', 'max:1000'],
|
||||
|
||||
// source of transaction
|
||||
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.source_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.source_name' => ['min:1', 'max:255', 'nullable'],
|
||||
|
||||
// destination of transaction
|
||||
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||
'transactions.*.destination_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.destination_name' => ['min:1', 'max:255', 'nullable'],
|
||||
|
||||
// budget, category, bill and piggy
|
||||
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser(), 'nullable'],
|
||||
'transactions.*.budget_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser(), 'nullable'],
|
||||
'transactions.*.category_name' => 'min:1|max:255|nullable',
|
||||
'transactions.*.category_name' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser()],
|
||||
'transactions.*.bill_name' => ['min:1', 'max:255', 'nullable', new BelongsUser()],
|
||||
|
||||
// other interesting fields
|
||||
'transactions.*.reconciled' => [new IsBoolean()],
|
||||
'transactions.*.notes' => 'min:1|max:32768|nullable',
|
||||
'transactions.*.tags' => 'min:0|max:255|nullable',
|
||||
'transactions.*.tags.*' => 'min:0|max:255',
|
||||
'transactions.*.notes' => ['min:1', 'max:32768', 'nullable'],
|
||||
'transactions.*.tags' => ['min:0', 'max:255', 'nullable'],
|
||||
'transactions.*.tags.*' => ['min:0', 'max:255'],
|
||||
|
||||
// meta info fields
|
||||
'transactions.*.internal_reference' => 'min:1|max:255|nullable',
|
||||
'transactions.*.external_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.recurrence_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.bunq_payment_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.internal_reference' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.external_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.recurrence_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.bunq_payment_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.external_url' => sprintf('min:1|max:255|nullable|url:%s', $validProtocols),
|
||||
|
||||
// SEPA fields:
|
||||
'transactions.*.sepa_cc' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ct_op' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ct_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_db' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_country' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ep' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_ci' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_batch_id' => 'min:1|max:255|nullable',
|
||||
'transactions.*.sepa_cc' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ct_op' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ct_id' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_db' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_country' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ep' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_ci' => ['min:1', 'max:255', 'nullable'],
|
||||
'transactions.*.sepa_batch_id' => ['min:1', 'max:255', 'nullable'],
|
||||
|
||||
// dates
|
||||
'transactions.*.interest_date' => 'date|nullable',
|
||||
'transactions.*.book_date' => 'date|nullable',
|
||||
'transactions.*.process_date' => 'date|nullable',
|
||||
'transactions.*.due_date' => 'date|nullable',
|
||||
'transactions.*.payment_date' => 'date|nullable',
|
||||
'transactions.*.invoice_date' => 'date|nullable',
|
||||
'transactions.*.interest_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.book_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.process_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.due_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.payment_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
'transactions.*.invoice_date' => ['date', 'nullable', 'after:1970-01-02', 'before:2038-01-17'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -69,10 +69,10 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|min:1|max:255|unique:transaction_currencies,name',
|
||||
'code' => 'required|min:3|max:32|unique:transaction_currencies,code',
|
||||
'symbol' => 'required|min:1|max:32|unique:transaction_currencies,symbol',
|
||||
'decimal_places' => 'numeric|min:0|max:12',
|
||||
'name' => ['required', 'min:1', 'max:255', 'unique:transaction_currencies,name'],
|
||||
'code' => ['required', 'min:3', 'max:32', 'unique:transaction_currencies,code'],
|
||||
'symbol' => ['required', 'min:1', 'max:32', 'unique:transaction_currencies,symbol'],
|
||||
'decimal_places' => ['numeric', 'min:0', 'max:12'],
|
||||
'enabled' => [new IsBoolean()],
|
||||
'default' => [new IsBoolean()],
|
||||
];
|
||||
|
||||
@@ -82,7 +82,7 @@ class UpdateRequest extends FormRequest
|
||||
'name' => sprintf('min:1|max:255|unique:transaction_currencies,name,%d', $currency->id),
|
||||
'code' => sprintf('min:3|max:32|unique:transaction_currencies,code,%d', $currency->id),
|
||||
'symbol' => sprintf('min:1|max:32|unique:transaction_currencies,symbol,%d', $currency->id),
|
||||
'decimal_places' => 'numeric|min:0|max:12',
|
||||
'decimal_places' => ['numeric', 'min:0', 'max:12'],
|
||||
'enabled' => [new IsBoolean()],
|
||||
'default' => [new IsBoolean()],
|
||||
];
|
||||
|
||||
@@ -63,11 +63,11 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'link_type_id' => 'exists:link_types,id|required_without:link_type_name',
|
||||
'link_type_name' => 'exists:link_types,name|required_without:link_type_id',
|
||||
'inward_id' => 'required|belongsToUser:transaction_journals,id|different:outward_id',
|
||||
'outward_id' => 'required|belongsToUser:transaction_journals,id|different:inward_id',
|
||||
'notes' => 'min:1|max:32768|nullable',
|
||||
'link_type_id' => ['exists:link_types,id', 'required_without:link_type_name'],
|
||||
'link_type_name' => ['exists:link_types,name', 'required_without:link_type_id'],
|
||||
'inward_id' => ['required', 'belongsToUser:transaction_journals,id', 'different:outward_id'],
|
||||
'outward_id' => ['required', 'belongsToUser:transaction_journals,id', 'different:inward_id'],
|
||||
'notes' => ['min:1', 'max:32768', 'nullable'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -65,9 +65,9 @@ class UpdateRequest extends FormRequest
|
||||
return [
|
||||
'link_type_id' => 'exists:link_types,id',
|
||||
'link_type_name' => 'exists:link_types,name',
|
||||
'inward_id' => 'belongsToUser:transaction_journals,id|different:outward_id',
|
||||
'outward_id' => 'belongsToUser:transaction_journals,id|different:inward_id',
|
||||
'notes' => 'min:1|max:32768|nullable',
|
||||
'inward_id' => ['belongsToUser:transaction_journals,id', 'different:outward_id'],
|
||||
'outward_id' => ['belongsToUser:transaction_journals,id', 'different:inward_id'],
|
||||
'notes' => ['min:1', 'max:32768', 'nullable'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -52,9 +52,9 @@ class StoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|unique:link_types,name|min:1|max:1024',
|
||||
'outward' => 'required|unique:link_types,outward|min:1|different:inward|max:1024',
|
||||
'inward' => 'required|unique:link_types,inward|min:1|different:outward|max:1024',
|
||||
'name' => ['required', 'unique:link_types,name', 'min:1', 'max:1024'],
|
||||
'outward' => ['required', 'unique:link_types,outward', 'min:1', 'different:inward', 'max:1024'],
|
||||
'inward' => ['required', 'unique:link_types,inward', 'min:1', 'different:outward', 'max:1024'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Rules\IsBoolean;
|
||||
use FireflyIII\Rules\Webhook\IsValidWebhookUrl;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use FireflyIII\Support\Request\ValidatesWebhooks;
|
||||
@@ -72,19 +72,19 @@ class CreateRequest extends FormRequest
|
||||
$triggers = implode(',', array_values(Webhook::getTriggers()));
|
||||
$responses = implode(',', array_values(Webhook::getResponses()));
|
||||
$deliveries = implode(',', array_values(Webhook::getDeliveries()));
|
||||
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
|
||||
return [
|
||||
'title' => 'required|min:1|max:255|uniqueObjectForUser:webhooks,title',
|
||||
'title' => ['required', 'min:1', 'max:255', 'uniqueObjectForUser:webhooks,title'],
|
||||
'active' => [new IsBoolean()],
|
||||
'trigger' => 'prohibited',
|
||||
'triggers' => 'required|array|min:1|max:10',
|
||||
'triggers' => ['required', 'array', 'min:1', 'max:10'],
|
||||
'triggers.*' => sprintf('required|in:%s', $triggers),
|
||||
'response' => 'prohibited',
|
||||
'responses' => 'required|array|min:1|max:1',
|
||||
'responses' => ['required', 'array', 'min:1', 'max:1'],
|
||||
'responses.*' => sprintf('required|in:%s', $responses),
|
||||
'delivery' => 'prohibited',
|
||||
'deliveries' => 'required|array|min:1|max:1',
|
||||
'deliveries' => ['required', 'array', 'min:1', 'max:1'],
|
||||
'deliveries.*' => sprintf('required|in:%s', $deliveries),
|
||||
'url' => ['required', sprintf('url:%s', $validProtocols), new IsValidWebhookUrl()],
|
||||
];
|
||||
|
||||
@@ -28,7 +28,7 @@ use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Webhook;
|
||||
use FireflyIII\Rules\IsBoolean;
|
||||
use FireflyIII\Rules\Webhook\IsValidWebhookUrl;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\Request\ChecksLogin;
|
||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||
use FireflyIII\Support\Request\ValidatesWebhooks;
|
||||
@@ -73,7 +73,7 @@ class UpdateRequest extends FormRequest
|
||||
$triggers = implode(',', array_values(Webhook::getTriggers()));
|
||||
$responses = implode(',', array_values(Webhook::getResponses()));
|
||||
$deliveries = implode(',', array_values(Webhook::getDeliveries()));
|
||||
$validProtocols = FireflyConfig::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
$validProtocols = AppConfiguration::get('valid_url_protocols', config('firefly.valid_url_protocols'))->data;
|
||||
|
||||
/** @var Webhook $webhook */
|
||||
$webhook = $this->route()->parameter('webhook');
|
||||
@@ -82,13 +82,13 @@ class UpdateRequest extends FormRequest
|
||||
'title' => sprintf('min:1|max:255|uniqueObjectForUser:webhooks,title,%d', $webhook->id),
|
||||
'active' => [new IsBoolean()],
|
||||
'trigger' => 'prohibited',
|
||||
'triggers' => 'required|array|min:1|max:10',
|
||||
'triggers' => ['required', 'array', 'min:1', 'max:10'],
|
||||
'triggers.*' => sprintf('required|in:%s', $triggers),
|
||||
'response' => 'prohibited',
|
||||
'responses' => 'required|array|min:1|max:1',
|
||||
'responses' => ['required', 'array', 'min:1', 'max:1'],
|
||||
'responses.*' => sprintf('required|in:%s', $responses),
|
||||
'delivery' => 'prohibited',
|
||||
'deliveries' => 'required|array|min:1|max:1',
|
||||
'deliveries' => ['required', 'array', 'min:1', 'max:1'],
|
||||
'deliveries.*' => sprintf('required|in:%s', $deliveries),
|
||||
'url' => [sprintf('url:%s', $validProtocols), sprintf('uniqueExistingWebhook:%d', $webhook->id), new IsValidWebhookUrl()],
|
||||
];
|
||||
|
||||
@@ -50,8 +50,8 @@ class PaginationRequest extends ApiRequest
|
||||
{
|
||||
return [
|
||||
'sort' => ['nullable', new IsValidSortInstruction((string) $this->sortClass)],
|
||||
'limit' => 'numeric|min:1|max:131337',
|
||||
'page' => 'numeric|min:1|max:131337',
|
||||
'limit' => ['numeric', 'min:1', 'max:131337'],
|
||||
'page' => ['numeric', 'min:1', 'max:131337'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -34,10 +34,10 @@ class CountRequest extends AggregateFormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'notes' => 'string|min:1|max:255',
|
||||
'external_identifier' => 'string|min:1|max:255',
|
||||
'description' => 'string|min:1|max:255',
|
||||
'internal_reference' => 'string|min:1|max:255',
|
||||
'notes' => ['string', 'min:1', 'max:255'],
|
||||
'external_identifier' => ['string', 'min:1', 'max:255'],
|
||||
'description' => ['string', 'min:1', 'max:255'],
|
||||
'internal_reference' => ['string', 'min:1', 'max:255'],
|
||||
'include_deleted' => new IsBoolean(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -68,6 +68,6 @@ class CronRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return ['force' => 'in:true,false', 'date' => 'nullable|date|after:1970-01-02|before:2038-01-17'];
|
||||
return ['force' => 'in:true,false', 'date' => ['nullable', 'date', 'after:1970-01-02', 'before:2038-01-17']];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,10 +77,10 @@ class UpdateRequest extends FormRequest
|
||||
return ['value' => ['required', new IsBoolean()]];
|
||||
}
|
||||
if ('configuration.permission_update_check' === $name) {
|
||||
return ['value' => 'required|numeric|min:-1|max:1'];
|
||||
return ['value' => ['required', 'numeric', 'min:-1', 'max:1']];
|
||||
}
|
||||
if (in_array($name, $this->integers, strict: true)) {
|
||||
return ['value' => 'required|numeric|min:464272080'];
|
||||
return ['value' => ['required', 'numeric', 'min:464272080']];
|
||||
}
|
||||
|
||||
return ['value' => 'required'];
|
||||
|
||||
@@ -71,7 +71,7 @@ class UserStoreRequest extends FormRequest
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'email' => ['required', 'email', 'unique:users,email'],
|
||||
'blocked' => [new IsBoolean()],
|
||||
'blocked_code' => 'in:email_changed',
|
||||
'role' => 'in:owner,demo',
|
||||
|
||||
@@ -52,15 +52,15 @@ class ClearsEmptyForeignAmounts extends Command
|
||||
public function handle(): int
|
||||
{
|
||||
// transaction: has no amount, but reference to currency.
|
||||
$count = Transaction::whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->count();
|
||||
$count = Transaction::query()->whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->count();
|
||||
if ($count > 0) {
|
||||
Transaction::whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->update(['foreign_currency_id' => null]);
|
||||
Transaction::query()->whereNull('foreign_amount')->whereNotNull('foreign_currency_id')->update(['foreign_currency_id' => null]);
|
||||
$this->friendlyInfo(sprintf('Corrected %d invalid foreign amount reference(s)', $count));
|
||||
}
|
||||
// transaction: has amount, but no currency.
|
||||
$count = Transaction::whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->count();
|
||||
$count = Transaction::query()->whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->count();
|
||||
if ($count > 0) {
|
||||
Transaction::whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->update(['foreign_amount' => null]);
|
||||
Transaction::query()->whereNull('foreign_currency_id')->whereNotNull('foreign_amount')->update(['foreign_amount' => null]);
|
||||
$this->friendlyInfo(sprintf('Corrected %d invalid foreign amount reference(s)', $count));
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace FireflyIII\Console\Commands\Correction;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\QueryException;
|
||||
@@ -58,7 +58,7 @@ class ConvertsDatesToUTC extends Command
|
||||
$this->ConvertModeltoUTC($model, $fields);
|
||||
}
|
||||
// tell the system we are now in UTC mode.
|
||||
FireflyConfig::set('utc', true);
|
||||
AppConfiguration::set('utc', true);
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ class CorrectsAmounts extends Command
|
||||
|
||||
/** @var AccountRepositoryInterface $repository */
|
||||
$repository = app(AccountRepositoryInterface::class);
|
||||
$type = TransactionType::where('type', TransactionTypeEnum::TRANSFER->value)->first();
|
||||
$type = TransactionType::query()->where('type', TransactionTypeEnum::TRANSFER->value)->first();
|
||||
$journals = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
|
||||
->whereNotNull('transactions.foreign_amount')
|
||||
->where('transaction_journals.transaction_type_id', $type->id)
|
||||
@@ -188,7 +188,10 @@ class CorrectsAmounts extends Command
|
||||
|
||||
private function fixAutoBudgets(): void
|
||||
{
|
||||
$count = AutoBudget::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
|
||||
$count = AutoBudget::query()
|
||||
->where('amount', '<', 0)
|
||||
->update(['amount' => DB::raw('amount * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -197,7 +200,10 @@ class CorrectsAmounts extends Command
|
||||
|
||||
private function fixAvailableBudgets(): void
|
||||
{
|
||||
$count = AvailableBudget::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
|
||||
$count = AvailableBudget::query()
|
||||
->where('amount', '<', 0)
|
||||
->update(['amount' => DB::raw('amount * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -207,8 +213,14 @@ class CorrectsAmounts extends Command
|
||||
private function fixBills(): void
|
||||
{
|
||||
$count = 0;
|
||||
$count += Bill::where('amount_max', '<', 0)->update(['amount_max' => DB::raw('amount_max * -1')]);
|
||||
$count += Bill::where('amount_min', '<', 0)->update(['amount_min' => DB::raw('amount_min * -1')]);
|
||||
$count += Bill::query()
|
||||
->where('amount_max', '<', 0)
|
||||
->update(['amount_max' => DB::raw('amount_max * -1')])
|
||||
;
|
||||
$count += Bill::query()
|
||||
->where('amount_min', '<', 0)
|
||||
->update(['amount_min' => DB::raw('amount_min * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -217,7 +229,10 @@ class CorrectsAmounts extends Command
|
||||
|
||||
private function fixBudgetLimits(): void
|
||||
{
|
||||
$count = BudgetLimit::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
|
||||
$count = BudgetLimit::query()
|
||||
->where('amount', '<', 0)
|
||||
->update(['amount' => DB::raw('amount * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -226,7 +241,10 @@ class CorrectsAmounts extends Command
|
||||
|
||||
private function fixExchangeRates(): void
|
||||
{
|
||||
$count = CurrencyExchangeRate::where('rate', '<', 0)->update(['rate' => DB::raw('rate * -1')]);
|
||||
$count = CurrencyExchangeRate::query()
|
||||
->where('rate', '<', 0)
|
||||
->update(['rate' => DB::raw('rate * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -235,7 +253,10 @@ class CorrectsAmounts extends Command
|
||||
|
||||
private function fixPiggyBanks(): void
|
||||
{
|
||||
$count = PiggyBank::where('target_amount', '<', 0)->update(['target_amount' => DB::raw('target_amount * -1')]);
|
||||
$count = PiggyBank::query()
|
||||
->where('target_amount', '<', 0)
|
||||
->update(['target_amount' => DB::raw('target_amount * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -245,8 +266,14 @@ class CorrectsAmounts extends Command
|
||||
private function fixRecurrences(): void
|
||||
{
|
||||
$count = 0;
|
||||
$count += RecurrenceTransaction::where('amount', '<', 0)->update(['amount' => DB::raw('amount * -1')]);
|
||||
$count += RecurrenceTransaction::where('foreign_amount', '<', 0)->update(['foreign_amount' => DB::raw('foreign_amount * -1')]);
|
||||
$count += RecurrenceTransaction::query()
|
||||
->where('amount', '<', 0)
|
||||
->update(['amount' => DB::raw('amount * -1')])
|
||||
;
|
||||
$count += RecurrenceTransaction::query()
|
||||
->where('foreign_amount', '<', 0)
|
||||
->update(['foreign_amount' => DB::raw('foreign_amount * -1')])
|
||||
;
|
||||
if (0 === $count) {
|
||||
return;
|
||||
}
|
||||
@@ -285,7 +312,7 @@ class CorrectsAmounts extends Command
|
||||
*/
|
||||
private function fixRuleTriggers(): void
|
||||
{
|
||||
$set = RuleTrigger::whereIn('trigger_type', ['amount_less', 'amount_more', 'amount_is'])->get();
|
||||
$set = RuleTrigger::query()->whereIn('trigger_type', ['amount_less', 'amount_more', 'amount_is'])->get();
|
||||
$fixed = 0;
|
||||
|
||||
/** @var RuleTrigger $item */
|
||||
|
||||
@@ -81,7 +81,7 @@ class CorrectsCurrencies extends Command
|
||||
}
|
||||
|
||||
// get all from journals:
|
||||
$journals = TransactionJournal::where('user_group_id', $userGroup->id)->groupBy('transaction_currency_id')->get(['transaction_currency_id']);
|
||||
$journals = TransactionJournal::query()->where('user_group_id', $userGroup->id)->groupBy('transaction_currency_id')->get(['transaction_currency_id']);
|
||||
foreach ($journals as $entry) {
|
||||
$found[] = (int) $entry->transaction_currency_id;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,10 @@ class CorrectsGroupAccounts extends Command
|
||||
{
|
||||
Log::debug('Start of correction:group-accounts');
|
||||
$groups = [];
|
||||
$res = TransactionJournal::groupBy('transaction_group_id')->get(['transaction_group_id', DB::raw('COUNT(transaction_group_id) as the_count')]);
|
||||
$res = TransactionJournal::query()->groupBy('transaction_group_id')->get([
|
||||
'transaction_group_id',
|
||||
DB::raw('COUNT(transaction_group_id) as the_count'),
|
||||
]);
|
||||
|
||||
/** @var TransactionJournal $journal */
|
||||
foreach ($res as $journal) {
|
||||
|
||||
@@ -44,7 +44,7 @@ class CorrectsIbans extends Command
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
$accounts = Account::with('accountMeta')->get();
|
||||
$accounts = Account::query()->with('accountMeta')->get();
|
||||
$this->filterIbans($accounts);
|
||||
$this->countAndCorrectIbans($accounts);
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ class CorrectsInvertedBudgetLimits extends Command
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
$set = BudgetLimit::where('start_date', '>', DB::raw('end_date'))->get();
|
||||
$set = BudgetLimit::query()->where('start_date', '>', DB::raw('end_date'))->get();
|
||||
if (0 === $set->count()) {
|
||||
Log::debug('No inverted budget limits found.');
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ class CorrectsLongDescriptions extends Command
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
$journals = TransactionJournal::where(DB::raw('LENGTH(description)'), '>', self::MAX_LENGTH)->get(['id', 'description']);
|
||||
$journals = TransactionJournal::query()->where(DB::raw('LENGTH(description)'), '>', self::MAX_LENGTH)->get(['id', 'description']);
|
||||
$count = 0;
|
||||
|
||||
/** @var TransactionJournal $journal */
|
||||
@@ -57,7 +57,7 @@ class CorrectsLongDescriptions extends Command
|
||||
}
|
||||
}
|
||||
|
||||
$groups = TransactionGroup::where(DB::raw('LENGTH(title)'), '>', self::MAX_LENGTH)->get(['id', 'title']);
|
||||
$groups = TransactionGroup::query()->where(DB::raw('LENGTH(title)'), '>', self::MAX_LENGTH)->get(['id', 'title']);
|
||||
|
||||
/** @var TransactionGroup $group */
|
||||
foreach ($groups as $group) {
|
||||
|
||||
@@ -42,7 +42,7 @@ class CorrectsPiggyBanks extends Command
|
||||
public function handle(): int
|
||||
{
|
||||
$count = 0;
|
||||
$set = PiggyBankEvent::with(['PiggyBank', 'TransactionJournal'])->get();
|
||||
$set = PiggyBankEvent::query()->with(['PiggyBank', 'TransactionJournal'])->get();
|
||||
|
||||
/** @var PiggyBankEvent $event */
|
||||
foreach ($set as $event) {
|
||||
|
||||
@@ -47,7 +47,7 @@ class CorrectsPreferences extends Command
|
||||
foreach ($users as $user) {
|
||||
$count = 0;
|
||||
foreach ($items as $item) {
|
||||
$preference = Preference::where('name', $item)->where('user_id', $user->id)->first();
|
||||
$preference = Preference::query()->where('name', $item)->where('user_id', $user->id)->first();
|
||||
if (null === $preference) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace FireflyIII\Console\Commands\Correction;
|
||||
|
||||
use FireflyIII\Console\Commands\ShowsFriendlyMessages;
|
||||
use FireflyIII\Services\Internal\Recalculate\PrimaryAmountRecalculationService;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
@@ -43,7 +43,7 @@ class CorrectsPrimaryCurrencyAmounts extends Command
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
if (false === FireflyConfig::get('enable_exchange_rates', config('cer.enabled'))->data) {
|
||||
if (false === AppConfiguration::get('enable_exchange_rates', config('cer.enabled'))->data) {
|
||||
$this->friendlyInfo('This command will not run because currency exchange rates are disabled.');
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -36,7 +36,7 @@ use FireflyIII\Models\PiggyBankRepetition;
|
||||
use FireflyIII\Models\Recurrence;
|
||||
use FireflyIII\Models\Tag;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
@@ -71,7 +71,7 @@ class CorrectsTimezoneInformation extends Command
|
||||
$this->addTimezoneToModel($model, $fields);
|
||||
}
|
||||
// not yet in UTC mode
|
||||
FireflyConfig::set('utc', false);
|
||||
AppConfiguration::set('utc', false);
|
||||
}
|
||||
|
||||
private function addTimezoneToModel(string $model, array $fields): void
|
||||
|
||||
@@ -81,7 +81,7 @@ class CorrectsTransactionTypes extends Command
|
||||
*/
|
||||
private function collectJournals(): Collection
|
||||
{
|
||||
return TransactionJournal::with(['transactionType', 'transactions', 'transactions.account', 'transactions.account.accountType'])->get();
|
||||
return TransactionJournal::query()->with(['transactionType', 'transactions', 'transactions.account', 'transactions.account.accountType'])->get();
|
||||
}
|
||||
|
||||
private function fixJournal(TransactionJournal $journal): bool
|
||||
|
||||
@@ -42,7 +42,8 @@ class CorrectsTransferBudgets extends Command
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
$set = TransactionJournal::distinct()
|
||||
$set = TransactionJournal::query()
|
||||
->distinct()
|
||||
->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
|
||||
->leftJoin('budget_transaction_journal', 'transaction_journals.id', '=', 'budget_transaction_journal.transaction_journal_id')
|
||||
->whereNotIn('transaction_types.type', [TransactionTypeEnum::WITHDRAWAL->value])
|
||||
|
||||
@@ -30,7 +30,7 @@ use FireflyIII\Enums\TransactionTypeEnum;
|
||||
use FireflyIII\Models\Transaction;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Support\Facades\FireflyConfig;
|
||||
use FireflyIII\Support\Facades\AppConfiguration;
|
||||
use FireflyIII\Support\Facades\Steam;
|
||||
use FireflyIII\Support\Models\AccountBalanceCalculator;
|
||||
use Illuminate\Console\Command;
|
||||
@@ -61,7 +61,7 @@ class CorrectsUnevenAmount extends Command
|
||||
|
||||
$this->fixUnevenAmounts();
|
||||
$this->matchCurrencies();
|
||||
if (true === FireflyConfig::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
|
||||
if (true === AppConfiguration::get('use_running_balance', config('firefly.feature_flags.running_balance_column'))->data) {
|
||||
$this->friendlyInfo('Will recalculate transaction running balance columns. This may take a LONG time. Please be patient.');
|
||||
AccountBalanceCalculator::recalculateAll(false);
|
||||
$this->friendlyInfo('Done recalculating transaction running balance columns.');
|
||||
@@ -76,7 +76,8 @@ class CorrectsUnevenAmount extends Command
|
||||
$repository = app(AccountRepositoryInterface::class);
|
||||
Log::debug('convertOldStyleTransactions()');
|
||||
$count = 0;
|
||||
$transactions = Transaction::distinct()
|
||||
$transactions = Transaction::query()
|
||||
->distinct()
|
||||
->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id')
|
||||
->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id')
|
||||
->leftJoin('accounts', 'accounts.id', 'transactions.account_id')
|
||||
@@ -188,7 +189,8 @@ class CorrectsUnevenAmount extends Command
|
||||
{
|
||||
Log::debug('convertOldStyleTransfers()');
|
||||
// select transactions with a foreign amount and a foreign currency. and it's a transfer. and they are different.
|
||||
$transactions = Transaction::distinct()
|
||||
$transactions = Transaction::query()
|
||||
->distinct()
|
||||
->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id')
|
||||
->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id')
|
||||
->where('transaction_types.type', TransactionTypeEnum::TRANSFER->value)
|
||||
@@ -262,8 +264,14 @@ class CorrectsUnevenAmount extends Command
|
||||
$journal->id ?? 0,
|
||||
$journal->description ?? ''
|
||||
));
|
||||
Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete();
|
||||
TransactionJournal::where('id', $journal->id ?? 0)->forceDelete();
|
||||
Transaction::query()
|
||||
->where('transaction_journal_id', $journal->id ?? 0)
|
||||
->forceDelete()
|
||||
;
|
||||
TransactionJournal::query()
|
||||
->where('id', $journal->id ?? 0)
|
||||
->forceDelete()
|
||||
;
|
||||
++$this->count;
|
||||
|
||||
return;
|
||||
@@ -282,8 +290,14 @@ class CorrectsUnevenAmount extends Command
|
||||
$journal->description ?? ''
|
||||
));
|
||||
|
||||
Transaction::where('transaction_journal_id', $journal->id ?? 0)->forceDelete();
|
||||
TransactionJournal::where('id', $journal->id ?? 0)->forceDelete();
|
||||
Transaction::query()
|
||||
->where('transaction_journal_id', $journal->id ?? 0)
|
||||
->forceDelete()
|
||||
;
|
||||
TransactionJournal::query()
|
||||
->where('id', $journal->id ?? 0)
|
||||
->forceDelete()
|
||||
;
|
||||
++$this->count;
|
||||
|
||||
return;
|
||||
@@ -430,7 +444,7 @@ class CorrectsUnevenAmount extends Command
|
||||
/** @var TransactionJournal $journal */
|
||||
foreach ($journals as $journal) {
|
||||
if (!$this->isForeignCurrencyTransfer($journal) && !$this->isBetweenAssetAndLiability($journal)) {
|
||||
Transaction::where('transaction_journal_id', $journal->id)->update(['transaction_currency_id' => $journal->transaction_currency_id]);
|
||||
Transaction::query()->where('transaction_journal_id', $journal->id)->update(['transaction_currency_id' => $journal->transaction_currency_id]);
|
||||
++$count;
|
||||
|
||||
continue;
|
||||
|
||||
@@ -50,17 +50,22 @@ class CreatesGroupMemberships extends Command
|
||||
public static function createGroupMembership(User $user): void
|
||||
{
|
||||
// check if membership exists
|
||||
$userGroup = UserGroup::where('title', $user->email)->first();
|
||||
$userGroup = UserGroup::query()->where('title', $user->email)->first();
|
||||
if (null === $userGroup) {
|
||||
$userGroup = UserGroup::create(['title' => $user->email]);
|
||||
}
|
||||
|
||||
$userRole = UserRole::where('title', UserRoleEnum::OWNER->value)->first();
|
||||
$userRole = UserRole::query()->where('title', UserRoleEnum::OWNER->value)->first();
|
||||
|
||||
if (null === $userRole) {
|
||||
throw new FireflyException('Firefly III could not find a user role. Please make sure all migrations have run.');
|
||||
}
|
||||
$membership = GroupMembership::where('user_id', $user->id)->where('user_group_id', $userGroup->id)->where('user_role_id', $userRole->id)->first();
|
||||
$membership = GroupMembership::query()
|
||||
->where('user_id', $user->id)
|
||||
->where('user_group_id', $userGroup->id)
|
||||
->where('user_role_id', $userRole->id)
|
||||
->first()
|
||||
;
|
||||
if (null === $membership) {
|
||||
GroupMembership::create(['user_id' => $user->id, 'user_role_id' => $userRole->id, 'user_group_id' => $userGroup->id]);
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class CreatesLinkTypes extends Command
|
||||
'Reimbursement' => ['(partially) reimburses', 'is (partially) reimbursed by'],
|
||||
];
|
||||
foreach ($set as $name => $values) {
|
||||
$link = LinkType::where('name', $name)->first();
|
||||
$link = LinkType::query()->where('name', $name)->first();
|
||||
if (null === $link) {
|
||||
$link = new LinkType();
|
||||
$link->name = $name;
|
||||
|
||||
@@ -43,11 +43,11 @@ class RemovesBills extends Command
|
||||
public function handle(): int
|
||||
{
|
||||
/** @var null|TransactionType $withdrawal */
|
||||
$withdrawal = TransactionType::where('type', TransactionTypeEnum::WITHDRAWAL->value)->first();
|
||||
$withdrawal = TransactionType::query()->where('type', TransactionTypeEnum::WITHDRAWAL->value)->first();
|
||||
if (null === $withdrawal) {
|
||||
return 0;
|
||||
}
|
||||
$journals = TransactionJournal::whereNotNull('bill_id')->where('transaction_type_id', '!=', $withdrawal->id)->get();
|
||||
$journals = TransactionJournal::query()->whereNotNull('bill_id')->where('transaction_type_id', '!=', $withdrawal->id)->get();
|
||||
|
||||
/** @var TransactionJournal $journal */
|
||||
foreach ($journals as $journal) {
|
||||
|
||||
@@ -57,7 +57,7 @@ class RemovesEmptyGroups extends Command
|
||||
// again, chunks for SQLite.
|
||||
$chunks = array_chunk($groupIds, 500);
|
||||
foreach ($chunks as $chunk) {
|
||||
TransactionGroup::whereNull('deleted_at')->whereIn('id', $chunk)->delete();
|
||||
TransactionGroup::query()->whereNull('deleted_at')->whereIn('id', $chunk)->delete();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,10 +80,14 @@ class RemovesEmptyJournals extends Command
|
||||
*/
|
||||
private function deleteUnevenJournals(): void
|
||||
{
|
||||
$set = Transaction::whereNull('deleted_at')->groupBy('transactions.transaction_journal_id')->get([
|
||||
DB::raw('COUNT(transactions.transaction_journal_id) as the_count'),
|
||||
'transaction_journal_id',
|
||||
]);
|
||||
$set = Transaction::query()
|
||||
->whereNull('deleted_at')
|
||||
->groupBy('transactions.transaction_journal_id')
|
||||
->get([
|
||||
DB::raw('COUNT(transactions.transaction_journal_id) as the_count'),
|
||||
'transaction_journal_id',
|
||||
])
|
||||
;
|
||||
$total = 0;
|
||||
|
||||
/** @var Transaction $row */
|
||||
@@ -100,7 +104,7 @@ class RemovesEmptyJournals extends Command
|
||||
Log::error($e->getTraceAsString());
|
||||
}
|
||||
|
||||
Transaction::where('transaction_journal_id', $row->transaction_journal_id)->delete();
|
||||
Transaction::query()->where('transaction_journal_id', $row->transaction_journal_id)->delete();
|
||||
$this->friendlyWarning(sprintf(
|
||||
'Deleted transaction journal #%d because it had an uneven number of transactions.',
|
||||
$row->transaction_journal_id
|
||||
|
||||
@@ -57,10 +57,34 @@ class RemovesLinksToDeletedObjects extends Command
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
$deletedTags = Tag::withTrashed()->whereNotNull('deleted_at')->get('tags.id')->pluck('id')->toArray();
|
||||
$deletedJournals = TransactionJournal::withTrashed()->whereNotNull('deleted_at')->get('transaction_journals.id')->pluck('id')->toArray();
|
||||
$deletedBudgets = Budget::withTrashed()->whereNotNull('deleted_at')->get('budgets.id')->pluck('id')->toArray();
|
||||
$deletedCategories = Category::withTrashed()->whereNotNull('deleted_at')->get('categories.id')->pluck('id')->toArray();
|
||||
$deletedTags = Tag::query()
|
||||
->withTrashed()
|
||||
->whereNotNull('deleted_at')
|
||||
->get('tags.id')
|
||||
->pluck('id')
|
||||
->toArray()
|
||||
;
|
||||
$deletedJournals = TransactionJournal::query()
|
||||
->withTrashed()
|
||||
->whereNotNull('deleted_at')
|
||||
->get('transaction_journals.id')
|
||||
->pluck('id')
|
||||
->toArray()
|
||||
;
|
||||
$deletedBudgets = Budget::query()
|
||||
->withTrashed()
|
||||
->whereNotNull('deleted_at')
|
||||
->get('budgets.id')
|
||||
->pluck('id')
|
||||
->toArray()
|
||||
;
|
||||
$deletedCategories = Category::query()
|
||||
->withTrashed()
|
||||
->whereNotNull('deleted_at')
|
||||
->get('categories.id')
|
||||
->pluck('id')
|
||||
->toArray()
|
||||
;
|
||||
|
||||
if (count($deletedTags) > 0) {
|
||||
$this->cleanupTags($deletedTags);
|
||||
|
||||
@@ -67,7 +67,7 @@ class RemovesOrphanedTransactions extends Command
|
||||
/** @var null|TransactionJournal $journal */
|
||||
$journal = TransactionJournal::find($transaction->transaction_journal_id);
|
||||
$journal?->delete();
|
||||
Transaction::where('transaction_journal_id', $transaction->transaction_journal_id)->delete();
|
||||
Transaction::query()->where('transaction_journal_id', $transaction->transaction_journal_id)->delete();
|
||||
$this->friendlyWarning(sprintf(
|
||||
'Deleted transaction journal #%d because account #%d was already deleted.',
|
||||
$transaction->transaction_journal_id,
|
||||
@@ -93,7 +93,7 @@ class RemovesOrphanedTransactions extends Command
|
||||
$this->friendlyInfo(sprintf('Found %d orphaned journal(s).', $count));
|
||||
foreach ($set as $entry) {
|
||||
/** @var null|TransactionJournal $journal */
|
||||
$journal = TransactionJournal::withTrashed()->find($entry->id);
|
||||
$journal = TransactionJournal::query()->withTrashed()->find($entry->id);
|
||||
if (null !== $journal) {
|
||||
$journal->delete();
|
||||
$this->friendlyWarning(sprintf(
|
||||
|
||||
@@ -42,16 +42,16 @@ class RemovesZeroAmount extends Command
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
$set = Transaction::where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
|
||||
$set = Transaction::query()->where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
|
||||
$set = array_unique($set);
|
||||
$journals = TransactionJournal::whereIn('id', $set)->get();
|
||||
$journals = TransactionJournal::query()->whereIn('id', $set)->get();
|
||||
|
||||
/** @var TransactionJournal $journal */
|
||||
foreach ($journals as $journal) {
|
||||
$this->friendlyWarning(sprintf('Deleted transaction journal #%d because the amount is zero (0.00).', $journal->id));
|
||||
$journal->delete();
|
||||
|
||||
Transaction::where('transaction_journal_id', $journal->id)->delete();
|
||||
Transaction::query()->where('transaction_journal_id', $journal->id)->delete();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user