mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-18 18:44:16 +00:00
Compare commits
331 Commits
develop-20
...
develop
Author | SHA1 | Date | |
---|---|---|---|
|
acc3c294d8 | ||
|
dbf7dba421 | ||
|
65813f290d | ||
|
3491fbb99d | ||
|
cb6b3d5f85 | ||
|
956d4e09c3 | ||
|
6a7c35e7bc | ||
|
090aecb5f5 | ||
|
b653d63d3d | ||
|
258dbf4a98 | ||
|
53335077ff | ||
|
ecfb3e2f95 | ||
|
f512e6724e | ||
|
de9efb0727 | ||
|
9075fa8ac8 | ||
|
768bd892c8 | ||
|
9d9483e20f | ||
|
935453796e | ||
|
c2d3f5da16 | ||
|
9e6f9d16e4 | ||
|
fad016f92f | ||
|
30df6684cb | ||
|
4aa911420a | ||
|
19555a7046 | ||
|
e5c409a8fc | ||
|
3adf3d2fdb | ||
|
0923d5a23e | ||
|
76b8cdc385 | ||
|
0a27da83eb | ||
|
17d6e2be85 | ||
|
7381f3eba9 | ||
|
7f2ef1b8e1 | ||
|
9dccae2402 | ||
|
073afd5b6e | ||
|
4167d85be2 | ||
|
ee28d1307d | ||
|
7562215666 | ||
|
0203b918e9 | ||
|
ae7c664418 | ||
|
f13e0991fb | ||
|
deae94b658 | ||
|
c38c752520 | ||
|
28e7df2527 | ||
|
cb0b42e44b | ||
|
a3674c4dfe | ||
|
27480561ee | ||
|
6ea7152423 | ||
|
dab95f7a86 | ||
|
adf34805a8 | ||
|
93e926465f | ||
|
5b0be91f93 | ||
|
01e7b604da | ||
|
974a550d22 | ||
|
58d175444b | ||
|
29d8861e96 | ||
|
eb832c750f | ||
|
134770644a | ||
|
a9f21c9371 | ||
|
781947beeb | ||
|
9760cd2f97 | ||
|
d317e9ec32 | ||
|
534f7fcadb | ||
|
fb3f7a1d4b | ||
|
bf2c3e3561 | ||
|
b670f81dcd | ||
|
7aac1cdf67 | ||
|
fa0ac8a16c | ||
|
0990b1f0b4 | ||
|
c1922670c8 | ||
|
81cd89d66f | ||
|
f5c202543c | ||
|
034f437c6b | ||
|
8550ba6138 | ||
|
a51501025b | ||
|
a9d26e4586 | ||
|
949691935f | ||
|
4835b05304 | ||
|
cce5a73dd2 | ||
|
3152f635dd | ||
|
12e8651017 | ||
|
f88286c848 | ||
|
39cf0533d9 | ||
|
6d82887960 | ||
|
262f1bae34 | ||
|
75dfdcc220 | ||
|
c3a3bdf525 | ||
|
602df95f3c | ||
|
296a64e284 | ||
|
b87b99a755 | ||
|
bf53f5d6b7 | ||
|
bcbb868acc | ||
|
b3a9e6569e | ||
|
f174f124ef | ||
|
8745377f31 | ||
|
cf76e93f31 | ||
|
19e36f6f6e | ||
|
2a7bb6f048 | ||
|
536eacbc0c | ||
|
af78158d0b | ||
|
fb97910a34 | ||
|
66b4d14129 | ||
|
fd53047dbc | ||
|
5f6fc1bab4 | ||
|
cd0b64bd24 | ||
|
91b26bce0e | ||
|
26a8bd921d | ||
|
ad77d55c16 | ||
|
445a383dd0 | ||
|
1666af939e | ||
|
35447f5eee | ||
|
7c6fcb5731 | ||
|
fabd9bf765 | ||
|
6352d26633 | ||
|
ebef145bd6 | ||
|
acc89eb5f9 | ||
|
6523596415 | ||
|
b6c2d23116 | ||
|
2a123354f9 | ||
|
1e7ea4b76c | ||
|
d959526eb3 | ||
|
8846ee9091 | ||
|
6eb8d0fc8c | ||
|
1b0e16b6a5 | ||
|
2e4df28288 | ||
|
f3b7a3015d | ||
|
5de5e08b1d | ||
|
0a116cd04c | ||
|
fd32a692c1 | ||
|
1ac762aba8 | ||
|
315dc532b6 | ||
|
e19ed1be15 | ||
|
cbb0621fd9 | ||
|
049cbab861 | ||
|
28b620fb5c | ||
|
c183f91ff6 | ||
|
172efae41c | ||
|
756e857ba0 | ||
|
1cde7aab0c | ||
|
2d67eece5d | ||
|
b1f79c4c0f | ||
|
33bd2ceae8 | ||
|
e68850f192 | ||
|
450ac7e6ee | ||
|
91f52b5dbc | ||
|
eed2405d76 | ||
|
c956df7790 | ||
|
0fdccec6a8 | ||
|
8ded54d7a8 | ||
|
bb1b4ca5ca | ||
|
e90d60113b | ||
|
d95dada0e0 | ||
|
8722456595 | ||
|
b5ad226451 | ||
|
ddb0e66651 | ||
|
e802899608 | ||
|
0894d3bf42 | ||
|
80bcfd3bcd | ||
|
8c410f42bd | ||
|
7a1021dffc | ||
|
63883c9a84 | ||
|
50d7f9d1ec | ||
|
ebc7ea0eb6 | ||
|
b905efd0aa | ||
|
93085599b7 | ||
|
8a8bbaf827 | ||
|
96a66b894a | ||
|
1ba641c279 | ||
|
6c5ddfcb8a | ||
|
65ddc246dc | ||
|
e4aff5ff4c | ||
|
dfece91541 | ||
|
6ddda13c3a | ||
|
46219c4678 | ||
|
a1595d0647 | ||
|
4ee9f9bb27 | ||
|
bcaa0bddea | ||
|
01cce49070 | ||
|
293be04d40 | ||
|
44a00ec8eb | ||
|
d84e772945 | ||
|
b475f6c51d | ||
|
2712662510 | ||
|
1f2eeba862 | ||
|
46a60134f4 | ||
|
f3f7820816 | ||
|
a57f8076b2 | ||
|
517afa2273 | ||
|
2142b23aec | ||
|
1bec43b111 | ||
|
d2978a5ee8 | ||
|
39b61c71e8 | ||
|
fa2c964790 | ||
|
134aeb3a46 | ||
|
6f6e1a4ff4 | ||
|
b743bf3d9e | ||
|
84ee6f16c9 | ||
|
9fe39e42b3 | ||
|
4013c7e316 | ||
|
0b76747531 | ||
|
3129756b37 | ||
|
b0df383004 | ||
|
9c5b1df86c | ||
|
5854e24775 | ||
|
3f873422f2 | ||
|
f898990773 | ||
|
a5759ab1c6 | ||
|
9bd6417e02 | ||
|
cd12a10214 | ||
|
ee8cb62e04 | ||
|
87ee95a852 | ||
|
10f8436885 | ||
|
6955846a1c | ||
|
11d2f8d471 | ||
|
99347ffff1 | ||
|
3ddc11a905 | ||
|
0a48c0c20f | ||
|
8bc764d6ef | ||
|
4b4f568558 | ||
|
d42117281a | ||
|
d68ed5a713 | ||
|
2f6f36c3f0 | ||
|
984aa02e35 | ||
|
cdadc7d533 | ||
|
4d59955cc5 | ||
|
fc547ba59a | ||
|
1b2ded3167 | ||
|
dcf20a472a | ||
|
7bd528defe | ||
|
9e6d123165 | ||
|
c592f51c83 | ||
|
fbb6f30366 | ||
|
4546c721fb | ||
|
3a659c9a81 | ||
|
e28a988eb3 | ||
|
a29742fe1f | ||
|
dd06838eec | ||
|
5eb828bff8 | ||
|
c7f3701053 | ||
|
ab6799442c | ||
|
1fe9bf7d76 | ||
|
bd14797da6 | ||
|
93b4e6a8d0 | ||
|
5566671971 | ||
|
defcc7a00c | ||
|
5183de634b | ||
|
7771b0311c | ||
|
52abe3bbc2 | ||
|
34db9f41c2 | ||
|
72c31fbe6a | ||
|
1d8dd41564 | ||
|
3409240a19 | ||
|
eccc58e75a | ||
|
24098f35bb | ||
|
e7d9dc57d8 | ||
|
f04ed5b8f0 | ||
|
8bd44f429b | ||
|
fb7866b165 | ||
|
98db6db1eb | ||
|
0a235ec523 | ||
|
cb4f7ad0a8 | ||
|
91ce1d3b88 | ||
|
8f9ab150ee | ||
|
8d52f83b4f | ||
|
fb19739b54 | ||
|
acd4f28ae3 | ||
|
e4d443db50 | ||
|
fe9d36cd27 | ||
|
a916cc7e78 | ||
|
77d15f884b | ||
|
ab773c9052 | ||
|
87d292ca27 | ||
|
946e272d1c | ||
|
ffe2e310aa | ||
|
9fc6af0f2d | ||
|
71807b67fc | ||
|
ab61d0ce21 | ||
|
f2dc0d234b | ||
|
4885dbc78e | ||
|
0e29e282df | ||
|
0b3fd335ad | ||
|
9b2263c7bb | ||
|
1305fafd38 | ||
|
844b8d48c4 | ||
|
fc9ef290f1 | ||
|
020c8ad933 | ||
|
33ea27b411 | ||
|
b39e3e5965 | ||
|
ba7e504f12 | ||
|
a732ce2a20 | ||
|
2b76c4801f | ||
|
dd09dd59e9 | ||
|
d56088d086 | ||
|
f27f00cfa0 | ||
|
d762136e0b | ||
|
536cd78e29 | ||
|
5ef0889f50 | ||
|
c2ffedb506 | ||
|
fe702a3030 | ||
|
2244d366bd | ||
|
ac16e0294e | ||
|
bf1b0ee3c2 | ||
|
ffec4bbfba | ||
|
ae6e103c09 | ||
|
99d4471f75 | ||
|
7f1fb72298 | ||
|
009c2ed5d9 | ||
|
44fc00299c | ||
|
774fc4281c | ||
|
c47955c069 | ||
|
e7569644f7 | ||
|
c567474043 | ||
|
9f394e92fe | ||
|
66befc7e44 | ||
|
c3a28fc698 | ||
|
ef317d5b3c | ||
|
152301f9ee | ||
|
645e9ba1f7 | ||
|
56487c3a33 | ||
|
b8062a915c | ||
|
5780c9512a | ||
|
71d39707d9 | ||
|
9ccb8ae692 | ||
|
8cd50bb5bd | ||
|
ae9e1278e5 | ||
|
58c03797b2 | ||
|
7db38b4c6c | ||
|
da6b447e64 | ||
|
c19ac2b0f3 | ||
|
d5ca2171b3 | ||
|
20972cb29f | ||
|
7b714d0866 |
223
.ci/php-cs-fixer/composer.lock
generated
223
.ci/php-cs-fixer/composer.lock
generated
@@ -151,16 +151,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/semver",
|
"name": "composer/semver",
|
||||||
"version": "3.4.3",
|
"version": "3.4.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/composer/semver.git",
|
"url": "https://github.com/composer/semver.git",
|
||||||
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
|
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
|
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
|
||||||
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
|
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -212,7 +212,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"irc": "ircs://irc.libera.chat:6697/composer",
|
"irc": "ircs://irc.libera.chat:6697/composer",
|
||||||
"issues": "https://github.com/composer/semver/issues",
|
"issues": "https://github.com/composer/semver/issues",
|
||||||
"source": "https://github.com/composer/semver/tree/3.4.3"
|
"source": "https://github.com/composer/semver/tree/3.4.4"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -222,13 +222,9 @@
|
|||||||
{
|
{
|
||||||
"url": "https://github.com/composer",
|
"url": "https://github.com/composer",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-09-19T14:15:21+00:00"
|
"time": "2025-08-20T19:15:30+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/xdebug-handler",
|
"name": "composer/xdebug-handler",
|
||||||
@@ -345,16 +341,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "fidry/cpu-core-counter",
|
"name": "fidry/cpu-core-counter",
|
||||||
"version": "1.2.0",
|
"version": "1.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/theofidry/cpu-core-counter.git",
|
"url": "https://github.com/theofidry/cpu-core-counter.git",
|
||||||
"reference": "8520451a140d3f46ac33042715115e290cf5785f"
|
"reference": "db9508f7b1474469d9d3c53b86f817e344732678"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f",
|
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678",
|
||||||
"reference": "8520451a140d3f46ac33042715115e290cf5785f",
|
"reference": "db9508f7b1474469d9d3c53b86f817e344732678",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -364,10 +360,10 @@
|
|||||||
"fidry/makefile": "^0.2.0",
|
"fidry/makefile": "^0.2.0",
|
||||||
"fidry/php-cs-fixer-config": "^1.1.2",
|
"fidry/php-cs-fixer-config": "^1.1.2",
|
||||||
"phpstan/extension-installer": "^1.2.0",
|
"phpstan/extension-installer": "^1.2.0",
|
||||||
"phpstan/phpstan": "^1.9.2",
|
"phpstan/phpstan": "^2.0",
|
||||||
"phpstan/phpstan-deprecation-rules": "^1.0.0",
|
"phpstan/phpstan-deprecation-rules": "^2.0.0",
|
||||||
"phpstan/phpstan-phpunit": "^1.2.2",
|
"phpstan/phpstan-phpunit": "^2.0",
|
||||||
"phpstan/phpstan-strict-rules": "^1.4.4",
|
"phpstan/phpstan-strict-rules": "^2.0",
|
||||||
"phpunit/phpunit": "^8.5.31 || ^9.5.26",
|
"phpunit/phpunit": "^8.5.31 || ^9.5.26",
|
||||||
"webmozarts/strict-phpunit": "^7.5"
|
"webmozarts/strict-phpunit": "^7.5"
|
||||||
},
|
},
|
||||||
@@ -394,7 +390,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/theofidry/cpu-core-counter/issues",
|
"issues": "https://github.com/theofidry/cpu-core-counter/issues",
|
||||||
"source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0"
|
"source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -402,20 +398,20 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-06T10:04:20+00:00"
|
"time": "2025-08-14T07:29:31+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "friendsofphp/php-cs-fixer",
|
"name": "friendsofphp/php-cs-fixer",
|
||||||
"version": "v3.85.1",
|
"version": "v3.87.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||||
"reference": "2fb6d7f6c3398dca5786a1635b27405d73a417ba"
|
"reference": "da5f0a7858c79b56fc0b8c36d3efcfe5f37f0992"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2fb6d7f6c3398dca5786a1635b27405d73a417ba",
|
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/da5f0a7858c79b56fc0b8c36d3efcfe5f37f0992",
|
||||||
"reference": "2fb6d7f6c3398dca5786a1635b27405d73a417ba",
|
"reference": "da5f0a7858c79b56fc0b8c36d3efcfe5f37f0992",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -426,39 +422,38 @@
|
|||||||
"ext-hash": "*",
|
"ext-hash": "*",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"ext-tokenizer": "*",
|
"ext-tokenizer": "*",
|
||||||
"fidry/cpu-core-counter": "^1.2",
|
"fidry/cpu-core-counter": "^1.3",
|
||||||
"php": "^7.4 || ^8.0",
|
"php": "^7.4 || ^8.0",
|
||||||
"react/child-process": "^0.6.6",
|
"react/child-process": "^0.6.6",
|
||||||
"react/event-loop": "^1.5",
|
"react/event-loop": "^1.5",
|
||||||
"react/promise": "^3.2",
|
"react/promise": "^3.3",
|
||||||
"react/socket": "^1.16",
|
"react/socket": "^1.16",
|
||||||
"react/stream": "^1.4",
|
"react/stream": "^1.4",
|
||||||
"sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0",
|
"sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0",
|
||||||
"symfony/console": "^5.4.47 || ^6.4.13 || ^7.0",
|
"symfony/console": "^5.4.47 || ^6.4.24 || ^7.0",
|
||||||
"symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0",
|
"symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0",
|
||||||
"symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0",
|
"symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0",
|
||||||
"symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0",
|
"symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0",
|
||||||
"symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0",
|
"symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0",
|
||||||
"symfony/polyfill-mbstring": "^1.32",
|
"symfony/polyfill-mbstring": "^1.33",
|
||||||
"symfony/polyfill-php80": "^1.32",
|
"symfony/polyfill-php80": "^1.33",
|
||||||
"symfony/polyfill-php81": "^1.32",
|
"symfony/polyfill-php81": "^1.33",
|
||||||
"symfony/process": "^5.4.47 || ^6.4.20 || ^7.2",
|
"symfony/process": "^5.4.47 || ^6.4.24 || ^7.2",
|
||||||
"symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0"
|
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"facile-it/paraunit": "^1.3.1 || ^2.6",
|
"facile-it/paraunit": "^1.3.1 || ^2.7",
|
||||||
"infection/infection": "^0.29.14",
|
"infection/infection": "^0.29.14",
|
||||||
"justinrainbow/json-schema": "^5.3 || ^6.4",
|
"justinrainbow/json-schema": "^6.5",
|
||||||
"keradus/cli-executor": "^2.2",
|
"keradus/cli-executor": "^2.2",
|
||||||
"mikey179/vfsstream": "^1.6.12",
|
"mikey179/vfsstream": "^1.6.12",
|
||||||
"php-coveralls/php-coveralls": "^2.8",
|
"php-coveralls/php-coveralls": "^2.8",
|
||||||
"php-cs-fixer/accessible-object": "^1.1",
|
|
||||||
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
|
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
|
||||||
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
|
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
|
||||||
"phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25",
|
"phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34",
|
||||||
"symfony/polyfill-php84": "^1.32",
|
"symfony/polyfill-php84": "^1.33",
|
||||||
"symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1",
|
"symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2",
|
||||||
"symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1"
|
"symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-dom": "For handling output formats in XML",
|
"ext-dom": "For handling output formats in XML",
|
||||||
@@ -499,7 +494,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.85.1"
|
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.87.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -507,7 +502,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-07-29T22:22:50+00:00"
|
"time": "2025-09-10T09:51:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/container",
|
"name": "psr/container",
|
||||||
@@ -959,23 +954,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "react/promise",
|
"name": "react/promise",
|
||||||
"version": "v3.2.0",
|
"version": "v3.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/reactphp/promise.git",
|
"url": "https://github.com/reactphp/promise.git",
|
||||||
"reference": "8a164643313c71354582dc850b42b33fa12a4b63"
|
"reference": "23444f53a813a3296c1368bb104793ce8d88f04a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
|
"url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
|
||||||
"reference": "8a164643313c71354582dc850b42b33fa12a4b63",
|
"reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1.0"
|
"php": ">=7.1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "1.10.39 || 1.4.10",
|
"phpstan/phpstan": "1.12.28 || 1.4.10",
|
||||||
"phpunit/phpunit": "^9.6 || ^7.5"
|
"phpunit/phpunit": "^9.6 || ^7.5"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@@ -1020,7 +1015,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/reactphp/promise/issues",
|
"issues": "https://github.com/reactphp/promise/issues",
|
||||||
"source": "https://github.com/reactphp/promise/tree/v3.2.0"
|
"source": "https://github.com/reactphp/promise/tree/v3.3.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1028,7 +1023,7 @@
|
|||||||
"type": "open_collective"
|
"type": "open_collective"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-05-24T10:39:05+00:00"
|
"time": "2025-08-19T18:57:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "react/socket",
|
"name": "react/socket",
|
||||||
@@ -1257,16 +1252,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v7.3.2",
|
"version": "v7.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/console.git",
|
"url": "https://github.com/symfony/console.git",
|
||||||
"reference": "5f360ebc65c55265a74d23d7fe27f957870158a1"
|
"reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/console/zipball/5f360ebc65c55265a74d23d7fe27f957870158a1",
|
"url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7",
|
||||||
"reference": "5f360ebc65c55265a74d23d7fe27f957870158a1",
|
"reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1331,7 +1326,7 @@
|
|||||||
"terminal"
|
"terminal"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/console/tree/v7.3.2"
|
"source": "https://github.com/symfony/console/tree/v7.3.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1351,7 +1346,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-07-30T17:13:41+00:00"
|
"time": "2025-08-25T06:35:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/deprecation-contracts",
|
"name": "symfony/deprecation-contracts",
|
||||||
@@ -1422,16 +1417,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher",
|
"name": "symfony/event-dispatcher",
|
||||||
"version": "v7.3.0",
|
"version": "v7.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||||
"reference": "497f73ac996a598c92409b44ac43b6690c4f666d"
|
"reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d",
|
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191",
|
||||||
"reference": "497f73ac996a598c92409b44ac43b6690c4f666d",
|
"reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1482,7 +1477,7 @@
|
|||||||
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0"
|
"source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1493,12 +1488,16 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-04-22T09:11:45+00:00"
|
"time": "2025-08-13T11:49:31+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher-contracts",
|
"name": "symfony/event-dispatcher-contracts",
|
||||||
@@ -1716,16 +1715,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/options-resolver",
|
"name": "symfony/options-resolver",
|
||||||
"version": "v7.3.2",
|
"version": "v7.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/options-resolver.git",
|
"url": "https://github.com/symfony/options-resolver.git",
|
||||||
"reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37"
|
"reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/119bcf13e67dbd188e5dbc74228b1686f66acd37",
|
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
|
||||||
"reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37",
|
"reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1763,7 +1762,7 @@
|
|||||||
"options"
|
"options"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/options-resolver/tree/v7.3.2"
|
"source": "https://github.com/symfony/options-resolver/tree/v7.3.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1783,11 +1782,11 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-07-15T11:36:08+00:00"
|
"time": "2025-08-05T10:16:07+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-ctype",
|
"name": "symfony/polyfill-ctype",
|
||||||
"version": "v1.32.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||||
@@ -1846,7 +1845,7 @@
|
|||||||
"portable"
|
"portable"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
|
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1857,6 +1856,10 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
@@ -1866,16 +1869,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-grapheme",
|
"name": "symfony/polyfill-intl-grapheme",
|
||||||
"version": "v1.32.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||||
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
|
"reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
|
||||||
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
"reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1924,7 +1927,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
|
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1935,16 +1938,20 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-09-09T11:45:10+00:00"
|
"time": "2025-06-27T09:58:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-normalizer",
|
"name": "symfony/polyfill-intl-normalizer",
|
||||||
"version": "v1.32.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||||
@@ -2005,7 +2012,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
|
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2016,6 +2023,10 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
@@ -2025,7 +2036,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
"version": "v1.32.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||||
@@ -2086,7 +2097,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
|
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2097,6 +2108,10 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
@@ -2106,7 +2121,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php80",
|
"name": "symfony/polyfill-php80",
|
||||||
"version": "v1.32.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||||
@@ -2166,7 +2181,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
|
"source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2177,6 +2192,10 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
@@ -2186,7 +2205,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php81",
|
"name": "symfony/polyfill-php81",
|
||||||
"version": "v1.32.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php81.git",
|
"url": "https://github.com/symfony/polyfill-php81.git",
|
||||||
@@ -2242,7 +2261,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0"
|
"source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2253,6 +2272,10 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
@@ -2262,16 +2285,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/process",
|
"name": "symfony/process",
|
||||||
"version": "v7.3.0",
|
"version": "v7.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/process.git",
|
"url": "https://github.com/symfony/process.git",
|
||||||
"reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af"
|
"reference": "32241012d521e2e8a9d713adb0812bb773b907f1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
|
"url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1",
|
||||||
"reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
|
"reference": "32241012d521e2e8a9d713adb0812bb773b907f1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2303,7 +2326,7 @@
|
|||||||
"description": "Executes commands in sub-processes",
|
"description": "Executes commands in sub-processes",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/process/tree/v7.3.0"
|
"source": "https://github.com/symfony/process/tree/v7.3.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2314,12 +2337,16 @@
|
|||||||
"url": "https://github.com/fabpot",
|
"url": "https://github.com/fabpot",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/nicolas-grekas",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-04-17T09:11:12+00:00"
|
"time": "2025-08-18T09:42:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/service-contracts",
|
"name": "symfony/service-contracts",
|
||||||
@@ -2468,16 +2495,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/string",
|
"name": "symfony/string",
|
||||||
"version": "v7.3.2",
|
"version": "v7.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/string.git",
|
"url": "https://github.com/symfony/string.git",
|
||||||
"reference": "42f505aff654e62ac7ac2ce21033818297ca89ca"
|
"reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca",
|
"url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
|
||||||
"reference": "42f505aff654e62ac7ac2ce21033818297ca89ca",
|
"reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2535,7 +2562,7 @@
|
|||||||
"utf8"
|
"utf8"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/string/tree/v7.3.2"
|
"source": "https://github.com/symfony/string/tree/v7.3.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2555,7 +2582,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-07-10T08:47:49+00:00"
|
"time": "2025-08-25T06:35:40+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [],
|
"packages-dev": [],
|
||||||
|
@@ -1,6 +1,4 @@
|
|||||||
parameters:
|
parameters:
|
||||||
scanFiles:
|
|
||||||
- ../_ide_helper
|
|
||||||
paths:
|
paths:
|
||||||
- ../app
|
- ../app
|
||||||
- ../database
|
- ../database
|
||||||
@@ -9,28 +7,24 @@ parameters:
|
|||||||
- ../bootstrap/app.php
|
- ../bootstrap/app.php
|
||||||
universalObjectCratesClasses:
|
universalObjectCratesClasses:
|
||||||
- Illuminate\Database\Eloquent\Model
|
- Illuminate\Database\Eloquent\Model
|
||||||
# TODO: slowly remove these parameters and fix the issues found.
|
|
||||||
reportUnmatchedIgnoredErrors: true
|
reportUnmatchedIgnoredErrors: true
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
# TODO: slowly remove these exceptions and fix the issues found.
|
# all errors below I will never fix.
|
||||||
- '#Dynamic call to static method#' # all the Laravel ORM things depend on this.
|
- '#expects view-string\|null, string given#'
|
||||||
- identifier: varTag.nativeType
|
- '#expects view-string, string given#'
|
||||||
- identifier: varTag.type
|
- "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
|
||||||
|
- identifier: missingType.generics # not interesting enough to fix.
|
||||||
-
|
-
|
||||||
identifier: larastan.noEnvCallsOutsideOfConfig
|
identifier: larastan.noEnvCallsOutsideOfConfig
|
||||||
path: ../app/Console/Commands/System/CreatesDatabase.php
|
path: ../app/Console/Commands/System/CreatesDatabase.php
|
||||||
- identifier: missingType.iterableValue # not interesting enough to fix.
|
- identifier: missingType.iterableValue # not interesting enough to fix.
|
||||||
- identifier: missingType.generics # not interesting enough to fix.
|
- identifier: varTag.type # needs a custom extension for every repository, not gonna happen.
|
||||||
- "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
|
- '#Dynamic call to static method Illuminate#'
|
||||||
- '#expects view-string, string given#'
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#' # is custom scope
|
||||||
- '#expects view-string\|null, string given#'
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#' # is custom scope
|
||||||
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#' # is to allow soft delete
|
||||||
# phpstan can't handle this so we ignore them.
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::accountTypeIn#' # is a custom scope
|
||||||
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#'
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::withTrashed#' # is to allow soft delete
|
||||||
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#'
|
|
||||||
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#'
|
|
||||||
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::accountTypeIn#'
|
|
||||||
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::withTrashed#'
|
|
||||||
|
|
||||||
# The level 8 is the highest level. original was 5
|
# The level 8 is the highest level. original was 5
|
||||||
# 7 is more than enough, higher just leaves NULL things.
|
# 7 is more than enough, higher just leaves NULL things.
|
||||||
|
@@ -314,8 +314,9 @@ DEMO_USERNAME=
|
|||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
#
|
#
|
||||||
# Disable or enable the running balance column data
|
# Disable or enable the running balance column data.
|
||||||
# Please disable this. It's a very experimental feature.
|
# If you enable this, please also run "php artisan firefly-iii:correct-database"
|
||||||
|
# This will take some time the first run.
|
||||||
#
|
#
|
||||||
USE_RUNNING_BALANCE=false
|
USE_RUNNING_BALANCE=false
|
||||||
|
|
||||||
|
6
.github/label-actions.yml
vendored
6
.github/label-actions.yml
vendored
@@ -25,7 +25,7 @@ feature:
|
|||||||
|
|
||||||
This issue has been marked as a feature request.
|
This issue has been marked as a feature request.
|
||||||
|
|
||||||
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
If you come across this issue, please be aware there is NO need to reply with "+1" or "I need this too" or "any updates?" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
||||||
|
|
||||||
Thank you for your contributions.
|
Thank you for your contributions.
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ epic:
|
|||||||
|
|
||||||
This issue has been marked as an epic. In epics, large amounts of works are collected that will be part of a major new feature. If you have more ideas that could be a part of this epic, feel free to reply.
|
This issue has been marked as an epic. In epics, large amounts of works are collected that will be part of a major new feature. If you have more ideas that could be a part of this epic, feel free to reply.
|
||||||
|
|
||||||
*However*, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted.
|
*However*, please be aware there is NO need to reply with "+1" or "I need this too" or "any updates?" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted.
|
||||||
|
|
||||||
If you are merely interested in this epic's progress, you can subscribe to this issue to get updates.
|
If you are merely interested in this epic's progress, you can subscribe to this issue to get updates.
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ enhancement:
|
|||||||
|
|
||||||
This issue has been marked as an enhancement.
|
This issue has been marked as an enhancement.
|
||||||
|
|
||||||
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
If you come across this issue, please be aware there is NO need to reply with "+1" or "I need this too" or "any updates?" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
||||||
|
|
||||||
Thank you for your contributions.
|
Thank you for your contributions.
|
||||||
|
|
||||||
|
25
.github/release-notes/alpha.md
vendored
Normal file
25
.github/release-notes/alpha.md
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Welcome to release %version of Firefly III. This **alpha** release contains the latest fixes, translations and features. It is probably buggy and may not work as expected. You can download the release below, and adventurous Docker users can find this release under the `alpha` tag.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Please be careful with this alpha release, as it may not work as expected.
|
||||||
|
|
||||||
|
Alpha releases are created to test new features and fixes before they are included in a stable release. They are not recommended for production use. This release was created on %date and may contain unexpected bugs. Data loss is rare but possible.
|
||||||
|
|
||||||
|
## Changelog (not final)
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
|
||||||
|
## Installation and upgrade instructions
|
||||||
|
|
||||||
|
* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/).
|
||||||
|
* Alternatively, read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)
|
||||||
|
|
||||||
|
The release files are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||||
|
|
||||||
|
## Develop with Firefly III
|
||||||
|
|
||||||
|
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||||
|
|
||||||
|
## Support Firefly III
|
||||||
|
|
||||||
|
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
25
.github/release-notes/beta.md
vendored
Normal file
25
.github/release-notes/beta.md
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Welcome to release %version of Firefly III. This **beta** release contains the latest fixes, translations and features. It may be buggy, nor work as expected. You can download the release below, and adventurous Docker users can find this release under the `beta` tag.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Please be careful with this beta release, as it may not work as expected.
|
||||||
|
|
||||||
|
Alpha releases are created to test new features and fixes before they are included in a stable release. They are not recommended for production use. This release was created on %date and may contain unexpected bugs. Data loss is rare but possible.
|
||||||
|
|
||||||
|
## Changelog (not final)
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
|
||||||
|
## Installation and upgrade instructions
|
||||||
|
|
||||||
|
* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/).
|
||||||
|
* Alternatively, read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)
|
||||||
|
|
||||||
|
The release files are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||||
|
|
||||||
|
## Develop with Firefly III
|
||||||
|
|
||||||
|
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||||
|
|
||||||
|
## Support Firefly III
|
||||||
|
|
||||||
|
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
25
.github/release-notes/branch.md
vendored
Normal file
25
.github/release-notes/branch.md
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Welcome to release %version of Firefly III. This branch-related release contains the latest fixes, translations and features. It is probably buggy and may not work as expected. You can download the release below, and adventurous Docker users can find this release under the `branch-*` tag.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Please be careful with this branch release, as it may not work as expected.
|
||||||
|
|
||||||
|
Branch releases are created to test large new features that are developed alongside the normal release flow. They are not recommended for production use. This release was created on %date and may contain unexpected bugs. Data loss is rare but possible.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
There is no changelog for this release, as it is not final. However, [changelog.md](https://github.com/firefly-iii/firefly-iii/blob/develop/changelog.md) may already contain entries for the future release that this branch will be a part of.
|
||||||
|
|
||||||
|
## Installation and upgrade instructions
|
||||||
|
|
||||||
|
* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/).
|
||||||
|
* Alternatively, read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)
|
||||||
|
|
||||||
|
The release files are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||||
|
|
||||||
|
## Develop with Firefly III
|
||||||
|
|
||||||
|
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||||
|
|
||||||
|
## Support Firefly III
|
||||||
|
|
||||||
|
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
25
.github/release-notes/develop.md
vendored
Normal file
25
.github/release-notes/develop.md
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Welcome to the latest development release of Firefly III. This test release contains the absolute latest fixes, translations and features. It is probably buggy and may not work as expected. You can download the release below, and adventurous Docker users can find this release under the `develop` tag.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Please be careful with this pre-release, as it may not work as expected.
|
||||||
|
|
||||||
|
This release was created on %date and may contain unexpected bugs. Data loss is rare but possible.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
The changelog for this release may not be up-to-date, so it is not included. However, [changelog.md](https://github.com/firefly-iii/firefly-iii/blob/develop/changelog.md) may already contain entries for the future release.
|
||||||
|
|
||||||
|
## Installation and upgrade instructions
|
||||||
|
|
||||||
|
* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/).
|
||||||
|
* Alternatively, read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)
|
||||||
|
|
||||||
|
The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||||
|
|
||||||
|
## Develop with Firefly III
|
||||||
|
|
||||||
|
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||||
|
|
||||||
|
## Support Firefly III
|
||||||
|
|
||||||
|
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
20
.github/release-notes/release.md
vendored
Normal file
20
.github/release-notes/release.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Welcome to release %version of Firefly III. It contains the latest fixes, translations and features. Docker users can find this release under the `latest` tag.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
|
||||||
|
## Installation and upgrade instructions
|
||||||
|
|
||||||
|
* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/).
|
||||||
|
* Alternatively, read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)
|
||||||
|
|
||||||
|
The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/).
|
||||||
|
|
||||||
|
## Develop with Firefly III
|
||||||
|
|
||||||
|
Are you interested in (future) API changes to Firefly III, or other interesting dev-related updates? Sign up to the [Firefly III developer newsletter](https://firefly-iii.kit.com/dev) to receive low-frequency updates about the development of Firefly III.
|
||||||
|
|
||||||
|
## Support Firefly III
|
||||||
|
|
||||||
|
Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. Please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information. Thank you for your consideration.
|
4
.github/workflows/cleanup.yml
vendored
4
.github/workflows/cleanup.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
steps:
|
steps:
|
||||||
- name: Prune cancelled/skipped runs
|
- name: Prune cancelled/skipped runs
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
- name: Prune runs older than 3 days
|
- name: Prune runs older than 3 days
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
|
2
.github/workflows/close-duplicates.yml
vendored
2
.github/workflows/close-duplicates.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
close_duplicates:
|
close_duplicates:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: github/command@v2.0.1
|
- uses: github/command@v2.0.2
|
||||||
id: command
|
id: command
|
||||||
with:
|
with:
|
||||||
allowed_contexts: "issue"
|
allowed_contexts: "issue"
|
||||||
|
2
.github/workflows/depsreview.yml
vendored
2
.github/workflows/depsreview.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout repository'
|
- name: 'Checkout repository'
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: 'Dependency review'
|
- name: 'Dependency review'
|
||||||
|
2
.github/workflows/lock.yml
vendored
2
.github/workflows/lock.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
discussions: write
|
discussions: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v5
|
- uses: JC5/lock-threads@v6.0.6
|
||||||
with:
|
with:
|
||||||
issue-inactive-days: 21
|
issue-inactive-days: 21
|
||||||
pr-inactive-days: 21
|
pr-inactive-days: 21
|
||||||
|
133
.github/workflows/release.yml
vendored
133
.github/workflows/release.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Import GPG key
|
- name: Import GPG key
|
||||||
@@ -50,7 +50,7 @@ jobs:
|
|||||||
git pull
|
git pull
|
||||||
echo "Current branch is $(git branch --show-current)"
|
echo "Current branch is $(git branch --show-current)"
|
||||||
env:
|
env:
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
- name: Configure Git
|
- name: Configure Git
|
||||||
run: |
|
run: |
|
||||||
# do some configuration
|
# do some configuration
|
||||||
@@ -118,7 +118,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
FIREFLY_III_ROOT: /github/workspace
|
FIREFLY_III_ROOT: /github/workspace
|
||||||
GH_TOKEN: ""
|
GH_TOKEN: ""
|
||||||
FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
- name: Generate JSON v1
|
- name: Generate JSON v1
|
||||||
id: json-v1
|
id: json-v1
|
||||||
uses: JC5/firefly-iii-dev@main
|
uses: JC5/firefly-iii-dev@main
|
||||||
@@ -221,7 +221,7 @@ jobs:
|
|||||||
echo "tarName=$tarName" >> "$GITHUB_ENV"
|
echo "tarName=$tarName" >> "$GITHUB_ENV"
|
||||||
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
|
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
|
||||||
env:
|
env:
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
- name: Commit all changes
|
- name: Commit all changes
|
||||||
run: |
|
run: |
|
||||||
# add all content, except output.txt (this contains the changelog and/or the download instructions)
|
# add all content, except output.txt (this contains the changelog and/or the download instructions)
|
||||||
@@ -232,123 +232,16 @@ jobs:
|
|||||||
git commit -m "🤖 Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
|
git commit -m "🤖 Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
|
||||||
git push
|
git push
|
||||||
env:
|
env:
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
- name: Extract changelog
|
- name: Generate release description
|
||||||
id: extract-changelog
|
id: release-description
|
||||||
uses: JC5/firefly-iii-dev@main
|
uses: JC5/firefly-iii-dev@main
|
||||||
with:
|
with:
|
||||||
action: 'ff3:extract-changelog'
|
action: "ff3:generate-release-notes firefly-iii ${{ inputs.version || 'develop' }}"
|
||||||
output: 'output'
|
output: 'output'
|
||||||
env:
|
env:
|
||||||
FIREFLY_III_ROOT: /github/workspace
|
FIREFLY_III_ROOT: /github/workspace
|
||||||
GH_TOKEN: ""
|
GH_TOKEN: ""
|
||||||
- name: Describe new release
|
|
||||||
run: |
|
|
||||||
|
|
||||||
# describe the development release.
|
|
||||||
if [[ "develop" == "$version" ]]; then
|
|
||||||
echo 'Describe the latest develop release'
|
|
||||||
rm -f output.txt
|
|
||||||
touch output.txt
|
|
||||||
sudo chown -R runner:docker output.txt
|
|
||||||
echo "Weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
|
|
||||||
|
|
||||||
# donations!
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo '### Support Firefly III' >> output.txt
|
|
||||||
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
fi
|
|
||||||
# describe a branch release
|
|
||||||
if [[ "$version" == branch* ]]; then
|
|
||||||
echo 'Describe a branch release'
|
|
||||||
rm -f output.txt
|
|
||||||
touch output.txt
|
|
||||||
sudo chown -R runner:docker output.txt
|
|
||||||
echo "Irregular BRANCH release of Firefly III. This release contains specific features or changes. Docker users can find this release under the \`$version\` tag." >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo ":warning: Please be careful with this branch pre-release, as it may not work as expected." >> output.txt
|
|
||||||
fi
|
|
||||||
# describe the main release
|
|
||||||
if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]] && [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then
|
|
||||||
echo 'Describe the latest release'
|
|
||||||
sudo chown -R runner:docker output.txt
|
|
||||||
|
|
||||||
# the changelog is in output.txt
|
|
||||||
mv output.txt output2.txt
|
|
||||||
|
|
||||||
touch output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
|
|
||||||
# add changelog to file.
|
|
||||||
cat output2.txt >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
rm -f output2.txt
|
|
||||||
|
|
||||||
echo '### Instructions' >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
|
|
||||||
# donations!
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo '### Support Firefly III' >> output.txt
|
|
||||||
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
fi
|
|
||||||
|
|
||||||
# describe alpha release
|
|
||||||
if [[ "$version" == *alpha* ]]; then
|
|
||||||
echo 'Describe an ALPHA release'
|
|
||||||
rm -f output.txt
|
|
||||||
touch output.txt
|
|
||||||
sudo chown -R runner:docker output.txt
|
|
||||||
echo "Very early ALPHA release of Firefly III. This release contains specific features or changes. Docker users can find this release under the \`$version\` tag." >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo '### Instructions' >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# describe beta release
|
|
||||||
if [[ "$version" == *beta* ]]; then
|
|
||||||
echo 'Describe a BETA release'
|
|
||||||
rm -f output.txt
|
|
||||||
touch output.txt
|
|
||||||
sudo chown -R runner:docker output.txt
|
|
||||||
echo "Very early BETA release of Firefly III. This release contains specific features or changes. Docker users can find this release under the \`$version\` tag." >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo '### Instructions' >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
|
||||||
- name: Merge all into working branch
|
- name: Merge all into working branch
|
||||||
run: |
|
run: |
|
||||||
MERGE_INTO=develop
|
MERGE_INTO=develop
|
||||||
@@ -357,7 +250,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Merge all changes from $BRANCH_NAME back into '$MERGE_INTO' using a PR"
|
echo "Merge all changes from $BRANCH_NAME back into '$MERGE_INTO' using a PR"
|
||||||
PR_URL=$(gh pr create -B $MERGE_INTO -H $BRANCH_NAME --title "🤖 Automatic PR to merge all changes into the '$MERGE_INTO' branch." --body '🤖 Created by GitHub action')
|
PR_URL=$(gh pr create -B $MERGE_INTO -H $BRANCH_NAME --title "🤖 Automatic PR to merge all changes into the '$MERGE_INTO' branch." --body '🤖 This PR was created automatically by a GitHub action to merge the changed files into this branch. It will be merged automatically. `Share and enjoy`')
|
||||||
echo "PR URL is '$PR_URL'"
|
echo "PR URL is '$PR_URL'"
|
||||||
IFS='/' read -ra parts <<< "$PR_URL"
|
IFS='/' read -ra parts <<< "$PR_URL"
|
||||||
PR_NR=$(printf %s\\n "${parts[@]:(-1)}")
|
PR_NR=$(printf %s\\n "${parts[@]:(-1)}")
|
||||||
@@ -379,7 +272,7 @@ jobs:
|
|||||||
|
|
||||||
echo "Also merge everything into main since this is a release."
|
echo "Also merge everything into main since this is a release."
|
||||||
echo 'create PR'
|
echo 'create PR'
|
||||||
PR_URL=$(gh pr create -B main -H develop --title "🤖 Automatic PR to merge all changes into the main branch." --body "🤖 Created by GitHub action")
|
PR_URL=$(gh pr create -B main -H develop --title "🤖 Automatic PR to merge all changes into the main branch." --body '🤖 This PR was created automatically by a GitHub action to merge the changed files into this branch. It will be merged automatically. `Share and enjoy`')
|
||||||
echo "PR URL is '$PR_URL'"
|
echo "PR URL is '$PR_URL'"
|
||||||
|
|
||||||
IFS='/' read -ra parts <<< "$PR_URL"
|
IFS='/' read -ra parts <<< "$PR_URL"
|
||||||
@@ -398,7 +291,7 @@ jobs:
|
|||||||
echo "DONE!"
|
echo "DONE!"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
- name: Create archives
|
- name: Create archives
|
||||||
run: |
|
run: |
|
||||||
echo "Create zip file $zipName"
|
echo "Create zip file $zipName"
|
||||||
@@ -482,7 +375,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
run: |
|
run: |
|
||||||
# add zip file to release.
|
# add zip file to release.
|
||||||
@@ -518,4 +411,4 @@ jobs:
|
|||||||
rm -f $tarName.sha256
|
rm -f $tarName.sha256
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || inputs.version }}
|
||||||
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
actions: write
|
actions: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v10
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
stale-issue-message: |
|
stale-issue-message: |
|
||||||
|
@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
@@ -34,7 +35,6 @@ use FireflyIII\Support\Debug\Timer;
|
|||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\AccountFilter;
|
use FireflyIII\Support\Http\Api\AccountFilter;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
@@ -46,7 +46,8 @@ class AccountController extends Controller
|
|||||||
use AccountFilter;
|
use AccountFilter;
|
||||||
|
|
||||||
// this array only exists to test if the constructor will use it properly.
|
// this array only exists to test if the constructor will use it properly.
|
||||||
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/** @var array<int, string> */
|
/** @var array<int, string> */
|
||||||
private array $balanceTypes;
|
private array $balanceTypes;
|
||||||
@@ -60,10 +61,10 @@ class AccountController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -85,7 +86,8 @@ class AccountController extends Controller
|
|||||||
$query = $data['query'];
|
$query = $data['query'];
|
||||||
$date = $data['date'] ?? today(config('app.timezone'));
|
$date = $data['date'] ?? today(config('app.timezone'));
|
||||||
$return = [];
|
$return = [];
|
||||||
Timer::start(sprintf('AC accounts "%s"', $query));
|
$timer = Timer::getInstance();
|
||||||
|
$timer->start(sprintf('AC accounts "%s"', $query));
|
||||||
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit'));
|
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit'));
|
||||||
|
|
||||||
// set date to subday + end-of-day for account balance. so it is at $date 23:59:59
|
// set date to subday + end-of-day for account balance. so it is at $date 23:59:59
|
||||||
@@ -112,6 +114,7 @@ class AccountController extends Controller
|
|||||||
'id' => (string) $account->id,
|
'id' => (string) $account->id,
|
||||||
'name' => $account->name,
|
'name' => $account->name,
|
||||||
'name_with_balance' => $nameWithBalance,
|
'name_with_balance' => $nameWithBalance,
|
||||||
|
'active' => $account->active,
|
||||||
'type' => $account->accountType->type,
|
'type' => $account->accountType->type,
|
||||||
'currency_id' => (string) $useCurrency->id,
|
'currency_id' => (string) $useCurrency->id,
|
||||||
'currency_name' => $useCurrency->name,
|
'currency_name' => $useCurrency->name,
|
||||||
@@ -137,7 +140,7 @@ class AccountController extends Controller
|
|||||||
return $posA - $posB;
|
return $posA - $posB;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Timer::stop(sprintf('AC accounts "%s"', $query));
|
$timer->stop(sprintf('AC accounts "%s"', $query));
|
||||||
|
|
||||||
return response()->api($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
|
@@ -26,9 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class BillController extends Controller
|
class BillController extends Controller
|
||||||
{
|
{
|
||||||
private BillRepositoryInterface $repository;
|
private BillRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_SUBSCRIPTIONS];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BillController constructor.
|
* BillController constructor.
|
||||||
@@ -46,10 +47,10 @@ class BillController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(BillRepositoryInterface::class);
|
$this->repository = app(BillRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
@@ -26,9 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class BudgetController extends Controller
|
class BudgetController extends Controller
|
||||||
{
|
{
|
||||||
private BudgetRepositoryInterface $repository;
|
private BudgetRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_BUDGETS];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BudgetController constructor.
|
* BudgetController constructor.
|
||||||
@@ -46,10 +47,10 @@ class BudgetController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(BudgetRepositoryInterface::class);
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -66,8 +67,9 @@ class BudgetController extends Controller
|
|||||||
$result = $this->repository->searchBudget($data['query'], $this->parameters->get('limit'));
|
$result = $this->repository->searchBudget($data['query'], $this->parameters->get('limit'));
|
||||||
$filtered = $result->map(
|
$filtered = $result->map(
|
||||||
static fn (Budget $item) => [
|
static fn (Budget $item) => [
|
||||||
'id' => (string) $item->id,
|
'id' => (string) $item->id,
|
||||||
'name' => $item->name,
|
'name' => $item->name,
|
||||||
|
'active' => $item->active,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -26,9 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class CategoryController extends Controller
|
class CategoryController extends Controller
|
||||||
{
|
{
|
||||||
private CategoryRepositoryInterface $repository;
|
private CategoryRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CategoryController constructor.
|
* CategoryController constructor.
|
||||||
@@ -46,10 +47,10 @@ class CategoryController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(CategoryRepositoryInterface::class);
|
$this->repository = app(CategoryRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
@@ -27,9 +27,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
use Deprecated;
|
use Deprecated;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,6 +38,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class CurrencyController extends Controller
|
class CurrencyController extends Controller
|
||||||
{
|
{
|
||||||
private CurrencyRepositoryInterface $repository;
|
private CurrencyRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CurrencyController constructor.
|
* CurrencyController constructor.
|
||||||
@@ -47,10 +48,10 @@ class CurrencyController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(CurrencyRepositoryInterface::class);
|
$this->repository = app(CurrencyRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
@@ -26,9 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\ObjectGroup;
|
use FireflyIII\Models\ObjectGroup;
|
||||||
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
|
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class ObjectGroupController extends Controller
|
class ObjectGroupController extends Controller
|
||||||
{
|
{
|
||||||
private ObjectGroupRepositoryInterface $repository;
|
private ObjectGroupRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CurrencyController constructor.
|
* CurrencyController constructor.
|
||||||
@@ -46,10 +47,10 @@ class ObjectGroupController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(ObjectGroupRepositoryInterface::class);
|
$this->repository = app(ObjectGroupRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
@@ -26,10 +26,10 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,6 +39,7 @@ class PiggyBankController extends Controller
|
|||||||
{
|
{
|
||||||
private AccountRepositoryInterface $accountRepository;
|
private AccountRepositoryInterface $accountRepository;
|
||||||
private PiggyBankRepositoryInterface $piggyRepository;
|
private PiggyBankRepositoryInterface $piggyRepository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_PIGGY_BANKS];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PiggyBankController constructor.
|
* PiggyBankController constructor.
|
||||||
@@ -48,22 +49,19 @@ class PiggyBankController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->piggyRepository = app(PiggyBankRepositoryInterface::class);
|
$this->piggyRepository = app(PiggyBankRepositoryInterface::class);
|
||||||
$this->accountRepository = app(AccountRepositoryInterface::class);
|
$this->accountRepository = app(AccountRepositoryInterface::class);
|
||||||
$this->piggyRepository->setUser($user);
|
$this->piggyRepository->setUser($this->user);
|
||||||
$this->accountRepository->setUser($user);
|
$this->piggyRepository->setUserGroup($this->userGroup);
|
||||||
|
$this->accountRepository->setUser($this->user);
|
||||||
|
$this->accountRepository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesAC
|
|
||||||
*/
|
|
||||||
public function piggyBanks(AutocompleteRequest $request): JsonResponse
|
public function piggyBanks(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
@@ -90,10 +88,6 @@ class PiggyBankController extends Controller
|
|||||||
return response()->api($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesBalanceAC
|
|
||||||
*/
|
|
||||||
public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse
|
public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class RecurrenceController extends Controller
|
class RecurrenceController extends Controller
|
||||||
{
|
{
|
||||||
private RecurringRepositoryInterface $repository;
|
private RecurringRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_RECURRING];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RecurrenceController constructor.
|
* RecurrenceController constructor.
|
||||||
@@ -45,19 +47,16 @@ class RecurrenceController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(RecurringRepositoryInterface::class);
|
$this->repository = app(RecurringRepositoryInterface::class);
|
||||||
|
$this->repository->setUser($this->user);
|
||||||
$this->repository->setUser(auth()->user());
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRecurringAC
|
|
||||||
*/
|
|
||||||
public function recurring(AutocompleteRequest $request): JsonResponse
|
public function recurring(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
@@ -70,6 +69,7 @@ class RecurrenceController extends Controller
|
|||||||
'id' => (string) $recurrence->id,
|
'id' => (string) $recurrence->id,
|
||||||
'name' => $recurrence->title,
|
'name' => $recurrence->title,
|
||||||
'description' => $recurrence->description,
|
'description' => $recurrence->description,
|
||||||
|
'active' => $recurrence->active,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Rule;
|
use FireflyIII\Models\Rule;
|
||||||
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class RuleController extends Controller
|
class RuleController extends Controller
|
||||||
{
|
{
|
||||||
private RuleRepositoryInterface $repository;
|
private RuleRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_RULES];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RuleController constructor.
|
* RuleController constructor.
|
||||||
@@ -45,18 +47,16 @@ class RuleController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(RuleRepositoryInterface::class);
|
$this->repository = app(RuleRepositoryInterface::class);
|
||||||
$this->repository->setUser(auth()->user());
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRulesAC
|
|
||||||
*/
|
|
||||||
public function rules(AutocompleteRequest $request): JsonResponse
|
public function rules(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
@@ -66,9 +66,10 @@ class RuleController extends Controller
|
|||||||
/** @var Rule $rule */
|
/** @var Rule $rule */
|
||||||
foreach ($rules as $rule) {
|
foreach ($rules as $rule) {
|
||||||
$response[] = [
|
$response[] = [
|
||||||
'id' => (string) $rule->id,
|
'id' => (string)$rule->id,
|
||||||
'name' => $rule->title,
|
'name' => $rule->title,
|
||||||
'description' => $rule->description,
|
'description' => $rule->description,
|
||||||
|
'active' => $rule->active,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\RuleGroup;
|
use FireflyIII\Models\RuleGroup;
|
||||||
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
|
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class RuleGroupController extends Controller
|
class RuleGroupController extends Controller
|
||||||
{
|
{
|
||||||
private RuleGroupRepositoryInterface $repository;
|
private RuleGroupRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_RULES];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RuleGroupController constructor.
|
* RuleGroupController constructor.
|
||||||
@@ -45,18 +47,16 @@ class RuleGroupController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(RuleGroupRepositoryInterface::class);
|
$this->repository = app(RuleGroupRepositoryInterface::class);
|
||||||
$this->repository->setUser(auth()->user());
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRuleGroupsAC
|
|
||||||
*/
|
|
||||||
public function ruleGroups(AutocompleteRequest $request): JsonResponse
|
public function ruleGroups(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
@@ -69,6 +69,7 @@ class RuleGroupController extends Controller
|
|||||||
'id' => (string) $group->id,
|
'id' => (string) $group->id,
|
||||||
'name' => $group->title,
|
'name' => $group->title,
|
||||||
'description' => $group->description,
|
'description' => $group->description,
|
||||||
|
'active' => $group->active,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,9 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Tag;
|
use FireflyIII\Models\Tag;
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class TagController extends Controller
|
class TagController extends Controller
|
||||||
{
|
{
|
||||||
private TagRepositoryInterface $repository;
|
private TagRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TagController constructor.
|
* TagController constructor.
|
||||||
@@ -46,20 +47,16 @@ class TagController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$this->repository = app(TagRepositoryInterface::class);
|
$this->repository = app(TagRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTagAC
|
|
||||||
*/
|
|
||||||
public function tags(AutocompleteRequest $request): JsonResponse
|
public function tags(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
|
@@ -31,7 +31,6 @@ use FireflyIII\Enums\UserRoleEnum;
|
|||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
|
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
@@ -52,24 +51,19 @@ class TransactionController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
$this->validateUserGroup($request);
|
||||||
$user = auth()->user();
|
|
||||||
$userGroup = $this->validateUserGroup($request);
|
|
||||||
$this->repository = app(JournalRepositoryInterface::class);
|
$this->repository = app(JournalRepositoryInterface::class);
|
||||||
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($this->user);
|
||||||
$this->groupRepository->setUser($user);
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
$this->groupRepository->setUserGroup($userGroup);
|
$this->groupRepository->setUser($this->user);
|
||||||
|
$this->groupRepository->setUserGroup($this->userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsAC
|
|
||||||
*/
|
|
||||||
public function transactions(AutocompleteRequest $request): JsonResponse
|
public function transactions(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
@@ -92,10 +86,6 @@ class TransactionController extends Controller
|
|||||||
return response()->api($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsIDAC
|
|
||||||
*/
|
|
||||||
public function transactionsWithID(AutocompleteRequest $request): JsonResponse
|
public function transactionsWithID(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Models\TransactionType;
|
||||||
use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface;
|
use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class TransactionTypeController extends Controller
|
class TransactionTypeController extends Controller
|
||||||
{
|
{
|
||||||
private TransactionTypeRepositoryInterface $repository;
|
private TransactionTypeRepositoryInterface $repository;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransactionTypeController constructor.
|
* TransactionTypeController constructor.
|
||||||
@@ -45,6 +47,7 @@ class TransactionTypeController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(TransactionTypeRepositoryInterface::class);
|
$this->repository = app(TransactionTypeRepositoryInterface::class);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
@@ -52,10 +55,6 @@ class TransactionTypeController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at
|
|
||||||
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionTypesAC
|
|
||||||
*/
|
|
||||||
public function transactionTypes(AutocompleteRequest $request): JsonResponse
|
public function transactionTypes(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
|
@@ -24,23 +24,17 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Chart;
|
namespace FireflyIII\Api\V1\Controllers\Chart;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
|
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
|
||||||
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Exceptions\ValidationException;
|
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Preference;
|
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Chart\ChartData;
|
|
||||||
use FireflyIII\Support\Facades\Preferences;
|
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\ApiSupport;
|
use FireflyIII\Support\Http\Api\ApiSupport;
|
||||||
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||||
use FireflyIII\User;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
@@ -50,9 +44,12 @@ use Illuminate\Support\Facades\Log;
|
|||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
use ApiSupport;
|
use ApiSupport;
|
||||||
|
use CleansChartData;
|
||||||
use CollectsAccountsFromFilter;
|
use CollectsAccountsFromFilter;
|
||||||
|
|
||||||
private ChartData $chartData;
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
|
private array $chartData = [];
|
||||||
private AccountRepositoryInterface $repository;
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -63,11 +60,10 @@ class AccountController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
|
||||||
$user = auth()->user();
|
|
||||||
$this->chartData = new ChartData();
|
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->validateUserGroup($request);
|
||||||
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
$this->repository->setUser($this->user);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -75,11 +71,9 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO fix documentation
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function dashboard(ChartRequest $request): JsonResponse
|
public function overview(ChartRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$queryParameters = $request->getParameters();
|
$queryParameters = $request->getParameters();
|
||||||
$accounts = $this->getAccountList($queryParameters);
|
$accounts = $this->getAccountList($queryParameters);
|
||||||
@@ -87,7 +81,7 @@ class AccountController extends Controller
|
|||||||
// move date to end of day
|
// move date to end of day
|
||||||
$queryParameters['start']->startOfDay();
|
$queryParameters['start']->startOfDay();
|
||||||
$queryParameters['end']->endOfDay();
|
$queryParameters['end']->endOfDay();
|
||||||
Log::debug(sprintf('dashboard(), convert to primary: %s', var_export($this->convertToPrimary, true)));
|
// Log::debug(sprintf('dashboard(), convert to primary: %s', var_export($this->convertToPrimary, true)));
|
||||||
|
|
||||||
// loop each account, and collect info:
|
// loop each account, and collect info:
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
@@ -96,7 +90,7 @@ class AccountController extends Controller
|
|||||||
$this->renderAccountData($queryParameters, $account);
|
$this->renderAccountData($queryParameters, $account);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($this->chartData->render());
|
return response()->json($this->clean($this->chartData));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -105,31 +99,38 @@ class AccountController extends Controller
|
|||||||
private function renderAccountData(array $params, Account $account): void
|
private function renderAccountData(array $params, Account $account): void
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('Now in %s(array, #%d)', __METHOD__, $account->id));
|
Log::debug(sprintf('Now in %s(array, #%d)', __METHOD__, $account->id));
|
||||||
$currency = $this->repository->getAccountCurrency($account);
|
$currency = $this->repository->getAccountCurrency($account);
|
||||||
$currentStart = clone $params['start'];
|
$currentStart = clone $params['start'];
|
||||||
$range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary);
|
$range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary);
|
||||||
|
|
||||||
|
|
||||||
$previous = array_values($range)[0]['balance'];
|
$previous = array_values($range)[0]['balance'];
|
||||||
$pcPrevious = null;
|
$pcPrevious = null;
|
||||||
if (!$currency instanceof TransactionCurrency) {
|
if (!$currency instanceof TransactionCurrency) {
|
||||||
$currency = $this->default;
|
$currency = $this->primaryCurrency;
|
||||||
}
|
}
|
||||||
$currentSet = [
|
$currentSet = [
|
||||||
'label' => $account->name,
|
'label' => $account->name,
|
||||||
|
|
||||||
// the currency that belongs to the account.
|
// the currency that belongs to the account.
|
||||||
'currency_id' => (string)$currency->id,
|
'currency_id' => (string)$currency->id,
|
||||||
|
'currency_name' => $currency->name,
|
||||||
'currency_code' => $currency->code,
|
'currency_code' => $currency->code,
|
||||||
'currency_symbol' => $currency->symbol,
|
'currency_symbol' => $currency->symbol,
|
||||||
'currency_decimal_places' => $currency->decimal_places,
|
'currency_decimal_places' => $currency->decimal_places,
|
||||||
|
|
||||||
|
// the primary currency
|
||||||
|
'primary_currency_id' => (string)$this->primaryCurrency->id,
|
||||||
|
|
||||||
// the default currency of the user (could be the same!)
|
// the default currency of the user (could be the same!)
|
||||||
'date' => $params['start']->toAtomString(),
|
'date' => $params['start']->toAtomString(),
|
||||||
'start' => $params['start']->toAtomString(),
|
'start_date' => $params['start']->toAtomString(),
|
||||||
'end' => $params['end']->toAtomString(),
|
'end_date' => $params['end']->toAtomString(),
|
||||||
|
'type' => 'line',
|
||||||
|
'yAxisID' => 0,
|
||||||
'period' => '1D',
|
'period' => '1D',
|
||||||
'entries' => [],
|
'entries' => [],
|
||||||
|
'pc_entries' => [],
|
||||||
];
|
];
|
||||||
if ($this->convertToPrimary) {
|
if ($this->convertToPrimary) {
|
||||||
$currentSet['pc_entries'] = [];
|
$currentSet['pc_entries'] = [];
|
||||||
@@ -159,106 +160,6 @@ class AccountController extends Controller
|
|||||||
|
|
||||||
$currentStart->addDay();
|
$currentStart->addDay();
|
||||||
}
|
}
|
||||||
$this->chartData->add($currentSet);
|
$this->chartData[] = $currentSet;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function overview(DateRequest $request): JsonResponse
|
|
||||||
{
|
|
||||||
// parameters for chart:
|
|
||||||
$dates = $request->getAll();
|
|
||||||
|
|
||||||
|
|
||||||
/** @var Carbon $start */
|
|
||||||
$start = $dates['start'];
|
|
||||||
|
|
||||||
/** @var Carbon $end */
|
|
||||||
$end = $dates['end'];
|
|
||||||
|
|
||||||
// set dates to end of day + start of day:
|
|
||||||
$start->startOfDay();
|
|
||||||
$end->endOfDay();
|
|
||||||
|
|
||||||
$frontPageIds = $this->getFrontPageAccountIds();
|
|
||||||
$accounts = $this->repository->getAccountsById($frontPageIds);
|
|
||||||
$chartData = [];
|
|
||||||
|
|
||||||
/** @var Account $account */
|
|
||||||
foreach ($accounts as $account) {
|
|
||||||
Log::debug(sprintf('Rendering chart data for account %s (%d)', $account->name, $account->id));
|
|
||||||
$currency = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency;
|
|
||||||
$currentStart = clone $start;
|
|
||||||
$range = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToPrimary);
|
|
||||||
$previous = array_values($range)[0]['balance'];
|
|
||||||
$pcPrevious = null;
|
|
||||||
$currentSet = [
|
|
||||||
'label' => $account->name,
|
|
||||||
'currency_id' => (string)$currency->id,
|
|
||||||
'currency_code' => $currency->code,
|
|
||||||
'currency_symbol' => $currency->symbol,
|
|
||||||
'currency_decimal_places' => $currency->decimal_places,
|
|
||||||
'start_date' => $start->toAtomString(),
|
|
||||||
'end_date' => $end->toAtomString(),
|
|
||||||
'type' => 'line', // line, area or bar
|
|
||||||
'yAxisID' => 0, // 0, 1, 2
|
|
||||||
'entries' => [],
|
|
||||||
];
|
|
||||||
|
|
||||||
// add "pc_entries" if convertToPrimary is true:
|
|
||||||
if ($this->convertToPrimary) {
|
|
||||||
$currentSet['pc_entries'] = [];
|
|
||||||
$currentSet['primary_currency_id'] = (string)$this->primaryCurrency->id;
|
|
||||||
$currentSet['primary_currency_code'] = $this->primaryCurrency->code;
|
|
||||||
$currentSet['primary_currency_symbol'] = $this->primaryCurrency->symbol;
|
|
||||||
$currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places;
|
|
||||||
$pcPrevious = array_values($range)[0]['pc_balance'];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// also get the primary balance if convertToPrimary is true:
|
|
||||||
while ($currentStart <= $end) {
|
|
||||||
$format = $currentStart->format('Y-m-d');
|
|
||||||
$label = $currentStart->toAtomString();
|
|
||||||
|
|
||||||
// balance is based on "balance" from the $range variable.
|
|
||||||
$balance = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous;
|
|
||||||
$previous = $balance;
|
|
||||||
$currentSet['entries'][$label] = $balance;
|
|
||||||
|
|
||||||
// do the same for the primary balance, if relevant:
|
|
||||||
$pcBalance = null;
|
|
||||||
if ($this->convertToPrimary) {
|
|
||||||
$pcBalance = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious;
|
|
||||||
$pcPrevious = $pcBalance;
|
|
||||||
$currentSet['pc_entries'][$label] = $pcBalance;
|
|
||||||
}
|
|
||||||
|
|
||||||
$currentStart->addDay();
|
|
||||||
|
|
||||||
}
|
|
||||||
$chartData[] = $currentSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json($chartData);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getFrontPageAccountIds(): array
|
|
||||||
{
|
|
||||||
$defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
|
||||||
|
|
||||||
/** @var Preference $frontpage */
|
|
||||||
$frontpage = Preferences::get('frontpageAccounts', $defaultSet);
|
|
||||||
|
|
||||||
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
|
||||||
$frontpage->data = $defaultSet;
|
|
||||||
$frontpage->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $frontpage->data ?? $defaultSet;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,26 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BalanceController.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Chart;
|
namespace FireflyIII\Api\V1\Controllers\Chart;
|
||||||
@@ -7,12 +28,10 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
|
|||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
|
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
|
||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Chart\ChartData;
|
|
||||||
use FireflyIII\Support\Facades\Amount;
|
|
||||||
use FireflyIII\Support\Http\Api\AccountBalanceGrouped;
|
use FireflyIII\Support\Http\Api\AccountBalanceGrouped;
|
||||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||||
@@ -25,8 +44,9 @@ class BalanceController extends Controller
|
|||||||
{
|
{
|
||||||
use CleansChartData;
|
use CleansChartData;
|
||||||
use CollectsAccountsFromFilter;
|
use CollectsAccountsFromFilter;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
private ChartData $chartData;
|
private array $chartData = [];
|
||||||
private GroupCollectorInterface $collector;
|
private GroupCollectorInterface $collector;
|
||||||
private AccountRepositoryInterface $repository;
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
@@ -37,13 +57,13 @@ class BalanceController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
$this->collector = app(GroupCollectorInterface::class);
|
$this->collector = app(GroupCollectorInterface::class);
|
||||||
$userGroup = $this->validateUserGroup($request);
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
$this->repository->setUserGroup($userGroup);
|
$this->collector->setUserGroup($this->userGroup);
|
||||||
$this->collector->setUserGroup($userGroup);
|
$this->repository->setUser($this->user);
|
||||||
$this->chartData = new ChartData();
|
$this->collector->setUser($this->user);
|
||||||
// $this->default = app('amount')->getPrimaryCurrency();
|
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -66,10 +86,6 @@ class BalanceController extends Controller
|
|||||||
$queryParameters = $request->getParameters();
|
$queryParameters = $request->getParameters();
|
||||||
$accounts = $this->getAccountList($queryParameters);
|
$accounts = $this->getAccountList($queryParameters);
|
||||||
|
|
||||||
// prepare for currency conversion and data collection:
|
|
||||||
/** @var TransactionCurrency $primary */
|
|
||||||
$primary = Amount::getPrimaryCurrency();
|
|
||||||
|
|
||||||
// get journals for entire period:
|
// get journals for entire period:
|
||||||
|
|
||||||
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
|
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
|
||||||
@@ -81,7 +97,7 @@ class BalanceController extends Controller
|
|||||||
|
|
||||||
$object = new AccountBalanceGrouped();
|
$object = new AccountBalanceGrouped();
|
||||||
$object->setPreferredRange($queryParameters['period']);
|
$object->setPreferredRange($queryParameters['period']);
|
||||||
$object->setPrimary($primary);
|
$object->setPrimary($this->primaryCurrency);
|
||||||
$object->setAccounts($accounts);
|
$object->setAccounts($accounts);
|
||||||
$object->setJournals($journals);
|
$object->setJournals($journals);
|
||||||
$object->setStart($queryParameters['start']);
|
$object->setStart($queryParameters['start']);
|
||||||
@@ -89,9 +105,10 @@ class BalanceController extends Controller
|
|||||||
$object->groupByCurrencyAndPeriod();
|
$object->groupByCurrencyAndPeriod();
|
||||||
$data = $object->convertToChartData();
|
$data = $object->convertToChartData();
|
||||||
foreach ($data as $entry) {
|
foreach ($data as $entry) {
|
||||||
$this->chartData->add($entry);
|
$this->chartData[] = $entry;
|
||||||
}
|
}
|
||||||
|
$this->chartData = $this->clean($this->chartData);
|
||||||
|
|
||||||
return response()->json($this->chartData->render());
|
return response()->json($this->chartData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,15 +26,15 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
use FireflyIII\Api\V1\Requests\Data\SameDateRequest;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
|
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
@@ -55,7 +55,6 @@ class BudgetController extends Controller
|
|||||||
protected OperationsRepositoryInterface $opsRepository;
|
protected OperationsRepositoryInterface $opsRepository;
|
||||||
private BudgetLimitRepositoryInterface $blRepository;
|
private BudgetLimitRepositoryInterface $blRepository;
|
||||||
private array $currencies = [];
|
private array $currencies = [];
|
||||||
private TransactionCurrency $currency;
|
|
||||||
private BudgetRepositoryInterface $repository;
|
private BudgetRepositoryInterface $repository;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
@@ -63,13 +62,16 @@ class BudgetController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(BudgetRepositoryInterface::class);
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
|
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
|
||||||
$this->opsRepository = app(OperationsRepositoryInterface::class);
|
$this->opsRepository = app(OperationsRepositoryInterface::class);
|
||||||
$userGroup = $this->validateUserGroup($request);
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
$this->repository->setUserGroup($userGroup);
|
$this->opsRepository->setUserGroup($this->userGroup);
|
||||||
$this->opsRepository->setUserGroup($userGroup);
|
$this->blRepository->setUserGroup($this->userGroup);
|
||||||
$this->blRepository->setUserGroup($userGroup);
|
$this->repository->setUser($this->user);
|
||||||
|
$this->opsRepository->setUser($this->user);
|
||||||
|
$this->blRepository->setUser($this->user);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -81,7 +83,7 @@ class BudgetController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function dashboard(DateRequest $request): JsonResponse
|
public function overview(SameDateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$params = $request->getAll();
|
$params = $request->getAll();
|
||||||
|
|
||||||
@@ -110,10 +112,12 @@ class BudgetController extends Controller
|
|||||||
private function processBudget(Budget $budget, Carbon $start, Carbon $end): array
|
private function processBudget(Budget $budget, Carbon $start, Carbon $end): array
|
||||||
{
|
{
|
||||||
// get all limits:
|
// get all limits:
|
||||||
$limits = $this->blRepository->getBudgetLimits($budget, $start, $end);
|
$limits = $this->blRepository->getBudgetLimits($budget, $start, $end);
|
||||||
$rows = [];
|
$rows = [];
|
||||||
$spent = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget]));
|
$spent = $this->opsRepository->listExpenses($start, $end, null, new Collection()->push($budget));
|
||||||
$expenses = $this->processExpenses($budget->id, $spent, $start, $end);
|
$expenses = $this->processExpenses($budget->id, $spent, $start, $end);
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
$currencies = [$this->primaryCurrency->id => $this->primaryCurrency];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int $currencyId
|
* @var int $currencyId
|
||||||
@@ -121,42 +125,74 @@ class BudgetController extends Controller
|
|||||||
*/
|
*/
|
||||||
foreach ($expenses as $currencyId => $row) {
|
foreach ($expenses as $currencyId => $row) {
|
||||||
// budgeted, left and overspent are now 0.
|
// budgeted, left and overspent are now 0.
|
||||||
$limit = $this->filterLimit($currencyId, $limits);
|
$limit = $this->filterLimit($currencyId, $limits);
|
||||||
if (null !== $limit) {
|
|
||||||
|
// primary currency entries
|
||||||
|
$row['pc_budgeted'] = '0';
|
||||||
|
$row['pc_spent'] = '0';
|
||||||
|
$row['pc_left'] = '0';
|
||||||
|
$row['pc_overspent'] = '0';
|
||||||
|
|
||||||
|
if ($limit instanceof BudgetLimit) {
|
||||||
$row['budgeted'] = $limit->amount;
|
$row['budgeted'] = $limit->amount;
|
||||||
$row['left'] = bcsub($row['budgeted'], bcmul($row['spent'], '-1'));
|
$row['left'] = bcsub((string) $row['budgeted'], bcmul((string) $row['spent'], '-1'));
|
||||||
$row['overspent'] = bcmul($row['left'], '-1');
|
$row['overspent'] = bcmul($row['left'], '-1');
|
||||||
$row['left'] = 1 === bccomp($row['left'], '0') ? $row['left'] : '0';
|
$row['left'] = 1 === bccomp($row['left'], '0') ? $row['left'] : '0';
|
||||||
$row['overspent'] = 1 === bccomp($row['overspent'], '0') ? $row['overspent'] : '0';
|
$row['overspent'] = 1 === bccomp($row['overspent'], '0') ? $row['overspent'] : '0';
|
||||||
}
|
}
|
||||||
$rows[] = $row;
|
|
||||||
|
// convert data if necessary.
|
||||||
|
if (true === $this->convertToPrimary && $currencyId !== $this->primaryCurrency->id) {
|
||||||
|
$currencies[$currencyId] ??= Amount::getTransactionCurrencyById($currencyId);
|
||||||
|
$row['pc_budgeted'] = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $row['budgeted']);
|
||||||
|
$row['pc_spent'] = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $row['spent']);
|
||||||
|
$row['pc_left'] = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $row['left']);
|
||||||
|
$row['pc_overspent'] = $converter->convert($currencies[$currencyId], $this->primaryCurrency, $start, $row['overspent']);
|
||||||
|
}
|
||||||
|
if (true === $this->convertToPrimary && $currencyId === $this->primaryCurrency->id) {
|
||||||
|
$row['pc_budgeted'] = $row['budgeted'];
|
||||||
|
$row['pc_spent'] = $row['spent'];
|
||||||
|
$row['pc_left'] = $row['left'];
|
||||||
|
$row['pc_overspent'] = $row['overspent'];
|
||||||
|
}
|
||||||
|
$rows[] = $row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if no limits
|
|
||||||
// if (0 === $limits->count()) {
|
|
||||||
// return as a single item in an array
|
|
||||||
// $rows = $this->noBudgetLimits($budget, $start, $end);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// is always an array
|
// is always an array
|
||||||
$return = [];
|
$return = [];
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
$current = [
|
$current = [
|
||||||
'label' => $budget->name,
|
'label' => $budget->name,
|
||||||
'currency_id' => (string)$row['currency_id'],
|
'currency_id' => (string)$row['currency_id'],
|
||||||
'currency_code' => $row['currency_code'],
|
'currency_name' => $row['currency_name'],
|
||||||
'currency_name' => $row['currency_name'],
|
'currency_code' => $row['currency_code'],
|
||||||
'currency_decimal_places' => $row['currency_decimal_places'],
|
'currency_decimal_places' => $row['currency_decimal_places'],
|
||||||
'period' => null,
|
|
||||||
'start' => $row['start'],
|
'primary_currency_id' => (string)$this->primaryCurrency->id,
|
||||||
'end' => $row['end'],
|
'primary_currency_name' => $this->primaryCurrency->name,
|
||||||
'entries' => [
|
'primary_currency_code' => $this->primaryCurrency->code,
|
||||||
|
'primary_currency_symbol' => $this->primaryCurrency->symbol,
|
||||||
|
'primary_currency_decimal_places' => $this->primaryCurrency->decimal_places,
|
||||||
|
|
||||||
|
'period' => null,
|
||||||
|
'date' => $row['start'],
|
||||||
|
'start_date' => $row['start'],
|
||||||
|
'end_date' => $row['end'],
|
||||||
|
'yAxisID' => 0,
|
||||||
|
'type' => 'bar',
|
||||||
|
'entries' => [
|
||||||
'budgeted' => $row['budgeted'],
|
'budgeted' => $row['budgeted'],
|
||||||
'spent' => $row['spent'],
|
'spent' => $row['spent'],
|
||||||
'left' => $row['left'],
|
'left' => $row['left'],
|
||||||
'overspent' => $row['overspent'],
|
'overspent' => $row['overspent'],
|
||||||
],
|
],
|
||||||
|
'pc_entries' => [
|
||||||
|
'budgeted' => $row['pc_budgeted'],
|
||||||
|
'spent' => $row['pc_spent'],
|
||||||
|
'left' => $row['pc_left'],
|
||||||
|
'overspent' => $row['pc_overspent'],
|
||||||
|
],
|
||||||
];
|
];
|
||||||
$return[] = $current;
|
$return[] = $current;
|
||||||
}
|
}
|
||||||
@@ -164,18 +200,18 @@ class BudgetController extends Controller
|
|||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* When no budget limits are present, the expenses of the whole period are collected and grouped.
|
// * When no budget limits are present, the expenses of the whole period are collected and grouped.
|
||||||
* This is grouped per currency. Because there is no limit set, "left to spend" and "overspent" are empty.
|
// * This is grouped per currency. Because there is no limit set, "left to spend" and "overspent" are empty.
|
||||||
*
|
// *
|
||||||
* @throws FireflyException
|
// * @throws FireflyException
|
||||||
*/
|
// */
|
||||||
private function noBudgetLimits(Budget $budget, Carbon $start, Carbon $end): array
|
// private function noBudgetLimits(Budget $budget, Carbon $start, Carbon $end): array
|
||||||
{
|
// {
|
||||||
$spent = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget]));
|
// $spent = $this->opsRepository->listExpenses($start, $end, null, new Collection()->push($budget));
|
||||||
|
//
|
||||||
return $this->processExpenses($budget->id, $spent, $start, $end);
|
// return $this->processExpenses($budget->id, $spent, $start, $end);
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return
|
* Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return
|
||||||
@@ -195,7 +231,7 @@ class BudgetController extends Controller
|
|||||||
* @var array $block
|
* @var array $block
|
||||||
*/
|
*/
|
||||||
foreach ($spent as $currencyId => $block) {
|
foreach ($spent as $currencyId => $block) {
|
||||||
$this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId);
|
$this->currencies[$currencyId] ??= Amount::getTransactionCurrencyById($currencyId);
|
||||||
$return[$currencyId] ??= [
|
$return[$currencyId] ??= [
|
||||||
'currency_id' => (string)$currencyId,
|
'currency_id' => (string)$currencyId,
|
||||||
'currency_code' => $block['currency_code'],
|
'currency_code' => $block['currency_code'],
|
||||||
@@ -214,66 +250,68 @@ class BudgetController extends Controller
|
|||||||
// var_dump($return);
|
// var_dump($return);
|
||||||
/** @var array $journal */
|
/** @var array $journal */
|
||||||
foreach ($currentBudgetArray['transaction_journals'] as $journal) {
|
foreach ($currentBudgetArray['transaction_journals'] as $journal) {
|
||||||
$return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], (string)$journal['amount']);
|
/** @var numeric-string $amount */
|
||||||
|
$amount = (string)$journal['amount'];
|
||||||
|
$return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], $amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Function that processes each budget limit (per budget).
|
// * Function that processes each budget limit (per budget).
|
||||||
*
|
// *
|
||||||
* If you have a budget limit in EUR, only transactions in EUR will be considered.
|
// * If you have a budget limit in EUR, only transactions in EUR will be considered.
|
||||||
* If you have a budget limit in GBP, only transactions in GBP will be considered.
|
// * If you have a budget limit in GBP, only transactions in GBP will be considered.
|
||||||
*
|
// *
|
||||||
* If you have a budget limit in EUR, and a transaction in GBP, it will not be considered for the EUR budget limit.
|
// * If you have a budget limit in EUR, and a transaction in GBP, it will not be considered for the EUR budget limit.
|
||||||
*
|
// *
|
||||||
* @throws FireflyException
|
// * @throws FireflyException
|
||||||
*/
|
// */
|
||||||
private function budgetLimits(Budget $budget, Collection $limits): array
|
// private function budgetLimits(Budget $budget, Collection $limits): array
|
||||||
{
|
// {
|
||||||
Log::debug(sprintf('Now in budgetLimits(#%d)', $budget->id));
|
// Log::debug(sprintf('Now in budgetLimits(#%d)', $budget->id));
|
||||||
$data = [];
|
// $data = [];
|
||||||
|
//
|
||||||
|
// /** @var BudgetLimit $limit */
|
||||||
|
// foreach ($limits as $limit) {
|
||||||
|
// $data = array_merge($data, $this->processLimit($budget, $limit));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return $data;
|
||||||
|
// }
|
||||||
|
|
||||||
/** @var BudgetLimit $limit */
|
// /**
|
||||||
foreach ($limits as $limit) {
|
// * @throws FireflyException
|
||||||
$data = array_merge($data, $this->processLimit($budget, $limit));
|
// */
|
||||||
}
|
// private function processLimit(Budget $budget, BudgetLimit $limit): array
|
||||||
|
// {
|
||||||
return $data;
|
// Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__));
|
||||||
}
|
// $end = clone $limit->end_date;
|
||||||
|
// $end->endOfDay();
|
||||||
/**
|
// $spent = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection()->push($budget));
|
||||||
* @throws FireflyException
|
// $limitCurrencyId = $limit->transaction_currency_id;
|
||||||
*/
|
//
|
||||||
private function processLimit(Budget $budget, BudgetLimit $limit): array
|
// /** @var array $entry */
|
||||||
{
|
// // only spent the entry where the entry's currency matches the budget limit's currency
|
||||||
Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__));
|
// // so $filtered will only have 1 or 0 entries
|
||||||
$end = clone $limit->end_date;
|
// $filtered = array_filter($spent, fn ($entry) => $entry['currency_id'] === $limitCurrencyId);
|
||||||
$end->endOfDay();
|
// $result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
|
||||||
$spent = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget]));
|
// if (1 === count($result)) {
|
||||||
$limitCurrencyId = $limit->transaction_currency_id;
|
// $compare = bccomp($limit->amount, (string)app('steam')->positive($result[$limitCurrencyId]['spent']));
|
||||||
|
// $result[$limitCurrencyId]['budgeted'] = $limit->amount;
|
||||||
/** @var array $entry */
|
// if (1 === $compare) {
|
||||||
// only spent the entry where the entry's currency matches the budget limit's currency
|
// // convert this amount into the primary currency:
|
||||||
// so $filtered will only have 1 or 0 entries
|
// $result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']);
|
||||||
$filtered = array_filter($spent, fn ($entry) => $entry['currency_id'] === $limitCurrencyId);
|
// }
|
||||||
$result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
|
// if ($compare <= 0) {
|
||||||
if (1 === count($result)) {
|
// $result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']));
|
||||||
$compare = bccomp($limit->amount, (string)app('steam')->positive($result[$limitCurrencyId]['spent']));
|
// }
|
||||||
$result[$limitCurrencyId]['budgeted'] = $limit->amount;
|
// }
|
||||||
if (1 === $compare) {
|
//
|
||||||
// convert this amount into the primary currency:
|
// return $result;
|
||||||
$result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']);
|
// }
|
||||||
}
|
|
||||||
if ($compare <= 0) {
|
|
||||||
$result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit
|
private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit
|
||||||
{
|
{
|
||||||
|
@@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
use FireflyIII\Api\V1\Requests\Data\SameDateRequest;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
@@ -34,6 +34,7 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
@@ -58,11 +59,13 @@ class CategoryController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->accountRepos = app(AccountRepositoryInterface::class);
|
$this->accountRepos = app(AccountRepositoryInterface::class);
|
||||||
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
|
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
|
||||||
$userGroup = $this->validateUserGroup($request);
|
$this->accountRepos->setUserGroup($this->userGroup);
|
||||||
$this->accountRepos->setUserGroup($userGroup);
|
$this->currencyRepos->setUserGroup($this->userGroup);
|
||||||
$this->currencyRepos->setUserGroup($userGroup);
|
$this->accountRepos->setUser($this->user);
|
||||||
|
$this->currencyRepos->setUser($this->user);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -77,7 +80,7 @@ class CategoryController extends Controller
|
|||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function dashboard(DateRequest $request): JsonResponse
|
public function overview(SameDateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
/** @var Carbon $start */
|
/** @var Carbon $start */
|
||||||
$start = $this->parameters->get('start');
|
$start = $this->parameters->get('start');
|
||||||
@@ -94,13 +97,14 @@ class CategoryController extends Controller
|
|||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setRange($start, $end)->withAccountInformation();
|
$collector->setRange($start, $end)->withAccountInformation();
|
||||||
$collector->setXorAccounts($accounts)->withCategoryInformation();
|
$collector->setXorAccounts($accounts)->withCategoryInformation();
|
||||||
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::RECONCILIATION->value]);
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value]);
|
||||||
$journals = $collector->getExtractedJournals();
|
$journals = $collector->getExtractedJournals();
|
||||||
|
|
||||||
/** @var array $journal */
|
/** @var array $journal */
|
||||||
foreach ($journals as $journal) {
|
foreach ($journals as $journal) {
|
||||||
// find journal:
|
// find journal:
|
||||||
$journalCurrencyId = (int)$journal['currency_id'];
|
$journalCurrencyId = (int)$journal['currency_id'];
|
||||||
|
$type = $journal['transaction_type_type'];
|
||||||
$currency = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId);
|
$currency = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId);
|
||||||
$currencies[$journalCurrencyId] = $currency;
|
$currencies[$journalCurrencyId] = $currency;
|
||||||
$currencyId = (int)$currency->id;
|
$currencyId = (int)$currency->id;
|
||||||
@@ -108,18 +112,21 @@ class CategoryController extends Controller
|
|||||||
$currencyCode = (string)$currency->code;
|
$currencyCode = (string)$currency->code;
|
||||||
$currencySymbol = (string)$currency->symbol;
|
$currencySymbol = (string)$currency->symbol;
|
||||||
$currencyDecimalPlaces = (int)$currency->decimal_places;
|
$currencyDecimalPlaces = (int)$currency->decimal_places;
|
||||||
$amount = app('steam')->positive($journal['amount']);
|
$amount = Steam::positive((string)$journal['amount']);
|
||||||
|
$pcAmount = null;
|
||||||
|
|
||||||
// overrule if necessary:
|
// overrule if necessary:
|
||||||
|
if ($this->convertToPrimary && $journalCurrencyId === $this->primaryCurrency->id) {
|
||||||
|
$pcAmount = $amount;
|
||||||
|
}
|
||||||
if ($this->convertToPrimary && $journalCurrencyId !== $this->primaryCurrency->id) {
|
if ($this->convertToPrimary && $journalCurrencyId !== $this->primaryCurrency->id) {
|
||||||
$currencyId = (int)$this->primaryCurrency->id;
|
$currencyId = (int)$this->primaryCurrency->id;
|
||||||
$currencyName = (string)$this->primaryCurrency->name;
|
$currencyName = (string)$this->primaryCurrency->name;
|
||||||
$currencyCode = (string)$this->primaryCurrency->code;
|
$currencyCode = (string)$this->primaryCurrency->code;
|
||||||
$currencySymbol = (string)$this->primaryCurrency->symbol;
|
$currencySymbol = (string)$this->primaryCurrency->symbol;
|
||||||
$currencyDecimalPlaces = (int)$this->primaryCurrency->decimal_places;
|
$currencyDecimalPlaces = (int)$this->primaryCurrency->decimal_places;
|
||||||
$convertedAmount = $converter->convert($currency, $this->primaryCurrency, $journal['date'], $amount);
|
$pcAmount = $converter->convert($currency, $this->primaryCurrency, $journal['date'], $amount);
|
||||||
Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $convertedAmount));
|
Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $pcAmount));
|
||||||
$amount = $convertedAmount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -127,25 +134,54 @@ class CategoryController extends Controller
|
|||||||
$key = sprintf('%s-%s', $categoryName, $currencyCode);
|
$key = sprintf('%s-%s', $categoryName, $currencyCode);
|
||||||
// create arrays
|
// create arrays
|
||||||
$return[$key] ??= [
|
$return[$key] ??= [
|
||||||
'label' => $categoryName,
|
'label' => $categoryName,
|
||||||
'currency_id' => (string)$currencyId,
|
'currency_id' => (string)$currencyId,
|
||||||
'currency_code' => $currencyCode,
|
'currency_name' => $currencyName,
|
||||||
'currency_name' => $currencyName,
|
'currency_code' => $currencyCode,
|
||||||
'currency_symbol' => $currencySymbol,
|
'currency_symbol' => $currencySymbol,
|
||||||
'currency_decimal_places' => $currencyDecimalPlaces,
|
'currency_decimal_places' => $currencyDecimalPlaces,
|
||||||
'period' => null,
|
'primary_currency_id' => (string)$this->primaryCurrency->id,
|
||||||
'start' => $start->toAtomString(),
|
'primary_currency_name' => (string)$this->primaryCurrency->name,
|
||||||
'end' => $end->toAtomString(),
|
'primary_currency_code' => (string)$this->primaryCurrency->code,
|
||||||
'amount' => '0',
|
'primary_currency_symbol' => (string)$this->primaryCurrency->symbol,
|
||||||
|
'primary_currency_decimal_places' => (int)$this->primaryCurrency->decimal_places,
|
||||||
|
'period' => null,
|
||||||
|
'start_date' => $start->toAtomString(),
|
||||||
|
'end_date' => $end->toAtomString(),
|
||||||
|
'yAxisID' => 0,
|
||||||
|
'type' => 'bar',
|
||||||
|
'entries' => [
|
||||||
|
'spent' => '0',
|
||||||
|
'earned' => '0',
|
||||||
|
],
|
||||||
|
'pc_entries' => [
|
||||||
|
'spent' => '0',
|
||||||
|
'earned' => '0',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
// add monies
|
// add monies
|
||||||
$return[$key]['amount'] = bcadd($return[$key]['amount'], (string)$amount);
|
// expenses to spent
|
||||||
|
if (TransactionTypeEnum::WITHDRAWAL->value === $type) {
|
||||||
|
$return[$key]['entries']['spent'] = bcadd($return[$key]['entries']['spent'], $amount);
|
||||||
|
if (null !== $pcAmount) {
|
||||||
|
$return[$key]['pc_entries']['spent'] = bcadd($return[$key]['pc_entries']['spent'], $pcAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// positive amount = earned
|
||||||
|
if (TransactionTypeEnum::DEPOSIT->value === $type) {
|
||||||
|
$return[$key]['entries']['earned'] = bcadd($return[$key]['entries']['earned'], $amount);
|
||||||
|
if (null !== $pcAmount) {
|
||||||
|
$return[$key]['pc_entries']['earned'] = bcadd($return[$key]['pc_entries']['earned'], $pcAmount);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$return = array_values($return);
|
$return = array_values($return);
|
||||||
|
|
||||||
// order by amount
|
// order by amount
|
||||||
usort($return, static fn (array $a, array $b) => (float)$a['amount'] < (float)$b['amount'] ? 1 : -1);
|
usort($return, static fn (array $a, array $b) => ((float)$a['entries']['spent'] + (float)$a['entries']['earned']) < ((float)$b['entries']['spent'] + (float)$b['entries']['earned']) ? 1 : -1);
|
||||||
|
|
||||||
return response()->json($this->clean($return));
|
return response()->json($this->clean($return));
|
||||||
}
|
}
|
||||||
|
@@ -27,7 +27,6 @@ namespace FireflyIII\Api\V1\Controllers;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Carbon\Exceptions\InvalidFormatException;
|
use Carbon\Exceptions\InvalidFormatException;
|
||||||
use FireflyIII\Exceptions\BadHttpHeaderException;
|
use FireflyIII\Exceptions\BadHttpHeaderException;
|
||||||
use FireflyIII\Models\Preference;
|
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Facades\Steam;
|
use FireflyIII\Support\Facades\Steam;
|
||||||
@@ -64,10 +63,8 @@ abstract class Controller extends BaseController
|
|||||||
|
|
||||||
protected const string CONTENT_TYPE = 'application/vnd.api+json';
|
protected const string CONTENT_TYPE = 'application/vnd.api+json';
|
||||||
protected const string JSON_CONTENT_TYPE = 'application/json';
|
protected const string JSON_CONTENT_TYPE = 'application/json';
|
||||||
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
||||||
|
|
||||||
/** @var array<int, string> */
|
|
||||||
protected array $allowedSort;
|
|
||||||
protected bool $convertToPrimary = false;
|
protected bool $convertToPrimary = false;
|
||||||
protected TransactionCurrency $primaryCurrency;
|
protected TransactionCurrency $primaryCurrency;
|
||||||
protected ParameterBag $parameters;
|
protected ParameterBag $parameters;
|
||||||
@@ -78,7 +75,6 @@ abstract class Controller extends BaseController
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
// get global parameters
|
// get global parameters
|
||||||
$this->allowedSort = config('firefly.allowed_sort_parameters');
|
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->parameters = $this->getParameters();
|
$this->parameters = $this->getParameters();
|
||||||
@@ -107,13 +103,8 @@ abstract class Controller extends BaseController
|
|||||||
private function getParameters(): ParameterBag
|
private function getParameters(): ParameterBag
|
||||||
{
|
{
|
||||||
$bag = new ParameterBag();
|
$bag = new ParameterBag();
|
||||||
$page = (int) request()->get('page');
|
$page = (int)request()->get('page');
|
||||||
if ($page < 1) {
|
$page = min(max(1, $page), 2 ** 16);
|
||||||
$page = 1;
|
|
||||||
}
|
|
||||||
if ($page > 2 ** 16) {
|
|
||||||
$page = 2 ** 16;
|
|
||||||
}
|
|
||||||
$bag->set('page', $page);
|
$bag->set('page', $page);
|
||||||
|
|
||||||
// some date fields:
|
// some date fields:
|
||||||
@@ -131,19 +122,15 @@ abstract class Controller extends BaseController
|
|||||||
$obj = null;
|
$obj = null;
|
||||||
if (null !== $date) {
|
if (null !== $date) {
|
||||||
try {
|
try {
|
||||||
$obj = Carbon::parse((string) $date);
|
$obj = Carbon::parse((string)$date, config('app.timezone'));
|
||||||
} catch (InvalidFormatException $e) {
|
} catch (InvalidFormatException $e) {
|
||||||
// don't care
|
// don't care
|
||||||
Log::warning(
|
Log::warning(sprintf('Ignored invalid date "%s" in API controller parameter check: %s', substr((string)$date, 0, 20), $e->getMessage()));
|
||||||
sprintf(
|
|
||||||
'Ignored invalid date "%s" in API controller parameter check: %s',
|
|
||||||
substr((string) $date, 0, 20),
|
|
||||||
$e->getMessage()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$bag->set($field, $obj);
|
if ($obj instanceof Carbon) {
|
||||||
|
$bag->set($field, $obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// integer fields:
|
// integer fields:
|
||||||
@@ -158,14 +145,8 @@ abstract class Controller extends BaseController
|
|||||||
$value = null;
|
$value = null;
|
||||||
}
|
}
|
||||||
if (null !== $value) {
|
if (null !== $value) {
|
||||||
$value = (int) $value;
|
$value = (int)$value;
|
||||||
if ($value < 1) {
|
$value = min(max(1, $value), 2 ** 16);
|
||||||
$value = 1;
|
|
||||||
}
|
|
||||||
if ($value > 2 ** 16) {
|
|
||||||
$value = 2 ** 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
$bag->set($integer, $value);
|
$bag->set($integer, $value);
|
||||||
}
|
}
|
||||||
if (null === $value
|
if (null === $value
|
||||||
@@ -175,46 +156,14 @@ abstract class Controller extends BaseController
|
|||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
|
||||||
/** @var Preference $pageSize */
|
$pageSize = (int)app('preferences')->getForUser($user, 'listPageSize', 50)->data;
|
||||||
$pageSize = (int) app('preferences')->getForUser($user, 'listPageSize', 50)->data;
|
|
||||||
$bag->set($integer, $pageSize);
|
$bag->set($integer, $pageSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort fields:
|
// sort fields:
|
||||||
return $this->getSortParameters($bag);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getSortParameters(ParameterBag $bag): ParameterBag
|
|
||||||
{
|
|
||||||
$sortParameters = [];
|
|
||||||
|
|
||||||
try {
|
|
||||||
$param = (string) request()->query->get('sort');
|
|
||||||
} catch (BadRequestException $e) {
|
|
||||||
Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.');
|
|
||||||
Log::error($e->getMessage());
|
|
||||||
Log::error($e->getTraceAsString());
|
|
||||||
$param = '';
|
|
||||||
}
|
|
||||||
if ('' === $param) {
|
|
||||||
return $bag;
|
|
||||||
}
|
|
||||||
$parts = explode(',', $param);
|
|
||||||
foreach ($parts as $part) {
|
|
||||||
$part = trim($part);
|
|
||||||
$direction = 'asc';
|
|
||||||
if ('-' === $part[0]) {
|
|
||||||
$part = substr($part, 1);
|
|
||||||
$direction = 'desc';
|
|
||||||
}
|
|
||||||
if (in_array($part, $this->allowedSort, true)) {
|
|
||||||
$sortParameters[] = [$part, $direction];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$bag->set('sort', $sortParameters);
|
|
||||||
|
|
||||||
return $bag;
|
return $bag;
|
||||||
|
// return $this->getSortParameters($bag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -283,8 +232,6 @@ abstract class Controller extends BaseController
|
|||||||
$baseUrl = sprintf('%s/api/v1', request()->getSchemeAndHttpHost());
|
$baseUrl = sprintf('%s/api/v1', request()->getSchemeAndHttpHost());
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
// $transformer->collectMetaData(new Collection([$object]));
|
|
||||||
|
|
||||||
$resource = new Item($object, $transformer, $key);
|
$resource = new Item($object, $transformer, $key);
|
||||||
|
|
||||||
return $manager->createData($resource)->toArray();
|
return $manager->createData($resource)->toArray();
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Data\Bulk;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Data\Bulk\TransactionRequest;
|
use FireflyIII\Api\V1\Requests\Data\Bulk\TransactionRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
|
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -44,23 +45,23 @@ class TransactionController extends Controller
|
|||||||
{
|
{
|
||||||
private AccountRepositoryInterface $repository;
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::MANAGE_TRANSACTIONS];
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
$this->repository->setUser(auth()->user());
|
$this->repository->setUserGroup($this->userGroup);
|
||||||
|
$this->repository->setUser($this->user);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/bulkUpdateTransactions
|
|
||||||
*/
|
|
||||||
public function update(TransactionRequest $request): JsonResponse
|
public function update(TransactionRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$query = $request->getAll();
|
$query = $request->getAll();
|
||||||
|
@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Data\DestroyRequest;
|
use FireflyIII\Api\V1\Requests\Data\DestroyRequest;
|
||||||
use FireflyIII\Enums\AccountTypeEnum;
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
@@ -55,12 +56,20 @@ class DestroyController extends Controller
|
|||||||
{
|
{
|
||||||
private bool $unused;
|
private bool $unused;
|
||||||
|
|
||||||
/**
|
protected array $acceptedRoles = [UserRoleEnum::FULL];
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/destroyData
|
public function __construct()
|
||||||
*
|
{
|
||||||
* @throws FireflyException
|
parent::__construct();
|
||||||
*/
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function destroy(DestroyRequest $request): JsonResponse
|
public function destroy(DestroyRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$objects = $request->getObjects();
|
$objects = $request->getObjects();
|
||||||
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Data\Export;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest;
|
use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Support\Export\ExportDataGenerator;
|
use FireflyIII\Support\Export\ExportDataGenerator;
|
||||||
use Illuminate\Http\Response as LaravelResponse;
|
use Illuminate\Http\Response as LaravelResponse;
|
||||||
@@ -39,6 +40,7 @@ use function Safe\date;
|
|||||||
class ExportController extends Controller
|
class ExportController extends Controller
|
||||||
{
|
{
|
||||||
private ExportDataGenerator $exporter;
|
private ExportDataGenerator $exporter;
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ExportController constructor.
|
* ExportController constructor.
|
||||||
@@ -48,8 +50,10 @@ class ExportController extends Controller
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
$this->exporter = app(ExportDataGenerator::class);
|
$this->exporter = app(ExportDataGenerator::class);
|
||||||
$this->exporter->setUser(auth()->user());
|
$this->exporter->setUserGroup($this->userGroup);
|
||||||
|
$this->exporter->setUser($this->user);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -57,9 +61,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportAccounts
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -99,9 +100,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBills
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -114,9 +112,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBudgets
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -129,9 +124,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportCategories
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -144,9 +136,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportPiggies
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -159,9 +148,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRecurring
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -174,9 +160,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRules
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -189,9 +172,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTags
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
@@ -204,9 +184,6 @@ class ExportController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTransactions
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function transactions(ExportRequest $request): LaravelResponse
|
public function transactions(ExportRequest $request): LaravelResponse
|
||||||
|
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers\Data;
|
namespace FireflyIII\Api\V1\Controllers\Data;
|
||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
@@ -44,10 +45,22 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class PurgeController extends Controller
|
class PurgeController extends Controller
|
||||||
{
|
{
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::FULL];
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->validateUserGroup($request);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO cleanup and use repositories.
|
* TODO cleanup and use repositories.
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData
|
|
||||||
*/
|
*/
|
||||||
public function purge(): JsonResponse
|
public function purge(): JsonResponse
|
||||||
{
|
{
|
||||||
@@ -66,14 +79,6 @@ class PurgeController extends Controller
|
|||||||
$repository = app(PiggyBankRepositoryInterface::class);
|
$repository = app(PiggyBankRepositoryInterface::class);
|
||||||
$repository->setUser($user);
|
$repository->setUser($user);
|
||||||
$repository->purgeAll();
|
$repository->purgeAll();
|
||||||
// $set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id')
|
|
||||||
// ->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*'])
|
|
||||||
// ;
|
|
||||||
//
|
|
||||||
// /** @var PiggyBank $piggy */
|
|
||||||
// foreach ($set as $piggy) {
|
|
||||||
// $piggy->forceDelete();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// rule group
|
// rule group
|
||||||
RuleGroup::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
RuleGroup::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
||||||
|
@@ -64,10 +64,6 @@ class AccountController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseAsset
|
|
||||||
*/
|
|
||||||
public function asset(GenericRequest $request): JsonResponse
|
public function asset(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
@@ -91,10 +87,6 @@ class AccountController extends Controller
|
|||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseExpense
|
|
||||||
*/
|
|
||||||
public function expense(GenericRequest $request): JsonResponse
|
public function expense(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -58,9 +58,6 @@ class BillController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBill
|
|
||||||
*
|
|
||||||
* Expenses per bill, possibly filtered by bill and account.
|
* Expenses per bill, possibly filtered by bill and account.
|
||||||
*/
|
*/
|
||||||
public function bill(GenericRequest $request): JsonResponse
|
public function bill(GenericRequest $request): JsonResponse
|
||||||
@@ -122,9 +119,6 @@ class BillController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBill
|
|
||||||
*
|
|
||||||
* Expenses for no bill filtered by account.
|
* Expenses for no bill filtered by account.
|
||||||
*/
|
*/
|
||||||
public function noBill(GenericRequest $request): JsonResponse
|
public function noBill(GenericRequest $request): JsonResponse
|
||||||
|
@@ -63,10 +63,6 @@ class BudgetController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBudget
|
|
||||||
*/
|
|
||||||
public function budget(GenericRequest $request): JsonResponse
|
public function budget(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
@@ -80,7 +76,7 @@ class BudgetController extends Controller
|
|||||||
|
|
||||||
/** @var Budget $budget */
|
/** @var Budget $budget */
|
||||||
foreach ($budgets as $budget) {
|
foreach ($budgets as $budget) {
|
||||||
$expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$budget]));
|
$expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection()->push($budget));
|
||||||
|
|
||||||
/** @var array $expense */
|
/** @var array $expense */
|
||||||
foreach ($expenses as $expense) {
|
foreach ($expenses as $expense) {
|
||||||
@@ -98,10 +94,6 @@ class BudgetController extends Controller
|
|||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBudget
|
|
||||||
*/
|
|
||||||
public function noBudget(GenericRequest $request): JsonResponse
|
public function noBudget(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -63,10 +63,6 @@ class CategoryController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
|
|
||||||
*/
|
|
||||||
public function category(GenericRequest $request): JsonResponse
|
public function category(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
@@ -80,7 +76,7 @@ class CategoryController extends Controller
|
|||||||
|
|
||||||
/** @var Category $category */
|
/** @var Category $category */
|
||||||
foreach ($categories as $category) {
|
foreach ($categories as $category) {
|
||||||
$expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$category]));
|
$expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection()->push($category));
|
||||||
|
|
||||||
/** @var array $expense */
|
/** @var array $expense */
|
||||||
foreach ($expenses as $expense) {
|
foreach ($expenses as $expense) {
|
||||||
@@ -98,10 +94,6 @@ class CategoryController extends Controller
|
|||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
|
|
||||||
*/
|
|
||||||
public function noCategory(GenericRequest $request): JsonResponse
|
public function noCategory(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -37,10 +37,6 @@ use Illuminate\Support\Facades\Log;
|
|||||||
*/
|
*/
|
||||||
class PeriodController extends Controller
|
class PeriodController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTotal
|
|
||||||
*/
|
|
||||||
public function total(GenericRequest $request): JsonResponse
|
public function total(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$accounts = $request->getAssetAccounts();
|
$accounts = $request->getAssetAccounts();
|
||||||
|
@@ -57,9 +57,6 @@ class TagController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoTag
|
|
||||||
*
|
|
||||||
* Expenses for no tag filtered by account.
|
* Expenses for no tag filtered by account.
|
||||||
*/
|
*/
|
||||||
public function noTag(GenericRequest $request): JsonResponse
|
public function noTag(GenericRequest $request): JsonResponse
|
||||||
@@ -115,9 +112,6 @@ class TagController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTag
|
|
||||||
*
|
|
||||||
* Expenses per tag, possibly filtered by tag and account.
|
* Expenses per tag, possibly filtered by tag and account.
|
||||||
*/
|
*/
|
||||||
public function tag(GenericRequest $request): JsonResponse
|
public function tag(GenericRequest $request): JsonResponse
|
||||||
|
@@ -64,10 +64,6 @@ class AccountController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeAsset
|
|
||||||
*/
|
|
||||||
public function asset(GenericRequest $request): JsonResponse
|
public function asset(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
@@ -92,10 +88,6 @@ class AccountController extends Controller
|
|||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeRevenue
|
|
||||||
*/
|
|
||||||
public function revenue(GenericRequest $request): JsonResponse
|
public function revenue(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -63,10 +63,6 @@ class CategoryController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeCategory
|
|
||||||
*/
|
|
||||||
public function category(GenericRequest $request): JsonResponse
|
public function category(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
@@ -80,7 +76,7 @@ class CategoryController extends Controller
|
|||||||
|
|
||||||
/** @var Category $category */
|
/** @var Category $category */
|
||||||
foreach ($categories as $category) {
|
foreach ($categories as $category) {
|
||||||
$expenses = $this->opsRepository->sumIncome($start, $end, $assetAccounts, new Collection([$category]));
|
$expenses = $this->opsRepository->sumIncome($start, $end, $assetAccounts, new Collection()->push($category));
|
||||||
|
|
||||||
/** @var array $expense */
|
/** @var array $expense */
|
||||||
foreach ($expenses as $expense) {
|
foreach ($expenses as $expense) {
|
||||||
@@ -98,10 +94,6 @@ class CategoryController extends Controller
|
|||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoCategory
|
|
||||||
*/
|
|
||||||
public function noCategory(GenericRequest $request): JsonResponse
|
public function noCategory(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
|||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,10 +37,6 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class PeriodController extends Controller
|
class PeriodController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTotal
|
|
||||||
*/
|
|
||||||
public function total(GenericRequest $request): JsonResponse
|
public function total(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$accounts = $request->getAssetAccounts();
|
$accounts = $request->getAssetAccounts();
|
||||||
@@ -75,7 +72,7 @@ class PeriodController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $currencyCode,
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -30,6 +30,7 @@ use FireflyIII\Enums\TransactionTypeEnum;
|
|||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,9 +58,6 @@ class TagController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTag
|
|
||||||
*
|
|
||||||
* Expenses for no tag filtered by account.
|
* Expenses for no tag filtered by account.
|
||||||
*/
|
*/
|
||||||
public function noTag(GenericRequest $request): JsonResponse
|
public function noTag(GenericRequest $request): JsonResponse
|
||||||
@@ -100,7 +98,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $currencyCode,
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -109,9 +107,6 @@ class TagController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoTag
|
|
||||||
*
|
|
||||||
* Expenses per tag, possibly filtered by tag and account.
|
* Expenses per tag, possibly filtered by tag and account.
|
||||||
*/
|
*/
|
||||||
public function tag(GenericRequest $request): JsonResponse
|
public function tag(GenericRequest $request): JsonResponse
|
||||||
@@ -154,7 +149,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $journal['currency_code'],
|
||||||
];
|
];
|
||||||
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], (string) app('steam')->positive($journal['amount']));
|
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], Steam::positive($journal['amount']));
|
||||||
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,10 +161,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $foreignCurrencyId,
|
'currency_id' => (string) $foreignCurrencyId,
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
'currency_code' => $journal['foreign_currency_code'],
|
||||||
];
|
];
|
||||||
$response[$foreignKey]['difference'] = bcadd(
|
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], Steam::positive($journal['foreign_amount']));
|
||||||
(string) $response[$foreignKey]['difference'],
|
|
||||||
(string) app('steam')->positive($journal['foreign_amount'])
|
|
||||||
);
|
|
||||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
|
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,10 +56,6 @@ class AccountController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransfers
|
|
||||||
*/
|
|
||||||
public function asset(GenericRequest $request): JsonResponse
|
public function asset(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -63,10 +63,6 @@ class CategoryController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
|
|
||||||
*/
|
|
||||||
public function category(GenericRequest $request): JsonResponse
|
public function category(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
@@ -80,7 +76,7 @@ class CategoryController extends Controller
|
|||||||
|
|
||||||
/** @var Category $category */
|
/** @var Category $category */
|
||||||
foreach ($categories as $category) {
|
foreach ($categories as $category) {
|
||||||
$expenses = $this->opsRepository->sumTransfers($start, $end, $assetAccounts, new Collection([$category]));
|
$expenses = $this->opsRepository->sumTransfers($start, $end, $assetAccounts, new Collection()->push($category));
|
||||||
|
|
||||||
/** @var array $expense */
|
/** @var array $expense */
|
||||||
foreach ($expenses as $expense) {
|
foreach ($expenses as $expense) {
|
||||||
@@ -98,10 +94,6 @@ class CategoryController extends Controller
|
|||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
|
|
||||||
*/
|
|
||||||
public function noCategory(GenericRequest $request): JsonResponse
|
public function noCategory(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
|
@@ -29,6 +29,7 @@ use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
|||||||
use FireflyIII\Enums\TransactionTypeEnum;
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,10 +37,6 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class PeriodController extends Controller
|
class PeriodController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTotal
|
|
||||||
*/
|
|
||||||
public function total(GenericRequest $request): JsonResponse
|
public function total(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$accounts = $request->getAssetAccounts();
|
$accounts = $request->getAssetAccounts();
|
||||||
@@ -75,7 +72,7 @@ class PeriodController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $currencyCode,
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,7 @@ use FireflyIII\Enums\TransactionTypeEnum;
|
|||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
||||||
use FireflyIII\Support\Facades\Amount;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,10 +57,6 @@ class TagController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoTag
|
|
||||||
*/
|
|
||||||
public function noTag(GenericRequest $request): JsonResponse
|
public function noTag(GenericRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$accounts = $request->getAssetAccounts();
|
$accounts = $request->getAssetAccounts();
|
||||||
@@ -99,7 +96,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $currencyCode,
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], Steam::positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -108,9 +105,6 @@ class TagController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTag
|
|
||||||
*
|
|
||||||
* Transfers per tag, possibly filtered by tag and account.
|
* Transfers per tag, possibly filtered by tag and account.
|
||||||
*/
|
*/
|
||||||
public function tag(GenericRequest $request): JsonResponse
|
public function tag(GenericRequest $request): JsonResponse
|
||||||
@@ -153,7 +147,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $journal['currency_code'],
|
||||||
];
|
];
|
||||||
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], (string) app('steam')->positive($journal['amount']));
|
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], Steam::positive($journal['amount']));
|
||||||
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +161,7 @@ class TagController extends Controller
|
|||||||
];
|
];
|
||||||
$response[$foreignKey]['difference'] = bcadd(
|
$response[$foreignKey]['difference'] = bcadd(
|
||||||
(string) $response[$foreignKey]['difference'],
|
(string) $response[$foreignKey]['difference'],
|
||||||
(string) app('steam')->positive($journal['foreign_amount'])
|
Steam::positive($journal['foreign_amount'])
|
||||||
);
|
);
|
||||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
|
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
|
||||||
}
|
}
|
||||||
|
@@ -55,9 +55,6 @@ class DestroyController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/deleteAccount
|
|
||||||
*
|
|
||||||
* Remove the specified resource from storage.
|
* Remove the specified resource from storage.
|
||||||
*/
|
*/
|
||||||
public function destroy(Account $account): JsonResponse
|
public function destroy(Account $account): JsonResponse
|
||||||
|
@@ -71,9 +71,6 @@ class ListController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAttachmentByAccount
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function attachments(Account $account): JsonResponse
|
public function attachments(Account $account): JsonResponse
|
||||||
@@ -100,9 +97,6 @@ class ListController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listPiggyBankByAccount
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function piggyBanks(Account $account): JsonResponse
|
public function piggyBanks(Account $account): JsonResponse
|
||||||
@@ -140,9 +134,6 @@ class ListController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listTransactionByAccount
|
|
||||||
*
|
|
||||||
* Show all transaction groups related to the account.
|
* Show all transaction groups related to the account.
|
||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
@@ -161,7 +152,7 @@ class ListController extends Controller
|
|||||||
// use new group collector:
|
// use new group collector:
|
||||||
/** @var GroupCollectorInterface $collector */
|
/** @var GroupCollectorInterface $collector */
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setUser($admin)->setAccounts(new Collection([$account]))
|
$collector->setUser($admin)->setAccounts(new Collection()->push($account))
|
||||||
->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types)
|
->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers\Models\Account;
|
namespace FireflyIII\Api\V1\Controllers\Models\Account;
|
||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\Account\ShowRequest;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
@@ -33,7 +34,6 @@ use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
|||||||
use FireflyIII\Transformers\AccountTransformer;
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
use League\Fractal\Resource\Collection as FractalCollection;
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
@@ -67,41 +67,42 @@ class ShowController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAccount
|
|
||||||
*
|
|
||||||
* Display a listing of the resource.
|
* Display a listing of the resource.
|
||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function index(Request $request): JsonResponse
|
public function index(ShowRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
$type = $request->get('type') ?? 'all';
|
$params = $request->getParameters();
|
||||||
$this->parameters->set('type', $type);
|
$this->parameters->set('type', $params['type']);
|
||||||
|
|
||||||
// types to get, page size:
|
// types to get, page size:
|
||||||
$types = $this->mapAccountTypes($this->parameters->get('type'));
|
$types = $this->mapAccountTypes($params['type']);
|
||||||
$pageSize = $this->parameters->get('limit');
|
|
||||||
|
|
||||||
// get list of accounts. Count it and split it.
|
// get list of accounts. Count it and split it.
|
||||||
$this->repository->resetAccountOrder();
|
$this->repository->resetAccountOrder();
|
||||||
$collection = $this->repository->getAccountsByType($types, $this->parameters->get('sort') ?? []);
|
$collection = $this->repository->getAccountsByType($types, $params['sort']);
|
||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
|
|
||||||
// continue sort:
|
// continue sort:
|
||||||
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
// TODO if the user sorts on DB dependent field there must be no slice before enrichment, only after.
|
||||||
|
// TODO still need to figure out how to do this easily.
|
||||||
|
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $params['limit'], $params['limit']);
|
||||||
|
|
||||||
// enrich
|
// enrich
|
||||||
/** @var User $admin */
|
/** @var User $admin */
|
||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
$enrichment = new AccountEnrichment();
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setSort($params['sort']);
|
||||||
$enrichment->setDate($this->parameters->get('date'));
|
$enrichment->setDate($this->parameters->get('date'));
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
$enrichment->setUser($admin);
|
$enrichment->setUser($admin);
|
||||||
$accounts = $enrichment->enrich($accounts);
|
$accounts = $enrichment->enrich($accounts);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($accounts, $count, $params['limit'], $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.accounts.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.accounts.index').$this->buildParams());
|
||||||
|
|
||||||
/** @var AccountTransformer $transformer */
|
/** @var AccountTransformer $transformer */
|
||||||
@@ -120,7 +121,7 @@ class ShowController extends Controller
|
|||||||
*
|
*
|
||||||
* Show single instance.
|
* Show single instance.
|
||||||
*/
|
*/
|
||||||
public function show(Account $account): JsonResponse
|
public function show(ShowRequest $request, Account $account): JsonResponse
|
||||||
{
|
{
|
||||||
// get list of accounts. Count it and split it.
|
// get list of accounts. Count it and split it.
|
||||||
$this->repository->resetAccountOrder();
|
$this->repository->resetAccountOrder();
|
||||||
@@ -132,6 +133,8 @@ class ShowController extends Controller
|
|||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
$enrichment = new AccountEnrichment();
|
$enrichment = new AccountEnrichment();
|
||||||
$enrichment->setDate($this->parameters->get('date'));
|
$enrichment->setDate($this->parameters->get('date'));
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
$enrichment->setUser($admin);
|
$enrichment->setUser($admin);
|
||||||
$account = $enrichment->enrichSingle($account);
|
$account = $enrichment->enrichSingle($account);
|
||||||
|
|
||||||
|
@@ -114,8 +114,8 @@ class ShowController extends Controller
|
|||||||
public function show(AvailableBudget $availableBudget): JsonResponse
|
public function show(AvailableBudget $availableBudget): JsonResponse
|
||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
$start = $this->parameters->get('start');
|
// $start = $this->parameters->get('start');
|
||||||
$end = $this->parameters->get('end');
|
// $end = $this->parameters->get('end');
|
||||||
|
|
||||||
/** @var AvailableBudgetTransformer $transformer */
|
/** @var AvailableBudgetTransformer $transformer */
|
||||||
$transformer = app(AvailableBudgetTransformer::class);
|
$transformer = app(AvailableBudgetTransformer::class);
|
||||||
@@ -126,8 +126,8 @@ class ShowController extends Controller
|
|||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
$enrichment = new AvailableBudgetEnrichment();
|
$enrichment = new AvailableBudgetEnrichment();
|
||||||
$enrichment->setUser($admin);
|
$enrichment->setUser($admin);
|
||||||
$enrichment->setStart($start);
|
// $enrichment->setStart($start);
|
||||||
$enrichment->setEnd($end);
|
// $enrichment->setEnd($end);
|
||||||
$availableBudget = $enrichment->enrichSingle($availableBudget);
|
$availableBudget = $enrichment->enrichSingle($availableBudget);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -67,7 +67,9 @@ class StoreController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store(StoreRequest $request): JsonResponse
|
public function store(StoreRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$budget = $this->repository->store($request->getAll());
|
$data = $request->getAll();
|
||||||
|
$data['fire_webhooks'] ??= true;
|
||||||
|
$budget = $this->repository->store($data);
|
||||||
$budget->refresh();
|
$budget->refresh();
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
@@ -57,15 +57,10 @@ class UpdateController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This endpoint is documented at:
|
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudget
|
|
||||||
*
|
|
||||||
* Update a budget.
|
|
||||||
*/
|
|
||||||
public function update(UpdateRequest $request, Budget $budget): JsonResponse
|
public function update(UpdateRequest $request, Budget $budget): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
|
$data['fire_webhooks'] ??= true;
|
||||||
$budget = $this->repository->update($budget, $data);
|
$budget = $this->repository->update($budget, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
@@ -31,6 +31,7 @@ use FireflyIII\Models\Budget;
|
|||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment;
|
||||||
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetLimitTransformer;
|
use FireflyIII\Transformers\BudgetLimitTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
@@ -76,6 +77,18 @@ class ShowController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function index(Budget $budget): JsonResponse
|
public function index(Budget $budget): JsonResponse
|
||||||
{
|
{
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
// enrich budget:
|
||||||
|
$enrichment = new BudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
|
||||||
|
/** @var Budget $budget */
|
||||||
|
$budget = $enrichment->enrichSingle($budget);
|
||||||
|
|
||||||
|
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
$manager->parseIncludes('budget');
|
$manager->parseIncludes('budget');
|
||||||
$pageSize = $this->parameters->get('limit');
|
$pageSize = $this->parameters->get('limit');
|
||||||
@@ -85,10 +98,7 @@ class ShowController extends Controller
|
|||||||
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams());
|
||||||
|
|
||||||
|
|
||||||
// enrich
|
// enrich
|
||||||
/** @var User $admin */
|
|
||||||
$admin = auth()->user();
|
|
||||||
$enrichment = new BudgetLimitEnrichment();
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
$enrichment->setUser($admin);
|
$enrichment->setUser($admin);
|
||||||
$budgetLimits = $enrichment->enrich($budgetLimits);
|
$budgetLimits = $enrichment->enrich($budgetLimits);
|
||||||
|
@@ -70,6 +70,7 @@ class StoreController extends Controller
|
|||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$data['start_date'] = $data['start'];
|
$data['start_date'] = $data['start'];
|
||||||
$data['end_date'] = $data['end'];
|
$data['end_date'] = $data['end'];
|
||||||
|
$data['fire_webhooks'] ??= true;
|
||||||
$data['budget_id'] = $budget->id;
|
$data['budget_id'] = $budget->id;
|
||||||
|
|
||||||
$budgetLimit = $this->blRepository->store($data);
|
$budgetLimit = $this->blRepository->store($data);
|
||||||
|
@@ -77,6 +77,7 @@ class UpdateController extends Controller
|
|||||||
throw new FireflyException('20028: The budget limit does not belong to the budget.');
|
throw new FireflyException('20028: The budget limit does not belong to the budget.');
|
||||||
}
|
}
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
|
$data['fire_webhooks'] ??= true;
|
||||||
$data['budget_id'] = $budget->id;
|
$data['budget_id'] = $budget->id;
|
||||||
$budgetLimit = $this->blRepository->update($budgetLimit, $data);
|
$budgetLimit = $this->blRepository->update($budgetLimit, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
@@ -86,7 +87,7 @@ class UpdateController extends Controller
|
|||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
$enrichment = new BudgetLimitEnrichment();
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
$enrichment->setUser($admin);
|
$enrichment->setUser($admin);
|
||||||
$budgetLimit = $enrichment->enrich($budgetLimit);
|
$budgetLimit = $enrichment->enrichSingle($budgetLimit);
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
|
@@ -28,13 +28,11 @@ use Carbon\Carbon;
|
|||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest;
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\ValidationException;
|
|
||||||
use FireflyIII\Models\CurrencyExchangeRate;
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
||||||
|
|
||||||
class DestroyController extends Controller
|
class DestroyController extends Controller
|
||||||
{
|
{
|
||||||
@@ -59,23 +57,25 @@ class DestroyController extends Controller
|
|||||||
|
|
||||||
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
||||||
{
|
{
|
||||||
$date = $request->getDate();
|
$this->repository->deleteRates($from, $to);
|
||||||
if (!$date instanceof Carbon) {
|
|
||||||
throw new ValidationException('Date is required');
|
|
||||||
}
|
|
||||||
$rate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
|
||||||
if (!$rate instanceof CurrencyExchangeRate) {
|
|
||||||
throw new NotFoundHttpException();
|
|
||||||
}
|
|
||||||
$this->repository->deleteRate($rate);
|
|
||||||
|
|
||||||
return response()->json([], 204);
|
return response()->json([], 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroySingle(CurrencyExchangeRate $exchangeRate): JsonResponse
|
public function destroySingleById(CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
{
|
{
|
||||||
$this->repository->deleteRate($exchangeRate);
|
$this->repository->deleteRate($exchangeRate);
|
||||||
|
|
||||||
return response()->json([], 204);
|
return response()->json([], 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function destroySingleByDate(TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse
|
||||||
|
{
|
||||||
|
$exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if (null !== $exchangeRate) {
|
||||||
|
$this->repository->deleteRate($exchangeRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\CurrencyExchangeRate;
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
@@ -33,6 +34,7 @@ use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
|||||||
use FireflyIII\Transformers\ExchangeRateTransformer;
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ShowController
|
* Class ShowController
|
||||||
@@ -76,7 +78,7 @@ class ShowController extends Controller
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function showSingle(CurrencyExchangeRate $exchangeRate): JsonResponse
|
public function showSingleById(CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
{
|
{
|
||||||
$transformer = new ExchangeRateTransformer();
|
$transformer = new ExchangeRateTransformer();
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -86,4 +88,20 @@ class ShowController extends Controller
|
|||||||
->header('Content-Type', self::CONTENT_TYPE)
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function showSingleByDate(TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse
|
||||||
|
{
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
$exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if (null === $exchangeRate) {
|
||||||
|
throw new NotFoundHttpException();
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,21 +24,28 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreByCurrenciesRequest;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreByDateRequest;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\CurrencyExchangeRate;
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
|
||||||
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Transformers\ExchangeRateTransformer;
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
class StoreController extends Controller
|
class StoreController extends Controller
|
||||||
{
|
{
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
public const string RESOURCE_KEY = 'exchange-rates';
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
private ExchangeRateRepositoryInterface $repository;
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
@@ -54,6 +61,68 @@ class StoreController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function storeByCurrencies(StoreByCurrenciesRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
||||||
|
{
|
||||||
|
|
||||||
|
$data = $request->getAll();
|
||||||
|
$collection = new Collection();
|
||||||
|
|
||||||
|
foreach ($data as $date => $rate) {
|
||||||
|
$date = Carbon::createFromFormat('Y-m-d', $date);
|
||||||
|
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if ($existing instanceof CurrencyExchangeRate) {
|
||||||
|
// update existing rate.
|
||||||
|
$existing = $this->repository->updateExchangeRate($existing, $rate);
|
||||||
|
$collection->push($existing);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
|
||||||
|
$collection->push($new);
|
||||||
|
}
|
||||||
|
|
||||||
|
$count = $collection->count();
|
||||||
|
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function storeByDate(StoreByDateRequest $request, Carbon $date): JsonResponse
|
||||||
|
{
|
||||||
|
|
||||||
|
$data = $request->getAll();
|
||||||
|
$from = $request->getFromCurrency();
|
||||||
|
$collection = new Collection();
|
||||||
|
foreach ($data['rates'] as $key => $rate) {
|
||||||
|
$to = Amount::getTransactionCurrencyByCode($key);
|
||||||
|
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if ($existing instanceof CurrencyExchangeRate) {
|
||||||
|
// update existing rate.
|
||||||
|
$existing = $this->repository->updateExchangeRate($existing, $rate);
|
||||||
|
$collection->push($existing);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
|
||||||
|
$collection->push($new);
|
||||||
|
}
|
||||||
|
|
||||||
|
$count = $collection->count();
|
||||||
|
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
public function store(StoreRequest $request): JsonResponse
|
public function store(StoreRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$date = $request->getDate();
|
$date = $request->getDate();
|
||||||
|
@@ -24,21 +24,24 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\CurrencyExchangeRate;
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Transformers\ExchangeRateTransformer;
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
|
|
||||||
class UpdateController extends Controller
|
class UpdateController extends Controller
|
||||||
{
|
{
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
public const string RESOURCE_KEY = 'exchange-rates';
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
private ExchangeRateRepositoryInterface $repository;
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
@@ -54,7 +57,7 @@ class UpdateController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function update(UpdateRequest $request, CurrencyExchangeRate $exchangeRate): JsonResponse
|
public function updateById(UpdateRequest $request, CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
{
|
{
|
||||||
$date = $request->getDate();
|
$date = $request->getDate();
|
||||||
$rate = $request->getRate();
|
$rate = $request->getRate();
|
||||||
@@ -67,4 +70,23 @@ class UpdateController extends Controller
|
|||||||
->header('Content-Type', self::CONTENT_TYPE)
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function updateByDate(UpdateRequest $request, TransactionCurrency $from, TransactionCurrency $to, Carbon $date): JsonResponse
|
||||||
|
{
|
||||||
|
$exchangeRate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if (null === $exchangeRate) {
|
||||||
|
throw new NotFoundHttpException();
|
||||||
|
}
|
||||||
|
$date = $request->getDate();
|
||||||
|
$rate = $request->getRate();
|
||||||
|
$exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date);
|
||||||
|
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
126
app/Api/V1/Controllers/Models/Recurrence/TriggerController.php
Normal file
126
app/Api/V1/Controllers/Models/Recurrence/TriggerController.php
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* TriggerController.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers\Models\Recurrence;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Generic\SingleDateRequest;
|
||||||
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
|
use FireflyIII\Jobs\CreateRecurringTransactions;
|
||||||
|
use FireflyIII\Models\Recurrence;
|
||||||
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
|
|
||||||
|
class TriggerController extends Controller
|
||||||
|
{
|
||||||
|
private RecurringRepositoryInterface $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RecurrenceController constructor.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(RecurringRepositoryInterface::class);
|
||||||
|
$this->repository->setUser(auth()->user());
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function trigger(SingleDateRequest $request, Recurrence $recurrence): JsonResponse
|
||||||
|
{
|
||||||
|
// find recurrence occurrence for this date and trigger it.
|
||||||
|
// grab the date from the last time the recurrence fired:
|
||||||
|
$backupDate = $recurrence->latest_date;
|
||||||
|
$date = $request->getDate();
|
||||||
|
|
||||||
|
// fire the recurring cron job on the given date, then post-date the created transaction.
|
||||||
|
Log::info(sprintf('Trigger: will now fire recurring cron job task for date "%s".', $date->format('Y-m-d H:i:s')));
|
||||||
|
|
||||||
|
/** @var CreateRecurringTransactions $job */
|
||||||
|
$job = app(CreateRecurringTransactions::class);
|
||||||
|
$job->setRecurrences(new Collection()->push($recurrence));
|
||||||
|
$job->setDate($date);
|
||||||
|
$job->setForce(false);
|
||||||
|
$job->handle();
|
||||||
|
Log::debug('Done with recurrence.');
|
||||||
|
|
||||||
|
$groups = $job->getGroups();
|
||||||
|
$this->repository->markGroupsAsNow($groups);
|
||||||
|
$recurrence->latest_date = $backupDate;
|
||||||
|
$recurrence->latest_date_tz = $backupDate?->format('e');
|
||||||
|
$recurrence->save();
|
||||||
|
Preferences::mark();
|
||||||
|
|
||||||
|
// enrich groups and return them:
|
||||||
|
|
||||||
|
if (0 === $groups->count()) {
|
||||||
|
$paginator = new LengthAwarePaginator(new Collection(), 0, 1);
|
||||||
|
}
|
||||||
|
if ($groups->count() > 0) {
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
|
||||||
|
// use new group collector:
|
||||||
|
/** @var GroupCollectorInterface $collector */
|
||||||
|
$collector = app(GroupCollectorInterface::class);
|
||||||
|
$collector
|
||||||
|
->setUser($admin)
|
||||||
|
->setIds($groups->pluck('id')->toArray())
|
||||||
|
->withAPIInformation()
|
||||||
|
;
|
||||||
|
$paginator = $collector->getPaginatedGroups();
|
||||||
|
}
|
||||||
|
|
||||||
|
$manager = $this->getManager();
|
||||||
|
$paginator->setPath(route('api.v1.recurrences.trigger', [$recurrence->id]).$this->buildParams());
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
$resource = new FractalCollection($transactions, $transformer, 'transactions');
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
}
|
||||||
|
}
|
@@ -75,7 +75,7 @@ class TriggerController extends Controller
|
|||||||
|
|
||||||
/** @var RuleEngineInterface $ruleEngine */
|
/** @var RuleEngineInterface $ruleEngine */
|
||||||
$ruleEngine = app(RuleEngineInterface::class);
|
$ruleEngine = app(RuleEngineInterface::class);
|
||||||
$ruleEngine->setRules(new Collection([$rule]));
|
$ruleEngine->setRules(new Collection()->push($rule));
|
||||||
|
|
||||||
// overrule the rule(s) if necessary.
|
// overrule the rule(s) if necessary.
|
||||||
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
|
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
|
||||||
@@ -129,7 +129,7 @@ class TriggerController extends Controller
|
|||||||
|
|
||||||
/** @var RuleEngineInterface $ruleEngine */
|
/** @var RuleEngineInterface $ruleEngine */
|
||||||
$ruleEngine = app(RuleEngineInterface::class);
|
$ruleEngine = app(RuleEngineInterface::class);
|
||||||
$ruleEngine->setRules(new Collection([$rule]));
|
$ruleEngine->setRules(new Collection()->push($rule));
|
||||||
|
|
||||||
// overrule the rule(s) if necessary.
|
// overrule the rule(s) if necessary.
|
||||||
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
|
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
|
||||||
|
@@ -30,9 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Models\RecurrenceTransaction;
|
|
||||||
use FireflyIII\Models\Rule;
|
use FireflyIII\Models\Rule;
|
||||||
use FireflyIII\Models\RuleTrigger;
|
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
@@ -192,7 +190,7 @@ class ListController extends Controller
|
|||||||
$enrichment->setUser($admin);
|
$enrichment->setUser($admin);
|
||||||
$enrichment->setStart($this->parameters->get('start'));
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
$enrichment->setEnd($this->parameters->get('end'));
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
$bills = $enrichment->enrichSingle($bills);
|
$bills = $enrichment->enrich($bills);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
||||||
@@ -268,7 +266,6 @@ class ListController extends Controller
|
|||||||
// filter selection
|
// filter selection
|
||||||
$collection = $unfiltered->filter(
|
$collection = $unfiltered->filter(
|
||||||
static function (Recurrence $recurrence) use ($currency) { // @phpstan-ignore-line
|
static function (Recurrence $recurrence) use ($currency) { // @phpstan-ignore-line
|
||||||
/** @var RecurrenceTransaction $transaction */
|
|
||||||
if (array_any($recurrence->recurrenceTransactions, fn ($transaction) => $transaction->transaction_currency_id === $currency->id || $transaction->foreign_currency_id === $currency->id)) {
|
if (array_any($recurrence->recurrenceTransactions, fn ($transaction) => $transaction->transaction_currency_id === $currency->id || $transaction->foreign_currency_id === $currency->id)) {
|
||||||
return $recurrence;
|
return $recurrence;
|
||||||
}
|
}
|
||||||
@@ -320,7 +317,6 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$collection = $unfiltered->filter(
|
$collection = $unfiltered->filter(
|
||||||
static function (Rule $rule) use ($currency) { // @phpstan-ignore-line
|
static function (Rule $rule) use ($currency) { // @phpstan-ignore-line
|
||||||
/** @var RuleTrigger $trigger */
|
|
||||||
if (array_any($rule->ruleTriggers, fn ($trigger) => 'currency_is' === $trigger->trigger_type && $currency->name === $trigger->trigger_value)) {
|
if (array_any($rule->ruleTriggers, fn ($trigger) => 'currency_is' === $trigger->trigger_type && $currency->name === $trigger->trigger_value)) {
|
||||||
return $rule;
|
return $rule;
|
||||||
}
|
}
|
||||||
|
@@ -126,7 +126,7 @@ class ShowController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function showDefault(): JsonResponse
|
public function showPrimary(): JsonResponse
|
||||||
{
|
{
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
@@ -73,7 +73,7 @@ class StoreController extends Controller
|
|||||||
{
|
{
|
||||||
$currency = $this->repository->store($request->getAll());
|
$currency = $this->repository->store($request->getAll());
|
||||||
if (true === $request->boolean('default')) {
|
if (true === $request->boolean('default')) {
|
||||||
$this->repository->makeDefault($currency);
|
$this->repository->makePrimary($currency);
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
}
|
}
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
@@ -101,12 +101,12 @@ class UpdateController extends Controller
|
|||||||
/**
|
/**
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function makeDefault(TransactionCurrency $currency): JsonResponse
|
public function makePrimary(TransactionCurrency $currency): JsonResponse
|
||||||
{
|
{
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
$this->repository->enable($currency);
|
$this->repository->enable($currency);
|
||||||
$this->repository->makeDefault($currency);
|
$this->repository->makePrimary($currency);
|
||||||
|
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
|
|
||||||
|
@@ -481,7 +481,7 @@ class BasicController extends Controller
|
|||||||
$currencies = [];
|
$currencies = [];
|
||||||
|
|
||||||
// first, create an entry for each entry in the "available" array.
|
// first, create an entry for each entry in the "available" array.
|
||||||
/** @var array $availableBudget */
|
/** @var string $availableBudget */
|
||||||
foreach ($available as $currencyId => $availableBudget) {
|
foreach ($available as $currencyId => $availableBudget) {
|
||||||
$currencies[$currencyId] ??= $this->currencyRepos->find($currencyId);
|
$currencies[$currencyId] ??= $this->currencyRepos->find($currencyId);
|
||||||
$return[$currencyId] = [
|
$return[$currencyId] = [
|
||||||
|
@@ -24,15 +24,18 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\System;
|
namespace FireflyIII\Api\V1\Controllers\System;
|
||||||
|
|
||||||
use FireflyIII\Support\Facades\FireflyConfig;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
|
||||||
use Illuminate\Support\Facades\Validator;
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\System\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\System\UpdateRequest;
|
||||||
|
use FireflyIII\Enums\WebhookDelivery;
|
||||||
|
use FireflyIII\Enums\WebhookResponse;
|
||||||
|
use FireflyIII\Enums\WebhookTrigger;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
use FireflyIII\Support\Binder\EitherConfigKey;
|
use FireflyIII\Support\Binder\EitherConfigKey;
|
||||||
|
use FireflyIII\Support\Facades\FireflyConfig;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -107,8 +110,8 @@ class ConfigurationController extends Controller
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
'is_demo_site' => $isDemoSite?->data,
|
'is_demo_site' => $isDemoSite?->data,
|
||||||
'permission_update_check' => null === $updateCheck ? null : (int) $updateCheck->data,
|
'permission_update_check' => null === $updateCheck ? null : (int)$updateCheck->data,
|
||||||
'last_update_check' => null === $lastCheck ? null : (int) $lastCheck->data,
|
'last_update_check' => null === $lastCheck ? null : (int)$lastCheck->data,
|
||||||
'single_user_mode' => $singleUser?->data,
|
'single_user_mode' => $singleUser?->data,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -130,7 +133,6 @@ class ConfigurationController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function show(string $configKey): JsonResponse
|
public function show(string $configKey): JsonResponse
|
||||||
{
|
{
|
||||||
$data = [];
|
|
||||||
$dynamic = $this->getDynamicConfiguration();
|
$dynamic = $this->getDynamicConfiguration();
|
||||||
$shortKey = str_replace('configuration.', '', $configKey);
|
$shortKey = str_replace('configuration.', '', $configKey);
|
||||||
if (str_starts_with($configKey, 'configuration.')) {
|
if (str_starts_with($configKey, 'configuration.')) {
|
||||||
@@ -139,15 +141,26 @@ class ConfigurationController extends Controller
|
|||||||
'value' => $dynamic[$shortKey],
|
'value' => $dynamic[$shortKey],
|
||||||
'editable' => true,
|
'editable' => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
if (!str_starts_with($configKey, 'configuration.')) {
|
if (str_starts_with($configKey, 'webhook.')) {
|
||||||
$data = [
|
$data = [
|
||||||
'title' => $configKey,
|
'title' => $configKey,
|
||||||
'value' => config($configKey),
|
'value' => $this->getWebhookConfiguration($configKey),
|
||||||
'editable' => false,
|
'editable' => false,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fallback
|
||||||
|
$data = [
|
||||||
|
'title' => $configKey,
|
||||||
|
'value' => config($shortKey),
|
||||||
|
'editable' => false,
|
||||||
|
];
|
||||||
|
|
||||||
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
return response()->api(['data' => $data])->header('Content-Type', self::JSON_CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,4 +195,39 @@ class ConfigurationController extends Controller
|
|||||||
|
|
||||||
return response()->api(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
return response()->api(['data' => $data])->header('Content-Type', self::CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getWebhookConfiguration(string $configKey): array
|
||||||
|
{
|
||||||
|
switch ($configKey) {
|
||||||
|
case 'webhook.triggers':
|
||||||
|
$cases = WebhookTrigger::cases();
|
||||||
|
$data = [];
|
||||||
|
foreach ($cases as $c) {
|
||||||
|
$data[$c->name] = $c->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
|
||||||
|
case 'webhook.responses':
|
||||||
|
$cases = WebhookResponse::cases();
|
||||||
|
$data = [];
|
||||||
|
foreach ($cases as $c) {
|
||||||
|
$data[$c->name] = $c->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
|
||||||
|
case 'webhook.deliveries':
|
||||||
|
$cases = WebhookDelivery::cases();
|
||||||
|
$data = [];
|
||||||
|
foreach ($cases as $c) {
|
||||||
|
$data[$c->name] = $c->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new FireflyException(sprintf('Unknown webhook configuration key "%s".', $configKey));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,13 +25,16 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers\Webhook;
|
namespace FireflyIII\Api\V1\Controllers\Webhook;
|
||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Enums\WebhookTrigger;
|
||||||
use FireflyIII\Events\RequestedSendWebhookMessages;
|
use FireflyIII\Events\RequestedSendWebhookMessages;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
|
use FireflyIII\Generator\Webhook\MessageGeneratorInterface;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
use FireflyIII\Models\Webhook;
|
use FireflyIII\Models\Webhook;
|
||||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||||
use FireflyIII\Transformers\WebhookTransformer;
|
use FireflyIII\Transformers\WebhookTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -89,6 +92,13 @@ class ShowController extends Controller
|
|||||||
$paginator = new LengthAwarePaginator($webhooks, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($webhooks, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.webhooks.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.webhooks.index').$this->buildParams());
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new WebhookEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$webhooks = $enrichment->enrich($webhooks);
|
||||||
|
|
||||||
/** @var WebhookTransformer $transformer */
|
/** @var WebhookTransformer $transformer */
|
||||||
$transformer = app(WebhookTransformer::class);
|
$transformer = app(WebhookTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -116,6 +126,13 @@ class ShowController extends Controller
|
|||||||
Log::channel('audit')->info(sprintf('User views webhook #%d.', $webhook->id));
|
Log::channel('audit')->info(sprintf('User views webhook #%d.', $webhook->id));
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new WebhookEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$webhook = $enrichment->enrichSingle($webhook);
|
||||||
|
|
||||||
/** @var WebhookTransformer $transformer */
|
/** @var WebhookTransformer $transformer */
|
||||||
$transformer = app(WebhookTransformer::class);
|
$transformer = app(WebhookTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -146,16 +163,16 @@ class ShowController extends Controller
|
|||||||
$engine->setUser(auth()->user());
|
$engine->setUser(auth()->user());
|
||||||
|
|
||||||
// tell the generator which trigger it should look for
|
// tell the generator which trigger it should look for
|
||||||
$engine->setTrigger($webhook->trigger);
|
$engine->setTrigger(WebhookTrigger::tryFrom($webhook->trigger));
|
||||||
// tell the generator which objects to process
|
// tell the generator which objects to process
|
||||||
$engine->setObjects(new Collection([$group]));
|
$engine->setObjects(new Collection()->push($group));
|
||||||
// set the webhook to trigger
|
// set the webhook to trigger
|
||||||
$engine->setWebhooks(new Collection([$webhook]));
|
$engine->setWebhooks(new Collection()->push($webhook));
|
||||||
// tell the generator to generate the messages
|
// tell the generator to generate the messages
|
||||||
$engine->generateMessages();
|
$engine->generateMessages();
|
||||||
|
|
||||||
// trigger event to send them:
|
// trigger event to send them:
|
||||||
Log::debug('send event RequestedSendWebhookMessages');
|
Log::debug('send event RequestedSendWebhookMessages from ShowController::triggerTransaction()');
|
||||||
event(new RequestedSendWebhookMessages());
|
event(new RequestedSendWebhookMessages());
|
||||||
|
|
||||||
return response()->json([], 204);
|
return response()->json([], 204);
|
||||||
|
@@ -27,7 +27,9 @@ namespace FireflyIII\Api\V1\Controllers\Webhook;
|
|||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Models\Webhook\CreateRequest;
|
use FireflyIII\Api\V1\Requests\Models\Webhook\CreateRequest;
|
||||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||||
use FireflyIII\Transformers\WebhookTransformer;
|
use FireflyIII\Transformers\WebhookTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
@@ -68,6 +70,15 @@ class StoreController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$webhook = $this->repository->store($data);
|
$webhook = $this->repository->store($data);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new WebhookEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$webhook = $enrichment->enrichSingle($webhook);
|
||||||
|
|
||||||
|
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
Log::channel('audit')->info('User stores new webhook', $data);
|
Log::channel('audit')->info('User stores new webhook', $data);
|
||||||
|
@@ -28,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Webhook\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\Models\Webhook\UpdateRequest;
|
||||||
use FireflyIII\Models\Webhook;
|
use FireflyIII\Models\Webhook;
|
||||||
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\WebhookEnrichment;
|
||||||
use FireflyIII\Transformers\WebhookTransformer;
|
use FireflyIII\Transformers\WebhookTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
@@ -70,6 +72,15 @@ class UpdateController extends Controller
|
|||||||
$webhook = $this->repository->update($webhook, $data);
|
$webhook = $this->repository->update($webhook, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new WebhookEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
|
||||||
|
/** @var Webhook $webhook */
|
||||||
|
$webhook = $enrichment->enrichSingle($webhook);
|
||||||
|
|
||||||
Log::channel('audit')->info(sprintf('User updates webhook #%d', $webhook->id), $data);
|
Log::channel('audit')->info(sprintf('User updates webhook #%d', $webhook->id), $data);
|
||||||
|
|
||||||
/** @var WebhookTransformer $transformer */
|
/** @var WebhookTransformer $transformer */
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Chart;
|
namespace FireflyIII\Api\V1\Requests\Chart;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Enums\UserRoleEnum;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
@@ -64,6 +64,7 @@ class ChartRequest extends FormRequest
|
|||||||
'end' => 'required|date|after:1970-01-02|before:2038-01-17|after_or_equal:start',
|
'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'))),
|
'preselected' => sprintf('nullable|in:%s', implode(',', config('firefly.preselected_accounts'))),
|
||||||
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
'period' => sprintf('nullable|in:%s', implode(',', config('firefly.valid_view_ranges'))),
|
||||||
|
'accounts' => 'nullable|array',
|
||||||
'accounts.*' => 'exists:accounts,id',
|
'accounts.*' => 'exists:accounts,id',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Data\Bulk;
|
namespace FireflyIII\Api\V1\Requests\Data\Bulk;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Data\Bulk;
|
namespace FireflyIII\Api\V1\Requests\Data\Bulk;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use JsonException;
|
use JsonException;
|
||||||
use FireflyIII\Enums\ClauseType;
|
use FireflyIII\Enums\ClauseType;
|
||||||
use FireflyIII\Rules\IsValidBulkClause;
|
use FireflyIII\Rules\IsValidBulkClause;
|
||||||
|
99
app/Api/V1/Requests/Models/Account/ShowRequest.php
Normal file
99
app/Api/V1/Requests/Models/Account/ShowRequest.php
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* ShowRequest.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests\Models\Account;
|
||||||
|
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Rules\IsValidSortInstruction;
|
||||||
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
|
use FireflyIII\Support\Http\Api\AccountFilter;
|
||||||
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ShowRequest extends FormRequest
|
||||||
|
{
|
||||||
|
use AccountFilter;
|
||||||
|
use ConvertsDataTypes;
|
||||||
|
|
||||||
|
public function getParameters(): array
|
||||||
|
{
|
||||||
|
$limit = $this->convertInteger('limit');
|
||||||
|
if (0 === $limit) {
|
||||||
|
// get default for user:
|
||||||
|
/** @var User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
$limit = (int)Preferences::getForUser($user, 'listPageSize', 50)->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
$page = $this->convertInteger('page');
|
||||||
|
$page = min(max(1, $page), 2 ** 16);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'type' => $this->convertString('type', 'all'),
|
||||||
|
'limit' => $limit,
|
||||||
|
'sort' => $this->convertSortParameters('sort', Account::class),
|
||||||
|
'page' => $page,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$keys = implode(',', array_keys($this->types));
|
||||||
|
|
||||||
|
return [
|
||||||
|
'date' => 'date',
|
||||||
|
'start' => 'date|present_with:end|before_or_equal:end|before:2038-01-17|after:1970-01-02',
|
||||||
|
'end' => 'date|present_with:start|after_or_equal:start|before:2038-01-17|after:1970-01-02',
|
||||||
|
'sort' => ['nullable', new IsValidSortInstruction(Account::class)],
|
||||||
|
'type' => sprintf('in:%s', $keys),
|
||||||
|
'limit' => 'numeric|min:1|max:131337',
|
||||||
|
'page' => 'numeric|min:1|max:131337',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$validator->after(
|
||||||
|
function (Validator $validator): void {
|
||||||
|
if (count($validator->failed()) > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$data = $validator->getData();
|
||||||
|
|
||||||
|
|
||||||
|
if (array_key_exists('date', $data) && array_key_exists('start', $data) && array_key_exists('end', $data)) {
|
||||||
|
// assume valid dates, before we got here.
|
||||||
|
$start = Carbon::parse($data['start'], config('app.timezone'))->startOfDay();
|
||||||
|
$end = Carbon::parse($data['end'], config('app.timezone'))->endOfDay();
|
||||||
|
$date = Carbon::parse($data['date'], config('app.timezone'));
|
||||||
|
if (!$date->between($start, $end)) {
|
||||||
|
$validator->errors()->add('date', (string)trans('validation.between_date'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Account;
|
namespace FireflyIII\Api\V1\Requests\Models\Account;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\Location;
|
use FireflyIII\Models\Location;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\AvailableBudget;
|
namespace FireflyIII\Api\V1\Requests\Models\AvailableBudget;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Bill;
|
namespace FireflyIII\Api\V1\Requests\Models\Bill;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use ValueError;
|
use ValueError;
|
||||||
use TypeError;
|
use TypeError;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Bill;
|
namespace FireflyIII\Api\V1\Requests\Models\Bill;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Budget;
|
namespace FireflyIII\Api\V1\Requests\Models\Budget;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
@@ -48,17 +48,20 @@ class StoreRequest extends FormRequest
|
|||||||
public function getAll(): array
|
public function getAll(): array
|
||||||
{
|
{
|
||||||
$fields = [
|
$fields = [
|
||||||
'name' => ['name', 'convertString'],
|
'name' => ['name', 'convertString'],
|
||||||
'active' => ['active', 'boolean'],
|
'active' => ['active', 'boolean'],
|
||||||
'order' => ['active', 'convertInteger'],
|
'order' => ['active', 'convertInteger'],
|
||||||
'notes' => ['notes', 'convertString'],
|
'notes' => ['notes', 'convertString'],
|
||||||
|
|
||||||
// auto budget currency:
|
// auto budget currency:
|
||||||
'currency_id' => ['auto_budget_currency_id', 'convertInteger'],
|
'currency_id' => ['auto_budget_currency_id', 'convertInteger'],
|
||||||
'currency_code' => ['auto_budget_currency_code', 'convertString'],
|
'currency_code' => ['auto_budget_currency_code', 'convertString'],
|
||||||
'auto_budget_type' => ['auto_budget_type', 'convertString'],
|
'auto_budget_type' => ['auto_budget_type', 'convertString'],
|
||||||
'auto_budget_amount' => ['auto_budget_amount', 'convertString'],
|
'auto_budget_amount' => ['auto_budget_amount', 'convertString'],
|
||||||
'auto_budget_period' => ['auto_budget_period', 'convertString'],
|
'auto_budget_period' => ['auto_budget_period', 'convertString'],
|
||||||
|
|
||||||
|
// webhooks
|
||||||
|
'fire_webhooks' => ['fire_webhooks', 'boolean'],
|
||||||
];
|
];
|
||||||
|
|
||||||
return $this->getAllData($fields);
|
return $this->getAllData($fields);
|
||||||
@@ -70,15 +73,18 @@ class StoreRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => 'required|min:1|max:255|uniqueObjectForUser:budgets,name',
|
'name' => 'required|min:1|max:255|uniqueObjectForUser:budgets,name',
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
'currency_id' => 'exists:transaction_currencies,id',
|
'currency_id' => 'exists:transaction_currencies,id',
|
||||||
'currency_code' => 'exists:transaction_currencies,code',
|
'currency_code' => 'exists:transaction_currencies,code',
|
||||||
'notes' => 'nullable|min:1|max:32768',
|
'notes' => 'nullable|min:1|max:32768',
|
||||||
// auto budget info
|
// auto budget info
|
||||||
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
|
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
|
||||||
'auto_budget_amount' => ['required_if:auto_budget_type,reset', 'required_if:auto_budget_type,rollover', 'required_if:auto_budget_type,adjusted', new IsValidPositiveAmount()],
|
'auto_budget_amount' => ['required_if:auto_budget_type,reset', 'required_if:auto_budget_type,rollover', '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()],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Budget;
|
namespace FireflyIII\Api\V1\Requests\Models\Budget;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
@@ -50,15 +50,18 @@ class UpdateRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
// this is the way:
|
// this is the way:
|
||||||
$fields = [
|
$fields = [
|
||||||
'name' => ['name', 'convertString'],
|
'name' => ['name', 'convertString'],
|
||||||
'active' => ['active', 'boolean'],
|
'active' => ['active', 'boolean'],
|
||||||
'order' => ['order', 'convertInteger'],
|
'order' => ['order', 'convertInteger'],
|
||||||
'notes' => ['notes', 'convertString'],
|
'notes' => ['notes', 'convertString'],
|
||||||
'currency_id' => ['auto_budget_currency_id', 'convertInteger'],
|
'currency_id' => ['auto_budget_currency_id', 'convertInteger'],
|
||||||
'currency_code' => ['auto_budget_currency_code', 'convertString'],
|
'currency_code' => ['auto_budget_currency_code', 'convertString'],
|
||||||
'auto_budget_type' => ['auto_budget_type', 'convertString'],
|
'auto_budget_type' => ['auto_budget_type', 'convertString'],
|
||||||
'auto_budget_amount' => ['auto_budget_amount', 'convertString'],
|
'auto_budget_amount' => ['auto_budget_amount', 'convertString'],
|
||||||
'auto_budget_period' => ['auto_budget_period', 'convertString'],
|
'auto_budget_period' => ['auto_budget_period', 'convertString'],
|
||||||
|
|
||||||
|
// webhooks
|
||||||
|
'fire_webhooks' => ['fire_webhooks', 'boolean'],
|
||||||
];
|
];
|
||||||
$allData = $this->getAllData($fields);
|
$allData = $this->getAllData($fields);
|
||||||
if (array_key_exists('auto_budget_type', $allData)) {
|
if (array_key_exists('auto_budget_type', $allData)) {
|
||||||
@@ -83,14 +86,17 @@ class UpdateRequest extends FormRequest
|
|||||||
$budget = $this->route()->parameter('budget');
|
$budget = $this->route()->parameter('budget');
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => sprintf('min:1|max:100|uniqueObjectForUser:budgets,name,%d', $budget->id),
|
'name' => sprintf('min:1|max:100|uniqueObjectForUser:budgets,name,%d', $budget->id),
|
||||||
'active' => [new IsBoolean()],
|
'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_type' => 'in:reset,rollover,adjusted,none',
|
||||||
'auto_budget_currency_id' => 'exists:transaction_currencies,id',
|
'auto_budget_currency_id' => 'exists:transaction_currencies,id',
|
||||||
'auto_budget_currency_code' => 'exists:transaction_currencies,code',
|
'auto_budget_currency_code' => 'exists:transaction_currencies,code',
|
||||||
'auto_budget_amount' => ['nullable', new IsValidPositiveAmount()],
|
'auto_budget_amount' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly',
|
'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly',
|
||||||
|
|
||||||
|
// webhooks
|
||||||
|
'fire_webhooks' => [new IsBoolean()],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,10 +24,16 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit;
|
namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Factory\TransactionCurrencyFactory;
|
||||||
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class StoreRequest
|
* Class StoreRequest
|
||||||
@@ -49,6 +55,9 @@ class StoreRequest extends FormRequest
|
|||||||
'currency_id' => $this->convertInteger('currency_id'),
|
'currency_id' => $this->convertInteger('currency_id'),
|
||||||
'currency_code' => $this->convertString('currency_code'),
|
'currency_code' => $this->convertString('currency_code'),
|
||||||
'notes' => $this->stringWithNewlines('notes'),
|
'notes' => $this->stringWithNewlines('notes'),
|
||||||
|
|
||||||
|
// for webhooks:
|
||||||
|
'fire_webhooks' => $this->boolean('fire_webhooks', true),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,12 +67,59 @@ class StoreRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => 'required|before:end|date',
|
'start' => 'required|before:end|date',
|
||||||
'end' => 'required|after:start|date',
|
'end' => 'required|after:start|date',
|
||||||
'amount' => ['required', new IsValidPositiveAmount()],
|
'amount' => ['required', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'notes' => 'nullable|min:0|max:32768',
|
'notes' => 'nullable|min:0|max:32768',
|
||||||
|
|
||||||
|
// webhooks
|
||||||
|
'fire_webhooks' => [new IsBoolean()],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the validator instance.
|
||||||
|
*/
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$budget = $this->route()->parameter('budget');
|
||||||
|
$validator->after(
|
||||||
|
static function (Validator $validator) use ($budget): void {
|
||||||
|
if (0 !== count($validator->failed())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$data = $validator->getData();
|
||||||
|
|
||||||
|
// if no currency has been provided, use the user's default currency:
|
||||||
|
/** @var TransactionCurrencyFactory $factory */
|
||||||
|
$factory = app(TransactionCurrencyFactory::class);
|
||||||
|
$currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null);
|
||||||
|
if (null === $currency) {
|
||||||
|
$currency = Amount::getPrimaryCurrency();
|
||||||
|
}
|
||||||
|
$currency->enabled = true;
|
||||||
|
$currency->save();
|
||||||
|
|
||||||
|
// validator already concluded start and end are valid dates:
|
||||||
|
$start = Carbon::parse($data['start'], config('app.timezone'));
|
||||||
|
$end = Carbon::parse($data['end'], config('app.timezone'));
|
||||||
|
|
||||||
|
// find limit with same date range and currency.
|
||||||
|
$limit = $budget->budgetlimits()
|
||||||
|
->where('budget_limits.start_date', $start->format('Y-m-d'))
|
||||||
|
->where('budget_limits.end_date', $end->format('Y-m-d'))
|
||||||
|
->where('budget_limits.transaction_currency_id', $currency->id)
|
||||||
|
->first(['budget_limits.*'])
|
||||||
|
;
|
||||||
|
if (null !== $limit) {
|
||||||
|
$validator->errors()->add('start', trans('validation.limit_exists'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if ($validator->fails()) {
|
||||||
|
Log::channel('audit')->error(sprintf('Validation errors in %s', self::class), $validator->errors()->toArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,8 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit;
|
namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
@@ -46,12 +47,15 @@ class UpdateRequest extends FormRequest
|
|||||||
public function getAll(): array
|
public function getAll(): array
|
||||||
{
|
{
|
||||||
$fields = [
|
$fields = [
|
||||||
'start' => ['start', 'date'],
|
'start' => ['start', 'date'],
|
||||||
'end' => ['end', 'date'],
|
'end' => ['end', 'date'],
|
||||||
'amount' => ['amount', 'convertString'],
|
'amount' => ['amount', 'convertString'],
|
||||||
'currency_id' => ['currency_id', 'convertInteger'],
|
'currency_id' => ['currency_id', 'convertInteger'],
|
||||||
'currency_code' => ['currency_code', 'convertString'],
|
'currency_code' => ['currency_code', 'convertString'],
|
||||||
'notes' => ['notes', 'stringWithNewlines'],
|
'notes' => ['notes', 'stringWithNewlines'],
|
||||||
|
|
||||||
|
// webhooks
|
||||||
|
'fire_webhooks' => ['fire_webhooks', 'boolean'],
|
||||||
];
|
];
|
||||||
if (false === $this->has('notes')) {
|
if (false === $this->has('notes')) {
|
||||||
// ignore notes, not submitted.
|
// ignore notes, not submitted.
|
||||||
@@ -67,12 +71,15 @@ class UpdateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'start' => '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',
|
'end' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'amount' => ['nullable', new IsValidPositiveAmount()],
|
'amount' => ['nullable', new IsValidPositiveAmount()],
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'notes' => 'nullable|min:0|max:32768',
|
'notes' => 'nullable|min:0|max:32768',
|
||||||
|
|
||||||
|
// webhooks
|
||||||
|
'fire_webhooks' => [new IsBoolean()],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,7 +45,7 @@ class DestroyRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
// 'date' => 'required|date|after:1970-01-02|before:2038-01-17',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StoreRequest.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Carbon\Exceptions\InvalidFormatException;
|
||||||
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class StoreByCurrenciesRequest extends FormRequest
|
||||||
|
{
|
||||||
|
use ChecksLogin;
|
||||||
|
use ConvertsDataTypes;
|
||||||
|
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
return $this->all();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The rules that the incoming request must be matched against.
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'*' => 'required|numeric|min:0.0000000001',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$validator->after(
|
||||||
|
static function (Validator $validator): void {
|
||||||
|
$data = $validator->getData();
|
||||||
|
foreach ($data as $date => $rate) {
|
||||||
|
try {
|
||||||
|
Carbon::createFromFormat('Y-m-d', $date);
|
||||||
|
} catch (InvalidFormatException) {
|
||||||
|
$validator->errors()->add('date', trans('validation.date', ['attribute' => 'date']));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!is_numeric($rate)) {
|
||||||
|
$validator->errors()->add('rate', trans('validation.number', ['attribute' => 'rate']));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,99 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StoreRequest.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class StoreByDateRequest extends FormRequest
|
||||||
|
{
|
||||||
|
use ChecksLogin;
|
||||||
|
use ConvertsDataTypes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'from' => $this->get('from'),
|
||||||
|
'rates' => $this->get('rates', []),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFromCurrency(): TransactionCurrency
|
||||||
|
{
|
||||||
|
return Amount::getTransactionCurrencyByCode((string)$this->get('from'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$from = $this->getFromCurrency();
|
||||||
|
|
||||||
|
$validator->after(
|
||||||
|
static function (Validator $validator) use ($from): void {
|
||||||
|
$data = $validator->getData();
|
||||||
|
$rates = $data['rates'] ?? [];
|
||||||
|
if (0 === count($rates)) {
|
||||||
|
$validator->errors()->add('rates', 'No rates given.');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach ($rates as $key => $entry) {
|
||||||
|
if ($key === $from->code) {
|
||||||
|
$validator->errors()->add(sprintf('rates.%s', $key), trans('validation.convert_to_itself', ['code' => $key]));
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Amount::getTransactionCurrencyByCode((string)$key);
|
||||||
|
} catch (FireflyException) {
|
||||||
|
$validator->errors()->add(sprintf('rates.%s', $key), trans('validation.invalid_currency_code', ['code' => $key]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
@@ -42,7 +43,7 @@ class StoreRequest extends FormRequest
|
|||||||
|
|
||||||
public function getFromCurrency(): TransactionCurrency
|
public function getFromCurrency(): TransactionCurrency
|
||||||
{
|
{
|
||||||
return TransactionCurrency::where('code', $this->get('from'))->first();
|
return Amount::getTransactionCurrencyByCode((string) $this->get('from'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRate(): string
|
public function getRate(): string
|
||||||
@@ -52,7 +53,7 @@ class StoreRequest extends FormRequest
|
|||||||
|
|
||||||
public function getToCurrency(): TransactionCurrency
|
public function getToCurrency(): TransactionCurrency
|
||||||
{
|
{
|
||||||
return TransactionCurrency::where('code', $this->get('to'))->first();
|
return Amount::getTransactionCurrencyByCode((string) $this->get('to'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -52,6 +52,8 @@ class UpdateRequest extends FormRequest
|
|||||||
return [
|
return [
|
||||||
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
'date' => 'date|after:1970-01-02|before:2038-01-17',
|
||||||
'rate' => 'required|numeric|gt:0',
|
'rate' => 'required|numeric|gt:0',
|
||||||
|
'from' => 'nullable|exists:transaction_currencies,code',
|
||||||
|
'to' => 'nullable|exists:transaction_currencies,code',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,8 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\PiggyBank;
|
namespace FireflyIII\Api\V1\Requests\Models\PiggyBank;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
|
use FireflyIII\Rules\IsValidZeroOrMoreAmount;
|
||||||
@@ -78,7 +79,7 @@ class StoreRequest extends FormRequest
|
|||||||
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
|
'object_group_id' => 'numeric|belongsToUser:object_groups,id',
|
||||||
'object_group_title' => ['min:1', 'max:255'],
|
'object_group_title' => ['min:1', 'max:255'],
|
||||||
'target_amount' => ['required', new IsValidZeroOrMoreAmount()],
|
'target_amount' => ['required', new IsValidZeroOrMoreAmount()],
|
||||||
'start_date' => 'date|nullable',
|
'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_id' => 'exists:transaction_currencies,id|required_without:transaction_currency_code',
|
||||||
'transaction_currency_code' => 'exists:transaction_currencies,code|required_without:transaction_currency_id',
|
'transaction_currency_code' => 'exists:transaction_currencies,code|required_without:transaction_currency_id',
|
||||||
'target_date' => 'date|nullable|after:start_date',
|
'target_date' => 'date|nullable|after:start_date',
|
||||||
@@ -96,7 +97,7 @@ class StoreRequest extends FormRequest
|
|||||||
// validate start before end only if both are there.
|
// validate start before end only if both are there.
|
||||||
$data = $validator->getData();
|
$data = $validator->getData();
|
||||||
$currency = $this->getCurrencyFromData($validator, $data);
|
$currency = $this->getCurrencyFromData($validator, $data);
|
||||||
if (null === $currency) {
|
if (!$currency instanceof TransactionCurrency) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$targetAmount = (string) ($data['target_amount'] ?? '0');
|
$targetAmount = (string) ($data['target_amount'] ?? '0');
|
||||||
@@ -135,16 +136,10 @@ class StoreRequest extends FormRequest
|
|||||||
private function getCurrencyFromData(Validator $validator, array $data): ?TransactionCurrency
|
private function getCurrencyFromData(Validator $validator, array $data): ?TransactionCurrency
|
||||||
{
|
{
|
||||||
if (array_key_exists('transaction_currency_code', $data) && '' !== (string) $data['transaction_currency_code']) {
|
if (array_key_exists('transaction_currency_code', $data) && '' !== (string) $data['transaction_currency_code']) {
|
||||||
$currency = TransactionCurrency::whereCode($data['transaction_currency_code'])->first();
|
return Amount::getTransactionCurrencyByCode((string) $data['transaction_currency_code']);
|
||||||
if (null !== $currency) {
|
|
||||||
return $currency;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (array_key_exists('transaction_currency_id', $data) && '' !== (string) $data['transaction_currency_id']) {
|
if (array_key_exists('transaction_currency_id', $data) && '' !== (string) $data['transaction_currency_id']) {
|
||||||
$currency = TransactionCurrency::find((int) $data['transaction_currency_id']);
|
return Amount::getTransactionCurrencyById((int) $data['transaction_currency_id']);
|
||||||
if (null !== $currency) {
|
|
||||||
return $currency;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$validator->errors()->add('transaction_currency_id', trans('validation.require_currency_id_code'));
|
$validator->errors()->add('transaction_currency_id', trans('validation.require_currency_id_code'));
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Recurrence;
|
namespace FireflyIII\Api\V1\Requests\Models\Recurrence;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Rules\BelongsUser;
|
use FireflyIII\Rules\BelongsUser;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidPositiveAmount;
|
use FireflyIII\Rules\IsValidPositiveAmount;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Recurrence;
|
namespace FireflyIII\Api\V1\Requests\Models\Recurrence;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Rules\BelongsUser;
|
use FireflyIII\Rules\BelongsUser;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Rule;
|
namespace FireflyIII\Api\V1\Requests\Models\Rule;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidActionExpression;
|
use FireflyIII\Rules\IsValidActionExpression;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Rule;
|
namespace FireflyIII\Api\V1\Requests\Models\Rule;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Models\Rule;
|
use FireflyIII\Models\Rule;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
use FireflyIII\Rules\IsValidActionExpression;
|
use FireflyIII\Rules\IsValidActionExpression;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Models\Location;
|
use FireflyIII\Models\Location;
|
||||||
use FireflyIII\Rules\BelongsUser;
|
use FireflyIII\Rules\BelongsUser;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
@@ -183,6 +183,7 @@ class StoreRequest extends FormRequest
|
|||||||
// basic fields for group:
|
// basic fields for group:
|
||||||
'group_title' => 'min:1|max:1000|nullable',
|
'group_title' => 'min:1|max:1000|nullable',
|
||||||
'error_if_duplicate_hash' => [new IsBoolean()],
|
'error_if_duplicate_hash' => [new IsBoolean()],
|
||||||
|
'fire_webhooks' => [new IsBoolean()],
|
||||||
'apply_rules' => [new IsBoolean()],
|
'apply_rules' => [new IsBoolean()],
|
||||||
|
|
||||||
// location rules
|
// location rules
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
use FireflyIII\Rules\BelongsUser;
|
use FireflyIII\Rules\BelongsUser;
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\TransactionLink;
|
namespace FireflyIII\Api\V1\Requests\Models\TransactionLink;
|
||||||
|
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
|
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
|
||||||
use FireflyIII\Support\Request\ChecksLogin;
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user