mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-19 10:53:37 +00:00
Compare commits
776 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
67d29b8416 | ||
|
f62e93b487 | ||
|
a7cc70b975 | ||
|
60f0d8074a | ||
|
ed1fdf9382 | ||
|
9ea3c4224e | ||
|
71325de44e | ||
|
cdb041e647 | ||
|
b9d750bf59 | ||
|
461249737e | ||
|
1aeaa8b77d | ||
|
a59d7ccdc2 | ||
|
2c1ca428db | ||
|
224970f3bd | ||
|
742d934ddb | ||
|
1699513023 | ||
|
488a8a7e86 | ||
|
dd571d6221 | ||
|
4cc5128b4c | ||
|
2636a6557a | ||
|
0bf97ccf22 | ||
|
592fc71b4e | ||
|
0e7712d3b8 | ||
|
80f21d2a4f | ||
|
5513ec068e | ||
|
14a46a6197 | ||
|
b93ee5efd8 | ||
|
cdd4dc6065 | ||
|
0d8b2ae799 | ||
|
77dc79b638 | ||
|
f48723db40 | ||
|
ebf91078c5 | ||
|
90d0d85dd6 | ||
|
0c5b4f7f64 | ||
|
9c4bb08ed1 | ||
|
1d3bbde4b0 | ||
|
b6faee033d | ||
|
05e0f88d11 | ||
|
ae9a151140 | ||
|
da633e3c62 | ||
|
8cb384d3cf | ||
|
de2a34c3ec | ||
|
b7c65446a8 | ||
|
bc648b187c | ||
|
4de0828b5d | ||
|
b2364d26ec | ||
|
83d94cb792 | ||
|
66cc3f48bc | ||
|
63297c43b7 | ||
|
5b0637558f | ||
|
e9a8e104be | ||
|
0f524e7800 | ||
|
969e0bccc9 | ||
|
ba3e026927 | ||
|
0c6868d477 | ||
|
7f70cf47ec | ||
|
fa4492287d | ||
|
60809c688e | ||
|
2404f5299c | ||
|
21a394eaf5 | ||
|
419d7846c9 | ||
|
0827accc39 | ||
|
2e53f7d0b7 | ||
|
bdfcf8ec95 | ||
|
6a20170e00 | ||
|
0c974f1ff7 | ||
|
9c098d45c5 | ||
|
cfdf9aa8dc | ||
|
2ea74542e6 | ||
|
7fcaa2b5fb | ||
|
e9e905e495 | ||
|
f67ff98d78 | ||
|
e3c4dde4ff | ||
|
9787561000 | ||
|
cd041b4c75 | ||
|
60ee70c926 | ||
|
00de78b6f1 | ||
|
33a841b831 | ||
|
df66dcf102 | ||
|
086a7a0b1e | ||
|
ec0ba3d212 | ||
|
b0ab06b7eb | ||
|
965acd6d45 | ||
|
4d156870ef | ||
|
499720df46 | ||
|
610bc108e7 | ||
|
53f1b0218c | ||
|
0a7a099796 | ||
|
ed90ebc896 | ||
|
87fe518d45 | ||
|
5cb0891a27 | ||
|
b4bd66bd58 | ||
|
64d95fe845 | ||
|
a2d6d7a92c | ||
|
1d8a784586 | ||
|
3c8bfae8ff | ||
|
f65eccfe4c | ||
|
7ce6dc9f16 | ||
|
4a73caf4c3 | ||
|
1b9d8dd3c3 | ||
|
b11bfb0aae | ||
|
024e16bf4b | ||
|
daf753d76e | ||
|
4c90f66578 | ||
|
db94f18d46 | ||
|
a9bd0f551d | ||
|
e1ba2d9ad9 | ||
|
939c636a74 | ||
|
2b829cb645 | ||
|
4bbc898639 | ||
|
27d07d5807 | ||
|
f010ffefc1 | ||
|
fc0fee161e | ||
|
72c99d3834 | ||
|
a2984f299b | ||
|
3925077223 | ||
|
deb51bd8de | ||
|
03f39f53d8 | ||
|
e72314778c | ||
|
ced3e9387a | ||
|
02c906afe6 | ||
|
7a2d4c9bd2 | ||
|
dffddfda18 | ||
|
9bb62c865a | ||
|
a97ebf2b97 | ||
|
9a62a6c514 | ||
|
04dc162270 | ||
|
75d5a50328 | ||
|
eadb7d5dcb | ||
|
8dc07f1148 | ||
|
217ce85a9b | ||
|
ef88b25dbd | ||
|
4c2e2a3a5a | ||
|
1e8e1c6e51 | ||
|
a92944786c | ||
|
8ce760a0bf | ||
|
8d8e047d2c | ||
|
06a923db94 | ||
|
551408b801 | ||
|
e1915e365a | ||
|
e8c4eec536 | ||
|
e3f4e75561 | ||
|
fd640f9698 | ||
|
ffd8aef35f | ||
|
46412bdc66 | ||
|
d73c3476c8 | ||
|
ff737ae05e | ||
|
171ec0c630 | ||
|
b4a6c6fcbe | ||
|
4886084296 | ||
|
1a3dfbdef6 | ||
|
0c087f33c2 | ||
|
5f9f621fa6 | ||
|
cd3de7b545 | ||
|
8aeb513d54 | ||
|
bfc5c5d154 | ||
|
7c9f7f04b7 | ||
|
3352c2cf3c | ||
|
e61a433999 | ||
|
3517452ea1 | ||
|
8a1190b9ee | ||
|
fc78c9a1d6 | ||
|
8d55f7f2e5 | ||
|
8162b22d43 | ||
|
8504d55f17 | ||
|
75ae1bbde1 | ||
|
a20668e91b | ||
|
eb559bbb03 | ||
|
2eae96a895 | ||
|
4bbf35bca4 | ||
|
f1b5e45488 | ||
|
57ed1581ec | ||
|
c668381ab0 | ||
|
44f99991fc | ||
|
696c76102b | ||
|
fe4e00dc5c | ||
|
1a1b0ee27d | ||
|
298c4ec654 | ||
|
c6e3fa2cc6 | ||
|
61484dcfee | ||
|
99009cff88 | ||
|
673f68b07c | ||
|
d1232192ce | ||
|
b2084a94e5 | ||
|
ddcb246955 | ||
|
8796168580 | ||
|
dde7bcfc4c | ||
|
a6503fda39 | ||
|
455e311661 | ||
|
a4a919d7b7 | ||
|
a90ce3c944 | ||
|
a6d179b883 | ||
|
1b29e5e628 | ||
|
e8fd496bca | ||
|
3d61e27a47 | ||
|
f9a55ce3d8 | ||
|
c432757942 | ||
|
da740ccbef | ||
|
f1173263b6 | ||
|
68da1a7039 | ||
|
64414edf58 | ||
|
6b136d2c8c | ||
|
752a877b91 | ||
|
d11c36e476 | ||
|
b13232f06b | ||
|
cf6ed5af32 | ||
|
be531d777e | ||
|
190508fa54 | ||
|
2c2dddc071 | ||
|
c60858de5c | ||
|
6ab332e4fb | ||
|
9df43cc710 | ||
|
79d1b15d86 | ||
|
923debb299 | ||
|
f5fef8c036 | ||
|
982134c077 | ||
|
07aeb6cd20 | ||
|
30cca355ba | ||
|
d17cc15037 | ||
|
efade857bb | ||
|
15ac6a1195 | ||
|
a45a050e7d | ||
|
e435ff8b1c | ||
|
788dae1477 | ||
|
2bb4cc7954 | ||
|
ecead8a27b | ||
|
4a2681df14 | ||
|
5761d82635 | ||
|
36fce9db4e | ||
|
1227574bc1 | ||
|
47c2a66e1d | ||
|
c59e52bbbf | ||
|
81961fd632 | ||
|
b557805eeb | ||
|
e58da3c41d | ||
|
f43b539470 | ||
|
ab3dbf9218 | ||
|
d943a5ae9b | ||
|
449058dad7 | ||
|
b9cf8b3ef2 | ||
|
27037c2fbb | ||
|
10646099a0 | ||
|
43ad63fac6 | ||
|
221c59437c | ||
|
1a94ec5bbe | ||
|
f57c554c56 | ||
|
334aec58a4 | ||
|
7035da4d75 | ||
|
29a40ce8dd | ||
|
c6c98c4df5 | ||
|
277d7e6650 | ||
|
130c539006 | ||
|
2bdb2e12f0 | ||
|
25779206a1 | ||
|
92f72a5ad7 | ||
|
4e041248ac | ||
|
8cc5aa8aba | ||
|
4ba712b24e | ||
|
7af9169763 | ||
|
775504acb6 | ||
|
7840e37e1a | ||
|
720fff4595 | ||
|
551c1f4cda | ||
|
7f0db0de04 | ||
|
6ac3cc384b | ||
|
563879c218 | ||
|
dbb7ed3d5d | ||
|
4e3c2ba72c | ||
|
8e911491f6 | ||
|
03c5f3cc2d | ||
|
484565d600 | ||
|
163a979227 | ||
|
ed105fee1d | ||
|
3b82cfa486 | ||
|
834e52eb2e | ||
|
7eb938fe23 | ||
|
8db7a4c47d | ||
|
b055a5d6af | ||
|
ad0a1b9a24 | ||
|
05d190659a | ||
|
9c6eaffba6 | ||
|
3ee5e9aa04 | ||
|
93a544fe53 | ||
|
3bc98bee20 | ||
|
f6302bc29b | ||
|
43aa1704a9 | ||
|
14fe82e361 | ||
|
33317c15a2 | ||
|
ff1b56c5ef | ||
|
25e2063d70 | ||
|
1d36c74934 | ||
|
aebe7908f0 | ||
|
3e2b881296 | ||
|
c670a6991d | ||
|
f76a7d59e0 | ||
|
3d8bf3ec9b | ||
|
55e4479454 | ||
|
436fe9fea4 | ||
|
63a7a4b03b | ||
|
0cab974048 | ||
|
5fdcf37d06 | ||
|
4663fb2f12 | ||
|
e844ab592d | ||
|
3dcb35710b | ||
|
8d87abde64 | ||
|
2b78485a61 | ||
|
9d057b853f | ||
|
bd269eaadf | ||
|
7096c65f50 | ||
|
1462b0de69 | ||
|
86a1f170c4 | ||
|
40389fb6d5 | ||
|
36021d84cf | ||
|
1278f92355 | ||
|
573f9adb49 | ||
|
431c99c27b | ||
|
77cc558931 | ||
|
42043de34f | ||
|
f2b2c2109f | ||
|
7fe29ad983 | ||
|
07d9bcfb9d | ||
|
fdd235e4cb | ||
|
2646acadb8 | ||
|
5ef646b810 | ||
|
e8bdb5ef38 | ||
|
7a851c2cc6 | ||
|
624784e54e | ||
|
20eb2ebe58 | ||
|
25f8acb417 | ||
|
f75e6430b1 | ||
|
e72a483c49 | ||
|
68934858ce | ||
|
c08b5177d9 | ||
|
fe8635f1ce | ||
|
e96d28b981 | ||
|
784cc3d52d | ||
|
2ab3fb3a71 | ||
|
ff765d4687 | ||
|
f6e778e1d4 | ||
|
ed36604050 | ||
|
cbf8c6e80d | ||
|
f11db0de61 | ||
|
34f16dcdd5 | ||
|
f18aae39b8 | ||
|
924171e7b9 | ||
|
6b580212bf | ||
|
208ae1cae7 | ||
|
3aa7fe47de | ||
|
5318082467 | ||
|
941ec095e5 | ||
|
d5ebd8e57c | ||
|
ebe087984d | ||
|
fa993e02dd | ||
|
44df77f45a | ||
|
0f8f95de9a | ||
|
f32283d2f1 | ||
|
14f8695599 | ||
|
f8b48f7455 | ||
|
70e2aab073 | ||
|
12db745f17 | ||
|
8a48cc690f | ||
|
eb313c65a5 | ||
|
07d6cbc194 | ||
|
8975a462c4 | ||
|
2e4f07d058 | ||
|
74a2935fea | ||
|
3d02468828 | ||
|
0438fb5a2e | ||
|
a4f9a6fd42 | ||
|
a0be4c9daa | ||
|
2dc003bd85 | ||
|
78aa8bd838 | ||
|
f55fde2b52 | ||
|
232572549e | ||
|
d07705c329 | ||
|
688ca8e374 | ||
|
160c364d2a | ||
|
2b3e6bfbb9 | ||
|
5a55d1db24 | ||
|
bd252dbc16 | ||
|
30124855e3 | ||
|
463ebd296f | ||
|
2e7a17560d | ||
|
374d5a074d | ||
|
88b294d873 | ||
|
0aa6d5b322 | ||
|
1357074dcd | ||
|
4a03847c14 | ||
|
346289fdb2 | ||
|
673c7d98f6 | ||
|
9473fb849a | ||
|
f60e244739 | ||
|
a571106f0f | ||
|
244d9be46e | ||
|
dcf71c6fdf | ||
|
1e1497ff4e | ||
|
b72aa92e55 | ||
|
527f18c1e3 | ||
|
788003dcdc | ||
|
c764ddd3be | ||
|
057ac0691c | ||
|
4334e9bed7 | ||
|
a9bb87b0c6 | ||
|
43f668dc65 | ||
|
6ed5892cf9 | ||
|
023a3fdade | ||
|
1b52147a05 | ||
|
7f7644c92f | ||
|
70b756baaf | ||
|
0f008b9b1e | ||
|
4d956858de | ||
|
959370a204 | ||
|
336829cd24 | ||
|
5975ab5170 | ||
|
eba0e942e8 | ||
|
f45c20db1e | ||
|
79afe09d8d | ||
|
334d010a24 | ||
|
91947daa5b | ||
|
aad2ca4488 | ||
|
7c68a96f7b | ||
|
2e1e8b5d39 | ||
|
178df1ed4a | ||
|
28749e2513 | ||
|
6cbe57ef40 | ||
|
13d3b86309 | ||
|
cf8f43cdf2 | ||
|
cc83268b2c | ||
|
8f23b47a78 | ||
|
529611170c | ||
|
c1114e889e | ||
|
d20e03a7b6 | ||
|
6303233bdf | ||
|
baa8c00144 | ||
|
e6daaa5b6d | ||
|
f711fcfd52 | ||
|
74992e95f2 | ||
|
20c8c1043f | ||
|
f00898afba | ||
|
95b431535e | ||
|
cafd8a9674 | ||
|
e1e7f914f9 | ||
|
19c2f7d2bf | ||
|
7daacd9b66 | ||
|
af715de566 | ||
|
93e3c89f20 | ||
|
b0456c5252 | ||
|
f7fa03ddd8 | ||
|
4c78e23a9c | ||
|
79c2065471 | ||
|
c19b89ac93 | ||
|
62a1837d61 | ||
|
56b34aa624 | ||
|
e8392155f9 | ||
|
6d532470e6 | ||
|
15f683ef7e | ||
|
18ba2e563e | ||
|
63984f1c37 | ||
|
3c082dcf0e | ||
|
090eb55226 | ||
|
4706cd44de | ||
|
cf7c01e5d0 | ||
|
0b5e0a268a | ||
|
9eea4497e5 | ||
|
63fdc2487f | ||
|
cf59da7e0c | ||
|
e0621affb6 | ||
|
6d0906c37b | ||
|
a3ede0c6f6 | ||
|
72eab3c0eb | ||
|
c530961546 | ||
|
dd7aba0b51 | ||
|
7c54e17a30 | ||
|
342d72b0a6 | ||
|
22ee504e52 | ||
|
4880ee850e | ||
|
b45ce27817 | ||
|
dfad93d9ec | ||
|
52712c8cb2 | ||
|
740874e654 | ||
|
0f1f37a5df | ||
|
d609cbfb16 | ||
|
2375857c92 | ||
|
10275eb832 | ||
|
108867b2ef | ||
|
e5a77a86f9 | ||
|
309d3e8e95 | ||
|
1ef9b83180 | ||
|
85757e1a20 | ||
|
e2a18e0e7c | ||
|
056af8fd8a | ||
|
c72a63f218 | ||
|
fb823ed422 | ||
|
3fae6c0cac | ||
|
55b1e22d37 | ||
|
e6b95c7894 | ||
|
ea2f9e4919 | ||
|
08bd405e29 | ||
|
8294b2d526 | ||
|
b521fb8fae | ||
|
3e9789d5e6 | ||
|
13b029d7f0 | ||
|
59427ba5c2 | ||
|
46bba9d799 | ||
|
0ef1d1834f | ||
|
e39b2f5355 | ||
|
03dae53714 | ||
|
6be6187532 | ||
|
4c26f613ee | ||
|
765de2eeba | ||
|
49b1fef7ff | ||
|
36157afc6a | ||
|
c5c3638dbc | ||
|
926665a8f5 | ||
|
e35743ff42 | ||
|
321743dbf6 | ||
|
c2e1e25489 | ||
|
222387adba | ||
|
335414f25a | ||
|
ea903c105d | ||
|
aab29852b4 | ||
|
aa17ea0b68 | ||
|
deeb5bf118 | ||
|
47d5e8d169 | ||
|
033d61abbb | ||
|
28efc15820 | ||
|
1c7988fad2 | ||
|
c8077762ba | ||
|
ea53b34cbb | ||
|
270ac87e65 | ||
|
0a60f63bf8 | ||
|
38ed70243e | ||
|
0f2a9a9b37 | ||
|
ec525849fc | ||
|
dee1e1a79d | ||
|
98b5ed9e5b | ||
|
d8eb084240 | ||
|
c2f5fbe7d3 | ||
|
60f6542a1b | ||
|
93c2edf76c | ||
|
f74f4c5719 | ||
|
8c67c347e1 | ||
|
fcbc341f03 | ||
|
2dbce10483 | ||
|
8504b3e3a9 | ||
|
d4ab5dcefd | ||
|
5d11e285bc | ||
|
259e1350d5 | ||
|
dd54ec6122 | ||
|
c2b3791336 | ||
|
fc1f15cc14 | ||
|
5d74979f50 | ||
|
5dea7e5b41 | ||
|
a53a8a8529 | ||
|
aac7a2691d | ||
|
10e7be1729 | ||
|
9b1319f970 | ||
|
a38f909919 | ||
|
d8c0192f54 | ||
|
1e8d294b8d | ||
|
d3be64114b | ||
|
1bddd4da8e | ||
|
6b5ff2680b | ||
|
efe17f638a | ||
|
3c1f4b7377 | ||
|
acfc214eb1 | ||
|
fe1c605c11 | ||
|
891cd94031 | ||
|
c620d57f42 | ||
|
b076c92eb0 | ||
|
9e35216e98 | ||
|
3fa4734ba7 | ||
|
0144d09325 | ||
|
f28274aded | ||
|
d5f5df82b6 | ||
|
49c27aff2d | ||
|
7b1b0cfef9 | ||
|
f728bdeb5a | ||
|
4712a826d1 | ||
|
d7335d71ea | ||
|
e6a84ab387 | ||
|
fd5269490d | ||
|
05e307136c | ||
|
2c41215e84 | ||
|
d9dc394e7f | ||
|
a63daf6166 | ||
|
f878af0d3b | ||
|
def0578421 | ||
|
a2e07b1518 | ||
|
dc26ce308d | ||
|
0189b91d3b | ||
|
fb6706648e | ||
|
3c20fd7533 | ||
|
82f89ef614 | ||
|
4d10ae91b7 | ||
|
aebb677c21 | ||
|
abf9c65b21 | ||
|
524dcc7d97 | ||
|
0a4f6fd6b8 | ||
|
9c4beab0a7 | ||
|
b91e019416 | ||
|
ad97e33ec0 | ||
|
b1479b5dae | ||
|
f1445b0132 | ||
|
456dbfd29d | ||
|
0eea776b8b | ||
|
853a97307b | ||
|
3b28b5d07a | ||
|
a7bfa503d9 | ||
|
a7c3d32370 | ||
|
c64ddbec1f | ||
|
6535f86001 | ||
|
531abc9f3d | ||
|
f7a02bdc2a | ||
|
af38f31147 | ||
|
4b4b5ef319 | ||
|
88fd76f0f1 | ||
|
3d1d064720 | ||
|
9ca8161588 | ||
|
5eb2b2fc5e | ||
|
d991df89c8 | ||
|
49339ea9b0 | ||
|
561359b14f | ||
|
79a4eec96e | ||
|
dd11f98be7 | ||
|
40e2bf7cac | ||
|
73e3a11be9 | ||
|
a180c37c58 | ||
|
aff802713e | ||
|
ebc7fad1fa | ||
|
5068fc76c1 | ||
|
70b6e39cd7 | ||
|
31fc915b51 | ||
|
dfed56ed1b | ||
|
7f6d2877fb | ||
|
d9315dcbfe | ||
|
6fbf4ec6f1 | ||
|
2e32acc3c9 | ||
|
328216534b | ||
|
dea6e2c83f | ||
|
31f4f08e54 | ||
|
c4f2519b6f | ||
|
0359a98681 | ||
|
c69b24c1d2 | ||
|
d50c560ed2 | ||
|
21ffd70523 | ||
|
664e9fe8da | ||
|
c948490eb6 | ||
|
5b3bcc7611 | ||
|
c7d9ca9a61 | ||
|
259bad4487 | ||
|
73d3a82519 | ||
|
6f4ca53907 | ||
|
5111aaa123 | ||
|
c903b82b7b | ||
|
ed00d97ff9 | ||
|
9939ed0aaf | ||
|
8ea32714f6 | ||
|
f9fb77690b | ||
|
98b28c75b7 | ||
|
405be07ba8 | ||
|
5a84e222fd | ||
|
36b0cf04ba | ||
|
70c11d6634 | ||
|
eebfb0cb40 | ||
|
2500cc55e2 | ||
|
c3b99c322d | ||
|
976128a435 | ||
|
3be55adaeb | ||
|
141a828947 | ||
|
0386d5e09f | ||
|
17d308cfde | ||
|
c540e3ff71 | ||
|
8641cbd619 | ||
|
70f76cd538 | ||
|
420a765295 | ||
|
c926d85c8b | ||
|
7668a854f7 | ||
|
c30e1c1973 | ||
|
bd556f1934 | ||
|
9530e928d5 | ||
|
ae367aa736 | ||
|
3ccff2969b | ||
|
530abb1da6 | ||
|
9fe70fb8d8 | ||
|
b0215a23fb | ||
|
48735b1a5b | ||
|
3c0b802667 | ||
|
9bfad07f8c | ||
|
5c91da80e1 | ||
|
e465c93ffc | ||
|
8e56fa4ef8 | ||
|
f56de6e719 | ||
|
86ba1d151a | ||
|
8d24db14e9 | ||
|
cead122d96 | ||
|
b7dd335fb7 | ||
|
20a7092fe3 | ||
|
1d3da33e1d | ||
|
e36675e232 | ||
|
aa8588758a | ||
|
47a58738d4 | ||
|
e0a31d29a4 | ||
|
45369868ad | ||
|
639c51d651 | ||
|
3d424972cc | ||
|
96fd4da6d8 | ||
|
a97a0d461d | ||
|
8d3170785e | ||
|
ae373a15c5 | ||
|
1f342ed592 | ||
|
3e04f14665 | ||
|
dbf83df363 | ||
|
15bfc0d6fa | ||
|
f3fc1d8382 | ||
|
07cb7dd06e | ||
|
38624442d1 | ||
|
258dfb3d11 | ||
|
51ddfcdaaa | ||
|
2a0acdbb27 | ||
|
99bd28f21e | ||
|
643ae91bb5 | ||
|
591e3ab3ec | ||
|
edd7aed691 | ||
|
2e89586559 | ||
|
173f593a7e | ||
|
d4839c8818 | ||
|
a122dba0ad | ||
|
ae813a536e | ||
|
b9d174238b | ||
|
fbf5adbe79 | ||
|
c676a65f93 | ||
|
5ab8fbddcb | ||
|
b942fa4b09 | ||
|
8ee358551c | ||
|
a5f3b4533b | ||
|
e258efe1bf | ||
|
f9a213e06f | ||
|
05bd732e7c | ||
|
70050678c5 | ||
|
6a649f2f42 | ||
|
6912e05677 | ||
|
c78fa8eaea | ||
|
5a06e3523b | ||
|
b34cb0428b | ||
|
ce3c866168 | ||
|
4ada2f3e3c | ||
|
ad739c1d84 | ||
|
60af2c4232 | ||
|
cc69f50106 | ||
|
0f57094b17 | ||
|
dad738ae42 | ||
|
3df05eb63c | ||
|
57b83dd239 | ||
|
1539dcffd5 | ||
|
b4a09efb8b | ||
|
e82b372f75 | ||
|
83a89181bc | ||
|
b1e08b1084 | ||
|
0eb582ab3b | ||
|
07b58b4200 | ||
|
8807f04599 | ||
|
4657d34ae4 | ||
|
79951453cd | ||
|
5291f485ac | ||
|
ed75d84376 | ||
|
a7011376cb | ||
|
6c4bd84b66 | ||
|
c4418857e6 | ||
|
5d316ea26a | ||
|
4a0887c978 | ||
|
dbfceafb02 | ||
|
4db73285b7 | ||
|
876ea8bb07 | ||
|
e0e90845e7 | ||
|
f1223a5a3f |
@@ -301,7 +301,6 @@ PUSHER_ID=
|
|||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
USE_ENCRYPTION=false
|
USE_ENCRYPTION=false
|
||||||
IS_HEROKU=false
|
|
||||||
FIREFLY_III_LAYOUT=v1
|
FIREFLY_III_LAYOUT=v1
|
||||||
|
|
||||||
#
|
#
|
||||||
|
1
.ci/php-cs-fixer/.gitignore
vendored
1
.ci/php-cs-fixer/.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
vendor
|
vendor
|
||||||
|
.php-cs-fixer.cache
|
||||||
|
@@ -37,8 +37,8 @@ $finder = PhpCsFixer\Finder::create()
|
|||||||
$config = new PhpCsFixer\Config();
|
$config = new PhpCsFixer\Config();
|
||||||
return $config->setRules([
|
return $config->setRules([
|
||||||
'@PSR12' => true,
|
'@PSR12' => true,
|
||||||
|
'declare_strict_types' => true,
|
||||||
'strict_param' => true,
|
'strict_param' => true,
|
||||||
'array_syntax' => ['syntax' => 'short'],
|
'array_syntax' => ['syntax' => 'short'],
|
||||||
])
|
])
|
||||||
->setFinder($finder)
|
->setFinder($finder);
|
||||||
;
|
|
||||||
|
509
.ci/php-cs-fixer/composer.lock
generated
509
.ci/php-cs-fixer/composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -30,7 +30,8 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
|||||||
|
|
||||||
# clean up php code
|
# clean up php code
|
||||||
cd $SCRIPT_DIR/php-cs-fixer
|
cd $SCRIPT_DIR/php-cs-fixer
|
||||||
composer update
|
composer update --quiet
|
||||||
|
rm -f .php-cs-fixer.cache
|
||||||
PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php --allow-risky=yes
|
PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php --allow-risky=yes
|
||||||
cd $SCRIPT_DIR/..
|
cd $SCRIPT_DIR/..
|
||||||
|
|
||||||
|
37
.ci/phpmd.sh
Normal file
37
.ci/phpmd.sh
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# phpmd.sh
|
||||||
|
# Copyright (c) 2023 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/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
|
||||||
|
cd $SCRIPT_DIR/phpmd
|
||||||
|
composer update --quiet
|
||||||
|
./vendor/bin/phpmd \
|
||||||
|
$SCRIPT_DIR/../app text phpmd.xml \
|
||||||
|
--exclude $SCRIPT_DIR/../app/resources/** \
|
||||||
|
--exclude $SCRIPT_DIR/../app/frontend/** \
|
||||||
|
--exclude $SCRIPT_DIR/../app/public/** \
|
||||||
|
--exclude $SCRIPT_DIR/../app/vendor/** \
|
||||||
|
|
||||||
|
cd $SCRIPT_DIR/..
|
||||||
|
|
||||||
|
exit 0
|
1
.ci/phpmd/.gitignore
vendored
Normal file
1
.ci/phpmd/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
vendor
|
5
.ci/phpmd/composer.json
Normal file
5
.ci/phpmd/composer.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"require-dev": {
|
||||||
|
"phpmd/phpmd": "^2.13"
|
||||||
|
}
|
||||||
|
}
|
1012
.ci/phpmd/composer.lock
generated
Normal file
1012
.ci/phpmd/composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
72
.ci/phpmd/phpmd.xml
Normal file
72
.ci/phpmd/phpmd.xml
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ phpmd.xml
|
||||||
|
~ Copyright (c) 2023 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/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ruleset name="pcsg-generated-ruleset"
|
||||||
|
xmlns="http://pmd.sf.net/ruleset/1.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
|
||||||
|
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
|
||||||
|
<description>Bla bla</description>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Commando vanuit firefly directory:
|
||||||
|
phpmd database,app,tests html /gdrive-all/development/phpmd/phpmd.xml > public/report.html
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Import the entire controversial code rule set -->
|
||||||
|
<rule ref="rulesets/controversial.xml">
|
||||||
|
<exclude name="CamelCasePropertyName" />
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- clean code -->
|
||||||
|
<rule ref="rulesets/codesize.xml" />
|
||||||
|
<rule ref="rulesets/design.xml" />
|
||||||
|
<rule ref="rulesets/naming.xml" />
|
||||||
|
<rule ref="rulesets/unusedcode.xml" />
|
||||||
|
|
||||||
|
<rule ref="rulesets/codesize.xml/CyclomaticComplexity">
|
||||||
|
<properties>
|
||||||
|
<property name="reportLevel" value="5"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
<rule ref="rulesets/codesize.xml/NPathComplexity">
|
||||||
|
<properties>
|
||||||
|
<property name="minimum" value="128"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
<rule ref="rulesets/codesize.xml/ExcessiveMethodLength">
|
||||||
|
<properties>
|
||||||
|
<property name="minimum" value="40"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
<rule ref="rulesets/codesize.xml/ExcessiveParameterList">
|
||||||
|
<properties>
|
||||||
|
<property name="minimum" value="5"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- include clean code manually -->
|
||||||
|
<rule ref="rulesets/cleancode.xml/BooleanArgumentFlag" />
|
||||||
|
<rule ref="rulesets/cleancode.xml/ElseExpression" />
|
||||||
|
|
||||||
|
<!-- no this one -->
|
||||||
|
<!--<rule ref="rulesets/cleancode.xml/StaticAccess" />-->
|
||||||
|
</ruleset>
|
@@ -59,3 +59,5 @@ fi
|
|||||||
|
|
||||||
# restore .env file
|
# restore .env file
|
||||||
mv $SCRIPT_DIR/../.env.backup $SCRIPT_DIR/../.env
|
mv $SCRIPT_DIR/../.env.backup $SCRIPT_DIR/../.env
|
||||||
|
|
||||||
|
cd $SCRIPT_DIR/..
|
||||||
|
@@ -1,321 +0,0 @@
|
|||||||
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
|
||||||
# Never set it to "testing".
|
|
||||||
APP_ENV=heroku
|
|
||||||
|
|
||||||
# Set to true if you want to see debug information in error screens.
|
|
||||||
APP_DEBUG=false
|
|
||||||
|
|
||||||
# This should be your email address.
|
|
||||||
# If you use Docker or similar, you can set this variable from a file by using SITE_OWNER_FILE
|
|
||||||
SITE_OWNER=heroku@example.com
|
|
||||||
|
|
||||||
# The encryption key for your sessions. Keep this very secure.
|
|
||||||
# If you generate a new one all existing attachments must be considered LOST.
|
|
||||||
# Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it.
|
|
||||||
# If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE
|
|
||||||
APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2
|
|
||||||
|
|
||||||
#
|
|
||||||
# Firefly III will launch using this language (for new users and unauthenticated visitors)
|
|
||||||
# For a list of available languages: https://github.com/firefly-iii/firefly-iii/tree/main/resources/lang
|
|
||||||
#
|
|
||||||
# If text is still in English, remember that not everything may have been translated.
|
|
||||||
DEFAULT_LANGUAGE=en_US
|
|
||||||
|
|
||||||
# The locale defines how numbers are formatted.
|
|
||||||
# by default this value is the same as whatever the language is.
|
|
||||||
DEFAULT_LOCALE=equal
|
|
||||||
|
|
||||||
# Change this value to your preferred time zone.
|
|
||||||
# Example: Europe/Amsterdam
|
|
||||||
# For a list of supported time zones, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
|
||||||
TZ=UTC
|
|
||||||
|
|
||||||
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
|
|
||||||
# Set it to ** and reverse proxies work just fine.
|
|
||||||
TRUSTED_PROXIES=**
|
|
||||||
|
|
||||||
# The log channel defines where your log entries go to.
|
|
||||||
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
|
||||||
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
|
|
||||||
# A rotating log option is 'daily', creates 5 files that (surprise) rotate.
|
|
||||||
# Default setting 'stack' will log to 'daily' and to 'stdout' at the same time.
|
|
||||||
|
|
||||||
# - Docker + versions <= 4.8.1.8 and before: use "stdout"
|
|
||||||
# - Docker + versions > 4.8.1.8 : use "docker_out"
|
|
||||||
# - Docker + versions >= 5.1.1 : use "stack"
|
|
||||||
# - For everything else (als not Docker) : use 'stack'
|
|
||||||
|
|
||||||
LOG_CHANNEL=stdout
|
|
||||||
|
|
||||||
# Log level. You can set this from least severe to most severe:
|
|
||||||
# debug, info, notice, warning, error, critical, alert, emergency
|
|
||||||
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
|
||||||
# nothing will get logged, ever.
|
|
||||||
APP_LOG_LEVEL=notice
|
|
||||||
|
|
||||||
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
|
||||||
# For other database types, please see the FAQ: https://docs.firefly-iii.org/support/faq
|
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
|
||||||
# Use "pgsql" for PostgreSQL
|
|
||||||
# Use "mysql" for MySQL and MariaDB.
|
|
||||||
# Use "sqlite" for SQLite.
|
|
||||||
DB_CONNECTION=pgsql
|
|
||||||
|
|
||||||
|
|
||||||
# MySQL supports SSL. You can configure it here.
|
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
|
||||||
MYSQL_USE_SSL=false
|
|
||||||
MYSQL_SSL_VERIFY_SERVER_CERT=true
|
|
||||||
# You need to set at least of these options
|
|
||||||
MYSQL_SSL_CAPATH=/etc/ssl/certs/
|
|
||||||
MYSQL_SSL_CA=
|
|
||||||
MYSQL_SSL_CERT=
|
|
||||||
MYSQL_SSL_KEY=
|
|
||||||
MYSQL_SSL_CIPHER=
|
|
||||||
|
|
||||||
# PostgreSQL supports SSL. You can configure it here.
|
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
|
||||||
PGSQL_SSL_MODE=prefer
|
|
||||||
PGSQL_SSL_ROOT_CERT=null
|
|
||||||
PGSQL_SSL_CERT=null
|
|
||||||
PGSQL_SSL_KEY=null
|
|
||||||
PGSQL_SSL_CRL_FILE=null
|
|
||||||
|
|
||||||
# If you're looking for performance improvements, you could install memcached.
|
|
||||||
CACHE_DRIVER=file
|
|
||||||
SESSION_DRIVER=file
|
|
||||||
|
|
||||||
# If you set either of these to 'redis', you might want to update these settings too
|
|
||||||
# If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or
|
|
||||||
# REDIS_PORT_FILE to set the value from a file instead of from an environment variable
|
|
||||||
|
|
||||||
# can be tcp, unix or http
|
|
||||||
REDIS_SCHEME=tcp
|
|
||||||
|
|
||||||
# use only when using 'unix' for REDIS_SCHEME. Leave empty otherwise.
|
|
||||||
REDIS_PATH=
|
|
||||||
|
|
||||||
# use only when using 'tcp' or 'http' for REDIS_SCHEME. Leave empty otherwise.
|
|
||||||
REDIS_HOST=127.0.0.1
|
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
REDIS_PASSWORD=null
|
|
||||||
# always use quotes and make sure redis db "0" and "1" exists. Otherwise change accordingly.
|
|
||||||
REDIS_DB="0"
|
|
||||||
REDIS_CACHE_DB="1"
|
|
||||||
|
|
||||||
# Cookie settings. Should not be necessary to change these.
|
|
||||||
# If you use Docker or similar, you can set COOKIE_DOMAIN_FILE to set
|
|
||||||
# the value from a file instead of from an environment variable
|
|
||||||
COOKIE_PATH="/"
|
|
||||||
COOKIE_DOMAIN=
|
|
||||||
COOKIE_SECURE=false
|
|
||||||
|
|
||||||
# If you want Firefly III to mail you, update these settings
|
|
||||||
# For instructions, see: https://docs.firefly-iii.org/advanced-installation/email
|
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
|
||||||
MAIL_MAILER=log
|
|
||||||
MAIL_HOST=null
|
|
||||||
MAIL_PORT=2525
|
|
||||||
MAIL_FROM=changeme@example.com
|
|
||||||
MAIL_USERNAME=null
|
|
||||||
MAIL_PASSWORD=null
|
|
||||||
MAIL_ENCRYPTION=null
|
|
||||||
|
|
||||||
# Other mail drivers:
|
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
|
||||||
MAILGUN_DOMAIN=
|
|
||||||
MAILGUN_SECRET=
|
|
||||||
|
|
||||||
|
|
||||||
# If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net
|
|
||||||
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
|
|
||||||
MAILGUN_ENDPOINT=api.mailgun.net
|
|
||||||
|
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
|
||||||
MANDRILL_SECRET=
|
|
||||||
SPARKPOST_SECRET=
|
|
||||||
|
|
||||||
|
|
||||||
# Firefly III can send you the following messages
|
|
||||||
SEND_REGISTRATION_MAIL=true
|
|
||||||
SEND_ERROR_MESSAGE=true
|
|
||||||
|
|
||||||
# These messages contain (sensitive) transaction information:
|
|
||||||
SEND_REPORT_JOURNALS=true
|
|
||||||
|
|
||||||
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
|
|
||||||
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
|
|
||||||
MAPBOX_API_KEY=
|
|
||||||
|
|
||||||
# The map will default to this location:
|
|
||||||
MAP_DEFAULT_LAT=51.983333
|
|
||||||
MAP_DEFAULT_LONG=5.916667
|
|
||||||
MAP_DEFAULT_ZOOM=6
|
|
||||||
|
|
||||||
# Firefly III currently supports two provider for live Currency Exchange Rates:
|
|
||||||
# "fixer", and "ratesapi".
|
|
||||||
# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates,
|
|
||||||
# built compatible with Fixer.IO, based on data published by European Central Bank, and doesn't require API key.
|
|
||||||
CER_PROVIDER=ratesapi
|
|
||||||
|
|
||||||
# If you have select "fixer" as default currency exchange rates,
|
|
||||||
# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
|
|
||||||
# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited
|
|
||||||
# the free API up to the point where you might as well offer nothing.
|
|
||||||
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
|
|
||||||
FIXER_API_KEY=
|
|
||||||
|
|
||||||
# Firefly III has two options for user authentication. "eloquent" is the default,
|
|
||||||
# and "ldap" for LDAP servers.
|
|
||||||
# For full instructions on these settings please visit:
|
|
||||||
# https://docs.firefly-iii.org/advanced-installation/authentication
|
|
||||||
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
|
|
||||||
LOGIN_PROVIDER=eloquent
|
|
||||||
|
|
||||||
#
|
|
||||||
# It's also possible to change the way users are authenticated. You could use Authelia for example.
|
|
||||||
# Authentication via the REMOTE_USER header is supported. Change the value below to "remote_user_guard".
|
|
||||||
#
|
|
||||||
# If you do this please read the documentation for instructions and warnings:
|
|
||||||
# https://docs.firefly-iii.org/advanced-installation/authentication
|
|
||||||
#
|
|
||||||
# This function is available in Firefly III v5.3.0 and higher.
|
|
||||||
AUTHENTICATION_GUARD=web
|
|
||||||
|
|
||||||
#
|
|
||||||
# Likewise, it's impossible to log out users who's authentication is handled by an external system.
|
|
||||||
# Enter a custom URL here that will force a logout (your authentication provider can tell you).
|
|
||||||
# Setting this variable only works when AUTHENTICATION_GUARD != web
|
|
||||||
#
|
|
||||||
CUSTOM_LOGOUT_URL=
|
|
||||||
|
|
||||||
# LDAP connection configuration
|
|
||||||
# OpenLDAP, FreeIPA or ActiveDirectory
|
|
||||||
# # If you use Docker or similar, you can set this variable from a file by appending it with _FILE
|
|
||||||
ADLDAP_CONNECTION_SCHEME=OpenLDAP
|
|
||||||
ADLDAP_AUTO_CONNECT=true
|
|
||||||
|
|
||||||
# LDAP connection settings
|
|
||||||
# You can set the following variables from a file by appending them with _FILE:
|
|
||||||
# ADLDAP_CONTROLLERS, ADLDAP_PORT, ADLDAP_BASEDN
|
|
||||||
ADLDAP_CONTROLLERS=
|
|
||||||
ADLDAP_PORT=389
|
|
||||||
ADLDAP_TIMEOUT=5
|
|
||||||
ADLDAP_BASEDN=""
|
|
||||||
ADLDAP_FOLLOW_REFFERALS=false
|
|
||||||
|
|
||||||
# SSL/TLS settings
|
|
||||||
ADLDAP_USE_SSL=false
|
|
||||||
ADLDAP_USE_TLS=false
|
|
||||||
ADLDAP_SSL_CACERTDIR=
|
|
||||||
ADLDAP_SSL_CACERTFILE=
|
|
||||||
ADLDAP_SSL_CERTFILE=
|
|
||||||
ADLDAP_SSL_KEYFILE=
|
|
||||||
ADLDAP_SSL_CIPHER_SUITE=
|
|
||||||
ADLDAP_SSL_REQUIRE_CERT=
|
|
||||||
|
|
||||||
# You can set the following variables from a file by appending them with _FILE:
|
|
||||||
ADLDAP_ADMIN_USERNAME=
|
|
||||||
ADLDAP_ADMIN_PASSWORD=
|
|
||||||
|
|
||||||
# You can set the following variables from a file by appending them with _FILE:
|
|
||||||
ADLDAP_ACCOUNT_PREFIX=
|
|
||||||
ADLDAP_ACCOUNT_SUFFIX=
|
|
||||||
|
|
||||||
|
|
||||||
# LDAP authentication settings.
|
|
||||||
ADLDAP_PASSWORD_SYNC=false
|
|
||||||
ADLDAP_LOGIN_FALLBACK=false
|
|
||||||
|
|
||||||
ADLDAP_DISCOVER_FIELD=distinguishedname
|
|
||||||
ADLDAP_AUTH_FIELD=distinguishedname
|
|
||||||
|
|
||||||
# Will allow SSO if your server provides an AUTH_USER field.
|
|
||||||
# You can set the following variables from a file by appending them with _FILE:
|
|
||||||
WINDOWS_SSO_ENABLED=false
|
|
||||||
WINDOWS_SSO_DISCOVER=samaccountname
|
|
||||||
WINDOWS_SSO_KEY=AUTH_USER
|
|
||||||
|
|
||||||
# field to sync as local username.
|
|
||||||
# You can set the following variable from a file by appending it with _FILE:
|
|
||||||
ADLDAP_SYNC_FIELD=userprincipalname
|
|
||||||
|
|
||||||
# You can disable the X-Frame-Options header if it interferes with tools like
|
|
||||||
# Organizr. This is at your own risk. Applications running in frames run the risk
|
|
||||||
# of leaking information to their parent frame.
|
|
||||||
DISABLE_FRAME_HEADER=false
|
|
||||||
|
|
||||||
# You can disable the Content Security Policy header when you're using an ancient browser
|
|
||||||
# or any version of Microsoft Edge / Internet Explorer (which amounts to the same thing really)
|
|
||||||
# This leaves you with the risk of not being able to stop XSS bugs should they ever surface.
|
|
||||||
# This is at your own risk.
|
|
||||||
DISABLE_CSP_HEADER=false
|
|
||||||
|
|
||||||
# If you wish to track your own behavior over Firefly III, set valid analytics tracker information here.
|
|
||||||
# Nobody uses this except for me on the demo site. But hey, feel free to use this if you want to.
|
|
||||||
# Do not prepend the TRACKER_URL with http:// or https://
|
|
||||||
# The only tracker supported is Matomo.
|
|
||||||
# You can set the following variables from a file by appending them with _FILE:
|
|
||||||
TRACKER_SITE_ID=
|
|
||||||
TRACKER_URL=
|
|
||||||
|
|
||||||
# You can fine tune the start-up of a Docker container by editing these environment variables.
|
|
||||||
# Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data.
|
|
||||||
# However if you know what you're doing you can significantly speed up container start times.
|
|
||||||
# Set each value to true to enable, or false to disable.
|
|
||||||
|
|
||||||
# Check if the SQLite database exists. Can be skipped if you're not using SQLite.
|
|
||||||
# Won't significantly speed up things.
|
|
||||||
DKR_CHECK_SQLITE=true
|
|
||||||
|
|
||||||
# Run database creation and migration commands. Disable this only if you're 100% sure the DB exists
|
|
||||||
# and is up to date.
|
|
||||||
DKR_RUN_MIGRATION=true
|
|
||||||
|
|
||||||
# Run database upgrade commands. Disable this only when you're 100% sure your DB is up-to-date
|
|
||||||
# with the latest fixes (outside of migrations!)
|
|
||||||
DKR_RUN_UPGRADE=true
|
|
||||||
|
|
||||||
# Verify database integrity. Includes all data checks and verifications.
|
|
||||||
# Disabling this makes Firefly III assume your DB is intact.
|
|
||||||
DKR_RUN_VERIFY=true
|
|
||||||
|
|
||||||
# Run database reporting commands. When disabled, Firefly III won't go over your data to report current state.
|
|
||||||
# Disabling this should have no impact on data integrity or safety but it won't warn you of possible issues.
|
|
||||||
DKR_RUN_REPORT=true
|
|
||||||
|
|
||||||
# Generate OAuth2 keys.
|
|
||||||
# When disabled, Firefly III won't attempt to generate OAuth2 Passport keys. This won't be an issue, IFF (if and only if)
|
|
||||||
# you had previously generated keys already and they're stored in your database for restoration.
|
|
||||||
DKR_RUN_PASSPORT_INSTALL=true
|
|
||||||
|
|
||||||
# Leave the following configuration vars as is.
|
|
||||||
# Unless you like to tinker and know what you're doing.
|
|
||||||
APP_NAME=FireflyIII
|
|
||||||
ADLDAP_CONNECTION=default
|
|
||||||
BROADCAST_DRIVER=log
|
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
CACHE_PREFIX=firefly
|
|
||||||
SEARCH_RESULT_LIMIT=50
|
|
||||||
PUSHER_KEY=
|
|
||||||
PUSHER_SECRET=
|
|
||||||
PUSHER_ID=
|
|
||||||
DEMO_USERNAME=
|
|
||||||
DEMO_PASSWORD=
|
|
||||||
USE_ENCRYPTION=false
|
|
||||||
IS_HEROKU=false
|
|
||||||
FIREFLY_III_LAYOUT=v1
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you have trouble configuring your Firefly III installation, DON'T BOTHER setting this variable.
|
|
||||||
# It won't work. It doesn't do ANYTHING. Don't believe the lies you read online. I'm not joking.
|
|
||||||
# This configuration value WILL NOT HELP.
|
|
||||||
#
|
|
||||||
# This variable is ONLY used in some of the emails Firefly III sends around. Nowhere else.
|
|
||||||
# So when configuring anything WEB related this variable doesn't do anything. Nothing
|
|
||||||
#
|
|
||||||
# If you're stuck I understand you get desperate but look SOMEWHERE ELSE.
|
|
||||||
#
|
|
||||||
APP_URL=http://localhost
|
|
@@ -1,30 +0,0 @@
|
|||||||
bg_BG
|
|
||||||
ca_ES
|
|
||||||
cs_CZ
|
|
||||||
da_DK
|
|
||||||
de_DE
|
|
||||||
el_GR
|
|
||||||
en_GB
|
|
||||||
en_US
|
|
||||||
es_ES
|
|
||||||
fi_FI
|
|
||||||
fr_FR
|
|
||||||
hu_HU
|
|
||||||
id_ID
|
|
||||||
it_IT
|
|
||||||
ja_JP
|
|
||||||
nb_NO
|
|
||||||
nl_NL
|
|
||||||
pl_PL
|
|
||||||
pt_BR
|
|
||||||
pt_PT
|
|
||||||
ro_RO
|
|
||||||
ru_RU
|
|
||||||
sk_SK
|
|
||||||
sl_SI
|
|
||||||
sv_SE
|
|
||||||
tr_TR
|
|
||||||
uk_UA
|
|
||||||
vi_VN
|
|
||||||
zh-hans_CN
|
|
||||||
zh-hant_CN
|
|
18
.editorconfig
Normal file
18
.editorconfig
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[*.{yml,yaml}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[docker-compose.yml]
|
||||||
|
indent_size = 4
|
47
.env.example
47
.env.example
@@ -45,12 +45,6 @@ TRUSTED_PROXIES=
|
|||||||
# Default setting 'stack' will log to 'daily' and to 'stdout' at the same time.
|
# Default setting 'stack' will log to 'daily' and to 'stdout' at the same time.
|
||||||
LOG_CHANNEL=stack
|
LOG_CHANNEL=stack
|
||||||
|
|
||||||
#
|
|
||||||
# Used when logging to papertrail:
|
|
||||||
#
|
|
||||||
PAPERTRAIL_HOST=
|
|
||||||
PAPERTRAIL_PORT=
|
|
||||||
|
|
||||||
# Log level. You can set this from least severe to most severe:
|
# Log level. You can set this from least severe to most severe:
|
||||||
# debug, info, notice, warning, error, critical, alert, emergency
|
# debug, info, notice, warning, error, critical, alert, emergency
|
||||||
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
||||||
@@ -58,11 +52,33 @@ PAPERTRAIL_PORT=
|
|||||||
APP_LOG_LEVEL=notice
|
APP_LOG_LEVEL=notice
|
||||||
|
|
||||||
# Audit log level.
|
# Audit log level.
|
||||||
# Set this to "emergency" if you dont want to store audit logs, leave on info otherwise.
|
# The audit log is used to log notable Firefly III events on a separate channel.
|
||||||
AUDIT_LOG_LEVEL=info
|
# These log entries may contain sensitive financial information.
|
||||||
|
# The audit log is disabled by default.
|
||||||
|
#
|
||||||
|
# To enable it, set AUDIT_LOG_LEVEL to "info"
|
||||||
|
# To disable it, set AUDIT_LOG_LEVEL to "emergency"
|
||||||
|
AUDIT_LOG_LEVEL=emergency
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you want, you can redirect the audit logs to another channel.
|
||||||
|
# Set 'audit_stdout', 'audit_syslog', 'audit_errorlog' to log to the system itself.
|
||||||
|
# Use audit_daily to log to a rotating file.
|
||||||
|
# Use audit_papertrail to log to papertrail.
|
||||||
|
#
|
||||||
|
# If you do this, the audit logs may be mixed with normal logs because the settings for these channels
|
||||||
|
# are often the same as the settings for the normal logs.
|
||||||
|
AUDIT_LOG_CHANNEL=
|
||||||
|
|
||||||
|
#
|
||||||
|
# Used when logging to papertrail:
|
||||||
|
# Also used when audit logs log to papertrail:
|
||||||
|
#
|
||||||
|
PAPERTRAIL_HOST=
|
||||||
|
PAPERTRAIL_PORT=
|
||||||
|
|
||||||
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||||
# For other database types, please see the FAQ: https://docs.firefly-iii.org/support/faq
|
# For other database types, please see the FAQ: https://docs.firefly-iii.org/firefly-iii/faq/self-hosted/#i-want-to-use-sqlite
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
||||||
# Use "pgsql" for PostgreSQL
|
# Use "pgsql" for PostgreSQL
|
||||||
# Use "mysql" for MySQL and MariaDB.
|
# Use "mysql" for MySQL and MariaDB.
|
||||||
@@ -134,7 +150,7 @@ COOKIE_SECURE=false
|
|||||||
COOKIE_SAMESITE=lax
|
COOKIE_SAMESITE=lax
|
||||||
|
|
||||||
# If you want Firefly III to email you, update these settings
|
# If you want Firefly III to email you, update these settings
|
||||||
# For instructions, see: https://docs.firefly-iii.org/advanced-installation/email
|
# For instructions, see: https://docs.firefly-iii.org/firefly-iii/advanced-installation/email/#email
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
||||||
MAIL_MAILER=log
|
MAIL_MAILER=log
|
||||||
MAIL_HOST=null
|
MAIL_HOST=null
|
||||||
@@ -143,6 +159,7 @@ MAIL_FROM=changeme@example.com
|
|||||||
MAIL_USERNAME=null
|
MAIL_USERNAME=null
|
||||||
MAIL_PASSWORD=null
|
MAIL_PASSWORD=null
|
||||||
MAIL_ENCRYPTION=null
|
MAIL_ENCRYPTION=null
|
||||||
|
MAIL_SENDMAIL_COMMAND=
|
||||||
|
|
||||||
# Other mail drivers:
|
# Other mail drivers:
|
||||||
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
|
||||||
@@ -163,9 +180,8 @@ SEND_ERROR_MESSAGE=true
|
|||||||
# These messages contain (sensitive) transaction information:
|
# These messages contain (sensitive) transaction information:
|
||||||
SEND_REPORT_JOURNALS=true
|
SEND_REPORT_JOURNALS=true
|
||||||
|
|
||||||
# Set this value to true if you want to set the location
|
# Set this value to true if you want to set the location of certain things, like transactions.
|
||||||
# of certain things, like transactions. Since this involves an external service, it's optional
|
# Since this involves an external service, it's optional and disabled by default.
|
||||||
# and disabled by default.
|
|
||||||
ENABLE_EXTERNAL_MAP=false
|
ENABLE_EXTERNAL_MAP=false
|
||||||
|
|
||||||
# Set this value to true if you want Firefly III to download currency exchange rates
|
# Set this value to true if you want Firefly III to download currency exchange rates
|
||||||
@@ -188,7 +204,7 @@ MAP_DEFAULT_ZOOM=6
|
|||||||
# - 'web' (default, uses built in DB)
|
# - 'web' (default, uses built in DB)
|
||||||
# - 'remote_user_guard' for Authelia etc
|
# - 'remote_user_guard' for Authelia etc
|
||||||
# Read more about these settings in the documentation.
|
# Read more about these settings in the documentation.
|
||||||
# https://docs.firefly-iii.org/advanced-installation/authentication
|
# https://docs.firefly-iii.org/firefly-iii/advanced-installation/authentication
|
||||||
#
|
#
|
||||||
# LDAP is no longer supported :(
|
# LDAP is no longer supported :(
|
||||||
#
|
#
|
||||||
@@ -241,7 +257,7 @@ ALLOW_WEBHOOKS=false
|
|||||||
#
|
#
|
||||||
# The static cron job token can be useful when you use Docker and wish to manage cron jobs.
|
# The static cron job token can be useful when you use Docker and wish to manage cron jobs.
|
||||||
# 1. Set this token to any 32-character value (this is important!).
|
# 1. Set this token to any 32-character value (this is important!).
|
||||||
# 2. Use this token in the cron URL instead of a user's command line token.
|
# 2. Use this token in the cron URL instead of a user's command line token that you can find in /profile
|
||||||
#
|
#
|
||||||
# For more info: https://docs.firefly-iii.org/firefly-iii/advanced-installation/cron/
|
# For more info: https://docs.firefly-iii.org/firefly-iii/advanced-installation/cron/
|
||||||
#
|
#
|
||||||
@@ -298,7 +314,6 @@ PUSHER_SECRET=
|
|||||||
PUSHER_ID=
|
PUSHER_ID=
|
||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
IS_HEROKU=false
|
|
||||||
FIREFLY_III_LAYOUT=v1
|
FIREFLY_III_LAYOUT=v1
|
||||||
|
|
||||||
#
|
#
|
||||||
|
17
.gitattributes
vendored
17
.gitattributes
vendored
@@ -1,8 +1,11 @@
|
|||||||
* text=auto
|
* text=auto eol=lf
|
||||||
*.css linguist-vendored
|
|
||||||
*.scss linguist-vendored
|
*.blade.php diff=html
|
||||||
*.js linguist-vendored
|
*.css diff=css
|
||||||
|
*.html diff=html
|
||||||
|
*.md diff=markdown
|
||||||
|
*.php diff=php
|
||||||
|
|
||||||
|
/.github export-ignore
|
||||||
CHANGELOG.md export-ignore
|
CHANGELOG.md export-ignore
|
||||||
/tests export-ignore
|
.styleci.yml export-ignore
|
||||||
/phpunit.xml export-ignore
|
|
||||||
/.ci export-ignore
|
|
||||||
|
14
.github/ISSUE_TEMPLATE/bug.yml
vendored
14
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -16,7 +16,7 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem
|
- label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem
|
||||||
- label: ... there are no open or closed issues that are related to my problem
|
- label: ... there are no open or closed issues that are related to my problem
|
||||||
- label: ... it's [definitely me, not you](https://github.com/firefly-iii/firefly-iii/blob/main/.github/its_you_not_me.md)
|
- label: ... it's [definitely a Firefly III issue, not me](https://github.com/firefly-iii/firefly-iii/blob/main/.github/its_you_not_me.md)
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
@@ -27,18 +27,18 @@ body:
|
|||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Expected behaviour
|
label: Debug information
|
||||||
description: Please describe precisely what you'd expect to happen.
|
description: Please provide the table from the /debug page. Do not add backticks or quotes.
|
||||||
|
placeholder: The output from the /debug page
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Debug information
|
label: Expected behaviour
|
||||||
description: Please provide the table from the /debug page
|
description: Please describe precisely what you'd expect to happen. Be specific.
|
||||||
placeholder: The output from the /debug page
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: false
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
|
10
.github/ISSUE_TEMPLATE/fr.yml
vendored
10
.github/ISSUE_TEMPLATE/fr.yml
vendored
@@ -8,9 +8,9 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
|
- label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
|
||||||
required: true
|
required: true
|
||||||
- label: My request is not listed as [a very good idea, but unfortunately...](https://docs.firefly-iii.org/firefly-iii/about-firefly-iii/what-its-not/)
|
- label: My request is not listed as [a very good idea, but unfortunately...](https://docs.firefly-iii.org/firefly-iii/more-information/what-its-not/)
|
||||||
required: true
|
required: true
|
||||||
- label: I've used [the search](https://github.com/firefly-iii/firefly-iii/issues?q=is%3Aissue) and this has not been discussed before.
|
- label: I've used [the search](https://github.com/firefly-iii/firefly-iii/issues?q=is%3Aissue) and this has not been requested before.
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
@@ -18,9 +18,9 @@ body:
|
|||||||
label: Description
|
label: Description
|
||||||
description: Please describe your feature request
|
description: Please describe your feature request
|
||||||
placeholder: |
|
placeholder: |
|
||||||
- I would like Firefly III to do ABC.
|
- I would like Firefly III to do (thing).
|
||||||
- What if you would add feature XYZ?
|
- What if you would add feature (feature here)?
|
||||||
- Firefly III doesn't do DEF.
|
- Firefly III doesn't do (thing).
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
29
.github/code_of_conduct.md
vendored
29
.github/code_of_conduct.md
vendored
@@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
## Our Pledge
|
## Our Pledge
|
||||||
|
|
||||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making
|
||||||
|
participation in our project and our community a harassment-free experience for everyone, regardless of age, body size,
|
||||||
|
disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race,
|
||||||
|
religion, or sexual identity and orientation.
|
||||||
|
|
||||||
## Our Standards
|
## Our Standards
|
||||||
|
|
||||||
@@ -24,23 +27,35 @@ Examples of unacceptable behavior by participants include:
|
|||||||
|
|
||||||
## Our Responsibilities
|
## Our Responsibilities
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take
|
||||||
|
appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
|
||||||
|
issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any
|
||||||
|
contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the
|
||||||
|
project or its community. Examples of representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed representative at an online or offline
|
||||||
|
event. Representation of a project may be further defined and clarified by project maintainers.
|
||||||
|
|
||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at james@firefly-iii.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at
|
||||||
|
james@firefly-iii.org. The project team will review and investigate all complaints, and will respond in a way that it
|
||||||
|
deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the
|
||||||
|
reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent
|
||||||
|
repercussions as determined by other members of the project's leadership.
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available
|
||||||
|
at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
[homepage]: http://contributor-covenant.org
|
[homepage]: http://contributor-covenant.org
|
||||||
|
|
||||||
[version]: http://contributor-covenant.org/version/1/4/
|
[version]: http://contributor-covenant.org/version/1/4/
|
||||||
|
4
.github/contributing.md
vendored
4
.github/contributing.md
vendored
@@ -1,3 +1,3 @@
|
|||||||
# [Contributing guidelines](https://docs.firefly-iii.org/other-pages/contributing)
|
# [Contributing guidelines](https://docs.firefly-iii.org/firefly-iii/support/#contributing-code)
|
||||||
|
|
||||||
[Contributing guidelines](https://docs.firefly-iii.org/other-pages/contributing)
|
[Contributing guidelines](https://docs.firefly-iii.org/firefly-iii/support/#contributing-code)
|
||||||
|
10
.github/its_you_not_me.md
vendored
10
.github/its_you_not_me.md
vendored
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
Sometimes bugs reported to Firefly III are configuration and system problems on the user's side.
|
Sometimes bugs reported to Firefly III are configuration and system problems on the user's side.
|
||||||
|
|
||||||
If you run into any of the following problems, there's a good chance it's not a Firefly III issue, but a configuration issue.
|
If you run into any of the following problems, there's a good chance it's not a Firefly III issue, but a configuration
|
||||||
|
issue.
|
||||||
|
|
||||||
- ⚠️ Firefly III can't connect to the database when starting or the password is wrong, even though you're sure it's correct.
|
- ⚠️ Firefly III can't connect to the database when starting or the password is wrong, even though you're sure it's
|
||||||
|
correct.
|
||||||
- ⚠️ Errors about a missing `APP_KEY` or other encryption/hash problems
|
- ⚠️ Errors about a missing `APP_KEY` or other encryption/hash problems
|
||||||
- ⚠️ You can't login due to `419` errors (page expired)
|
- ⚠️ You can't login due to `419` errors (page expired)
|
||||||
- ⚠️ Any `500` error when starting Firefly III
|
- ⚠️ Any `500` error when starting Firefly III
|
||||||
@@ -13,4 +15,6 @@ If you run into any of the following problems, there's a good chance it's not a
|
|||||||
- ⚠️ Firefly III does not work behind your reverse proxy
|
- ⚠️ Firefly III does not work behind your reverse proxy
|
||||||
- ⚠️ You can't connect to the Data Importer due to 404's or authentication issues.
|
- ⚠️ You can't connect to the Data Importer due to 404's or authentication issues.
|
||||||
|
|
||||||
If you run into an issue like this, please start a [discussion](https://github.com/firefly-iii/firefly-iii/discussions) or chat on [Gitter.im](https://gitter.im/firefly-iii/firefly-iii). There's a good chance it's not a bug but something we can fix rather quickly :+1:
|
If you run into an issue like this, please start a [discussion](https://github.com/firefly-iii/firefly-iii/discussions)
|
||||||
|
or chat on [Gitter.im](https://gitter.im/firefly-iii/firefly-iii). There's a good chance it's not a bug but something we
|
||||||
|
can fix rather quickly :+1:
|
||||||
|
6
.github/support.md
vendored
6
.github/support.md
vendored
@@ -9,7 +9,8 @@ First of all: thank you for reporting a bug instead of ditching the tool altoget
|
|||||||
1. Open bugs will have open issues, so search for one first.
|
1. Open bugs will have open issues, so search for one first.
|
||||||
2. If your feature request is already there, vote on it with :+1: or :-1: reactions.
|
2. If your feature request is already there, vote on it with :+1: or :-1: reactions.
|
||||||
3. Do NOT hijack old issues with the bug you found, open your own issue.
|
3. Do NOT hijack old issues with the bug you found, open your own issue.
|
||||||
4. If relevant, take the time and see if the [demo site](https://demo.firefly-iii.org/) is also suffering from your issue.
|
4. If relevant, take the time and see if the [demo site](https://demo.firefly-iii.org/) is also suffering from your
|
||||||
|
issue.
|
||||||
5. If relevant, read the [documentation](https://docs.firefly-iii.org/).
|
5. If relevant, read the [documentation](https://docs.firefly-iii.org/).
|
||||||
|
|
||||||
Please follow these guidelines when opening new issues:
|
Please follow these guidelines when opening new issues:
|
||||||
@@ -25,7 +26,8 @@ Only then [create a new issue](https://github.com/firefly-iii/firefly-iii/issues
|
|||||||
## Issue closure and abandonment policy
|
## Issue closure and abandonment policy
|
||||||
|
|
||||||
- Issues can be converted into discussions if it's not a bug or feature request.
|
- Issues can be converted into discussions if it's not a bug or feature request.
|
||||||
- Features that won't be implemented will be labelled "wontfix". [This isn't personal](https://docs.firefly-iii.org/firefly-iii/about-firefly-iii/what-its-not/).
|
- Features that won't be implemented will be labelled "
|
||||||
|
wontfix". [This isn't personal](https://docs.firefly-iii.org/firefly-iii/about-firefly-iii/what-its-not/).
|
||||||
- Issues can be closed if they're duplicates of other issues.
|
- Issues can be closed if they're duplicates of other issues.
|
||||||
- Issues can be closed if the answer is in the FAQ.
|
- Issues can be closed if the answer is in the FAQ.
|
||||||
- Issues will be closed automatically after 14 days.
|
- Issues will be closed automatically after 14 days.
|
||||||
|
16
.github/workflows/build.yml
vendored
16
.github/workflows/build.yml
vendored
@@ -1,16 +0,0 @@
|
|||||||
name: Sonarcloud CI
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
sonarcloud:
|
|
||||||
name: SonarCloud
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
|
||||||
- name: SonarCloud Scan
|
|
||||||
uses: SonarSource/sonarcloud-github-action@master
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
|
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
4
.github/workflows/cleanup.yml
vendored
4
.github/workflows/cleanup.yml
vendored
@@ -55,11 +55,13 @@ jobs:
|
|||||||
// because we track the duration of runs over time
|
// because we track the duration of runs over time
|
||||||
|
|
||||||
const workflows = [
|
const workflows = [
|
||||||
'build.yml',
|
|
||||||
'cleanup.yml',
|
'cleanup.yml',
|
||||||
|
'closed-issues.yml',
|
||||||
'depsreview.yaml',
|
'depsreview.yaml',
|
||||||
'laravel.yml',
|
'laravel.yml',
|
||||||
'lock.yml',
|
'lock.yml',
|
||||||
|
'qodana.yml',
|
||||||
|
'sonarcloud.yml',
|
||||||
'stale.yml'
|
'stale.yml'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
12
.github/workflows/closed-issues.yml
vendored
12
.github/workflows/closed-issues.yml
vendored
@@ -7,16 +7,16 @@ jobs:
|
|||||||
auto_comment:
|
auto_comment:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
-
|
- uses: aws-actions/closed-issue-message@v1
|
||||||
uses: aws-actions/closed-issue-message@v1
|
|
||||||
with:
|
with:
|
||||||
message: |
|
message: |
|
||||||
Hi there! This is an automatic reply. `Share and enjoy`
|
Hi there! This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
This issue is now closed. Please be aware that closed issues are not actively monitored. If you reply, you may get no response.
|
This issue is now 🔒 closed. Please be aware that closed issues are **not** watched.
|
||||||
|
|
||||||
- If the original bug is not actually fixed, please feel free to open a new issue. Please refer to this issue for clarity.
|
- If the original bug is not actually fixed, please feel free to open [a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose). Please refer to this issue for clarity.
|
||||||
- Follow-up questions can also be posted in a new [discussion](https://github.com/firefly-iii/firefly-iii/discussions/)
|
- Follow-up questions must be posted in a new [discussion](https://github.com/firefly-iii/firefly-iii/discussions/)
|
||||||
|
- Further replies to this issue will get **no response**.
|
||||||
|
|
||||||
Thank you for your consideration.
|
Thank you for your contributions.
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
21
.github/workflows/lock.yml
vendored
21
.github/workflows/lock.yml
vendored
@@ -5,26 +5,15 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * *'
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lock:
|
lock:
|
||||||
permissions:
|
permissions:
|
||||||
issues: write # for dessant/lock-threads to lock issues
|
issues: write
|
||||||
pull-requests: write # for dessant/lock-threads to lock PRs
|
pull-requests: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v4
|
- uses: JC5/lock-threads@main
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
issue-lock-inactive-days: '90'
|
issue-inactive-days: 90
|
||||||
issue-comment: >
|
pr-inactive-days: 90
|
||||||
Hi there! This is an automatic reply. `Share and enjoy`
|
|
||||||
|
|
||||||
This issue is now `locked` :lock:.
|
|
||||||
|
|
||||||
- If you feel there is more to be said about this specific issue, please feel free to open a new issue. Please refer to this issue for clarity.
|
|
||||||
- Follow-up questions and comments can also be posted in a new [discussion](https://github.com/firefly-iii/firefly-iii/discussions/)
|
|
||||||
|
|
||||||
Thank you for your consideration.
|
|
||||||
|
2
.github/workflows/qodana.yml
vendored
2
.github/workflows/qodana.yml
vendored
@@ -5,8 +5,6 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- develop
|
- develop
|
||||||
pull_request:
|
|
||||||
types: [ opened, synchronize, reopened ]
|
|
||||||
jobs:
|
jobs:
|
||||||
qodana:
|
qodana:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
47
.github/workflows/sonarcloud.yml
vendored
Normal file
47
.github/workflows/sonarcloud.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: Sonarcloud
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
jobs:
|
||||||
|
sonarcloud:
|
||||||
|
name: SonarCloud
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup PHP with Xdebug
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: '8.2'
|
||||||
|
coverage: xdebug
|
||||||
|
|
||||||
|
- name: Install Composer dependencies
|
||||||
|
run: composer install --prefer-dist --no-interaction --no-progress --no-scripts
|
||||||
|
|
||||||
|
- name: Copy environment file
|
||||||
|
run: cp .env.example .env
|
||||||
|
|
||||||
|
- name: Generate app key
|
||||||
|
run: php artisan key:generate
|
||||||
|
|
||||||
|
- name: "Run tests with coverage"
|
||||||
|
run: composer coverage
|
||||||
|
|
||||||
|
- name: Fix code coverage paths
|
||||||
|
run: sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace/@g' coverage.xml
|
||||||
|
|
||||||
|
- name: SonarCloud Scan
|
||||||
|
uses: SonarSource/sonarcloud-github-action@master
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }}
|
||||||
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@@ -31,4 +31,4 @@ jobs:
|
|||||||
Thank you for your contributions.
|
Thank you for your contributions.
|
||||||
days-before-stale: 14
|
days-before-stale: 14
|
||||||
days-before-close: 7
|
days-before-close: 7
|
||||||
exempt-issue-labels: 'enhancement,feature,bug,announcement,layout-v3'
|
exempt-issue-labels: 'enhancement,feature,bug,announcement,epic'
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@@ -7,4 +7,4 @@ npm-debug.log
|
|||||||
yarn-error.log
|
yarn-error.log
|
||||||
.env
|
.env
|
||||||
/.ci/php-cs-fixer/vendor
|
/.ci/php-cs-fixer/vendor
|
||||||
/.ci/coverage
|
coverage.xml
|
||||||
|
65
app.json
65
app.json
@@ -1,65 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Firefly III",
|
|
||||||
"description": "A free and open source personal finances manager",
|
|
||||||
"repository": "https://github.com/firefly-iii/firefly-iii",
|
|
||||||
"website": "https://firefly-iii.org/",
|
|
||||||
"logo": "https://raw.githubusercontent.com/firefly-iii/firefly-iii/main/public/mstile-150x150.png",
|
|
||||||
"keywords": [
|
|
||||||
"finance",
|
|
||||||
"finances",
|
|
||||||
"manager",
|
|
||||||
"management",
|
|
||||||
"euro",
|
|
||||||
"dollar",
|
|
||||||
"laravel",
|
|
||||||
"money",
|
|
||||||
"currency",
|
|
||||||
"financials",
|
|
||||||
"financial",
|
|
||||||
"budgets",
|
|
||||||
"administration",
|
|
||||||
"tool",
|
|
||||||
"tooling",
|
|
||||||
"help",
|
|
||||||
"helper",
|
|
||||||
"assistant",
|
|
||||||
"planning",
|
|
||||||
"organizing",
|
|
||||||
"bills",
|
|
||||||
"personal finance",
|
|
||||||
"budgets",
|
|
||||||
"budgeting",
|
|
||||||
"budgeting tool",
|
|
||||||
"budgeting application",
|
|
||||||
"transactions",
|
|
||||||
"self hosted",
|
|
||||||
"self-hosted",
|
|
||||||
"transfers",
|
|
||||||
"management"
|
|
||||||
],
|
|
||||||
"addons": [
|
|
||||||
{
|
|
||||||
"plan": "heroku-postgresql",
|
|
||||||
"options": {
|
|
||||||
"version": "12"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"scripts": {
|
|
||||||
"postdeploy": "php artisan migrate:refresh --seed;php artisan firefly:instructions install"
|
|
||||||
},
|
|
||||||
"buildpacks": [
|
|
||||||
{
|
|
||||||
"url": "heroku/php"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/heroku/heroku-buildpack-locale"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"APP_KEY": {
|
|
||||||
"description": "This key is used to create app cookies en secure attachments.",
|
|
||||||
"value": "base64:If1gJN4pyycXTq+WS5TjneDympKuu+8SKvTl6RZnhJg="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -83,6 +83,7 @@ class AccountController extends Controller
|
|||||||
|
|
||||||
$return = [];
|
$return = [];
|
||||||
$result = $this->repository->searchAccount((string)$query, $types, $data['limit']);
|
$result = $this->repository->searchAccount((string)$query, $types, $data['limit']);
|
||||||
|
// TODO this code is duplicated in the V2 Autocomplete controller, which means this code is due to be deprecated.
|
||||||
$defaultCurrency = app('amount')->getDefaultCurrency();
|
$defaultCurrency = app('amount')->getDefaultCurrency();
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
@@ -92,7 +93,11 @@ class AccountController extends Controller
|
|||||||
|
|
||||||
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
||||||
$balance = app('steam')->balance($account, $date);
|
$balance = app('steam')->balance($account, $date);
|
||||||
$nameWithBalance = sprintf('%s (%s)', $account->name, app('amount')->formatAnything($currency, $balance, false));
|
$nameWithBalance = sprintf(
|
||||||
|
'%s (%s)',
|
||||||
|
$account->name,
|
||||||
|
app('amount')->formatAnything($currency, $balance, false)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$return[] = [
|
$return[] = [
|
||||||
@@ -109,14 +114,14 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
// custom order.
|
// custom order.
|
||||||
$order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE];
|
|
||||||
usort(
|
usort(
|
||||||
$return,
|
$return,
|
||||||
function ($a, $b) use ($order) {
|
function ($a, $b) {
|
||||||
$pos_a = array_search($a['type'], $order, true);
|
$order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE];
|
||||||
$pos_b = array_search($b['type'], $order, true);
|
$posA = array_search($a['type'], $order, true);
|
||||||
|
$posB = array_search($b['type'], $order, true);
|
||||||
|
|
||||||
return $pos_a - $pos_b;
|
return $posA - $posB;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -125,6 +125,7 @@ class AccountController extends Controller
|
|||||||
'yAxisID' => 0, // 0, 1, 2
|
'yAxisID' => 0, // 0, 1, 2
|
||||||
'entries' => [],
|
'entries' => [],
|
||||||
];
|
];
|
||||||
|
// TODO this code is also present in the V2 chart account controller so this method is due to be deprecated.
|
||||||
$currentStart = clone $start;
|
$currentStart = clone $start;
|
||||||
$range = app('steam')->balanceInRange($account, $start, clone $end);
|
$range = app('steam')->balanceInRange($account, $start, clone $end);
|
||||||
// 2022-10-11 this method no longer converts to float.
|
// 2022-10-11 this method no longer converts to float.
|
||||||
|
@@ -85,12 +85,11 @@ abstract class Controller extends BaseController
|
|||||||
{
|
{
|
||||||
$bag = new ParameterBag();
|
$bag = new ParameterBag();
|
||||||
$page = (int)request()->get('page');
|
$page = (int)request()->get('page');
|
||||||
|
|
||||||
if ($page < 1) {
|
if ($page < 1) {
|
||||||
$page = 1;
|
$page = 1;
|
||||||
}
|
}
|
||||||
if ($page > (2 ^ 16)) {
|
if ($page > pow(2, 16)) {
|
||||||
$page = (2 ^ 16);
|
$page = pow(2, 16);
|
||||||
}
|
}
|
||||||
$bag->set('page', $page);
|
$bag->set('page', $page);
|
||||||
|
|
||||||
@@ -103,6 +102,7 @@ abstract class Controller extends BaseController
|
|||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
|
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
|
||||||
Log::error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
|
Log::error($e->getTraceAsString());
|
||||||
$value = null;
|
$value = null;
|
||||||
}
|
}
|
||||||
$obj = null;
|
$obj = null;
|
||||||
@@ -111,7 +111,13 @@ abstract class Controller extends BaseController
|
|||||||
$obj = Carbon::parse($date);
|
$obj = Carbon::parse($date);
|
||||||
} catch (InvalidDateException | InvalidFormatException $e) {
|
} catch (InvalidDateException | InvalidFormatException $e) {
|
||||||
// don't care
|
// don't care
|
||||||
app('log')->warning(sprintf('Ignored invalid date "%s" in API controller parameter check: %s', substr($date, 0, 20), $e->getMessage()));
|
app('log')->warning(
|
||||||
|
sprintf(
|
||||||
|
'Ignored invalid date "%s" in API controller parameter check: %s',
|
||||||
|
substr($date, 0, 20),
|
||||||
|
$e->getMessage()
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$bag->set($field, $obj);
|
$bag->set($field, $obj);
|
||||||
@@ -125,6 +131,7 @@ abstract class Controller extends BaseController
|
|||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer));
|
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer));
|
||||||
Log::error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
|
Log::error($e->getTraceAsString());
|
||||||
$value = null;
|
$value = null;
|
||||||
}
|
}
|
||||||
if (null !== $value) {
|
if (null !== $value) {
|
||||||
@@ -149,6 +156,7 @@ abstract class Controller extends BaseController
|
|||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.');
|
Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.');
|
||||||
Log::error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
|
Log::error($e->getTraceAsString());
|
||||||
$param = '';
|
$param = '';
|
||||||
}
|
}
|
||||||
if ('' === $param) {
|
if ('' === $param) {
|
||||||
@@ -171,7 +179,6 @@ abstract class Controller extends BaseController
|
|||||||
return $bag;
|
return $bag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to help build URL's.
|
* Method to help build URL's.
|
||||||
*
|
*
|
||||||
|
@@ -94,19 +94,39 @@ class DestroyController extends Controller
|
|||||||
case 'object_groups':
|
case 'object_groups':
|
||||||
$this->destroyObjectGroups();
|
$this->destroyObjectGroups();
|
||||||
break;
|
break;
|
||||||
|
case 'not_assets_liabilities':
|
||||||
|
$this->destroyAccounts(
|
||||||
|
[
|
||||||
|
AccountType::BENEFICIARY,
|
||||||
|
AccountType::CASH,
|
||||||
|
AccountType::CREDITCARD,
|
||||||
|
AccountType::DEFAULT,
|
||||||
|
AccountType::EXPENSE,
|
||||||
|
AccountType::IMPORT,
|
||||||
|
AccountType::INITIAL_BALANCE,
|
||||||
|
AccountType::LIABILITY_CREDIT,
|
||||||
|
AccountType::RECONCILIATION,
|
||||||
|
AccountType::REVENUE,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
case 'accounts':
|
case 'accounts':
|
||||||
$this->destroyAccounts(
|
$this->destroyAccounts(
|
||||||
[
|
[
|
||||||
AccountType::ASSET,
|
AccountType::ASSET,
|
||||||
AccountType::DEFAULT,
|
|
||||||
AccountType::BENEFICIARY,
|
AccountType::BENEFICIARY,
|
||||||
AccountType::EXPENSE,
|
AccountType::CASH,
|
||||||
AccountType::REVENUE,
|
AccountType::CREDITCARD,
|
||||||
AccountType::INITIAL_BALANCE,
|
|
||||||
AccountType::DEBT,
|
AccountType::DEBT,
|
||||||
|
AccountType::DEFAULT,
|
||||||
|
AccountType::EXPENSE,
|
||||||
|
AccountType::IMPORT,
|
||||||
|
AccountType::INITIAL_BALANCE,
|
||||||
|
AccountType::LIABILITY_CREDIT,
|
||||||
AccountType::LOAN,
|
AccountType::LOAN,
|
||||||
AccountType::MORTGAGE,
|
AccountType::MORTGAGE,
|
||||||
AccountType::CREDITCARD,
|
AccountType::RECONCILIATION,
|
||||||
|
AccountType::REVENUE,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
@@ -259,6 +279,9 @@ class DestroyController extends Controller
|
|||||||
$tagRepository->destroyAll();
|
$tagRepository->destroyAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
private function destroyObjectGroups(): void
|
private function destroyObjectGroups(): void
|
||||||
{
|
{
|
||||||
/** @var ObjectGroupRepositoryInterface $repository */
|
/** @var ObjectGroupRepositoryInterface $repository */
|
||||||
|
@@ -29,6 +29,8 @@ use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest;
|
|||||||
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;
|
||||||
|
use Psr\Container\ContainerExceptionInterface;
|
||||||
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ExportController
|
* Class ExportController
|
||||||
@@ -74,6 +76,8 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @return LaravelResponse
|
* @return LaravelResponse
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
|
* @throws ContainerExceptionInterface
|
||||||
|
* @throws NotFoundExceptionInterface
|
||||||
*/
|
*/
|
||||||
private function returnExport(string $key): LaravelResponse
|
private function returnExport(string $key): LaravelResponse
|
||||||
{
|
{
|
||||||
|
@@ -37,12 +37,16 @@ use FireflyIII\Models\TransactionGroup;
|
|||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PurgeController
|
||||||
|
*/
|
||||||
class PurgeController extends Controller
|
class PurgeController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* TODO cleanup and use repositories.
|
* TODO cleanup and use repositories.
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function purge(): JsonResponse
|
public function purge(): JsonResponse
|
||||||
|
@@ -29,8 +29,8 @@ use FireflyIII\Models\Account;
|
|||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Transformers\AccountTransformer;
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
use Log;
|
|
||||||
use Preferences;
|
use Preferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -34,8 +34,8 @@ use FireflyIII\Transformers\AttachmentTransformer;
|
|||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
use Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class StoreController
|
* Class StoreController
|
||||||
|
@@ -24,7 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
|
namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
|
||||||
|
|
||||||
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\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
@@ -108,12 +108,12 @@ class ShowController extends Controller
|
|||||||
*
|
*
|
||||||
* Display a listing of the budget limits for this budget.
|
* Display a listing of the budget limits for this budget.
|
||||||
*
|
*
|
||||||
* @param DateRequest $request
|
* @param SameDateRequest $request
|
||||||
*
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function indexAll(DateRequest $request): JsonResponse
|
public function indexAll(SameDateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
$manager->parseIncludes('budget');
|
$manager->parseIncludes('budget');
|
||||||
|
@@ -96,6 +96,7 @@ class TriggerController extends Controller
|
|||||||
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
|
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// file the rule(s)
|
// file the rule(s)
|
||||||
$transactions = $ruleEngine->find();
|
$transactions = $ruleEngine->find();
|
||||||
$count = $transactions->count();
|
$count = $transactions->count();
|
||||||
@@ -149,6 +150,7 @@ class TriggerController extends Controller
|
|||||||
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
|
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// fire the rule(s)
|
// fire the rule(s)
|
||||||
$ruleEngine->fire();
|
$ruleEngine->fire();
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@ use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
|||||||
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository;
|
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepository;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class DestroyController
|
* Class DestroyController
|
||||||
|
@@ -35,9 +35,9 @@ use FireflyIII\Support\Http\Api\TransactionFilter;
|
|||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
use Log;
|
|
||||||
use Validator;
|
use Validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -32,8 +32,8 @@ use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface
|
|||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
use Log;
|
|
||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,6 +79,7 @@ class UpdateController extends Controller
|
|||||||
{
|
{
|
||||||
Log::debug('Now in update routine for transaction group!');
|
Log::debug('Now in update routine for transaction group!');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
|
|
||||||
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
|
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
@@ -30,6 +30,9 @@ use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
|
|||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class DestroyController
|
||||||
|
*/
|
||||||
class DestroyController extends Controller
|
class DestroyController extends Controller
|
||||||
{
|
{
|
||||||
private LinkTypeRepositoryInterface $repository;
|
private LinkTypeRepositoryInterface $repository;
|
||||||
|
@@ -37,6 +37,9 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
|||||||
use League\Fractal\Resource\Collection as FractalCollection;
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ShowController
|
||||||
|
*/
|
||||||
class ShowController extends Controller
|
class ShowController extends Controller
|
||||||
{
|
{
|
||||||
private LinkTypeRepositoryInterface $repository;
|
private LinkTypeRepositoryInterface $repository;
|
||||||
|
@@ -35,6 +35,9 @@ use FireflyIII\User;
|
|||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class StoreController
|
||||||
|
*/
|
||||||
class StoreController extends Controller
|
class StoreController extends Controller
|
||||||
{
|
{
|
||||||
use TransactionFilter;
|
use TransactionFilter;
|
||||||
|
@@ -34,6 +34,9 @@ use FireflyIII\User;
|
|||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class UpdateController
|
||||||
|
*/
|
||||||
class UpdateController extends Controller
|
class UpdateController extends Controller
|
||||||
{
|
{
|
||||||
private JournalRepositoryInterface $journalRepository;
|
private JournalRepositoryInterface $journalRepository;
|
||||||
|
@@ -32,10 +32,9 @@ use Illuminate\Http\JsonResponse;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Response;
|
use Illuminate\Http\Response;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use JsonException;
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
use League\Fractal\Resource\Collection as FractalCollection;
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
use Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AccountController
|
* Class AccountController
|
||||||
@@ -61,12 +60,12 @@ class AccountController extends Controller
|
|||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/search/searchAccounts
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/search/searchAccounts
|
||||||
|
*
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
*
|
*
|
||||||
* @return JsonResponse|Response
|
* @return JsonResponse|Response
|
||||||
* @throws JsonException
|
|
||||||
*/
|
*/
|
||||||
public function search(Request $request)
|
public function search(Request $request): JsonResponse | Response
|
||||||
{
|
{
|
||||||
Log::debug('Now in account search()');
|
Log::debug('Now in account search()');
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
@@ -71,6 +71,8 @@ class TransactionController extends Controller
|
|||||||
$resource = new Collection($transactions, $transformer, 'transactions');
|
$resource = new Collection($transactions, $transformer, 'transactions');
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($groups));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($groups));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
$array = $manager->createData($resource)->toArray();
|
||||||
|
|
||||||
|
return response()->json($array)->header('Content-Type', self::CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -240,44 +240,43 @@ class BasicController extends Controller
|
|||||||
* Since both this method and the chart use the exact same data, we can suffice
|
* Since both this method and the chart use the exact same data, we can suffice
|
||||||
* with calling the one method in the bill repository that will get this amount.
|
* with calling the one method in the bill repository that will get this amount.
|
||||||
*/
|
*/
|
||||||
$paidAmount = $this->billRepository->getBillsPaidInRangePerCurrency($start, $end);
|
$paidAmount = $this->billRepository->sumPaidInRange($start, $end);
|
||||||
$unpaidAmount = $this->billRepository->getBillsUnpaidInRangePerCurrency($start, $end);
|
$unpaidAmount = $this->billRepository->sumUnpaidInRange($start, $end);
|
||||||
|
|
||||||
$return = [];
|
$return = [];
|
||||||
foreach ($paidAmount as $currencyId => $amount) {
|
/**
|
||||||
$amount = bcmul($amount, '-1');
|
* @var array $info
|
||||||
$currency = $this->currencyRepos->find((int)$currencyId);
|
*/
|
||||||
if (null === $currency) {
|
foreach ($paidAmount as $info) {
|
||||||
continue;
|
$amount = bcmul($info['sum'], '-1');
|
||||||
}
|
|
||||||
$return[] = [
|
$return[] = [
|
||||||
'key' => sprintf('bills-paid-in-%s', $currency->code),
|
'key' => sprintf('bills-paid-in-%s', $info['code']),
|
||||||
'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $currency->symbol]),
|
'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $info['symbol']]),
|
||||||
'monetary_value' => $amount,
|
'monetary_value' => $amount,
|
||||||
'currency_id' => $currency->id,
|
'currency_id' => $info['id'],
|
||||||
'currency_code' => $currency->code,
|
'currency_code' => $info['code'],
|
||||||
'currency_symbol' => $currency->symbol,
|
'currency_symbol' => $info['symbol'],
|
||||||
'currency_decimal_places' => $currency->decimal_places,
|
'currency_decimal_places' => $info['decimal_places'],
|
||||||
'value_parsed' => app('amount')->formatAnything($currency, $amount, false),
|
'value_parsed' => app('amount')->formatFlat($info['symbol'], $info['decimal_places'], $amount, false),
|
||||||
'local_icon' => 'check',
|
'local_icon' => 'check',
|
||||||
'sub_title' => '',
|
'sub_title' => '',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($unpaidAmount as $currencyId => $amount) {
|
/**
|
||||||
$amount = bcmul($amount, '-1');
|
* @var array $info
|
||||||
$currency = $this->currencyRepos->find((int)$currencyId);
|
*/
|
||||||
if (null === $currency) {
|
foreach ($unpaidAmount as $info) {
|
||||||
continue;
|
$amount = bcmul($info['sum'], '-1');
|
||||||
}
|
|
||||||
$return[] = [
|
$return[] = [
|
||||||
'key' => sprintf('bills-unpaid-in-%s', $currency->code),
|
'key' => sprintf('bills-unpaid-in-%s', $info['code']),
|
||||||
'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $currency->symbol]),
|
'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $info['symbol']]),
|
||||||
'monetary_value' => $amount,
|
'monetary_value' => $amount,
|
||||||
'currency_id' => $currency->id,
|
'currency_id' => $info['id'],
|
||||||
'currency_code' => $currency->code,
|
'currency_code' => $info['code'],
|
||||||
'currency_symbol' => $currency->symbol,
|
'currency_symbol' => $info['symbol'],
|
||||||
'currency_decimal_places' => $currency->decimal_places,
|
'currency_decimal_places' => $info['decimal_places'],
|
||||||
'value_parsed' => app('amount')->formatAnything($currency, $amount, false),
|
'value_parsed' => app('amount')->formatFlat($info['symbol'], $info['decimal_places'], $amount, false),
|
||||||
'local_icon' => 'calendar-o',
|
'local_icon' => 'calendar-o',
|
||||||
'sub_title' => '',
|
'sub_title' => '',
|
||||||
];
|
];
|
||||||
@@ -323,17 +322,12 @@ class BasicController extends Controller
|
|||||||
'currency_decimal_places' => $row['currency_decimal_places'],
|
'currency_decimal_places' => $row['currency_decimal_places'],
|
||||||
'value_parsed' => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false),
|
'value_parsed' => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false),
|
||||||
'local_icon' => 'money',
|
'local_icon' => 'money',
|
||||||
'sub_title' => (string)trans(
|
'sub_title' => app('amount')->formatFlat(
|
||||||
'firefly.box_spend_per_day',
|
|
||||||
[
|
|
||||||
'amount' => app('amount')->formatFlat(
|
|
||||||
$row['currency_symbol'],
|
$row['currency_symbol'],
|
||||||
$row['currency_decimal_places'],
|
$row['currency_decimal_places'],
|
||||||
$perDay,
|
$perDay,
|
||||||
false
|
false
|
||||||
),
|
),
|
||||||
]
|
|
||||||
),
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,7 +29,7 @@ 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 Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use Psr\Container\ContainerExceptionInterface;
|
use Psr\Container\ContainerExceptionInterface;
|
||||||
use Psr\Container\NotFoundExceptionInterface;
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
use Validator;
|
use Validator;
|
||||||
@@ -138,7 +138,6 @@ class ConfigurationController extends Controller
|
|||||||
*
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
* @throws ContainerExceptionInterface
|
* @throws ContainerExceptionInterface
|
||||||
* @throws FireflyException
|
|
||||||
* @throws NotFoundExceptionInterface
|
* @throws NotFoundExceptionInterface
|
||||||
*/
|
*/
|
||||||
public function show(string $configKey): JsonResponse
|
public function show(string $configKey): JsonResponse
|
||||||
|
@@ -27,7 +27,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\System\CronRequest;
|
use FireflyIII\Api\V1\Requests\System\CronRequest;
|
||||||
use FireflyIII\Support\Http\Controllers\CronRunner;
|
use FireflyIII\Support\Http\Controllers\CronRunner;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Psr\Container\ContainerExceptionInterface;
|
||||||
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class CronController
|
* Class CronController
|
||||||
@@ -44,6 +46,8 @@ class CronController extends Controller
|
|||||||
* @param string $token
|
* @param string $token
|
||||||
*
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
|
* @throws ContainerExceptionInterface
|
||||||
|
* @throws NotFoundExceptionInterface
|
||||||
*/
|
*/
|
||||||
public function cron(CronRequest $request, string $token): JsonResponse
|
public function cron(CronRequest $request, string $token): JsonResponse
|
||||||
{
|
{
|
||||||
@@ -54,6 +58,10 @@ class CronController extends Controller
|
|||||||
$return = [];
|
$return = [];
|
||||||
$return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']);
|
$return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']);
|
||||||
$return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']);
|
$return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']);
|
||||||
|
if (true === config('cer.download_enabled')) {
|
||||||
|
$return['exchange_rates'] = $this->exchangeRatesCronJob($config['force'], $config['date']);
|
||||||
|
}
|
||||||
|
$return['bill_warnings'] = $this->billWarningCronJob($config['force'], $config['date']);
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->json($return);
|
||||||
}
|
}
|
||||||
|
@@ -35,6 +35,9 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
|||||||
use League\Fractal\Resource\Collection as FractalCollection;
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class MessageController
|
||||||
|
*/
|
||||||
class MessageController extends Controller
|
class MessageController extends Controller
|
||||||
{
|
{
|
||||||
public const RESOURCE_KEY = 'webhook_messages';
|
public const RESOURCE_KEY = 'webhook_messages';
|
||||||
|
@@ -122,10 +122,12 @@ class ShowController extends Controller
|
|||||||
*
|
*
|
||||||
* @param Webhook $webhook
|
* @param Webhook $webhook
|
||||||
* @param TransactionGroup $group
|
* @param TransactionGroup $group
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function triggerTransaction(Webhook $webhook, TransactionGroup $group): JsonResponse
|
public function triggerTransaction(Webhook $webhook, TransactionGroup $group): JsonResponse
|
||||||
{
|
{
|
||||||
|
app('log')->debug(sprintf('Now in triggerTransaction(%d, %d)', $webhook->id, $group->id));
|
||||||
/** @var MessageGeneratorInterface $engine */
|
/** @var MessageGeneratorInterface $engine */
|
||||||
$engine = app(MessageGeneratorInterface::class);
|
$engine = app(MessageGeneratorInterface::class);
|
||||||
$engine->setUser(auth()->user());
|
$engine->setUser(auth()->user());
|
||||||
@@ -140,7 +142,9 @@ class ShowController extends Controller
|
|||||||
$engine->generateMessages();
|
$engine->generateMessages();
|
||||||
|
|
||||||
// trigger event to send them:
|
// trigger event to send them:
|
||||||
|
app('log')->debug('send event RequestedSendWebhookMessages');
|
||||||
event(new RequestedSendWebhookMessages());
|
event(new RequestedSendWebhookMessages());
|
||||||
|
|
||||||
return response()->json([], 204);
|
return response()->json([], 204);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -83,6 +83,7 @@ class MoveTransactionsRequest extends FormRequest
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Validator $validator
|
* @param Validator $validator
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function validateMove(Validator $validator): void
|
private function validateMove(Validator $validator): void
|
||||||
|
@@ -30,9 +30,9 @@ use FireflyIII\Support\Request\ChecksLogin;
|
|||||||
use FireflyIII\Support\Request\ConvertsDataTypes;
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
use FireflyIII\Validation\Api\Data\Bulk\ValidatesBulkTransactionQuery;
|
use FireflyIII\Validation\Api\Data\Bulk\ValidatesBulkTransactionQuery;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use JsonException;
|
use JsonException;
|
||||||
use Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class TransactionRequest
|
* Class TransactionRequest
|
||||||
|
@@ -53,10 +53,11 @@ class DestroyRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
$valid = 'budgets,bills,piggy_banks,rules,recurring,categories,tags,object_groups' .
|
$valid = 'budgets,bills,piggy_banks,rules,recurring,categories,tags,object_groups' .
|
||||||
',accounts,asset_accounts,expense_accounts,revenue_accounts,liabilities,transactions,withdrawals,deposits,transfers';
|
',accounts,asset_accounts,expense_accounts,revenue_accounts,liabilities,transactions,withdrawals,deposits,transfers' .
|
||||||
|
',not_assets_liabilities';
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'objects' => sprintf('required|min:1|string|in:%s', $valid),
|
'objects' => sprintf('required|max:255|min:1|string|in:%s', $valid),
|
||||||
'unused' => 'in:true,false',
|
'unused' => 'in:true,false',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@@ -38,6 +38,9 @@ class ExportRequest extends FormRequest
|
|||||||
use ChecksLogin;
|
use ChecksLogin;
|
||||||
use ConvertsDataTypes;
|
use ConvertsDataTypes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function getAll(): array
|
public function getAll(): array
|
||||||
{
|
{
|
||||||
$result = [
|
$result = [
|
||||||
@@ -73,7 +76,7 @@ class ExportRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'type' => 'in:csv',
|
'type' => 'in:csv',
|
||||||
'accounts' => 'min:1',
|
'accounts' => 'min:1|max:65536',
|
||||||
'start' => 'date|before:end',
|
'start' => 'date|before:end',
|
||||||
'end' => 'date|after:start',
|
'end' => 'date|after:start',
|
||||||
];
|
];
|
||||||
|
66
app/Api/V1/Requests/Data/SameDateRequest.php
Normal file
66
app/Api/V1/Requests/Data/SameDateRequest.php
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DateRequest.php
|
||||||
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests\Data;
|
||||||
|
|
||||||
|
use FireflyIII\Support\Request\ChecksLogin;
|
||||||
|
use FireflyIII\Support\Request\ConvertsDataTypes;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request class for end points that require date parameters.
|
||||||
|
*
|
||||||
|
* Class SameDateRequest
|
||||||
|
*/
|
||||||
|
class SameDateRequest extends FormRequest
|
||||||
|
{
|
||||||
|
use ConvertsDataTypes;
|
||||||
|
use ChecksLogin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all data from the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'start' => $this->getCarbonDate('start'),
|
||||||
|
'end' => $this->getCarbonDate('end'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The rules that the incoming request must be matched against.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'start' => 'required|date',
|
||||||
|
'end' => 'required|date|after_or_equal:start',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@@ -103,8 +103,8 @@ class StoreRequest extends FormRequest
|
|||||||
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
|
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
|
||||||
$type = $this->convertString('type');
|
$type = $this->convertString('type');
|
||||||
$rules = [
|
$rules = [
|
||||||
'name' => 'required|min:1|uniqueAccountForUser',
|
'name' => 'required|max:1024|min:1|uniqueAccountForUser',
|
||||||
'type' => 'required|min:1|'.sprintf('in:%s', $types),
|
'type' => 'required|max:1024|min:1|' . sprintf('in:%s', $types),
|
||||||
'iban' => ['iban', 'nullable', new UniqueIban(null, $type)],
|
'iban' => ['iban', 'nullable', new UniqueIban(null, $type)],
|
||||||
'bic' => 'bic|nullable',
|
'bic' => 'bic|nullable',
|
||||||
'account_number' => ['between:1,255', 'nullable', new UniqueAccountNumber(null, $type)],
|
'account_number' => ['between:1,255', 'nullable', new UniqueAccountNumber(null, $type)],
|
||||||
@@ -120,7 +120,7 @@ class StoreRequest extends FormRequest
|
|||||||
'credit_card_type' => sprintf('nullable|in:%s|required_if:account_role,ccAsset', $ccPaymentTypes),
|
'credit_card_type' => sprintf('nullable|in:%s|required_if:account_role,ccAsset', $ccPaymentTypes),
|
||||||
'monthly_payment_date' => 'nullable|date|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
|
'monthly_payment_date' => 'nullable|date|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
|
||||||
'liability_type' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:loan,debt,mortgage',
|
'liability_type' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:loan,debt,mortgage',
|
||||||
'liability_amount' => 'required_with:liability_start_date|min:0|numeric',
|
'liability_amount' => 'required_with:liability_start_date|min:0|numeric|max:1000000000',
|
||||||
'liability_start_date' => 'required_with:liability_amount|date',
|
'liability_start_date' => 'required_with:liability_amount|date',
|
||||||
'liability_direction' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:credit,debit',
|
'liability_direction' => 'nullable|required_if:type,liability|required_if:type,liabilities|in:credit,debit',
|
||||||
'interest' => 'between:0,100|numeric',
|
'interest' => 'between:0,100|numeric',
|
||||||
|
@@ -33,7 +33,6 @@ use FireflyIII\Support\Request\AppendsLocationData;
|
|||||||
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 Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class UpdateRequest
|
* Class UpdateRequest
|
||||||
@@ -63,9 +62,9 @@ class UpdateRequest extends FormRequest
|
|||||||
'account_role' => ['account_role', 'convertString'],
|
'account_role' => ['account_role', 'convertString'],
|
||||||
'liability_type' => ['liability_type', 'convertString'],
|
'liability_type' => ['liability_type', 'convertString'],
|
||||||
'opening_balance' => ['opening_balance', 'convertString'],
|
'opening_balance' => ['opening_balance', 'convertString'],
|
||||||
'opening_balance_date' => ['opening_balance_date', 'date'],
|
'opening_balance_date' => ['opening_balance_date', 'convertDateTime'],
|
||||||
'cc_type' => ['credit_card_type', 'convertString'],
|
'cc_type' => ['credit_card_type', 'convertString'],
|
||||||
'cc_monthly_payment_date' => ['monthly_payment_date', 'convertString'],
|
'cc_monthly_payment_date' => ['monthly_payment_date', 'convertDateTime'],
|
||||||
'notes' => ['notes', 'stringWithNewlines'],
|
'notes' => ['notes', 'stringWithNewlines'],
|
||||||
'interest' => ['interest', 'convertString'],
|
'interest' => ['interest', 'convertString'],
|
||||||
'interest_period' => ['interest_period', 'convertString'],
|
'interest_period' => ['interest_period', 'convertString'],
|
||||||
@@ -77,6 +76,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'liability_start_date' => ['liability_start_date', 'date'],
|
'liability_start_date' => ['liability_start_date', 'date'],
|
||||||
];
|
];
|
||||||
$data = $this->getAllData($fields);
|
$data = $this->getAllData($fields);
|
||||||
|
|
||||||
return $this->appendLocationData($data, null);
|
return $this->appendLocationData($data, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ class UpdateRequest extends FormRequest
|
|||||||
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
|
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
|
||||||
|
|
||||||
$rules = [
|
$rules = [
|
||||||
'name' => sprintf('min:1|uniqueAccountForUser:%d', $account->id),
|
'name' => sprintf('min:1|max:1024|uniqueAccountForUser:%d', $account->id),
|
||||||
'type' => sprintf('in:%s', $types),
|
'type' => sprintf('in:%s', $types),
|
||||||
'iban' => ['iban', 'nullable', new UniqueIban($account, $this->convertString('type'))],
|
'iban' => ['iban', 'nullable', new UniqueIban($account, $this->convertString('type'))],
|
||||||
'bic' => 'bic|nullable',
|
'bic' => 'bic|nullable',
|
||||||
@@ -104,7 +104,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'virtual_balance' => 'numeric|nullable',
|
'virtual_balance' => 'numeric|nullable',
|
||||||
'order' => 'numeric|nullable',
|
'order' => 'numeric|nullable',
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
'include_net_worth' => [new IsBoolean()],
|
'include_net_worth' => [new IsBoolean()],
|
||||||
'account_role' => sprintf('in:%s|nullable|required_if:type,asset', $accountRoles),
|
'account_role' => sprintf('in:%s|nullable|required_if:type,asset', $accountRoles),
|
||||||
|
@@ -67,7 +67,7 @@ class Request extends FormRequest
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'amount' => 'numeric|gt:0',
|
'amount' => 'numeric|gt:0',
|
||||||
'start' => 'date',
|
'start' => 'date',
|
||||||
'end' => 'date',
|
'end' => 'date',
|
||||||
|
@@ -28,8 +28,8 @@ use FireflyIII\Rules\IsBoolean;
|
|||||||
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;
|
use Illuminate\Validation\Validator;
|
||||||
use Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class StoreRequest
|
* Class StoreRequest
|
||||||
@@ -82,7 +82,7 @@ class StoreRequest extends FormRequest
|
|||||||
'amount_min' => 'numeric|gt:0|required',
|
'amount_min' => 'numeric|gt:0|required',
|
||||||
'amount_max' => 'numeric|gt:0|required',
|
'amount_max' => 'numeric|gt:0|required',
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'date' => 'date|required',
|
'date' => 'date|required',
|
||||||
'end_date' => 'date|after:date',
|
'end_date' => 'date|after:date',
|
||||||
'extension_date' => 'date|after:date',
|
'extension_date' => 'date|after:date',
|
||||||
@@ -105,8 +105,8 @@ class StoreRequest extends FormRequest
|
|||||||
$validator->after(
|
$validator->after(
|
||||||
static function (Validator $validator) {
|
static function (Validator $validator) {
|
||||||
$data = $validator->getData();
|
$data = $validator->getData();
|
||||||
$min = $data['amount_min'] ?? '0';
|
$min = (string)($data['amount_min'] ?? '0');
|
||||||
$max = $data['amount_max'] ?? '0';
|
$max = (string)($data['amount_max'] ?? '0');
|
||||||
|
|
||||||
if (1 === bccomp($min, $max)) {
|
if (1 === bccomp($min, $max)) {
|
||||||
$validator->errors()->add('amount_min', (string)trans('validation.amount_min_over_max'));
|
$validator->errors()->add('amount_min', (string)trans('validation.amount_min_over_max'));
|
||||||
|
@@ -84,7 +84,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'amount_min' => 'numeric|gt:0',
|
'amount_min' => 'numeric|gt:0',
|
||||||
'amount_max' => 'numeric|gt:0',
|
'amount_max' => 'numeric|gt:0',
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
'date' => 'date',
|
'date' => 'date',
|
||||||
'end_date' => 'date|after:date',
|
'end_date' => 'date|after:date',
|
||||||
'extension_date' => 'date|after:date',
|
'extension_date' => 'date|after:date',
|
||||||
|
@@ -79,9 +79,9 @@ class StoreRequest extends FormRequest
|
|||||||
'currency_code' => 'exists:transaction_currencies,code',
|
'currency_code' => 'exists:transaction_currencies,code',
|
||||||
'notes' => 'nullable|between:1,65536',
|
'notes' => 'nullable|between:1,65536',
|
||||||
// auto budget info
|
// auto budget info
|
||||||
'auto_budget_type' => 'in:reset,rollover,none',
|
'auto_budget_type' => 'in:reset,rollover,adjusted,none',
|
||||||
'auto_budget_amount' => 'numeric|min:0|max:1000000000|required_if:auto_budget_type,reset|required_if:auto_budget_type,rollover',
|
'auto_budget_amount' => 'numeric|min:0|max:1000000000|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',
|
'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',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -67,6 +67,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'none' => 0,
|
'none' => 0,
|
||||||
'reset' => 1,
|
'reset' => 1,
|
||||||
'rollover' => 2,
|
'rollover' => 2,
|
||||||
|
'adjusted' => 3,
|
||||||
];
|
];
|
||||||
$allData['auto_budget_type'] = $types[$allData['auto_budget_type']] ?? 0;
|
$allData['auto_budget_type'] = $types[$allData['auto_budget_type']] ?? 0;
|
||||||
}
|
}
|
||||||
@@ -88,7 +89,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'name' => sprintf('between:1,100|uniqueObjectForUser:budgets,name,%d', $budget->id),
|
'name' => sprintf('between:1,100|uniqueObjectForUser:budgets,name,%d', $budget->id),
|
||||||
'active' => [new IsBoolean()],
|
'active' => [new IsBoolean()],
|
||||||
'notes' => 'nullable|between:1,65536',
|
'notes' => 'nullable|between:1,65536',
|
||||||
'auto_budget_type' => 'in:reset,rollover,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' => 'min:0|max:1000000000',
|
'auto_budget_amount' => 'min:0|max:1000000000',
|
||||||
|
@@ -65,7 +65,7 @@ class StoreRequest extends FormRequest
|
|||||||
'end' => 'required|after:start|date',
|
'end' => 'required|after:start|date',
|
||||||
'amount' => 'required|gt:0',
|
'amount' => 'required|gt:0',
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -69,7 +69,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'end' => 'date',
|
'end' => 'date',
|
||||||
'amount' => 'gt:0',
|
'amount' => 'gt:0',
|
||||||
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
'currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'currency_code' => 'min:3|max:51|exists:transaction_currencies,code',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -63,7 +63,7 @@ class UpdateRequest extends FormRequest
|
|||||||
$objectGroup = $this->route()->parameter('objectGroup');
|
$objectGroup = $this->route()->parameter('objectGroup');
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'title' => sprintf('min:1|uniqueObjectGroup:%d', $objectGroup->id),
|
'title' => sprintf('max:1024|min:1|uniqueObjectGroup:%d', $objectGroup->id),
|
||||||
'order' => 'numeric',
|
'order' => 'numeric',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@@ -52,8 +52,8 @@ class UpdateRequest extends FormRequest
|
|||||||
'account_id' => ['account_id', 'convertInteger'],
|
'account_id' => ['account_id', 'convertInteger'],
|
||||||
'targetamount' => ['target_amount', 'convertString'],
|
'targetamount' => ['target_amount', 'convertString'],
|
||||||
'current_amount' => ['current_amount', 'convertString'],
|
'current_amount' => ['current_amount', 'convertString'],
|
||||||
'startdate' => ['start_date', 'date'],
|
'startdate' => ['start_date', 'convertDateTime'],
|
||||||
'targetdate' => ['target_date', 'convertString'],
|
'targetdate' => ['target_date', 'convertDateTime'],
|
||||||
'notes' => ['notes', 'stringWithNewlines'],
|
'notes' => ['notes', 'stringWithNewlines'],
|
||||||
'order' => ['order', 'convertInteger'],
|
'order' => ['order', 'convertInteger'],
|
||||||
'object_group_title' => ['object_group_title', 'convertString'],
|
'object_group_title' => ['object_group_title', 'convertString'],
|
||||||
@@ -76,7 +76,7 @@ class UpdateRequest extends FormRequest
|
|||||||
return [
|
return [
|
||||||
'name' => 'between:1,255|uniquePiggyBankForUser:' . $piggyBank->id,
|
'name' => 'between:1,255|uniquePiggyBankForUser:' . $piggyBank->id,
|
||||||
'current_amount' => ['numeric', 'gte:0', new LessThanPiggyTarget()],
|
'current_amount' => ['numeric', 'gte:0', new LessThanPiggyTarget()],
|
||||||
'target_amount' => 'numeric|gt:0',
|
'target_amount' => 'numeric|gte:0',
|
||||||
'start_date' => 'date|nullable',
|
'start_date' => 'date|nullable',
|
||||||
'target_date' => 'date|nullable|after:start_date',
|
'target_date' => 'date|nullable|after:start_date',
|
||||||
'notes' => 'max:65000',
|
'notes' => 'max:65000',
|
||||||
|
@@ -57,8 +57,8 @@ class StoreRequest extends FormRequest
|
|||||||
'type' => ['type', 'convertString'],
|
'type' => ['type', 'convertString'],
|
||||||
'title' => ['title', 'convertString'],
|
'title' => ['title', 'convertString'],
|
||||||
'description' => ['description', 'convertString'],
|
'description' => ['description', 'convertString'],
|
||||||
'first_date' => ['first_date', 'date'],
|
'first_date' => ['first_date', 'convertDateTime'],
|
||||||
'repeat_until' => ['repeat_until', 'date'],
|
'repeat_until' => ['repeat_until', 'convertDateTime'],
|
||||||
'nr_of_repetitions' => ['nr_of_repetitions', 'convertInteger'],
|
'nr_of_repetitions' => ['nr_of_repetitions', 'convertInteger'],
|
||||||
'apply_rules' => ['apply_rules', 'boolean'],
|
'apply_rules' => ['apply_rules', 'boolean'],
|
||||||
'active' => ['active', 'boolean'],
|
'active' => ['active', 'boolean'],
|
||||||
@@ -158,9 +158,9 @@ class StoreRequest extends FormRequest
|
|||||||
'transactions.*.amount' => 'required|numeric|gt:0',
|
'transactions.*.amount' => 'required|numeric|gt:0',
|
||||||
'transactions.*.foreign_amount' => 'nullable|numeric|gt:0',
|
'transactions.*.foreign_amount' => 'nullable|numeric|gt:0',
|
||||||
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||||
'transactions.*.currency_code' => 'nullable|min:3|max:3|exists:transaction_currencies,code',
|
'transactions.*.currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||||
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||||
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:3|exists:transaction_currencies,code',
|
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||||
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||||
'transactions.*.source_name' => 'between:1,255|nullable',
|
'transactions.*.source_name' => 'between:1,255|nullable',
|
||||||
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||||
|
@@ -58,8 +58,8 @@ class UpdateRequest extends FormRequest
|
|||||||
$fields = [
|
$fields = [
|
||||||
'title' => ['title', 'convertString'],
|
'title' => ['title', 'convertString'],
|
||||||
'description' => ['description', 'convertString'],
|
'description' => ['description', 'convertString'],
|
||||||
'first_date' => ['first_date', 'date'],
|
'first_date' => ['first_date', 'convertDateTime'],
|
||||||
'repeat_until' => ['repeat_until', 'date'],
|
'repeat_until' => ['repeat_until', 'convertDateTime'],
|
||||||
'nr_of_repetitions' => ['nr_of_repetitions', 'convertInteger'],
|
'nr_of_repetitions' => ['nr_of_repetitions', 'convertInteger'],
|
||||||
'apply_rules' => ['apply_rules', 'boolean'],
|
'apply_rules' => ['apply_rules', 'boolean'],
|
||||||
'active' => ['active', 'boolean'],
|
'active' => ['active', 'boolean'],
|
||||||
@@ -172,9 +172,9 @@ class UpdateRequest extends FormRequest
|
|||||||
'transactions.*.amount' => 'numeric|gt:0',
|
'transactions.*.amount' => 'numeric|gt:0',
|
||||||
'transactions.*.foreign_amount' => 'nullable|numeric|gt:0',
|
'transactions.*.foreign_amount' => 'nullable|numeric|gt:0',
|
||||||
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
'transactions.*.currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||||
'transactions.*.currency_code' => 'nullable|min:3|max:3|exists:transaction_currencies,code',
|
'transactions.*.currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||||
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||||
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:3|exists:transaction_currencies,code',
|
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||||
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||||
'transactions.*.source_name' => 'between:1,255|nullable',
|
'transactions.*.source_name' => 'between:1,255|nullable',
|
||||||
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser()],
|
||||||
@@ -205,6 +205,11 @@ class UpdateRequest extends FormRequest
|
|||||||
function (Validator $validator) {
|
function (Validator $validator) {
|
||||||
//$this->validateOneRecurrenceTransaction($validator);
|
//$this->validateOneRecurrenceTransaction($validator);
|
||||||
//$this->validateOneRepetitionUpdate($validator);
|
//$this->validateOneRepetitionUpdate($validator);
|
||||||
|
|
||||||
|
|
||||||
|
/** @var Recurrence $recurrence */
|
||||||
|
$recurrence = $this->route()->parameter('recurrence');
|
||||||
|
$this->validateTransactionId($recurrence, $validator);
|
||||||
$this->validateRecurrenceRepetition($validator);
|
$this->validateRecurrenceRepetition($validator);
|
||||||
$this->validateRepetitionMoment($validator);
|
$this->validateRepetitionMoment($validator);
|
||||||
$this->validateForeignCurrencyInformation($validator);
|
$this->validateForeignCurrencyInformation($validator);
|
||||||
@@ -212,4 +217,5 @@ class UpdateRequest extends FormRequest
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -79,7 +79,7 @@ class StoreRequest extends FormRequest
|
|||||||
$return[] = [
|
$return[] = [
|
||||||
'type' => $trigger['type'],
|
'type' => $trigger['type'],
|
||||||
'value' => $trigger['value'],
|
'value' => $trigger['value'],
|
||||||
'active' => $this->convertBoolean((string)($trigger['active'] ?? 'false')),
|
'active' => $this->convertBoolean((string)($trigger['active'] ?? 'true')),
|
||||||
'stop_processing' => $this->convertBoolean((string)($trigger['stop_processing'] ?? 'false')),
|
'stop_processing' => $this->convertBoolean((string)($trigger['stop_processing'] ?? 'false')),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ class StoreRequest extends FormRequest
|
|||||||
$return[] = [
|
$return[] = [
|
||||||
'type' => $action['type'],
|
'type' => $action['type'],
|
||||||
'value' => $action['value'],
|
'value' => $action['value'],
|
||||||
'active' => $this->convertBoolean((string)($action['active'] ?? 'false')),
|
'active' => $this->convertBoolean((string)($action['active'] ?? 'true')),
|
||||||
'stop_processing' => $this->convertBoolean((string)($action['stop_processing'] ?? 'false')),
|
'stop_processing' => $this->convertBoolean((string)($action['stop_processing'] ?? 'false')),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@ class StoreRequest extends FormRequest
|
|||||||
'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title',
|
'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title',
|
||||||
'trigger' => 'required|in:store-journal,update-journal',
|
'trigger' => 'required|in:store-journal,update-journal',
|
||||||
'triggers.*.type' => 'required|in:' . implode(',', $validTriggers),
|
'triggers.*.type' => 'required|in:' . implode(',', $validTriggers),
|
||||||
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue',
|
'triggers.*.value' => 'required_if:actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue|max:1024',
|
||||||
'triggers.*.stop_processing' => [new IsBoolean()],
|
'triggers.*.stop_processing' => [new IsBoolean()],
|
||||||
'triggers.*.active' => [new IsBoolean()],
|
'triggers.*.active' => [new IsBoolean()],
|
||||||
'actions.*.type' => 'required|in:' . implode(',', $validActions),
|
'actions.*.type' => 'required|in:' . implode(',', $validActions),
|
||||||
|
@@ -147,7 +147,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'rule_group_title' => 'nullable|between:1,255|belongsToUser:rule_groups,title',
|
'rule_group_title' => 'nullable|between:1,255|belongsToUser:rule_groups,title',
|
||||||
'trigger' => 'in:store-journal,update-journal',
|
'trigger' => 'in:store-journal,update-journal',
|
||||||
'triggers.*.type' => 'required|in:' . implode(',', $validTriggers),
|
'triggers.*.type' => 'required|in:' . implode(',', $validTriggers),
|
||||||
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue',
|
'triggers.*.value' => 'required_if:actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue|max:1024',
|
||||||
'triggers.*.stop_processing' => [new IsBoolean()],
|
'triggers.*.stop_processing' => [new IsBoolean()],
|
||||||
'triggers.*.active' => [new IsBoolean()],
|
'triggers.*.active' => [new IsBoolean()],
|
||||||
'actions.*.type' => 'required|in:' . implode(',', $validActions),
|
'actions.*.type' => 'required|in:' . implode(',', $validActions),
|
||||||
|
@@ -65,8 +65,8 @@ class StoreRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
$rules = [
|
$rules = [
|
||||||
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag',
|
'tag' => 'required|min:1|uniqueObjectForUser:tags,tag|max:1024',
|
||||||
'description' => 'min:1|nullable',
|
'description' => 'min:1|nullable|max:65536',
|
||||||
'date' => 'date|nullable',
|
'date' => 'date|nullable',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@@ -71,8 +71,8 @@ class UpdateRequest extends FormRequest
|
|||||||
$tag = $this->route()->parameter('tagOrId');
|
$tag = $this->route()->parameter('tagOrId');
|
||||||
// TODO check if uniqueObjectForUser is obsolete
|
// TODO check if uniqueObjectForUser is obsolete
|
||||||
$rules = [
|
$rules = [
|
||||||
'tag' => 'min:1|uniqueObjectForUser:tags,tag,'.$tag->id,
|
'tag' => 'min:1|max:1024|uniqueObjectForUser:tags,tag,' . $tag->id,
|
||||||
'description' => 'min:1|nullable',
|
'description' => 'min:1|nullable|max:65536',
|
||||||
'date' => 'date|nullable',
|
'date' => 'date|nullable',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@@ -35,8 +35,8 @@ use FireflyIII\Validation\CurrencyValidation;
|
|||||||
use FireflyIII\Validation\GroupValidation;
|
use FireflyIII\Validation\GroupValidation;
|
||||||
use FireflyIII\Validation\TransactionValidation;
|
use FireflyIII\Validation\TransactionValidation;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Validation\Validator;
|
use Illuminate\Validation\Validator;
|
||||||
use Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class StoreRequest
|
* Class StoreRequest
|
||||||
@@ -188,9 +188,9 @@ class StoreRequest extends FormRequest
|
|||||||
|
|
||||||
// currency info
|
// currency info
|
||||||
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
||||||
'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code|nullable',
|
'transactions.*.currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
|
||||||
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
||||||
'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code|nullable',
|
'transactions.*.foreign_currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
|
||||||
|
|
||||||
// amount
|
// amount
|
||||||
'transactions.*.amount' => 'required|numeric|gt:0',
|
'transactions.*.amount' => 'required|numeric|gt:0',
|
||||||
@@ -225,25 +225,25 @@ class StoreRequest extends FormRequest
|
|||||||
|
|
||||||
// other interesting fields
|
// other interesting fields
|
||||||
'transactions.*.reconciled' => [new IsBoolean()],
|
'transactions.*.reconciled' => [new IsBoolean()],
|
||||||
'transactions.*.notes' => 'min:1,max:50000|nullable',
|
'transactions.*.notes' => 'min:1|max:50000|nullable',
|
||||||
'transactions.*.tags' => 'between:0,255',
|
'transactions.*.tags' => 'between:0,255',
|
||||||
|
|
||||||
// meta info fields
|
// meta info fields
|
||||||
'transactions.*.internal_reference' => 'min:1,max:255|nullable',
|
'transactions.*.internal_reference' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.external_id' => 'min:1,max:255|nullable',
|
'transactions.*.external_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.recurrence_id' => 'min:1,max:255|nullable',
|
'transactions.*.recurrence_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.bunq_payment_id' => 'min:1,max:255|nullable',
|
'transactions.*.bunq_payment_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.external_url' => 'min:1,max:255|nullable|url',
|
'transactions.*.external_url' => 'min:1|max:255|nullable|url',
|
||||||
|
|
||||||
// SEPA fields:
|
// SEPA fields:
|
||||||
'transactions.*.sepa_cc' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_cc' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ct_op' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ct_op' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ct_id' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ct_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_db' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_db' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_country' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_country' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ep' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ep' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ci' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ci' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_batch_id' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_batch_id' => 'min:1|max:255|nullable',
|
||||||
|
|
||||||
// dates
|
// dates
|
||||||
'transactions.*.interest_date' => 'date|nullable',
|
'transactions.*.interest_date' => 'date|nullable',
|
||||||
@@ -270,7 +270,9 @@ class StoreRequest extends FormRequest
|
|||||||
$this->validateTransactionArray($validator);
|
$this->validateTransactionArray($validator);
|
||||||
|
|
||||||
// must submit at least one transaction.
|
// must submit at least one transaction.
|
||||||
|
Log::debug('Now going to validateOneTransaction');
|
||||||
$this->validateOneTransaction($validator);
|
$this->validateOneTransaction($validator);
|
||||||
|
Log::debug('Now done with validateOneTransaction');
|
||||||
|
|
||||||
// all journals must have a description
|
// all journals must have a description
|
||||||
$this->validateDescriptions($validator);
|
$this->validateDescriptions($validator);
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
namespace FireflyIII\Api\V1\Requests\Models\Transaction;
|
||||||
|
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
use FireflyIII\Rules\BelongsUser;
|
use FireflyIII\Rules\BelongsUser;
|
||||||
use FireflyIII\Rules\IsBoolean;
|
use FireflyIII\Rules\IsBoolean;
|
||||||
@@ -58,6 +59,7 @@ class UpdateRequest extends FormRequest
|
|||||||
* Get all data. Is pretty complex because of all the ??-statements.
|
* Get all data. Is pretty complex because of all the ??-statements.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function getAll(): array
|
public function getAll(): array
|
||||||
{
|
{
|
||||||
@@ -151,6 +153,7 @@ class UpdateRequest extends FormRequest
|
|||||||
* Get transaction data.
|
* Get transaction data.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
private function getTransactionData(): array
|
private function getTransactionData(): array
|
||||||
{
|
{
|
||||||
@@ -163,6 +166,9 @@ class UpdateRequest extends FormRequest
|
|||||||
|
|
||||||
/** @var array $transaction */
|
/** @var array $transaction */
|
||||||
foreach ($this->get('transactions') as $transaction) {
|
foreach ($this->get('transactions') as $transaction) {
|
||||||
|
if (!is_array($transaction)) {
|
||||||
|
throw new FireflyException('Invalid data submitted: transaction is not array.');
|
||||||
|
}
|
||||||
// default response is to update nothing in the transaction:
|
// default response is to update nothing in the transaction:
|
||||||
$current = [];
|
$current = [];
|
||||||
$current = $this->getIntegerData($current, $transaction);
|
$current = $this->getIntegerData($current, $transaction);
|
||||||
@@ -287,6 +293,7 @@ class UpdateRequest extends FormRequest
|
|||||||
/**
|
/**
|
||||||
* @param array $current
|
* @param array $current
|
||||||
* @param array $transaction
|
* @param array $transaction
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function getFloatData(array $current, array $transaction): array
|
private function getFloatData(array $current, array $transaction): array
|
||||||
@@ -295,7 +302,7 @@ class UpdateRequest extends FormRequest
|
|||||||
if (array_key_exists($fieldName, $transaction)) {
|
if (array_key_exists($fieldName, $transaction)) {
|
||||||
$value = $transaction[$fieldName];
|
$value = $transaction[$fieldName];
|
||||||
if (is_float($value)) {
|
if (is_float($value)) {
|
||||||
$current[$fieldName] = sprintf('%.24f', $value);
|
$current[$fieldName] = sprintf('%.12f', $value);
|
||||||
}
|
}
|
||||||
if (!is_float($value)) {
|
if (!is_float($value)) {
|
||||||
$current[$fieldName] = (string)$value;
|
$current[$fieldName] = (string)$value;
|
||||||
@@ -314,9 +321,10 @@ class UpdateRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('Now in %s', __METHOD__));
|
Log::debug(sprintf('Now in %s', __METHOD__));
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// basic fields for group:
|
// basic fields for group:
|
||||||
'group_title' => 'between:1,1000',
|
'group_title' => 'between:1,1000|nullable',
|
||||||
'apply_rules' => [new IsBoolean()],
|
'apply_rules' => [new IsBoolean()],
|
||||||
|
|
||||||
// transaction rules (in array for splits):
|
// transaction rules (in array for splits):
|
||||||
@@ -329,10 +337,10 @@ class UpdateRequest extends FormRequest
|
|||||||
|
|
||||||
|
|
||||||
// currency info
|
// currency info
|
||||||
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id',
|
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|nullable',
|
||||||
'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
'transactions.*.currency_code' => 'min:3|max:51|exists:transaction_currencies,code|nullable',
|
||||||
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
'transactions.*.foreign_currency_id' => 'nullable|numeric|exists:transaction_currencies,id',
|
||||||
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:3|exists:transaction_currencies,code',
|
'transactions.*.foreign_currency_code' => 'nullable|min:3|max:51|exists:transaction_currencies,code',
|
||||||
|
|
||||||
// amount
|
// amount
|
||||||
'transactions.*.amount' => 'numeric|gt:0|max:100000000000',
|
'transactions.*.amount' => 'numeric|gt:0|max:100000000000',
|
||||||
@@ -350,34 +358,34 @@ class UpdateRequest extends FormRequest
|
|||||||
'transactions.*.destination_name' => 'between:1,255|nullable',
|
'transactions.*.destination_name' => 'between:1,255|nullable',
|
||||||
|
|
||||||
// budget, category, bill and piggy
|
// budget, category, bill and piggy
|
||||||
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser()],
|
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser(), 'nullable'],
|
||||||
'transactions.*.budget_name' => ['between:1,255', 'nullable', new BelongsUser()],
|
'transactions.*.budget_name' => ['between:1,255', 'nullable', new BelongsUser()],
|
||||||
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser()],
|
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser(), 'nullable'],
|
||||||
'transactions.*.category_name' => 'between:1,255|nullable',
|
'transactions.*.category_name' => 'between:1,255|nullable',
|
||||||
'transactions.*.bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser()],
|
'transactions.*.bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser()],
|
||||||
'transactions.*.bill_name' => ['between:1,255', 'nullable', new BelongsUser()],
|
'transactions.*.bill_name' => ['between:1,255', 'nullable', new BelongsUser()],
|
||||||
|
|
||||||
// other interesting fields
|
// other interesting fields
|
||||||
'transactions.*.reconciled' => [new IsBoolean()],
|
'transactions.*.reconciled' => [new IsBoolean()],
|
||||||
'transactions.*.notes' => 'min:1,max:50000|nullable',
|
'transactions.*.notes' => 'min:1|max:50000|nullable',
|
||||||
'transactions.*.tags' => 'between:0,255',
|
'transactions.*.tags' => 'between:0,255|nullable',
|
||||||
|
|
||||||
// meta info fields
|
// meta info fields
|
||||||
'transactions.*.internal_reference' => 'min:1,max:255|nullable',
|
'transactions.*.internal_reference' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.external_id' => 'min:1,max:255|nullable',
|
'transactions.*.external_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.recurrence_id' => 'min:1,max:255|nullable',
|
'transactions.*.recurrence_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.bunq_payment_id' => 'min:1,max:255|nullable',
|
'transactions.*.bunq_payment_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.external_url' => 'min:1,max:255|nullable|url',
|
'transactions.*.external_url' => 'min:1|max:255|nullable|url',
|
||||||
|
|
||||||
// SEPA fields:
|
// SEPA fields:
|
||||||
'transactions.*.sepa_cc' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_cc' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ct_op' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ct_op' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ct_id' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ct_id' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_db' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_db' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_country' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_country' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ep' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ep' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_ci' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_ci' => 'min:1|max:255|nullable',
|
||||||
'transactions.*.sepa_batch_id' => 'min:1,max:255|nullable',
|
'transactions.*.sepa_batch_id' => 'min:1|max:255|nullable',
|
||||||
|
|
||||||
// dates
|
// dates
|
||||||
'transactions.*.interest_date' => 'date|nullable',
|
'transactions.*.interest_date' => 'date|nullable',
|
||||||
@@ -398,6 +406,7 @@ class UpdateRequest extends FormRequest
|
|||||||
*/
|
*/
|
||||||
public function withValidator(Validator $validator): void
|
public function withValidator(Validator $validator): void
|
||||||
{
|
{
|
||||||
|
Log::debug('Now in withValidator');
|
||||||
/** @var TransactionGroup $transactionGroup */
|
/** @var TransactionGroup $transactionGroup */
|
||||||
$transactionGroup = $this->route()->parameter('transactionGroup');
|
$transactionGroup = $this->route()->parameter('transactionGroup');
|
||||||
$validator->after(
|
$validator->after(
|
||||||
|
@@ -75,7 +75,7 @@ class StoreRequest extends FormRequest
|
|||||||
'name' => 'required|between:1,255|unique:transaction_currencies,name',
|
'name' => 'required|between:1,255|unique:transaction_currencies,name',
|
||||||
'code' => 'required|between:3,51|unique:transaction_currencies,code',
|
'code' => 'required|between:3,51|unique:transaction_currencies,code',
|
||||||
'symbol' => 'required|between:1,51|unique:transaction_currencies,symbol',
|
'symbol' => 'required|between:1,51|unique:transaction_currencies,symbol',
|
||||||
'decimal_places' => 'between:0,20|numeric|min:0|max:20',
|
'decimal_places' => 'between:0,20|numeric|min:0|max:12',
|
||||||
'enabled' => [new IsBoolean()],
|
'enabled' => [new IsBoolean()],
|
||||||
'default' => [new IsBoolean()],
|
'default' => [new IsBoolean()],
|
||||||
|
|
||||||
|
@@ -74,7 +74,7 @@ class UpdateRequest extends FormRequest
|
|||||||
'name' => sprintf('between:1,255|unique:transaction_currencies,name,%d', $currency->id),
|
'name' => sprintf('between:1,255|unique:transaction_currencies,name,%d', $currency->id),
|
||||||
'code' => sprintf('between:3,51|unique:transaction_currencies,code,%d', $currency->id),
|
'code' => sprintf('between:3,51|unique:transaction_currencies,code,%d', $currency->id),
|
||||||
'symbol' => sprintf('between:1,51|unique:transaction_currencies,symbol,%d', $currency->id),
|
'symbol' => sprintf('between:1,51|unique:transaction_currencies,symbol,%d', $currency->id),
|
||||||
'decimal_places' => 'between:0,20|numeric|min:0|max:20',
|
'decimal_places' => 'between:0,20|numeric|min:0|max:12',
|
||||||
'enabled' => [new IsBoolean()],
|
'enabled' => [new IsBoolean()],
|
||||||
'default' => [new IsBoolean()],
|
'default' => [new IsBoolean()],
|
||||||
];
|
];
|
||||||
|
@@ -59,9 +59,9 @@ class StoreRequest extends FormRequest
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => 'required|unique:link_types,name|min:1',
|
'name' => 'required|unique:link_types,name|min:1|max:1024',
|
||||||
'outward' => 'required|unique:link_types,outward|min:1|different:inward',
|
'outward' => 'required|unique:link_types,outward|min:1|different:inward|max:1024',
|
||||||
'inward' => 'required|unique:link_types,inward|min:1|different:outward',
|
'inward' => 'required|unique:link_types,inward|min:1|different:outward|max:1024',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -64,9 +64,9 @@ class UpdateRequest extends FormRequest
|
|||||||
$linkType = $this->route()->parameter('linkType');
|
$linkType = $this->route()->parameter('linkType');
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => [Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1'],
|
'name' => [Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1', 'max:1024'],
|
||||||
'outward' => ['different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1'],
|
'outward' => ['different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1', 'max:1024'],
|
||||||
'inward' => ['different:outward', Rule::unique('link_types', 'inward')->ignore($linkType->id), 'min:1'],
|
'inward' => ['different:outward', Rule::unique('link_types', 'inward')->ignore($linkType->id), 'min:1', 'max:1024'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,9 @@ 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PreferenceStoreRequest
|
||||||
|
*/
|
||||||
class PreferenceStoreRequest extends FormRequest
|
class PreferenceStoreRequest extends FormRequest
|
||||||
{
|
{
|
||||||
use ChecksLogin;
|
use ChecksLogin;
|
||||||
|
@@ -28,6 +28,9 @@ 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PreferenceUpdateRequest
|
||||||
|
*/
|
||||||
class PreferenceUpdateRequest extends FormRequest
|
class PreferenceUpdateRequest extends FormRequest
|
||||||
{
|
{
|
||||||
use ChecksLogin;
|
use ChecksLogin;
|
||||||
|
@@ -25,10 +25,105 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V2\Controllers\Autocomplete;
|
namespace FireflyIII\Api\V2\Controllers\Autocomplete;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V2\Request\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Administration\Account\AccountRepositoryInterface as AdminAccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\AccountFilter;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AccountController
|
* Class AccountController
|
||||||
*/
|
*/
|
||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
|
use AccountFilter;
|
||||||
|
|
||||||
|
private AdminAccountRepositoryInterface $adminRepository;
|
||||||
|
private array $balanceTypes;
|
||||||
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AccountController constructor.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
|
$this->adminRepository = app(AdminAccountRepositoryInterface::class);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE,];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Documentation for this endpoint:
|
||||||
|
* TODO list of checks
|
||||||
|
* 1. use dates from ParameterBag
|
||||||
|
* 2. Request validates dates
|
||||||
|
* 3. Request includes user_group_id as administration_id
|
||||||
|
* 4. Endpoint is documented.
|
||||||
|
* 5. Collector uses administration_id
|
||||||
|
*
|
||||||
|
* @param AutocompleteRequest $request
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
* @throws FireflyException
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function accounts(AutocompleteRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$data = $request->getData();
|
||||||
|
$types = $data['types'];
|
||||||
|
$query = $data['query'];
|
||||||
|
$date = $this->parameters->get('date') ?? today(config('app.timezone'));
|
||||||
|
$this->adminRepository->setAdministrationId($data['administration_id']);
|
||||||
|
|
||||||
|
$return = [];
|
||||||
|
$result = $this->adminRepository->searchAccount((string)$query, $types, $data['limit']);
|
||||||
|
$defaultCurrency = app('amount')->getDefaultCurrency();
|
||||||
|
|
||||||
|
/** @var Account $account */
|
||||||
|
foreach ($result as $account) {
|
||||||
|
$nameWithBalance = $account->name;
|
||||||
|
$currency = $this->repository->getAccountCurrency($account) ?? $defaultCurrency;
|
||||||
|
|
||||||
|
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
||||||
|
$balance = app('steam')->balance($account, $date);
|
||||||
|
$nameWithBalance = sprintf('%s (%s)', $account->name, app('amount')->formatAnything($currency, $balance, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
$return[] = [
|
||||||
|
'id' => (string)$account->id,
|
||||||
|
'name' => $account->name,
|
||||||
|
'name_with_balance' => $nameWithBalance,
|
||||||
|
'type' => $account->accountType->type,
|
||||||
|
'currency_id' => $currency->id,
|
||||||
|
'currency_name' => $currency->name,
|
||||||
|
'currency_code' => $currency->code,
|
||||||
|
'currency_symbol' => $currency->symbol,
|
||||||
|
'currency_decimal_places' => $currency->decimal_places,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// custom order.
|
||||||
|
usort(
|
||||||
|
$return,
|
||||||
|
function ($a, $b) {
|
||||||
|
$order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE];
|
||||||
|
$pos_a = array_search($a['type'], $order, true);
|
||||||
|
$pos_b = array_search($b['type'], $order, true);
|
||||||
|
|
||||||
|
return $pos_a - $pos_b;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return response()->json($return);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,10 +27,12 @@ namespace FireflyIII\Api\V2\Controllers\Chart;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\AccountType;
|
use FireflyIII\Models\AccountType;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Support\Http\Api\ConvertsExchangeRates;
|
use FireflyIII\Repositories\Administration\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Psr\Container\ContainerExceptionInterface;
|
use Psr\Container\ContainerExceptionInterface;
|
||||||
use Psr\Container\NotFoundExceptionInterface;
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
@@ -40,7 +42,7 @@ use Psr\Container\NotFoundExceptionInterface;
|
|||||||
*/
|
*/
|
||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
use ConvertsExchangeRates;
|
use CleansChartData;
|
||||||
|
|
||||||
private AccountRepositoryInterface $repository;
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
@@ -53,6 +55,7 @@ class AccountController extends Controller
|
|||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
|
$this->repository->setAdministrationId(auth()->user()->user_group_id);
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -62,23 +65,32 @@ class AccountController extends Controller
|
|||||||
* This endpoint is documented at
|
* This endpoint is documented at
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/charts/getChartAccountOverview
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/charts/getChartAccountOverview
|
||||||
*
|
*
|
||||||
|
* The native currency is the preferred currency on the page /currencies.
|
||||||
|
*
|
||||||
|
* If a transaction has foreign currency = native currency, the foreign amount will be used, no conversion
|
||||||
|
* will take place.
|
||||||
|
*
|
||||||
|
* TODO validate and set administration_id from request
|
||||||
|
*
|
||||||
* @param DateRequest $request
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
* @throws ContainerExceptionInterface
|
* @throws ContainerExceptionInterface
|
||||||
* @throws NotFoundExceptionInterface
|
* @throws NotFoundExceptionInterface
|
||||||
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function dashboard(DateRequest $request): JsonResponse
|
public function dashboard(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
// parameters for chart:
|
|
||||||
$dates = $request->getAll();
|
|
||||||
/** @var Carbon $start */
|
/** @var Carbon $start */
|
||||||
$start = $dates['start'];
|
$start = $this->parameters->get('start');
|
||||||
/** @var Carbon $end */
|
/** @var Carbon $end */
|
||||||
$end = $dates['end'];
|
$end = $this->parameters->get('end');
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
// user's preferences
|
// user's preferences
|
||||||
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])->pluck('id')->toArray();
|
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])->pluck('id')->toArray();
|
||||||
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
|
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
|
||||||
|
/** @var TransactionCurrency $default */
|
||||||
$default = app('amount')->getDefaultCurrency();
|
$default = app('amount')->getDefaultCurrency();
|
||||||
$accounts = $this->repository->getAccountsById($frontPage->data);
|
$accounts = $this->repository->getAccountsById($frontPage->data);
|
||||||
$chartData = [];
|
$chartData = [];
|
||||||
@@ -87,7 +99,6 @@ class AccountController extends Controller
|
|||||||
$frontPage->data = $defaultSet;
|
$frontPage->data = $defaultSet;
|
||||||
$frontPage->save();
|
$frontPage->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$currency = $this->repository->getAccountCurrency($account);
|
$currency = $this->repository->getAccountCurrency($account);
|
||||||
@@ -96,38 +107,45 @@ class AccountController extends Controller
|
|||||||
}
|
}
|
||||||
$currentSet = [
|
$currentSet = [
|
||||||
'label' => $account->name,
|
'label' => $account->name,
|
||||||
|
// the currency that belongs to the account.
|
||||||
'currency_id' => (string)$currency->id,
|
'currency_id' => (string)$currency->id,
|
||||||
'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,
|
||||||
'native_id' => null,
|
|
||||||
'native_code' => null,
|
// the default currency of the user (could be the same!)
|
||||||
'native_symbol' => null,
|
'native_id' => (int)$default->id,
|
||||||
'native_decimal_places' => null,
|
'native_code' => $default->code,
|
||||||
'start_date' => $start->toAtomString(),
|
'native_symbol' => $default->symbol,
|
||||||
'end_date' => $end->toAtomString(),
|
'native_decimal_places' => (int)$default->decimal_places,
|
||||||
'type' => 'line', // line, area or bar
|
'start' => $start->toAtomString(),
|
||||||
'yAxisID' => 0, // 0, 1, 2
|
'end' => $end->toAtomString(),
|
||||||
|
'period' => '1D',
|
||||||
'entries' => [],
|
'entries' => [],
|
||||||
|
'native_entries' => [],
|
||||||
];
|
];
|
||||||
$currentStart = clone $start;
|
$currentStart = clone $start;
|
||||||
$range = app('steam')->balanceInRange($account, $start, clone $end);
|
$range = app('steam')->balanceInRange($account, $start, clone $end, $currency);
|
||||||
|
$rangeConverted = app('steam')->balanceInRangeConverted($account, $start, clone $end, $default);
|
||||||
// 2022-10-11: this method no longer converts to floats
|
|
||||||
|
|
||||||
$previous = array_values($range)[0];
|
$previous = array_values($range)[0];
|
||||||
|
$previousConverted = array_values($rangeConverted)[0];
|
||||||
while ($currentStart <= $end) {
|
while ($currentStart <= $end) {
|
||||||
$format = $currentStart->format('Y-m-d');
|
$format = $currentStart->format('Y-m-d');
|
||||||
$label = $currentStart->toAtomString();
|
$label = $currentStart->toAtomString();
|
||||||
$balance = array_key_exists($format, $range) ? $range[$format] : $previous;
|
$balance = array_key_exists($format, $range) ? $range[$format] : $previous;
|
||||||
|
$balanceConverted = array_key_exists($format, $rangeConverted) ? $rangeConverted[$format] : $previousConverted;
|
||||||
$previous = $balance;
|
$previous = $balance;
|
||||||
|
$previousConverted = $balanceConverted;
|
||||||
|
|
||||||
$currentStart->addDay();
|
$currentStart->addDay();
|
||||||
$currentSet['entries'][$label] = $balance;
|
$currentSet['entries'][$label] = $balance;
|
||||||
|
$currentSet['native_entries'][$label] = $balanceConverted;
|
||||||
}
|
}
|
||||||
$currentSet = $this->cerChartSet($currentSet);
|
|
||||||
$chartData[] = $currentSet;
|
$chartData[] = $currentSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($chartData);
|
return response()->json($this->clean($chartData));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
260
app/Api/V2/Controllers/Chart/BalanceController.php
Normal file
260
app/Api/V2/Controllers/Chart/BalanceController.php
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* BalanceController.php
|
||||||
|
* Copyright (c) 2023 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\V2\Controllers\Chart;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V2\Request\Chart\BalanceChartRequest;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Repositories\Administration\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BalanceController
|
||||||
|
*/
|
||||||
|
class BalanceController extends Controller
|
||||||
|
{
|
||||||
|
use CleansChartData;
|
||||||
|
|
||||||
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The code is practically a duplicate of ReportController::operations.
|
||||||
|
*
|
||||||
|
* Currency is up to the account/transactions in question, but conversion to the default
|
||||||
|
* currency is possible.
|
||||||
|
*
|
||||||
|
* If the transaction being processed is already in native currency OR if the
|
||||||
|
* foreign amount is in the native currency, the amount will not be converted.
|
||||||
|
*
|
||||||
|
* TODO validate and set administration_id
|
||||||
|
* TODO collector set group, not user
|
||||||
|
*
|
||||||
|
* @param BalanceChartRequest $request
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function balance(BalanceChartRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$params = $request->getAll();
|
||||||
|
/** @var Carbon $start */
|
||||||
|
$start = $this->parameters->get('start');
|
||||||
|
/** @var Carbon $end */
|
||||||
|
$end = $this->parameters->get('end');
|
||||||
|
$end->endOfDay();
|
||||||
|
/** @var Collection $accounts */
|
||||||
|
$accounts = $params['accounts'];
|
||||||
|
$preferredRange = $params['period'];
|
||||||
|
|
||||||
|
// set some formats, based on input parameters.
|
||||||
|
$format = app('navigation')->preferredCarbonFormatByPeriod($preferredRange);
|
||||||
|
|
||||||
|
// prepare for currency conversion and data collection:
|
||||||
|
$ids = $accounts->pluck('id')->toArray();
|
||||||
|
/** @var TransactionCurrency $default */
|
||||||
|
$default = app('amount')->getDefaultCurrency();
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
$currencies = [(int)$default->id => $default,]; // currency cache
|
||||||
|
$data = [];
|
||||||
|
$chartData = [];
|
||||||
|
|
||||||
|
// get journals for entire period:
|
||||||
|
/** @var GroupCollectorInterface $collector */
|
||||||
|
$collector = app(GroupCollectorInterface::class);
|
||||||
|
$collector->setRange($start, $end)->withAccountInformation();
|
||||||
|
$collector->setXorAccounts($accounts);
|
||||||
|
$collector->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::RECONCILIATION, TransactionType::TRANSFER]);
|
||||||
|
$journals = $collector->getExtractedJournals();
|
||||||
|
|
||||||
|
// set array for default currency (even if unused later on)
|
||||||
|
$defaultCurrencyId = (int)$default->id;
|
||||||
|
$data[$defaultCurrencyId] = [
|
||||||
|
'currency_id' => $defaultCurrencyId,
|
||||||
|
'currency_symbol' => $default->symbol,
|
||||||
|
'currency_code' => $default->code,
|
||||||
|
'currency_name' => $default->name,
|
||||||
|
'currency_decimal_places' => (int)$default->decimal_places,
|
||||||
|
'native_id' => $defaultCurrencyId,
|
||||||
|
'native_symbol' => $default->symbol,
|
||||||
|
'native_code' => $default->code,
|
||||||
|
'native_name' => $default->name,
|
||||||
|
'native_decimal_places' => (int)$default->decimal_places,
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
// loop. group by currency and by period.
|
||||||
|
/** @var array $journal */
|
||||||
|
foreach ($journals as $journal) {
|
||||||
|
// format the date according to the period
|
||||||
|
$period = $journal['date']->format($format);
|
||||||
|
|
||||||
|
// collect (and cache) currency information for this journal.
|
||||||
|
$currencyId = (int)$journal['currency_id'];
|
||||||
|
$currency = $currencies[$currencyId] ?? TransactionCurrency::find($currencyId);
|
||||||
|
$currencies[$currencyId] = $currency; // may just re-assign itself, don't mind.
|
||||||
|
|
||||||
|
// set the array with monetary info, if it does not exist.
|
||||||
|
$data[$currencyId] = $data[$currencyId] ?? [
|
||||||
|
'currency_id' => $currencyId,
|
||||||
|
'currency_symbol' => $journal['currency_symbol'],
|
||||||
|
'currency_code' => $journal['currency_code'],
|
||||||
|
'currency_name' => $journal['currency_name'],
|
||||||
|
'currency_decimal_places' => $journal['currency_decimal_places'],
|
||||||
|
// native currency info (could be the same)
|
||||||
|
'native_id' => (int)$default->id,
|
||||||
|
'native_code' => $default->code,
|
||||||
|
'native_symbol' => $default->symbol,
|
||||||
|
'native_decimal_places' => (int)$default->decimal_places,
|
||||||
|
];
|
||||||
|
|
||||||
|
// set the array (in monetary info) with spent/earned in this $period, if it does not exist.
|
||||||
|
$data[$currencyId][$period] = $data[$currencyId][$period] ?? [
|
||||||
|
'period' => $period,
|
||||||
|
'spent' => '0',
|
||||||
|
'earned' => '0',
|
||||||
|
'native_spent' => '0',
|
||||||
|
'native_earned' => '0',
|
||||||
|
];
|
||||||
|
// is this journal's amount in- our outgoing?
|
||||||
|
$key = 'spent';
|
||||||
|
$amount = app('steam')->negative($journal['amount']);
|
||||||
|
// deposit = incoming
|
||||||
|
// transfer or reconcile or opening balance, and these accounts are the destination.
|
||||||
|
if (
|
||||||
|
TransactionType::DEPOSIT === $journal['transaction_type_type']
|
||||||
|
||
|
||||||
|
|
||||||
|
(
|
||||||
|
(
|
||||||
|
TransactionType::TRANSFER === $journal['transaction_type_type']
|
||||||
|
|| TransactionType::RECONCILIATION === $journal['transaction_type_type']
|
||||||
|
|| TransactionType::OPENING_BALANCE === $journal['transaction_type_type']
|
||||||
|
)
|
||||||
|
&& in_array($journal['destination_account_id'], $ids, true)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
$key = 'earned';
|
||||||
|
$amount = app('steam')->positive($journal['amount']);
|
||||||
|
}
|
||||||
|
// get conversion rate
|
||||||
|
$rate = $converter->getCurrencyRate($currency, $default, $journal['date']);
|
||||||
|
$amountConverted = bcmul($amount, $rate);
|
||||||
|
|
||||||
|
// perhaps transaction already has the foreign amount in the native currency.
|
||||||
|
if ((int)$journal['foreign_currency_id'] === (int)$default->id) {
|
||||||
|
$amountConverted = $journal['foreign_amount'] ?? '0';
|
||||||
|
$amountConverted = 'earned' === $key ? app('steam')->positive($amountConverted) : app('steam')->negative($amountConverted);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add normal entry
|
||||||
|
$data[$currencyId][$period][$key] = bcadd($data[$currencyId][$period][$key], $amount);
|
||||||
|
|
||||||
|
// add converted entry
|
||||||
|
$convertedKey = sprintf('native_%s', $key);
|
||||||
|
$data[$currencyId][$period][$convertedKey] = bcadd($data[$currencyId][$period][$convertedKey], $amountConverted);
|
||||||
|
}
|
||||||
|
|
||||||
|
// loop this data, make chart bars for each currency:
|
||||||
|
/** @var array $currency */
|
||||||
|
foreach ($data as $currency) {
|
||||||
|
// income and expense array prepped:
|
||||||
|
$income = [
|
||||||
|
'label' => 'earned',
|
||||||
|
'currency_id' => $currency['currency_id'],
|
||||||
|
'currency_symbol' => $currency['currency_symbol'],
|
||||||
|
'currency_code' => $currency['currency_code'],
|
||||||
|
'currency_decimal_places' => $currency['currency_decimal_places'],
|
||||||
|
'native_id' => $currency['native_id'],
|
||||||
|
'native_symbol' => $currency['native_symbol'],
|
||||||
|
'native_code' => $currency['native_code'],
|
||||||
|
'native_decimal_places' => $currency['native_decimal_places'],
|
||||||
|
'start' => $start->toAtomString(),
|
||||||
|
'end' => $end->toAtomString(),
|
||||||
|
'period' => $preferredRange,
|
||||||
|
'entries' => [],
|
||||||
|
'native_entries' => [],
|
||||||
|
];
|
||||||
|
$expense = [
|
||||||
|
'label' => 'spent',
|
||||||
|
'currency_id' => $currency['currency_id'],
|
||||||
|
'currency_symbol' => $currency['currency_symbol'],
|
||||||
|
'currency_code' => $currency['currency_code'],
|
||||||
|
'currency_decimal_places' => $currency['currency_decimal_places'],
|
||||||
|
'native_id' => $currency['native_id'],
|
||||||
|
'native_symbol' => $currency['native_symbol'],
|
||||||
|
'native_code' => $currency['native_code'],
|
||||||
|
'native_decimal_places' => $currency['native_decimal_places'],
|
||||||
|
'start' => $start->toAtomString(),
|
||||||
|
'end' => $end->toAtomString(),
|
||||||
|
'period' => $preferredRange,
|
||||||
|
'entries' => [],
|
||||||
|
'native_entries' => [],
|
||||||
|
|
||||||
|
];
|
||||||
|
// loop all possible periods between $start and $end, and add them to the correct dataset.
|
||||||
|
$currentStart = clone $start;
|
||||||
|
while ($currentStart <= $end) {
|
||||||
|
$key = $currentStart->format($format);
|
||||||
|
$label = $currentStart->toAtomString();
|
||||||
|
// normal entries
|
||||||
|
$income['entries'][$label] = app('steam')->bcround(($currency[$key]['earned'] ?? '0'), $currency['currency_decimal_places']);
|
||||||
|
$expense['entries'][$label] = app('steam')->bcround(($currency[$key]['spent'] ?? '0'), $currency['currency_decimal_places']);
|
||||||
|
|
||||||
|
// converted entries
|
||||||
|
$income['native_entries'][$label] = app('steam')->bcround(($currency[$key]['native_earned'] ?? '0'), $currency['native_decimal_places']);
|
||||||
|
$expense['native_entries'][$label] = app('steam')->bcround(($currency[$key]['native_spent'] ?? '0'), $currency['native_decimal_places']);
|
||||||
|
|
||||||
|
// next loop
|
||||||
|
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$chartData[] = $income;
|
||||||
|
$chartData[] = $expense;
|
||||||
|
}
|
||||||
|
return response()->json($this->clean($chartData));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
313
app/Api/V2/Controllers/Chart/BudgetController.php
Normal file
313
app/Api/V2/Controllers/Chart/BudgetController.php
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* BudgetController.php
|
||||||
|
* Copyright (c) 2023 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\V2\Controllers\Chart;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Models\Budget;
|
||||||
|
use FireflyIII\Models\BudgetLimit;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Repositories\Administration\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Administration\Budget\OperationsRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BudgetController
|
||||||
|
*/
|
||||||
|
class BudgetController extends Controller
|
||||||
|
{
|
||||||
|
use CleansChartData;
|
||||||
|
|
||||||
|
protected OperationsRepositoryInterface $opsRepository;
|
||||||
|
private BudgetLimitRepositoryInterface $blRepository;
|
||||||
|
private array $currencies = [];
|
||||||
|
private TransactionCurrency $currency;
|
||||||
|
private BudgetRepositoryInterface $repository;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
|
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
|
||||||
|
$this->opsRepository = app(OperationsRepositoryInterface::class);
|
||||||
|
$this->currency = app('amount')->getDefaultCurrency();
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
|
* TODO see autocomplete/accountcontroller
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function dashboard(DateRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
// get user.
|
||||||
|
/** @var User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
// group ID
|
||||||
|
$administrationId = $user->getAdministrationId();
|
||||||
|
$this->repository->setAdministrationId($administrationId);
|
||||||
|
$this->opsRepository->setAdministrationId($administrationId);
|
||||||
|
|
||||||
|
$params = $request->getAll();
|
||||||
|
/** @var Carbon $start */
|
||||||
|
$start = $params['start'];
|
||||||
|
/** @var Carbon $end */
|
||||||
|
$end = $params['end'];
|
||||||
|
|
||||||
|
// code from FrontpageChartGenerator, but not in separate class
|
||||||
|
$budgets = $this->repository->getActiveBudgets();
|
||||||
|
$data = [];
|
||||||
|
/** @var Budget $budget */
|
||||||
|
foreach ($budgets as $budget) {
|
||||||
|
// could return multiple arrays, so merge.
|
||||||
|
$data = array_merge($data, $this->processBudget($budget, $start, $end));
|
||||||
|
}
|
||||||
|
return response()->json($this->clean($data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Budget $budget
|
||||||
|
* @param Carbon $start
|
||||||
|
* @param Carbon $end
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
private function processBudget(Budget $budget, Carbon $start, Carbon $end): array
|
||||||
|
{
|
||||||
|
// get all limits:
|
||||||
|
$limits = $this->blRepository->getBudgetLimits($budget, $start, $end);
|
||||||
|
$rows = [];
|
||||||
|
|
||||||
|
// if no limits
|
||||||
|
if (0 === $limits->count()) {
|
||||||
|
// return as a single item in an array
|
||||||
|
$rows = $this->noBudgetLimits($budget, $start, $end);
|
||||||
|
}
|
||||||
|
if ($limits->count() > 0) {
|
||||||
|
$rows = $this->budgetLimits($budget, $limits);
|
||||||
|
}
|
||||||
|
// is always an array
|
||||||
|
$return = [];
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$current = [
|
||||||
|
'label' => $budget->name,
|
||||||
|
'currency_id' => $row['currency_id'],
|
||||||
|
'currency_code' => $row['currency_code'],
|
||||||
|
'currency_name' => $row['currency_name'],
|
||||||
|
'currency_decimal_places' => $row['currency_decimal_places'],
|
||||||
|
'native_id' => $row['native_id'],
|
||||||
|
'native_code' => $row['native_code'],
|
||||||
|
'native_name' => $row['native_name'],
|
||||||
|
'native_decimal_places' => $row['native_decimal_places'],
|
||||||
|
'period' => null,
|
||||||
|
'start' => $row['start'],
|
||||||
|
'end' => $row['end'],
|
||||||
|
'entries' => [
|
||||||
|
'spent' => $row['spent'],
|
||||||
|
'left' => $row['left'],
|
||||||
|
'overspent' => $row['overspent'],
|
||||||
|
],
|
||||||
|
'native_entries' => [
|
||||||
|
'spent' => $row['native_spent'],
|
||||||
|
'left' => $row['native_left'],
|
||||||
|
'overspent' => $row['native_overspent'],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$return[] = $current;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @param Budget $budget
|
||||||
|
* @param Carbon $start
|
||||||
|
* @param Carbon $end
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
private function noBudgetLimits(Budget $budget, Carbon $start, Carbon $end): array
|
||||||
|
{
|
||||||
|
$budgetId = (int)$budget->id;
|
||||||
|
$spent = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget]));
|
||||||
|
return $this->processExpenses($budgetId, $spent, $start, $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shared between the "noBudgetLimits" function and "processLimit".
|
||||||
|
*
|
||||||
|
* Will take a single set of expenses and return its info.
|
||||||
|
*
|
||||||
|
* @param int $budgetId
|
||||||
|
* @param array $array
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
private function processExpenses(int $budgetId, array $array, Carbon $start, Carbon $end): array
|
||||||
|
{
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
$return = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This array contains the expenses in this budget. Grouped per currency.
|
||||||
|
* The grouping is on the main currency only.
|
||||||
|
*
|
||||||
|
* @var int $currencyId
|
||||||
|
* @var array $block
|
||||||
|
*/
|
||||||
|
foreach ($array as $currencyId => $block) {
|
||||||
|
$this->currencies[$currencyId] = $this->currencies[$currencyId] ?? TransactionCurrency::find($currencyId);
|
||||||
|
$return[$currencyId] = $return[$currencyId] ?? [
|
||||||
|
'currency_id' => $currencyId,
|
||||||
|
'currency_code' => $block['currency_code'],
|
||||||
|
'currency_name' => $block['currency_name'],
|
||||||
|
'currency_symbol' => $block['currency_symbol'],
|
||||||
|
'currency_decimal_places' => (int)$block['currency_decimal_places'],
|
||||||
|
'native_id' => (int)$this->currency->id,
|
||||||
|
'native_code' => $this->currency->code,
|
||||||
|
'native_name' => $this->currency->name,
|
||||||
|
'native_symbol' => $this->currency->symbol,
|
||||||
|
'native_decimal_places' => (int)$this->currency->decimal_places,
|
||||||
|
'start' => $start->toAtomString(),
|
||||||
|
'end' => $end->toAtomString(),
|
||||||
|
'spent' => '0',
|
||||||
|
'native_spent' => '0',
|
||||||
|
'left' => '0',
|
||||||
|
'native_left' => '0',
|
||||||
|
'overspent' => '0',
|
||||||
|
'native_overspent' => '0',
|
||||||
|
|
||||||
|
];
|
||||||
|
$currentBudgetArray = $block['budgets'][$budgetId];
|
||||||
|
//var_dump($return);
|
||||||
|
/** @var array $journal */
|
||||||
|
foreach ($currentBudgetArray['transaction_journals'] as $journal) {
|
||||||
|
|
||||||
|
// convert the amount to the native currency.
|
||||||
|
$rate = $converter->getCurrencyRate($this->currencies[$currencyId], $this->currency, $journal['date']);
|
||||||
|
$convertedAmount = bcmul($journal['amount'], $rate);
|
||||||
|
if ($journal['foreign_currency_id'] === $this->currency->id) {
|
||||||
|
$convertedAmount = $journal['foreign_amount'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], $journal['amount']);
|
||||||
|
$return[$currencyId]['native_spent'] = bcadd($return[$currencyId]['native_spent'], $convertedAmount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
* @param Budget $budget
|
||||||
|
* @param Collection $limits
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
private function budgetLimits(Budget $budget, Collection $limits): array
|
||||||
|
{
|
||||||
|
app('log')->debug(sprintf('Now in budgetLimits(#%d)', $budget->id));
|
||||||
|
$data = [];
|
||||||
|
/** @var BudgetLimit $limit */
|
||||||
|
foreach ($limits as $limit) {
|
||||||
|
$data = array_merge($data, $this->processLimit($budget, $limit));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Budget $budget
|
||||||
|
* @param BudgetLimit $limit
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
private function processLimit(Budget $budget, BudgetLimit $limit): array
|
||||||
|
{
|
||||||
|
$budgetId = (int)$budget->id;
|
||||||
|
$end = clone $limit->end_date;
|
||||||
|
$end->endOfDay();
|
||||||
|
$spent = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget]));
|
||||||
|
$limitCurrencyId = (int)$limit->transaction_currency_id;
|
||||||
|
$limitCurrency = $limit->transactionCurrency;
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
$filtered = [];
|
||||||
|
$rate = $converter->getCurrencyRate($limitCurrency, $this->currency, $limit->start_date);
|
||||||
|
$convertedLimitAmount = bcmul($limit->amount, $rate);
|
||||||
|
|
||||||
|
|
||||||
|
/** @var array $entry */
|
||||||
|
foreach ($spent as $currencyId => $entry) {
|
||||||
|
// only spent the entry where the entry's currency matches the budget limit's currency
|
||||||
|
// so $filtered will only have 1 or 0 entries
|
||||||
|
if ($entry['currency_id'] === $limitCurrencyId) {
|
||||||
|
$filtered[$currencyId] = $entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$result = $this->processExpenses($budgetId, $filtered, $limit->start_date, $end);
|
||||||
|
if (1 === count($result)) {
|
||||||
|
$compare = bccomp((string)$limit->amount, app('steam')->positive($result[$limitCurrencyId]['spent']));
|
||||||
|
if (1 === $compare) {
|
||||||
|
// convert this amount into the native currency:
|
||||||
|
$result[$limitCurrencyId]['left'] = bcadd($limit->amount, $result[$limitCurrencyId]['spent']);
|
||||||
|
$result[$limitCurrencyId]['native_left'] = bcadd($convertedLimitAmount, $result[$limitCurrencyId]['native_spent']);
|
||||||
|
}
|
||||||
|
if ($compare <= 0) {
|
||||||
|
$result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, $result[$limitCurrencyId]['spent']));
|
||||||
|
$result[$limitCurrencyId]['native_overspent'] = app('steam')->positive(bcadd($convertedLimitAmount, $result[$limitCurrencyId]['native_spent']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
137
app/Api/V2/Controllers/Chart/CategoryController.php
Normal file
137
app/Api/V2/Controllers/Chart/CategoryController.php
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* BudgetController.php
|
||||||
|
* Copyright (c) 2023 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\V2\Controllers\Chart;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Repositories\Administration\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BudgetController
|
||||||
|
*/
|
||||||
|
class CategoryController extends Controller
|
||||||
|
{
|
||||||
|
use CleansChartData;
|
||||||
|
|
||||||
|
private AccountRepositoryInterface $accountRepos;
|
||||||
|
private CurrencyRepositoryInterface $currencyRepos;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->accountRepos = app(AccountRepositoryInterface::class);
|
||||||
|
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
|
||||||
|
$this->accountRepos->setAdministrationId(auth()->user()->user_group_id);
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO may be worth to move to a handler but the data is simple enough.
|
||||||
|
* TODO see autoComplete/account controller
|
||||||
|
*
|
||||||
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function dashboard(DateRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
/** @var Carbon $start */
|
||||||
|
$start = $this->parameters->get('start');
|
||||||
|
/** @var Carbon $end */
|
||||||
|
$end = $this->parameters->get('end');
|
||||||
|
$accounts = $this->accountRepos->getAccountsByType([AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::ASSET, AccountType::DEFAULT]);
|
||||||
|
$default = app('amount')->getDefaultCurrency();
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
$currencies = [];
|
||||||
|
$return = [];
|
||||||
|
|
||||||
|
// get journals for entire period:
|
||||||
|
/** @var GroupCollectorInterface $collector */
|
||||||
|
$collector = app(GroupCollectorInterface::class);
|
||||||
|
$collector->setRange($start, $end)->withAccountInformation();
|
||||||
|
$collector->setXorAccounts($accounts)->withCategoryInformation();
|
||||||
|
$collector->setTypes([TransactionType::WITHDRAWAL, TransactionType::RECONCILIATION]);
|
||||||
|
$journals = $collector->getExtractedJournals();
|
||||||
|
|
||||||
|
/** @var array $journal */
|
||||||
|
foreach ($journals as $journal) {
|
||||||
|
$currencyId = (int)$journal['currency_id'];
|
||||||
|
$currency = $currencies[$currencyId] ?? $this->currencyRepos->find($currencyId);
|
||||||
|
$currencies[$currencyId] = $currency;
|
||||||
|
$categoryName = null === $journal['category_name'] ? (string)trans('firefly.no_category') : $journal['category_name'];
|
||||||
|
$amount = app('steam')->positive($journal['amount']);
|
||||||
|
$nativeAmount = $converter->convert($default, $currency, $journal['date'], $amount);
|
||||||
|
$key = sprintf('%s-%s', $categoryName, $currency->code);
|
||||||
|
if ((int)$journal['foreign_currency_id'] === (int)$default->id) {
|
||||||
|
$nativeAmount = app('steam')->positive($journal['foreign_amount']);
|
||||||
|
}
|
||||||
|
// create arrays
|
||||||
|
$return[$key] = $return[$key] ?? [
|
||||||
|
'label' => $categoryName,
|
||||||
|
'currency_id' => (int)$currency->id,
|
||||||
|
'currency_code' => $currency->code,
|
||||||
|
'currency_name' => $currency->name,
|
||||||
|
'currency_symbol' => $currency->symbol,
|
||||||
|
'currency_decimal_places' => (int)$currency->decimal_places,
|
||||||
|
'native_id' => (int)$default->id,
|
||||||
|
'native_code' => $default->code,
|
||||||
|
'native_name' => $default->name,
|
||||||
|
'native_symbol' => $default->symbol,
|
||||||
|
'native_decimal_places' => (int)$default->decimal_places,
|
||||||
|
'period' => null,
|
||||||
|
'start' => $start->toAtomString(),
|
||||||
|
'end' => $end->toAtomString(),
|
||||||
|
'amount' => '0',
|
||||||
|
'native_amount' => '0',
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
// add monies
|
||||||
|
$return[$key]['amount'] = bcadd($return[$key]['amount'], $amount);
|
||||||
|
$return[$key]['native_amount'] = bcadd($return[$key]['native_amount'], $nativeAmount);
|
||||||
|
}
|
||||||
|
$return = array_values($return);
|
||||||
|
|
||||||
|
// order by native amount
|
||||||
|
usort($return, function (array $a, array $b) {
|
||||||
|
return (float)$a['native_amount'] < (float)$b['native_amount'] ? 1 : -1;
|
||||||
|
});
|
||||||
|
return response()->json($this->clean($return));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -79,7 +79,7 @@ class Controller extends BaseController
|
|||||||
$page = 1;
|
$page = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$integers = ['limit'];
|
$integers = ['limit', 'administration'];
|
||||||
$dates = ['start', 'end', 'date'];
|
$dates = ['start', 'end', 'date'];
|
||||||
|
|
||||||
if ($page < 1) {
|
if ($page < 1) {
|
||||||
@@ -93,21 +93,26 @@ class Controller extends BaseController
|
|||||||
// some date fields:
|
// some date fields:
|
||||||
foreach ($dates as $field) {
|
foreach ($dates as $field) {
|
||||||
$date = null;
|
$date = null;
|
||||||
|
$obj = null;
|
||||||
try {
|
try {
|
||||||
$date = request()->query->get($field);
|
$date = request()->query->get($field);
|
||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
|
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
|
||||||
Log::error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
$value = null;
|
Log::error($e->getTraceAsString());
|
||||||
}
|
}
|
||||||
$obj = null;
|
|
||||||
if (null !== $date) {
|
if (null !== $date) {
|
||||||
try {
|
try {
|
||||||
$obj = Carbon::parse($date);
|
$obj = Carbon::parse($date, config('app.timezone'));
|
||||||
} catch (InvalidDateException | InvalidFormatException $e) {
|
} catch (InvalidDateException | InvalidFormatException $e) {
|
||||||
// don't care
|
// don't care
|
||||||
app('log')->warning(sprintf('Ignored invalid date "%s" in API v2 controller parameter check: %s', substr($date, 0, 20), $e->getMessage()));
|
app('log')->warning(sprintf('Ignored invalid date "%s" in API v2 controller parameter check: %s', substr($date, 0, 20), $e->getMessage()));
|
||||||
}
|
}
|
||||||
|
// out of range? set to null.
|
||||||
|
if (null !== $obj && ($obj->year <= 1900 || $obj->year > 2099)) {
|
||||||
|
app('log')->warning(sprintf('Refuse to use date "%s" in API v2 controller parameter check: %s', $field, $obj->toAtomString()));
|
||||||
|
$obj = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$bag->set($field, $obj);
|
$bag->set($field, $obj);
|
||||||
}
|
}
|
||||||
@@ -136,6 +141,7 @@ class Controller extends BaseController
|
|||||||
* @param string $key
|
* @param string $key
|
||||||
* @param LengthAwarePaginator $paginator
|
* @param LengthAwarePaginator $paginator
|
||||||
* @param AbstractTransformer $transformer
|
* @param AbstractTransformer $transformer
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array
|
final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array
|
||||||
@@ -147,7 +153,7 @@ class Controller extends BaseController
|
|||||||
$objects = $paginator->getCollection();
|
$objects = $paginator->getCollection();
|
||||||
|
|
||||||
// the transformer, at this point, needs to collect information that ALL items in the collection
|
// the transformer, at this point, needs to collect information that ALL items in the collection
|
||||||
// require, like meta data and stuff like that, and save it for later.
|
// require, like meta-data and stuff like that, and save it for later.
|
||||||
$transformer->collectMetaData($objects);
|
$transformer->collectMetaData($objects);
|
||||||
|
|
||||||
$resource = new FractalCollection($objects, $transformer, $key);
|
$resource = new FractalCollection($objects, $transformer, $key);
|
||||||
@@ -162,6 +168,7 @@ class Controller extends BaseController
|
|||||||
* @param string $key
|
* @param string $key
|
||||||
* @param Model $object
|
* @param Model $object
|
||||||
* @param AbstractTransformer $transformer
|
* @param AbstractTransformer $transformer
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
final protected function jsonApiObject(string $key, Model $object, AbstractTransformer $transformer): array
|
final protected function jsonApiObject(string $key, Model $object, AbstractTransformer $transformer): array
|
||||||
@@ -174,6 +181,7 @@ class Controller extends BaseController
|
|||||||
$transformer->collectMetaData(new Collection([$object]));
|
$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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
89
app/Api/V2/Controllers/Model/Bill/ShowController.php
Normal file
89
app/Api/V2/Controllers/Model/Bill/ShowController.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* ShowController.php
|
||||||
|
* Copyright (c) 2023 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\V2\Controllers\Model\Bill;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Models\Bill;
|
||||||
|
use FireflyIII\Repositories\Administration\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Transformers\V2\AccountTransformer;
|
||||||
|
use FireflyIII\Transformers\V2\BillTransformer;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ShowController
|
||||||
|
*/
|
||||||
|
class ShowController extends Controller
|
||||||
|
{
|
||||||
|
private BillRepositoryInterface $repository;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(BillRepositoryInterface::class);
|
||||||
|
$this->repository->setAdministrationId(auth()->user()->user_group_id);
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* TODO see autocomplete/accountcontroller for list.
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
*/
|
||||||
|
public function index(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$this->repository->correctOrder();
|
||||||
|
$bills = $this->repository->getBills();
|
||||||
|
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
||||||
|
$count = $bills->count();
|
||||||
|
$bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
$transformer = new BillTransformer();
|
||||||
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->json($this->jsonApiList('subscriptions', $paginator, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO this endpoint is not documented
|
||||||
|
*/
|
||||||
|
public function show(Request $request, Bill $bill): JsonResponse
|
||||||
|
{
|
||||||
|
$transformer = new BillTransformer();
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->api($this->jsonApiObject('subscriptions', $bill, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
}
|
||||||
|
}
|
@@ -26,8 +26,7 @@ namespace FireflyIII\Api\V2\Controllers\Model\Bill;
|
|||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Administration\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ConvertsExchangeRates;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,8 +34,6 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class SumController extends Controller
|
class SumController extends Controller
|
||||||
{
|
{
|
||||||
use ConvertsExchangeRates;
|
|
||||||
|
|
||||||
private BillRepositoryInterface $repository;
|
private BillRepositoryInterface $repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,6 +45,7 @@ class SumController extends Controller
|
|||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(BillRepositoryInterface::class);
|
$this->repository = app(BillRepositoryInterface::class);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -57,33 +55,37 @@ class SumController extends Controller
|
|||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/transactions-sum/getBillsPaidTrSum
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/transactions-sum/getBillsPaidTrSum
|
||||||
*
|
*
|
||||||
|
* TODO see autocomplete/accountcontroller for list.
|
||||||
|
*
|
||||||
* @param DateRequest $request
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function paid(DateRequest $request): JsonResponse
|
public function paid(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$dates = $request->getAll();
|
$this->repository->setAdministrationId(auth()->user()->user_group_id);
|
||||||
$result = $this->repository->sumPaidInRange($dates['start'], $dates['end']);
|
$result = $this->repository->sumPaidInRange($this->parameters->get('start'), $this->parameters->get('end'));
|
||||||
$converted = $this->cerSum($result);
|
|
||||||
|
|
||||||
// convert to JSON response:
|
// convert to JSON response:
|
||||||
return response()->api($converted);
|
return response()->api(array_values($result));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/transactions-sum/getBillsUnpaidTrSum
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/transactions-sum/getBillsUnpaidTrSum
|
||||||
*
|
*
|
||||||
|
* TODO see autocomplete/accountcontroller for list.
|
||||||
|
*
|
||||||
* @param DateRequest $request
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function unpaid(DateRequest $request): JsonResponse
|
public function unpaid(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$dates = $request->getAll();
|
$this->repository->setAdministrationId(auth()->user()->user_group_id);
|
||||||
$result = $this->repository->sumUnpaidInRange($dates['start'], $dates['end']);
|
$result = $this->repository->sumUnpaidInRange($this->parameters->get('start'), $this->parameters->get('end'));
|
||||||
$converted = $this->cerSum($result);
|
|
||||||
|
|
||||||
// convert to JSON response:
|
// convert to JSON response:
|
||||||
return response()->api($converted);
|
return response()->api(array_values($result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -31,6 +31,9 @@ use Illuminate\Http\JsonResponse;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ListController
|
||||||
|
*/
|
||||||
class ListController extends Controller
|
class ListController extends Controller
|
||||||
{
|
{
|
||||||
private BudgetRepositoryInterface $repository;
|
private BudgetRepositoryInterface $repository;
|
||||||
@@ -41,6 +44,7 @@ class ListController extends Controller
|
|||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(BudgetRepositoryInterface::class);
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -51,16 +55,20 @@ class ListController extends Controller
|
|||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/listBudgets
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/listBudgets
|
||||||
*
|
*
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function index(Request $request): JsonResponse
|
public function index(Request $request): JsonResponse
|
||||||
{
|
{
|
||||||
|
echo 'this needs move to Administration';
|
||||||
|
exit;
|
||||||
$collection = $this->repository->getActiveBudgets();
|
$collection = $this->repository->getActiveBudgets();
|
||||||
$total = $collection->count();
|
$total = $collection->count();
|
||||||
$collection->slice($this->pageSize * $this->parameters->get('page'), $this->pageSize);
|
$collection->slice($this->pageSize * $this->parameters->get('page'), $this->pageSize);
|
||||||
|
|
||||||
$paginator = new LengthAwarePaginator($collection, $total, $this->pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($collection, $total, $this->pageSize, $this->parameters->get('page'));
|
||||||
$transformer = new BudgetTransformer();
|
$transformer = new BudgetTransformer();
|
||||||
|
|
||||||
return response()
|
return response()
|
||||||
->api($this->jsonApiList('budgets', $paginator, $transformer))
|
->api($this->jsonApiList('budgets', $paginator, $transformer))
|
||||||
->header('Content-Type', self::CONTENT_TYPE);
|
->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2023 james@firefly-iii.org
|
* Copyright (c) 2023 james@firefly-iii.org
|
||||||
@@ -21,13 +21,14 @@ declare(strict_types=1);
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\Budget;
|
namespace FireflyIII\Api\V2\Controllers\Model\Budget;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ConvertsExchangeRates;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,8 +36,6 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class ShowController extends Controller
|
class ShowController extends Controller
|
||||||
{
|
{
|
||||||
use ConvertsExchangeRates;
|
|
||||||
|
|
||||||
private BudgetRepositoryInterface $repository;
|
private BudgetRepositoryInterface $repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,6 +47,7 @@ class ShowController extends Controller
|
|||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(BudgetRepositoryInterface::class);
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -60,6 +60,7 @@ class ShowController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function budgeted(DateRequest $request, Budget $budget): JsonResponse
|
public function budgeted(DateRequest $request, Budget $budget): JsonResponse
|
||||||
{
|
{
|
||||||
|
die('deprecated use of thing.');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$result = $this->repository->budgetedInPeriodForBudget($budget, $data['start'], $data['end']);
|
$result = $this->repository->budgetedInPeriodForBudget($budget, $data['start'], $data['end']);
|
||||||
$converted = $this->cerSum(array_values($result));
|
$converted = $this->cerSum(array_values($result));
|
||||||
@@ -74,6 +75,7 @@ class ShowController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function spent(DateRequest $request, Budget $budget): JsonResponse
|
public function spent(DateRequest $request, Budget $budget): JsonResponse
|
||||||
{
|
{
|
||||||
|
die('deprecated use of thing.');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$result = $this->repository->spentInPeriodForBudget($budget, $data['start'], $data['end']);
|
$result = $this->repository->spentInPeriodForBudget($budget, $data['start'], $data['end']);
|
||||||
$converted = $this->cerSum(array_values($result));
|
$converted = $this->cerSum(array_values($result));
|
||||||
|
@@ -27,7 +27,6 @@ namespace FireflyIII\Api\V2\Controllers\Model\Budget;
|
|||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ConvertsExchangeRates;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,8 +34,6 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class SumController extends Controller
|
class SumController extends Controller
|
||||||
{
|
{
|
||||||
use ConvertsExchangeRates;
|
|
||||||
|
|
||||||
private BudgetRepositoryInterface $repository;
|
private BudgetRepositoryInterface $repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,6 +45,7 @@ class SumController extends Controller
|
|||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(BudgetRepositoryInterface::class);
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -58,10 +56,12 @@ class SumController extends Controller
|
|||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/getBudgetedForBudget
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/getBudgetedForBudget
|
||||||
*
|
*
|
||||||
* @param DateRequest $request
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function budgeted(DateRequest $request): JsonResponse
|
public function budgeted(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
|
die('deprecated use of thing.');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$result = $this->repository->budgetedInPeriod($data['start'], $data['end']);
|
$result = $this->repository->budgetedInPeriod($data['start'], $data['end']);
|
||||||
$converted = $this->cerSum(array_values($result));
|
$converted = $this->cerSum(array_values($result));
|
||||||
@@ -72,11 +72,14 @@ class SumController extends Controller
|
|||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/getSpentForBudget
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/budgets/getSpentForBudget
|
||||||
|
*
|
||||||
* @param DateRequest $request
|
* @param DateRequest $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function spent(DateRequest $request): JsonResponse
|
public function spent(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
|
die('deprecated use of thing.');
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$result = $this->repository->spentInPeriod($data['start'], $data['end']);
|
$result = $this->repository->spentInPeriod($data['start'], $data['end']);
|
||||||
$converted = $this->cerSum(array_values($result));
|
$converted = $this->cerSum(array_values($result));
|
||||||
|
@@ -32,6 +32,9 @@ use FireflyIII\Transformers\V2\BudgetLimitTransformer;
|
|||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ListController
|
||||||
|
*/
|
||||||
class ListController extends Controller
|
class ListController extends Controller
|
||||||
{
|
{
|
||||||
private BudgetLimitRepositoryInterface $repository;
|
private BudgetLimitRepositoryInterface $repository;
|
||||||
@@ -42,6 +45,7 @@ class ListController extends Controller
|
|||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(BudgetLimitRepositoryInterface::class);
|
$this->repository = app(BudgetLimitRepositoryInterface::class);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -60,6 +64,7 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$paginator = new LengthAwarePaginator($collection, $total, $this->pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($collection, $total, $this->pageSize, $this->parameters->get('page'));
|
||||||
$transformer = new BudgetLimitTransformer();
|
$transformer = new BudgetLimitTransformer();
|
||||||
|
|
||||||
return response()
|
return response()
|
||||||
->api($this->jsonApiList('budget_limits', $paginator, $transformer))
|
->api($this->jsonApiList('budget_limits', $paginator, $transformer))
|
||||||
->header('Content-Type', self::CONTENT_TYPE);
|
->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
73
app/Api/V2/Controllers/Model/PiggyBank/ShowController.php
Normal file
73
app/Api/V2/Controllers/Model/PiggyBank/ShowController.php
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* ShowController.php
|
||||||
|
* Copyright (c) 2023 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\V2\Controllers\Model\PiggyBank;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use FireflyIII\Repositories\Administration\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Transformers\V2\PiggyBankTransformer;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ShowController
|
||||||
|
*/
|
||||||
|
class ShowController extends Controller
|
||||||
|
{
|
||||||
|
private PiggyBankRepositoryInterface $repository;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(PiggyBankRepositoryInterface::class);
|
||||||
|
$this->repository->setAdministrationId(auth()->user()->user_group_id);
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* TODO see autocomplete/accountcontroller for list.
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
*/
|
||||||
|
public function index(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$piggies = $this->repository->getPiggyBanks();
|
||||||
|
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
||||||
|
$count = $piggies->count();
|
||||||
|
$piggies = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
$paginator = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
$transformer = new PiggyBankTransformer();
|
||||||
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->json($this->jsonApiList('piggy-banks', $paginator, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
}
|
||||||
|
}
|
45
app/Api/V2/Controllers/Model/Transaction/StoreController.php
Normal file
45
app/Api/V2/Controllers/Model/Transaction/StoreController.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/*
|
||||||
|
* StoreController.php
|
||||||
|
* Copyright (c) 2023 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\V2\Controllers\Model\Transaction;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V2\Controllers\Controller;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class StoreController
|
||||||
|
*/
|
||||||
|
class StoreController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return JsonResponse
|
||||||
|
*/
|
||||||
|
public function post(): JsonResponse
|
||||||
|
{
|
||||||
|
|
||||||
|
return response()->json([]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@@ -26,7 +26,6 @@ namespace FireflyIII\Api\V2\Controllers;
|
|||||||
|
|
||||||
use FireflyIII\Api\V2\Request\Generic\SingleDateRequest;
|
use FireflyIII\Api\V2\Request\Generic\SingleDateRequest;
|
||||||
use FireflyIII\Helpers\Report\NetWorthInterface;
|
use FireflyIII\Helpers\Report\NetWorthInterface;
|
||||||
use FireflyIII\Support\Http\Api\ConvertsExchangeRates;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,8 +33,6 @@ use Illuminate\Http\JsonResponse;
|
|||||||
*/
|
*/
|
||||||
class NetWorthController extends Controller
|
class NetWorthController extends Controller
|
||||||
{
|
{
|
||||||
use ConvertsExchangeRates;
|
|
||||||
|
|
||||||
private NetWorthInterface $netWorth;
|
private NetWorthInterface $netWorth;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,6 +45,7 @@ class NetWorthController extends Controller
|
|||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->netWorth = app(NetWorthInterface::class);
|
$this->netWorth = app(NetWorthInterface::class);
|
||||||
$this->netWorth->setUser(auth()->user());
|
$this->netWorth->setUser(auth()->user());
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -56,11 +54,14 @@ class NetWorthController extends Controller
|
|||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/net-worth/getNetWorth
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/net-worth/getNetWorth
|
||||||
|
*
|
||||||
* @param SingleDateRequest $request
|
* @param SingleDateRequest $request
|
||||||
|
*
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function get(SingleDateRequest $request): JsonResponse
|
public function get(SingleDateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
|
die('deprecated use of thing.');
|
||||||
$date = $request->getDate();
|
$date = $request->getDate();
|
||||||
$result = $this->netWorth->sumNetWorthByCurrency($date);
|
$result = $this->netWorth->sumNetWorthByCurrency($date);
|
||||||
$converted = $this->cerSum($result);
|
$converted = $this->cerSum($result);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user