mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-04 03:43:07 +00:00
Compare commits
1568 Commits
develop-20
...
develop-20
Author | SHA1 | Date | |
---|---|---|---|
|
661e4e53e6 | ||
|
3eeda4a6aa | ||
|
4dba9cea21 | ||
|
6aab5fab05 | ||
|
4b0597d19a | ||
|
92f534bcb3 | ||
|
76e91be4dc | ||
|
deca4fed56 | ||
|
73512b0365 | ||
|
aaffc125e7 | ||
|
41a48c39a0 | ||
|
2d96bd84b5 | ||
|
ad1c1d2254 | ||
|
813206766d | ||
|
bb25d4a82a | ||
|
f3b78beecc | ||
|
64073768fe | ||
|
fe6dd0f901 | ||
|
aac8d11ff6 | ||
|
afa99a35b5 | ||
|
e9cb0a51d7 | ||
|
9fbcccfd02 | ||
|
468c9c9d56 | ||
|
f76b27a73d | ||
|
579fe81616 | ||
|
ec9ba53690 | ||
|
85337c53d4 | ||
|
eb6d585bb2 | ||
|
378ffbc609 | ||
|
3b3c8e5bcd | ||
|
75cbdb6a57 | ||
|
cdaff0d983 | ||
|
dda3863889 | ||
|
57dc423b3f | ||
|
c0570bc3b2 | ||
|
65110d1666 | ||
|
5a10b29402 | ||
|
028544ca2e | ||
|
af46729372 | ||
|
4c7789a668 | ||
|
292908048c | ||
|
e300314e05 | ||
|
4f1f360346 | ||
|
bff856aeff | ||
|
7f5a1bda8d | ||
|
b506281bd6 | ||
|
dfe9b3e787 | ||
|
2428a2a7c5 | ||
|
0e8f608e00 | ||
|
70071767ab | ||
|
0ad6beb66c | ||
|
1197f65589 | ||
|
7bbf2dcc6f | ||
|
d4ab69ebe6 | ||
|
c8c552602e | ||
|
1921a8050b | ||
|
f488feda93 | ||
|
d90c033b83 | ||
|
9f256253f2 | ||
|
489b7c12e5 | ||
|
1049a8314d | ||
|
48301b6b9c | ||
|
5a92215921 | ||
|
ccfc75852a | ||
|
9804cffff3 | ||
|
901e113fef | ||
|
a4021ff056 | ||
|
902d91ad29 | ||
|
fa2cf22e73 | ||
|
970dad4c49 | ||
|
9d01c7bdb8 | ||
|
dc7d4fb258 | ||
|
a807ca5002 | ||
|
d59d326841 | ||
|
b915548e82 | ||
|
8200a81840 | ||
|
6a49918707 | ||
|
e55fc483bd | ||
|
4ff5f5883d | ||
|
eda2eae04a | ||
|
c07c30ea17 | ||
|
56f1eb03e0 | ||
|
d4e14dd262 | ||
|
0c7f04fb17 | ||
|
061c01da53 | ||
|
716d72d8af | ||
|
3233ca4a4c | ||
|
1041030b1e | ||
|
bb3b06cf08 | ||
|
f35e361915 | ||
|
47d697c7dc | ||
|
3745d79f1f | ||
|
04cbff4b9a | ||
|
0c2ca4b97c | ||
|
3918665cd1 | ||
|
9eb8869649 | ||
|
62221af591 | ||
|
4d013a44ce | ||
|
c55cfd1acf | ||
|
b2652b83ce | ||
|
3d28932216 | ||
|
87567d5a31 | ||
|
37d45f4f87 | ||
|
4acf0828e4 | ||
|
b5bab53e7a | ||
|
60b0dc6279 | ||
|
883994de19 | ||
|
62d72516ba | ||
|
cfb86c683e | ||
|
6278662014 | ||
|
65dcad6898 | ||
|
8e7bcbdd7b | ||
|
084ce02c21 | ||
|
ea6addafe6 | ||
|
da36d84b79 | ||
|
d6d9f665c7 | ||
|
73d2621255 | ||
|
4299ba033c | ||
|
6007687bcc | ||
|
6d3f2bd5e7 | ||
|
210bd83bd4 | ||
|
65a926874b | ||
|
d0e7681e56 | ||
|
33bde854ec | ||
|
da874c97f4 | ||
|
aa7ec95a59 | ||
|
4dd77303f7 | ||
|
166d4bd842 | ||
|
54bf56bbb0 | ||
|
3d8c6671f4 | ||
|
4e33de9c29 | ||
|
27d46eb3fa | ||
|
e1e7a2e497 | ||
|
a476b4259c | ||
|
0c03ec5ddd | ||
|
2d95b7f8ef | ||
|
34cc79ce4f | ||
|
6ff9943fe0 | ||
|
a0166b45e4 | ||
|
d27b035b20 | ||
|
f3b387fc22 | ||
|
03904ffcde | ||
|
a7973190c2 | ||
|
671ff95f22 | ||
|
01181ceea9 | ||
|
97643639d1 | ||
|
424783c47b | ||
|
ea0ced70b2 | ||
|
1a633e64ef | ||
|
30da3f4399 | ||
|
6bdff95d87 | ||
|
895ae279d5 | ||
|
8b57f45963 | ||
|
a2d2b7edd3 | ||
|
3d65f00c6e | ||
|
333004c4d9 | ||
|
7451659824 | ||
|
ec89c23ace | ||
|
92d07d346f | ||
|
a7ac894af2 | ||
|
20f89e3a7c | ||
|
5d2f11c3c7 | ||
|
1eea79e431 | ||
|
1aaaac67ca | ||
|
1eb86639c9 | ||
|
28b911c4ee | ||
|
c525c70ec0 | ||
|
1f7d6e218b | ||
|
a69b6d9ce2 | ||
|
28b2ddde18 | ||
|
a16cc73c77 | ||
|
46395e350a | ||
|
f62e49090c | ||
|
af3b40a314 | ||
|
c3cea0fa9e | ||
|
6cbdb2ce70 | ||
|
b78460100d | ||
|
bf6e1cb0e1 | ||
|
6a53f5031c | ||
|
ae15ec01e8 | ||
|
fe3c7c47c4 | ||
|
68b934010c | ||
|
22852bd238 | ||
|
5b3b1804f3 | ||
|
f2588eb343 | ||
|
64a643ceec | ||
|
1add505644 | ||
|
9663eb6a19 | ||
|
f30a24a02f | ||
|
68655d60a6 | ||
|
63b0efcd81 | ||
|
93284682c8 | ||
|
3bafcb6ad2 | ||
|
942d027556 | ||
|
a60882d5f5 | ||
|
680f554981 | ||
|
20e4dc07ce | ||
|
184d8eb027 | ||
|
59725b088a | ||
|
32fca4a9f5 | ||
|
7dccf6ec48 | ||
|
917665feac | ||
|
06c50b68c2 | ||
|
7035c399d8 | ||
|
7c0ac5805c | ||
|
3424741583 | ||
|
baf0297994 | ||
|
31d06752fa | ||
|
8a27154798 | ||
|
6d87e38ec0 | ||
|
ccdc30a6fb | ||
|
90005538d3 | ||
|
f4e0428ebc | ||
|
bd1326eca9 | ||
|
bdfa834251 | ||
|
4a9aeb4e44 | ||
|
3886c0fbde | ||
|
d998eff56e | ||
|
d73df9bf0a | ||
|
754f2f3a34 | ||
|
43fd7c928a | ||
|
05768c2e73 | ||
|
3feb2c9955 | ||
|
7d9f3ac473 | ||
|
8a5755c8f1 | ||
|
a75a760019 | ||
|
78d1a130d2 | ||
|
79fd43f32b | ||
|
7a7bd65a27 | ||
|
01a9ecccac | ||
|
c1b3c71090 | ||
|
323d04fe6c | ||
|
80c2f1ea3f | ||
|
784494871d | ||
|
8e93af5cc7 | ||
|
ebfdeeedaa | ||
|
1d02ed6a56 | ||
|
cca53cb0e8 | ||
|
ab33aee4b1 | ||
|
41d4fab071 | ||
|
f0a1913dc6 | ||
|
b956b463c2 | ||
|
43603c4990 | ||
|
196e738f60 | ||
|
59e2ea357a | ||
|
5e9d942069 | ||
|
53d5bedd85 | ||
|
49c68af07b | ||
|
c84c8e1aef | ||
|
a8d43d7174 | ||
|
1087278890 | ||
|
ae5912ab52 | ||
|
035bd96ae5 | ||
|
7283c616a0 | ||
|
5706666bb6 | ||
|
4607466fb6 | ||
|
34bcfcfe9b | ||
|
05986cb6a6 | ||
|
0c4ee9f043 | ||
|
ff222795cf | ||
|
e0c76695ee | ||
|
ae126e8322 | ||
|
8f9c35fbe8 | ||
|
84efd6e2ee | ||
|
b1fbe4e909 | ||
|
8576877072 | ||
|
c298aced01 | ||
|
ac61a78d8d | ||
|
fce90a94c4 | ||
|
023a4f178d | ||
|
ef254995ad | ||
|
faeb74634b | ||
|
b5baae373f | ||
|
63de711cda | ||
|
bd28d116cb | ||
|
7efc2861bc | ||
|
5c689a2ca2 | ||
|
d5d65df76f | ||
|
df7d4f700c | ||
|
efebe3cb41 | ||
|
2ba5b6ae49 | ||
|
31d93efab2 | ||
|
657b95485c | ||
|
3bfc12f93b | ||
|
ccfd2f2ac3 | ||
|
fb3fe0d87b | ||
|
c80c6d52fe | ||
|
0fb3c0c7bf | ||
|
43c625bee2 | ||
|
967a5dd256 | ||
|
3c9d1bcaa1 | ||
|
8cd2de14a9 | ||
|
7728a35e04 | ||
|
49000da123 | ||
|
32a8f89875 | ||
|
49e5a81bd3 | ||
|
a8efe86af0 | ||
|
4f07b089d2 | ||
|
e786bf47c2 | ||
|
be11778c53 | ||
|
3d7325424c | ||
|
f4ffed99ef | ||
|
52dfe9a738 | ||
|
a0bc8b2ba2 | ||
|
4ffca9e2ca | ||
|
a6afec9afa | ||
|
5d859222f8 | ||
|
0e3ba14666 | ||
|
860767fe5a | ||
|
91b0ad625c | ||
|
67bab2561a | ||
|
b7908ebcb4 | ||
|
a20601ea85 | ||
|
14622329a8 | ||
|
5577be7b08 | ||
|
e3bab9d7d8 | ||
|
e0512bee3d | ||
|
20827a5fd1 | ||
|
8819dac1e1 | ||
|
da0a07262c | ||
|
9c195dcc66 | ||
|
0b45506e52 | ||
|
51e58f8d88 | ||
|
d0c658e79a | ||
|
35e0791a9f | ||
|
637ecc66d2 | ||
|
3a38175b2a | ||
|
d78fd86d7a | ||
|
395332d6dd | ||
|
c5cbceb81a | ||
|
ec94f1bcf1 | ||
|
ee3d18a8ea | ||
|
a9cd8b6512 | ||
|
5bd87036b0 | ||
|
0e7d72023d | ||
|
314f91ff24 | ||
|
ed54a5c9a4 | ||
|
5d35edb126 | ||
|
8bdfdc39cb | ||
|
d465b51da8 | ||
|
3344d2e5f3 | ||
|
0521da124e | ||
|
7e9c5a668f | ||
|
08e2c1684f | ||
|
36ab188ad1 | ||
|
2e69e09808 | ||
|
adba360466 | ||
|
5be6bb755d | ||
|
189a323f3c | ||
|
adbf785aba | ||
|
b1258d0b43 | ||
|
f33ec58e7c | ||
|
58bd818539 | ||
|
b875e67fe0 | ||
|
b9528c05a0 | ||
|
bc98100401 | ||
|
26bbb21520 | ||
|
86a51b5caa | ||
|
c3e039a757 | ||
|
7762f555c5 | ||
|
e412e23c87 | ||
|
2cb14f6b72 | ||
|
d8f512ca3a | ||
|
c074fec0a7 | ||
|
7c04c4c2bc | ||
|
df82252c95 | ||
|
c747f4afd8 | ||
|
bcd7db0256 | ||
|
469acce76d | ||
|
568f71ce63 | ||
|
f6fbcf54aa | ||
|
c194a1ae20 | ||
|
7df3728394 | ||
|
acad0b5b55 | ||
|
1fae39a49d | ||
|
605ab38660 | ||
|
75b21b20d8 | ||
|
e82459cd29 | ||
|
6dcf80967e | ||
|
3d9edaeaac | ||
|
659240a98b | ||
|
4a5a31bf69 | ||
|
5f73e37657 | ||
|
7a9c0a8172 | ||
|
39914e2380 | ||
|
5a3240f69d | ||
|
19e5fd6277 | ||
|
e9844dc2f5 | ||
|
c9f07c093a | ||
|
6a986d8119 | ||
|
f780de9e71 | ||
|
b830bd2732 | ||
|
e333dedeec | ||
|
6e5a08245c | ||
|
6a82a813e0 | ||
|
7992ecf7f6 | ||
|
967f7cb015 | ||
|
7ca5e03752 | ||
|
e9644c9679 | ||
|
abc6c611fa | ||
|
7673b939a1 | ||
|
c029bd42a7 | ||
|
63d051d9ba | ||
|
1ec5ee08aa | ||
|
66be8ee80e | ||
|
d26d1b4b87 | ||
|
3716b50616 | ||
|
5e398bd07a | ||
|
2ee000debb | ||
|
b8e33201bd | ||
|
1c33be4828 | ||
|
c40229e9fa | ||
|
b7ec7625c0 | ||
|
64170d4957 | ||
|
d82c3b55e0 | ||
|
01800a3534 | ||
|
01404bf9cd | ||
|
2f9d73c0b3 | ||
|
670c2e4872 | ||
|
1261122a57 | ||
|
2a17ec9280 | ||
|
1424410115 | ||
|
f20eccf279 | ||
|
c18cbe1d26 | ||
|
d5a3ae43e0 | ||
|
767abacd27 | ||
|
2b3172ba8e | ||
|
1ff8a48ca3 | ||
|
5b7645b6d5 | ||
|
ae82474b19 | ||
|
d38c59c5b1 | ||
|
a4205afb7b | ||
|
75e187ee34 | ||
|
a37ed82bb4 | ||
|
a7233de561 | ||
|
e87c5eee6b | ||
|
7a75290709 | ||
|
981f6df9ee | ||
|
c4572c66d3 | ||
|
8e7d750a5a | ||
|
94961466f9 | ||
|
0f3fe45b06 | ||
|
0650457ea5 | ||
|
2e1ce03f13 | ||
|
9b345db623 | ||
|
c1afcc5219 | ||
|
fb394b7f45 | ||
|
381598f1bb | ||
|
25b7a76da9 | ||
|
4b03ebe3cb | ||
|
664c59136a | ||
|
27b61aae73 | ||
|
d90fcd1889 | ||
|
979d5c579b | ||
|
5124ca1738 | ||
|
ac5d9b656a | ||
|
9a02739251 | ||
|
4af2aadc48 | ||
|
84779b8d02 | ||
|
145e8d23f0 | ||
|
d0ba0583a5 | ||
|
17d8b54280 | ||
|
2cf0bfe3c4 | ||
|
070a8cf148 | ||
|
f94c21446a | ||
|
1ef1873016 | ||
|
32e4e29e7c | ||
|
65ca0dd9e0 | ||
|
3385e12c01 | ||
|
3566a4afa3 | ||
|
68ff033342 | ||
|
f141b0be5c | ||
|
d399dd160f | ||
|
4c8ed784cd | ||
|
fb3402acd4 | ||
|
8cad430816 | ||
|
01502b456e | ||
|
9b6314066b | ||
|
e61dadcbc6 | ||
|
f7baf5b2fd | ||
|
0545826d57 | ||
|
a29904704c | ||
|
899d374222 | ||
|
07ff2305fd | ||
|
ee96dd3ab6 | ||
|
a766d3a133 | ||
|
67545b0371 | ||
|
6b86d825ea | ||
|
31dbc57e8b | ||
|
00050f629c | ||
|
3760aabf13 | ||
|
22e092b513 | ||
|
a4f7c90e09 | ||
|
4b92ab46a3 | ||
|
0573bf2402 | ||
|
e28e538272 | ||
|
6f8f175890 | ||
|
fbf9ab6c5f | ||
|
3c67175e68 | ||
|
b0d25a1d33 | ||
|
9ea8709835 | ||
|
ae22c59f21 | ||
|
12b8ba68b3 | ||
|
6b086c9bff | ||
|
546a1198a1 | ||
|
1001e04b63 | ||
|
2c96729d76 | ||
|
194d22ad90 | ||
|
51e86448c7 | ||
|
e42107c03c | ||
|
abd9260193 | ||
|
042e2ba97d | ||
|
d5240f7afd | ||
|
cda90df995 | ||
|
446e855b74 | ||
|
fb31f25d71 | ||
|
ba43d8c3f5 | ||
|
3924781797 | ||
|
b99a6a9fc9 | ||
|
2967f4d4c7 | ||
|
285eeb1d12 | ||
|
6374215ebc | ||
|
8f0c0f215c | ||
|
5fc764e72b | ||
|
b330313c55 | ||
|
aa9ce73758 | ||
|
d97fda41b2 | ||
|
945ad79c03 | ||
|
6273807525 | ||
|
50803a2c24 | ||
|
a0e9b05680 | ||
|
41e74cd816 | ||
|
b379c8e36b | ||
|
76e893f86e | ||
|
5da1599959 | ||
|
1d997e7c86 | ||
|
35e2eba303 | ||
|
b50f8f8ecd | ||
|
c16d3be85f | ||
|
bd1232644f | ||
|
37ca460ff2 | ||
|
478acdc847 | ||
|
f9ec94ea97 | ||
|
576c5f242c | ||
|
dba8bba41a | ||
|
55a00aa6fe | ||
|
22133f64cf | ||
|
2efb2377b6 | ||
|
9f75a96ad6 | ||
|
d0be9bb957 | ||
|
c25adf0a56 | ||
|
0ca79fd843 | ||
|
efc516eb3b | ||
|
dca3ac9250 | ||
|
33668a3688 | ||
|
5414a70abb | ||
|
85aee63d1e | ||
|
ad09c851f6 | ||
|
c57f36820b | ||
|
6bb2702e07 | ||
|
b1dbd3ee17 | ||
|
2d41db349a | ||
|
6b73b9327a | ||
|
e3ea54329d | ||
|
686a76f32c | ||
|
cdafb82a49 | ||
|
0075f10f98 | ||
|
b70c0e4ab3 | ||
|
01aca092a1 | ||
|
8e6449ec12 | ||
|
984c4e2449 | ||
|
002c5485f5 | ||
|
12d74f15c0 | ||
|
2e87e179f0 | ||
|
a861126c0f | ||
|
8f5e58e8ad | ||
|
6c26f1f677 | ||
|
d7caaca5e4 | ||
|
835c81f329 | ||
|
1615b0cb29 | ||
|
c07a279c81 | ||
|
1478dae316 | ||
|
83a1e6616a | ||
|
66bd786842 | ||
|
33d73d8be8 | ||
|
75e190ba64 | ||
|
820569a52b | ||
|
05005eac32 | ||
|
5aa677c6fb | ||
|
456a3a9216 | ||
|
be25a7596f | ||
|
59a07e5dde | ||
|
6946a815e2 | ||
|
4a84e94022 | ||
|
5ba5d1f90e | ||
|
beb2bbcdc9 | ||
|
805fd5ae08 | ||
|
96093e313a | ||
|
afe9e88f9a | ||
|
b43048c674 | ||
|
11c38a599b | ||
|
0ce245f480 | ||
|
aef15cf3d3 | ||
|
d1880de30e | ||
|
9d900a69ed | ||
|
1653f77b15 | ||
|
9418436d51 | ||
|
1c9a6a194a | ||
|
11cfb5a962 | ||
|
7d21467447 | ||
|
5ce9f32deb | ||
|
337440259f | ||
|
c483e0768f | ||
|
fd9b0d9417 | ||
|
c3165f4937 | ||
|
a5c9adc872 | ||
|
59cc007931 | ||
|
8b0b12b521 | ||
|
6ae1cfd82e | ||
|
4d7eb27fd0 | ||
|
fe0b8d0128 | ||
|
04f0fcfbf7 | ||
|
7e182cf070 | ||
|
ad78c302ef | ||
|
36b4c69491 | ||
|
30bd0711f4 | ||
|
d847827584 | ||
|
786c1fcd58 | ||
|
90e7f0c0f7 | ||
|
63f334abe5 | ||
|
2466cd942f | ||
|
ea37db87f4 | ||
|
c168fb6960 | ||
|
03fb707b93 | ||
|
db226c2584 | ||
|
1c6ec82c91 | ||
|
40eb77ffde | ||
|
17ddb01cd1 | ||
|
ca56c7af70 | ||
|
55c428070f | ||
|
574eec1c08 | ||
|
15cde8173e | ||
|
ccb581b4ee | ||
|
c5f8db5b50 | ||
|
611748fbaf | ||
|
b57dfa9432 | ||
|
253982d579 | ||
|
94c7a19aa0 | ||
|
e9b360a721 | ||
|
ebf7f5932a | ||
|
4427f2fb99 | ||
|
6626dfbac3 | ||
|
093a6387a2 | ||
|
21ddde9e0d | ||
|
44d4e4e6da | ||
|
e34e53eeb3 | ||
|
07fb45bb34 | ||
|
d381669733 | ||
|
fb9eb15ae1 | ||
|
a2127c382b | ||
|
e10d39c093 | ||
|
a933b49e7c | ||
|
38bcd610df | ||
|
5beb476a28 | ||
|
3a43ce6546 | ||
|
c11fddb097 | ||
|
98f79cd9bf | ||
|
a3d3fe758b | ||
|
93587cf1b6 | ||
|
361e95f102 | ||
|
be212e7d1d | ||
|
003a30727f | ||
|
27b662e2dc | ||
|
0b4d7ad95e | ||
|
7acbfb230a | ||
|
b974310798 | ||
|
e391725eed | ||
|
f505580b33 | ||
|
270f932a48 | ||
|
b9afa908e3 | ||
|
6dcc78b9e5 | ||
|
7b0e7e8612 | ||
|
1ece4abd9d | ||
|
07c03b672b | ||
|
27ea50ec16 | ||
|
e1195e6663 | ||
|
faeb17f319 | ||
|
db91b1b127 | ||
|
b5b511c86b | ||
|
8c805fe0c9 | ||
|
b0672eb294 | ||
|
750019808c | ||
|
7f4510467f | ||
|
a46f8430df | ||
|
5e1ecb2b11 | ||
|
4fff59f16b | ||
|
eea8f5e07e | ||
|
a3fcd636e7 | ||
|
de6dc19077 | ||
|
7a8e3aca03 | ||
|
076047ad24 | ||
|
a4e1c8c24f | ||
|
3bf1c0075e | ||
|
1821ade319 | ||
|
dcd4f072d5 | ||
|
1734c7f545 | ||
|
aef3d340ae | ||
|
e39d4bc288 | ||
|
ed35b0f81a | ||
|
4805c9e1c9 | ||
|
eebcbe0f67 | ||
|
61e2b79357 | ||
|
fd3b03d3de | ||
|
9423a28158 | ||
|
55062068fd | ||
|
542b6f670d | ||
|
5b163b42b4 | ||
|
613dce51fb | ||
|
40adb5b203 | ||
|
fba796fa84 | ||
|
db4c3f9bfa | ||
|
d960cc6ad7 | ||
|
c620ec1f24 | ||
|
2d78bba6f4 | ||
|
b7a3f5d740 | ||
|
96def3c5d4 | ||
|
e1941d9d87 | ||
|
a30cf03678 | ||
|
aa0dcd3b7e | ||
|
810e92f7a3 | ||
|
5dd49fc1e1 | ||
|
8517af105d | ||
|
442cf7f9b3 | ||
|
82878b5214 | ||
|
b0f1102540 | ||
|
2efee7e6de | ||
|
abcecc7476 | ||
|
c28005f649 | ||
|
a369e61f18 | ||
|
05d82b6c05 | ||
|
68ca8fd250 | ||
|
b55b565ee5 | ||
|
fc98d66ef4 | ||
|
f6642c075d | ||
|
458a337521 | ||
|
37d2299a1d | ||
|
f69cffc50b | ||
|
fd77a17ba5 | ||
|
b481cf53e7 | ||
|
a4a4590c45 | ||
|
9e398beb07 | ||
|
38ae3df423 | ||
|
2f17701b68 | ||
|
4c797c1d4c | ||
|
a8e1c22c93 | ||
|
b60021e0ce | ||
|
453ccd3271 | ||
|
08f13aebe3 | ||
|
26df1be871 | ||
|
fe2def9684 | ||
|
db2cab3cef | ||
|
d84405191f | ||
|
349d32a268 | ||
|
30b7e17b6f | ||
|
2d3d3bc0a4 | ||
|
a4f887921a | ||
|
710732d7f5 | ||
|
cd08c16dee | ||
|
a8f36a2490 | ||
|
7f12d06989 | ||
|
8eb0313841 | ||
|
113eb84461 | ||
|
cdf42e50f0 | ||
|
e59cf03d80 | ||
|
0bd0e6caeb | ||
|
605623a7af | ||
|
042d055d85 | ||
|
cc29d0a850 | ||
|
7dede49aee | ||
|
775282ae02 | ||
|
e49806078a | ||
|
71d8c0d219 | ||
|
0031c5a5ad | ||
|
3ce111550e | ||
|
58af83cc8c | ||
|
422a23e700 | ||
|
8c2672cdf8 | ||
|
764e49985b | ||
|
84251f8f10 | ||
|
3d878cb5dd | ||
|
8b4740d28c | ||
|
0845e265c2 | ||
|
b4455a3802 | ||
|
8d12d47691 | ||
|
3dc01b0d5c | ||
|
b442645280 | ||
|
eda2b5f822 | ||
|
d9593db5e2 | ||
|
9dcb8e2680 | ||
|
56bac9fc97 | ||
|
f7ad9c56c8 | ||
|
0086a0ddc8 | ||
|
25ebfd6978 | ||
|
de8149137a | ||
|
79ae110368 | ||
|
60aef0de1a | ||
|
8d464962a8 | ||
|
b93cfc5de2 | ||
|
d41f5b1090 | ||
|
40322813c9 | ||
|
4a98927e32 | ||
|
193e529803 | ||
|
fbf20ef2c2 | ||
|
54de829c8a | ||
|
131b987561 | ||
|
dce6754c62 | ||
|
f4bca90080 | ||
|
b2960b1ed9 | ||
|
33f87bce23 | ||
|
23aa45609b | ||
|
b098952f82 | ||
|
68c3e14b0c | ||
|
19d08137a5 | ||
|
73776e7869 | ||
|
bf04ca12c1 | ||
|
a4637debe9 | ||
|
48c1b525be | ||
|
56470bfbba | ||
|
0f732ca874 | ||
|
e452ba938d | ||
|
9921c5a925 | ||
|
58fab75681 | ||
|
54990308f6 | ||
|
f95758ff47 | ||
|
8d830e178f | ||
|
334a521ca1 | ||
|
12629a1955 | ||
|
2e3669a32f | ||
|
ea337607c4 | ||
|
f7f317a3b2 | ||
|
adbf6defe5 | ||
|
e0709f2975 | ||
|
30007b05cb | ||
|
13fc7f0d8d | ||
|
7c85138115 | ||
|
2c25f65f7f | ||
|
7eaba962e8 | ||
|
7c38393cde | ||
|
153fd2ae74 | ||
|
c0204c810c | ||
|
944c107e26 | ||
|
18e05c06fd | ||
|
fb79dbf17c | ||
|
31a8163c61 | ||
|
8bcd729250 | ||
|
80c4e69528 | ||
|
7f6d8fdb87 | ||
|
c8e301326e | ||
|
4820ef6580 | ||
|
4cb775cf4b | ||
|
c371662c51 | ||
|
ffaa164aa5 | ||
|
344bfbe059 | ||
|
6c38b87ec5 | ||
|
dfcd5d79be | ||
|
07631eea28 | ||
|
26c4fe36cc | ||
|
90fc4b44f2 | ||
|
f755dd2d48 | ||
|
d2647f96e7 | ||
|
9f94ec067a | ||
|
a795755618 | ||
|
8457a1c881 | ||
|
fc9429bf3e | ||
|
b6e8b66035 | ||
|
7504b21c3e | ||
|
b7dad8166d | ||
|
2da1b43c37 | ||
|
a606315884 | ||
|
295feedd77 | ||
|
d3b2748c8f | ||
|
1b4655fd70 | ||
|
05f67ef584 | ||
|
04ab7ba07d | ||
|
5806323970 | ||
|
ee260a3df7 | ||
|
7cb41fb333 | ||
|
d38adbfdc2 | ||
|
e6a6766ef1 | ||
|
a1e596491c | ||
|
9c920908a6 | ||
|
0014bffeb8 | ||
|
63c17f99b2 | ||
|
ec1e0e2807 | ||
|
2f16419a7b | ||
|
02c13859e7 | ||
|
57ec9b8e36 | ||
|
41ad35880d | ||
|
3aa946e028 | ||
|
53e46895aa | ||
|
c61389037d | ||
|
6172d60e00 | ||
|
f909f1d9ff | ||
|
55018ca046 | ||
|
19c746a865 | ||
|
503d2aa786 | ||
|
70d83ab501 | ||
|
edab602bb7 | ||
|
f9bcc4b1fa | ||
|
f3fe86167c | ||
|
2189fb46a2 | ||
|
7ff4178c8b | ||
|
fffd695ef8 | ||
|
ee592de035 | ||
|
7394e50ae2 | ||
|
f42fcff04a | ||
|
4eb3ce7c14 | ||
|
a977c567ce | ||
|
785bd7e905 | ||
|
df19f699d4 | ||
|
5e6e932e7e | ||
|
5bc397f01a | ||
|
42209e367f | ||
|
d53b1670d3 | ||
|
a6d450ba18 | ||
|
e8c1a95128 | ||
|
edb201f210 | ||
|
fe57367a8c | ||
|
134194a95b | ||
|
41c0e6fe2d | ||
|
c07914e733 | ||
|
52e2302f4f | ||
|
0a6b34b4f2 | ||
|
1e06b4dd0b | ||
|
5701f95e0b | ||
|
60d3572d37 | ||
|
ffa6e6a571 | ||
|
d6453cd735 | ||
|
fd79f9df44 | ||
|
4587340293 | ||
|
90bfdc7573 | ||
|
eca12f661f | ||
|
f85878b843 | ||
|
6499b5eaab | ||
|
7e4fece63d | ||
|
512eddf8be | ||
|
f0fa93a811 | ||
|
3c8de21709 | ||
|
81173e8340 | ||
|
35a8fa5f02 | ||
|
443036936d | ||
|
ac88007593 | ||
|
2297589dca | ||
|
6ada5fa560 | ||
|
8f6eefb5e7 | ||
|
b36a50381b | ||
|
51f84b3060 | ||
|
72132a19b0 | ||
|
065d165211 | ||
|
cabedf39b2 | ||
|
5d3806fcd4 | ||
|
01695b3342 | ||
|
71fb5fe077 | ||
|
3bec106840 | ||
|
fb01c36be1 | ||
|
26d851e69e | ||
|
28c18c046b | ||
|
318cef7e3b | ||
|
e8dc8f25be | ||
|
10ccc30240 | ||
|
5adc877d5e | ||
|
30923afb2b | ||
|
4eb6813b43 | ||
|
7521a31619 | ||
|
fc05beb452 | ||
|
1103428a83 | ||
|
d06d521bf0 | ||
|
8f64f1c0eb | ||
|
d11c232171 | ||
|
93c73248de | ||
|
5bed081ab9 | ||
|
c5188c503e | ||
|
98ffcac7b6 | ||
|
df1e81d611 | ||
|
9711170b08 | ||
|
e43264bdce | ||
|
e0643bed7a | ||
|
7f0eb3b064 | ||
|
f38e510526 | ||
|
25f99b23b2 | ||
|
44281fc8a0 | ||
|
eed3902cb7 | ||
|
94a3bb0443 | ||
|
8dcc36880e | ||
|
695bb31894 | ||
|
f8ded66869 | ||
|
8e4bdbc584 | ||
|
f7b14b01bc | ||
|
705b9bf0f2 | ||
|
f0226dbc54 | ||
|
1b1dfb0d7b | ||
|
8ed5092a76 | ||
|
d609821be6 | ||
|
cd0201074c | ||
|
1d8feec7bc | ||
|
d941472c84 | ||
|
674a118fac | ||
|
1334d793f6 | ||
|
60354c0202 | ||
|
22081d3f0a | ||
|
4b3f8fc78d | ||
|
4bd1aab86d | ||
|
60362cb60c | ||
|
27f740bf98 | ||
|
5e15747a5b | ||
|
8a6eaad2bb | ||
|
5ab52d9f66 | ||
|
21a327bf08 | ||
|
15dd175394 | ||
|
3f35305beb | ||
|
768d8b1515 | ||
|
1c19428a12 | ||
|
c204533195 | ||
|
6d89485792 | ||
|
949d818bad | ||
|
a12e200a0a | ||
|
b4039b1f13 | ||
|
32921e15b1 | ||
|
4f7cc7d53b | ||
|
0986bfbc34 | ||
|
663202bfc6 | ||
|
6f63ddf5b0 | ||
|
a9805b144a | ||
|
e1b8b9b3ae | ||
|
d57327fd11 | ||
|
15ac69bfad | ||
|
a5bd28f8d4 | ||
|
b2516ca1b4 | ||
|
053b46ae63 | ||
|
6e836aceec | ||
|
0e8bcd2e79 | ||
|
bd1f8b2497 | ||
|
19dfcf7139 | ||
|
ef7a3287bb | ||
|
2900049498 | ||
|
04d1e8fd59 | ||
|
9d2f57e40a | ||
|
ae366341cc | ||
|
3766128cb8 | ||
|
950c60d55c | ||
|
4b2807de48 | ||
|
649736cb31 | ||
|
6a121a8a78 | ||
|
f69b9ac9da | ||
|
23d70a2fac | ||
|
d178ff9de0 | ||
|
3ecad3457f | ||
|
fa6c621968 | ||
|
df863b6cff | ||
|
9316ff3e51 | ||
|
bfd91f8ee6 | ||
|
13e5d25cfe | ||
|
b13030420b | ||
|
44d1e8181c | ||
|
63b34c1853 | ||
|
facd0144cb | ||
|
115e3435af | ||
|
d44cd50768 | ||
|
1afcaea4c6 | ||
|
2bd1b37717 | ||
|
2d37177316 | ||
|
abb25e2015 | ||
|
d08d075e30 | ||
|
b4c67c02a7 | ||
|
04fb6a953e | ||
|
5dce0bec8e | ||
|
481bb3fb0a | ||
|
b6960dc299 | ||
|
73104aae1f | ||
|
10a284848b | ||
|
fd6560bdd0 | ||
|
0810f617c7 | ||
|
c3ffd39450 | ||
|
0f69e0d672 | ||
|
1aa8ebe57f | ||
|
23178614d5 | ||
|
d2b6829574 | ||
|
5602715c96 | ||
|
54d0433dd4 | ||
|
f4bc313d0b | ||
|
5617de3a79 | ||
|
2d62f0ff06 | ||
|
1c79f6b1b6 | ||
|
bf01153c6b | ||
|
c43b37baef | ||
|
d4942efd8e | ||
|
ea9f635b1a | ||
|
7eaa0e16b3 | ||
|
1b97d8fd48 | ||
|
89a29b9b10 | ||
|
2baac1a6d7 | ||
|
cd296aa9ac | ||
|
959d168352 | ||
|
6cd60951ba | ||
|
3898c0c0ef | ||
|
fe4d139817 | ||
|
d95f3ca59f | ||
|
7f6c03ce17 | ||
|
394d0eabef | ||
|
a8ae496fda | ||
|
1787f4421b | ||
|
36351a5dd9 | ||
|
d009ce31ca | ||
|
44eafeeae5 | ||
|
21165eb3e0 | ||
|
2ef3a33fbf | ||
|
f74be0402f | ||
|
a60cb366b2 | ||
|
58e2ef187d | ||
|
ae80fd8578 | ||
|
c17f2efca6 | ||
|
4a185639b9 | ||
|
dae7e7d507 | ||
|
e33e3cc40f | ||
|
36ec1daf3a | ||
|
50aff9cfb6 | ||
|
058a0f9fb2 | ||
|
0c955efa8b | ||
|
a62916a63d | ||
|
af7a4b5d3d | ||
|
2ae3929dd6 | ||
|
ebd30f4861 | ||
|
afc9ea08f3 | ||
|
78f9f7e2dd | ||
|
c44b827922 | ||
|
fb30f7ec8f | ||
|
e878d5ce07 | ||
|
f727a38b69 | ||
|
c11a5384da | ||
|
ed92cbd4b8 | ||
|
a9ea32772f | ||
|
92f5cca65b | ||
|
57b064f590 | ||
|
9729434926 | ||
|
9d9dffee74 | ||
|
b3f374f4ea | ||
|
50e07d422f | ||
|
631ed4956a | ||
|
0eca1c8d03 | ||
|
e38e4574ad | ||
|
be2d3f3637 | ||
|
0e3d779e24 | ||
|
4d25336d87 | ||
|
74f76a2835 | ||
|
84560a6f44 | ||
|
6fde693e7a | ||
|
2e46d9ba33 | ||
|
e36f8deb08 | ||
|
1631b422f1 | ||
|
b58d809063 | ||
|
9e34314dbc | ||
|
e4aa218b5f | ||
|
31722477d4 | ||
|
ec82105433 | ||
|
146e164f04 | ||
|
7d37c93988 | ||
|
73dffacd9a | ||
|
d37304fa68 | ||
|
62f4da6063 | ||
|
760da08ab7 | ||
|
e68c4d4408 | ||
|
46a200aa1f | ||
|
c422039335 | ||
|
0579c8565d | ||
|
9f25880a59 | ||
|
05f1819f7d | ||
|
fa2149f957 | ||
|
c21a79e029 | ||
|
03e31ebb5e | ||
|
3c20e5f3af | ||
|
9a9dd9e075 | ||
|
7189986c03 | ||
|
b407d8d315 | ||
|
41fa2a6208 | ||
|
fe00c4c373 | ||
|
7248a76c63 | ||
|
ee3c618797 | ||
|
a1241ebedb | ||
|
af78d998db | ||
|
d96c235ffe | ||
|
79ca1b5f4e | ||
|
0f68735e1c | ||
|
82abee37de | ||
|
507040f1fd | ||
|
42dc8486e9 | ||
|
6c655634bc | ||
|
f2166b97b8 | ||
|
da88e02be0 | ||
|
0d56b7d251 | ||
|
0a089efcac | ||
|
89ab360391 | ||
|
2bd97d9a99 | ||
|
103b9056e4 | ||
|
23c4352c18 | ||
|
2dddaa36d5 | ||
|
8ab7cf2388 | ||
|
f191086adb | ||
|
68b446db18 | ||
|
3d49d81856 | ||
|
96493425d1 | ||
|
419975285c | ||
|
aa5bde122e | ||
|
0fa3c2bd8d | ||
|
b9249a4d96 | ||
|
6638ca270f | ||
|
9bfef892f8 | ||
|
32e5efec7c | ||
|
36457455ca | ||
|
062c148e43 | ||
|
2314ce8004 | ||
|
a3ff73903a | ||
|
7c8445707e | ||
|
291e73da4b | ||
|
286a29ca3e | ||
|
71cf6c6a5e | ||
|
1e8f0adaf8 | ||
|
33531244aa | ||
|
06049a9a28 | ||
|
d313f5fdf5 | ||
|
f4868126c1 | ||
|
00147e98dd | ||
|
6d22663ca2 | ||
|
756bb9cf5e | ||
|
399d7968f5 | ||
|
966b68f42e | ||
|
134c551c12 | ||
|
9aeca15355 | ||
|
6c6d31830b | ||
|
e8cc321898 | ||
|
e73fe06f7e | ||
|
98b579c042 | ||
|
7b3a5c1afd | ||
|
7e2e49e129 | ||
|
e8ef630424 | ||
|
8805bcf6f6 | ||
|
ff5c9a3aa0 | ||
|
3a274dcaa7 | ||
|
ddfededf02 | ||
|
e1785898ba | ||
|
ae09200f42 | ||
|
847984f678 | ||
|
5971d155ef | ||
|
42305672ac | ||
|
25a56d9f72 | ||
|
cea52c0ac7 | ||
|
1b33ff9c25 | ||
|
8f9f08b96f | ||
|
594ba205bb | ||
|
3c65b46aa5 | ||
|
1cf9c76329 | ||
|
495f5c71c3 | ||
|
7e80f607b7 | ||
|
d93732e451 | ||
|
1b57bc7889 | ||
|
c0499df4ec | ||
|
d90ac519f7 | ||
|
a0e92b6969 | ||
|
df49dd23e2 | ||
|
d4525da6bc | ||
|
25b11bd20b | ||
|
9e373a9b0d | ||
|
705aac419a | ||
|
4fb61646b4 | ||
|
f6e642f72e | ||
|
565bd87959 | ||
|
5751f7e5a3 | ||
|
f5a755d4fc | ||
|
a500de8ab1 | ||
|
303548a5fe | ||
|
68de905698 | ||
|
9240b9868b | ||
|
0e2e155cc6 | ||
|
bffa0088b4 | ||
|
2e993857e8 | ||
|
117a376fc3 | ||
|
1daffedde0 | ||
|
0e8fdd76a6 | ||
|
7ff4f29bcb | ||
|
9e4cff2b23 | ||
|
4aaea89f2c | ||
|
4fbf7b38fb | ||
|
76075401f9 | ||
|
e2a20dd63d | ||
|
b52a1f3eb1 | ||
|
7fd5a88122 | ||
|
1a1baa5cda | ||
|
577d671a0c | ||
|
380029ffd8 | ||
|
e2f1fc307f | ||
|
76cc27a267 | ||
|
e8a6f30e4e | ||
|
fe6021a3d6 | ||
|
563c54702b | ||
|
4d67d27ba0 | ||
|
edf3876a57 | ||
|
2d10f255c2 | ||
|
ee76cc6761 | ||
|
f197e6623b | ||
|
42a9809450 | ||
|
444f80a933 | ||
|
4b985c818a | ||
|
2e62fe7b72 | ||
|
ccd182aed9 | ||
|
615eef3fdd | ||
|
d4e4907363 | ||
|
c205e93876 | ||
|
3b24bb99bb | ||
|
2814cd1b2a | ||
|
5285e1ac14 | ||
|
48a999cf91 | ||
|
3117c8846e | ||
|
6bb297e76f | ||
|
bc698f67ea | ||
|
f1c859aaa3 | ||
|
2d0aa207d4 | ||
|
4a75e9c262 | ||
|
ee7c4b8863 | ||
|
f782979d6c | ||
|
53cce6510c | ||
|
53252b84fd | ||
|
8f3cf38f77 | ||
|
f33766a062 | ||
|
ac5e62c65d | ||
|
e2289ce1e6 | ||
|
f0e2913802 | ||
|
1fa928b98f | ||
|
1c691cca33 | ||
|
69e1eb3eff | ||
|
90794cb515 | ||
|
28d7e24d30 | ||
|
6a62f781e9 | ||
|
fb6c67fa04 | ||
|
03e9e3dbdb | ||
|
5520992861 | ||
|
5f1502eea7 | ||
|
b3560ff525 | ||
|
8030167ffc | ||
|
fd2c1615cf | ||
|
b976239580 | ||
|
7d8d773f8f | ||
|
b930ad4da7 | ||
|
abad7cdf16 | ||
|
0e5eb036b0 | ||
|
d995bfc081 | ||
|
c920070ce2 | ||
|
277f5e538f | ||
|
89f197b9d4 | ||
|
c35ff3174a | ||
|
94085ee940 | ||
|
c841fa3620 | ||
|
69b2c1f4d2 | ||
|
2f7a1c941e | ||
|
c06fb8daf6 | ||
|
26948a058a | ||
|
1220564f30 | ||
|
ea4be9dd0c | ||
|
1ccda0b598 | ||
|
eb3b67ffd6 | ||
|
4819b5ac5d | ||
|
591b795aa3 | ||
|
ac21ed7d18 | ||
|
d9c66a2db0 | ||
|
d740814f88 | ||
|
cdf1ebf3f7 | ||
|
f2fab5d4ee | ||
|
21a6927279 | ||
|
92190bbc54 | ||
|
9ad005e31f | ||
|
f5c56e02da | ||
|
6f02eff020 | ||
|
c25c0d37c5 | ||
|
4ba1c5bcfc | ||
|
64aefe5848 | ||
|
73f2f71b03 | ||
|
12ee37d700 | ||
|
9679c22a27 | ||
|
1395c95353 | ||
|
4d1fd43c8c | ||
|
71c208c4fb | ||
|
91a2a1afc3 | ||
|
25c1ca2f5d | ||
|
6f0bb82f59 | ||
|
22a5184ebe | ||
|
17b0b1f43f | ||
|
b61df5ec19 | ||
|
1ac7275f83 | ||
|
cd10d04907 | ||
|
f9b76fcb8b | ||
|
093fa067e6 | ||
|
fa655f065b | ||
|
c8f2244912 | ||
|
f3a20e14a6 | ||
|
33ad47b115 | ||
|
775424d3b7 | ||
|
c9c86bbd1d | ||
|
f76a6ad85c | ||
|
2138b14d89 | ||
|
1bf61f57f5 | ||
|
07b55bd71f | ||
|
8d2d3d4002 | ||
|
d182b4b4a6 | ||
|
60f6a91fe4 | ||
|
ec89a2f956 | ||
|
87113d7181 | ||
|
59fae290e5 | ||
|
1a8ba2ce53 | ||
|
dddaa25d86 | ||
|
f28341587a | ||
|
5593bf3e08 | ||
|
92574a7a9d | ||
|
e049266f5d | ||
|
5b3e6fcb07 | ||
|
b0bfb556db | ||
|
484acbcb45 | ||
|
cdc802cfb8 | ||
|
582671ca84 | ||
|
22498b5804 | ||
|
87f277a482 | ||
|
ae0d74f57a | ||
|
0ae5593dde | ||
|
0d11769590 | ||
|
b7d8daf013 | ||
|
a9c0126b05 | ||
|
6bc5a57d10 | ||
|
2714ee96f1 | ||
|
524d382b7a | ||
|
2723e05d2a | ||
|
6dd9bda6b4 | ||
|
44449bc716 | ||
|
b17d8edb50 | ||
|
578072238a | ||
|
b4edd3dcc4 | ||
|
068094caac | ||
|
deb58e617d | ||
|
baca0c1120 | ||
|
02543438a4 | ||
|
d507e59038 | ||
|
9d0fd7ef1b | ||
|
dbef5e2143 | ||
|
04eca755d2 | ||
|
7883692196 | ||
|
8f64977cb9 | ||
|
f94fdc4979 | ||
|
a0a0e28447 | ||
|
f6f7783b94 | ||
|
d233cc1de8 | ||
|
37671499c8 | ||
|
c83b79998d | ||
|
ed842c2b42 | ||
|
8c5f114339 | ||
|
8b2f1d0b4f | ||
|
591a1b3050 | ||
|
42ec3fe02b | ||
|
370a398b5e | ||
|
554d89b6e9 | ||
|
cb049f5dda | ||
|
0728668d41 | ||
|
dfc187874e | ||
|
225588f3e7 | ||
|
06cc6c29aa | ||
|
b2d4469908 | ||
|
c398383905 | ||
|
7af9dce33b | ||
|
038790a5d6 | ||
|
fb3295bde1 | ||
|
43a4fd2ecb | ||
|
899c72d068 | ||
|
d118c0d886 | ||
|
6d4004d1ed | ||
|
ae60cd5b28 | ||
|
ab31a72199 | ||
|
2c1b9534f3 | ||
|
7028cb1546 | ||
|
dc1ecf6a42 | ||
|
3a27f9d02c | ||
|
4b27ab38f8 | ||
|
40de147611 | ||
|
df5756dc86 | ||
|
bb4f90d730 | ||
|
d89d46aaec | ||
|
304d720c4c | ||
|
7eff160190 | ||
|
8b2e18ed9d | ||
|
7001051833 | ||
|
b4b9752c05 | ||
|
acadc89eaa | ||
|
6ff84b8e90 | ||
|
7f3e3fc3bf | ||
|
02233fd7a4 | ||
|
50d3db0643 | ||
|
3751831779 | ||
|
14a24e47fb | ||
|
b7e78cb0e6 | ||
|
a8f65f42fc | ||
|
d3385a116d | ||
|
e0c446dd13 | ||
|
33d11b4780 | ||
|
07c49d1d04 | ||
|
9463285ac9 | ||
|
b41fc43e64 | ||
|
562763c938 | ||
|
ec60194110 | ||
|
1e472ee095 | ||
|
5597327448 | ||
|
cdd5baf5be | ||
|
7b5978059b | ||
|
da0b41e45c | ||
|
d0be2afba5 | ||
|
d99851231a | ||
|
7e02c141f9 | ||
|
d03960e379 | ||
|
16d3984ffc | ||
|
856a194988 | ||
|
1bff966bfe | ||
|
1948b6118b | ||
|
20c25d3ca2 | ||
|
a153735ac3 | ||
|
62509f7c18 | ||
|
9b48b67158 | ||
|
cbd50634a4 | ||
|
f475393bc1 | ||
|
abcddb09bf | ||
|
cf71a0fc55 | ||
|
78253f9e1e | ||
|
ebd0848c7f | ||
|
c8461eb0b5 | ||
|
a4cbdeaeac | ||
|
3e1ce69d52 | ||
|
08a26b976e | ||
|
5fc55381a2 | ||
|
dbf3d24ae7 | ||
|
cc7c6e02c5 | ||
|
b45aa85853 | ||
|
e7526ac5e3 | ||
|
441ada70b8 | ||
|
dedc06a46b | ||
|
b0adf1b277 | ||
|
28f65e9f44 | ||
|
a013af5f0d | ||
|
9552701662 | ||
|
ef52f0aad1 | ||
|
0b6f04905a | ||
|
cdb36357d4 | ||
|
8938622bd9 | ||
|
b210294aa9 | ||
|
5b02f20775 | ||
|
fac382a5df | ||
|
88d88bebc9 | ||
|
755fb9c29b | ||
|
51a835ab51 | ||
|
c9895ab182 | ||
|
e71d46a4e5 | ||
|
8d1d5f37c1 | ||
|
525a68682d | ||
|
715648d0d8 | ||
|
9452e93f22 | ||
|
a6aa145471 | ||
|
25aa6dcb59 |
@@ -19,26 +19,25 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use PhpCsFixer\Runner\Parallel\ParallelConfigFactory;
|
|
||||||
|
|
||||||
$current = __DIR__;
|
$current = __DIR__;
|
||||||
|
|
||||||
$paths = [
|
$paths = [
|
||||||
$current . '/../../app',
|
$current . '/../../app',
|
||||||
$current . '/../../config',
|
$current . '/../../config',
|
||||||
$current . '/../../database',
|
|
||||||
$current . '/../../routes',
|
$current . '/../../routes',
|
||||||
$current . '/../../tests',
|
$current . '/../../tests',
|
||||||
$current . '/../../resources/lang',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$finder = PhpCsFixer\Finder::create()
|
$finder = PhpCsFixer\Finder::create()
|
||||||
->in($paths);
|
->in($paths);
|
||||||
|
|
||||||
|
|
||||||
$config = new PhpCsFixer\Config();
|
$config = (new PhpCsFixer\Config())
|
||||||
$config->setParallelConfig(ParallelConfigFactory::detect());
|
// ->setUnsupportedPhpVersionAllowed(true) // use this when PHP 8.5 comes out.
|
||||||
|
->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect())
|
||||||
|
;
|
||||||
return $config->setRules(
|
return $config->setRules(
|
||||||
|
|
||||||
[
|
[
|
||||||
// rule sets
|
// rule sets
|
||||||
'@PHP83Migration' => true,
|
'@PHP83Migration' => true,
|
||||||
@@ -62,7 +61,14 @@ return $config->setRules(
|
|||||||
'type_declaration_spaces' => false,
|
'type_declaration_spaces' => false,
|
||||||
'cast_spaces' => false,
|
'cast_spaces' => false,
|
||||||
|
|
||||||
|
// enabled rules
|
||||||
|
'global_namespace_import' => true, // matches with rector.
|
||||||
|
|
||||||
// complex rules
|
// complex rules
|
||||||
|
'phpdoc_to_comment' => ['ignored_tags' => ['var']],
|
||||||
|
'php_unit_test_case_static_method_calls' => [
|
||||||
|
'call_type' => 'this',
|
||||||
|
],
|
||||||
'array_syntax' => ['syntax' => 'short'],
|
'array_syntax' => ['syntax' => 'short'],
|
||||||
'binary_operator_spaces' => [
|
'binary_operator_spaces' => [
|
||||||
'default' => 'at_least_single_space',
|
'default' => 'at_least_single_space',
|
||||||
@@ -72,5 +78,7 @@ return $config->setRules(
|
|||||||
'??=' => 'align_single_space_minimal_by_scope',
|
'??=' => 'align_single_space_minimal_by_scope',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
])
|
]
|
||||||
|
|
||||||
|
)
|
||||||
->setFinder($finder);
|
->setFinder($finder);
|
||||||
|
416
.ci/php-cs-fixer/composer.lock
generated
416
.ci/php-cs-fixer/composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -26,10 +26,10 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
|||||||
cd $SCRIPT_DIR/php-cs-fixer
|
cd $SCRIPT_DIR/php-cs-fixer
|
||||||
composer update --quiet
|
composer update --quiet
|
||||||
rm -f .php-cs-fixer.cache
|
rm -f .php-cs-fixer.cache
|
||||||
PHP_CS_FIXER_IGNORE_ENV=true
|
|
||||||
./vendor/bin/php-cs-fixer fix \
|
./vendor/bin/php-cs-fixer fix \
|
||||||
--config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \
|
--config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \
|
||||||
--format=txt \
|
--format=txt \
|
||||||
|
-v \
|
||||||
--allow-risky=yes
|
--allow-risky=yes
|
||||||
|
|
||||||
EXIT_CODE=$?
|
EXIT_CODE=$?
|
||||||
|
@@ -1,61 +1,36 @@
|
|||||||
parameters:
|
parameters:
|
||||||
scanFiles:
|
scanFiles:
|
||||||
- ../_ide_helper_models.php
|
- ../_ide_helper
|
||||||
universalObjectCratesClasses:
|
|
||||||
- Illuminate\Database\Eloquent\Model
|
|
||||||
# TODO: slowly remove these parameters and fix the issues found.
|
|
||||||
reportUnmatchedIgnoredErrors: false
|
|
||||||
ignoreErrors:
|
|
||||||
# TODO: slowly remove these exceptions and fix the issues found.
|
|
||||||
- '#Dynamic call to static method#' # all the Laravel ORM things depend on this.
|
|
||||||
- '#Control structures using switch should not be used.#' # switch is fine in some cases.
|
|
||||||
- '#with no value type specified in iterable type array#' # remove this rule when all other issues are solved.
|
|
||||||
- '#has no value type specified in iterable type array#' # remove this rule when all other issues are solved.
|
|
||||||
- '#is not allowed to extend#'
|
|
||||||
- '#does not specify its types#'
|
|
||||||
- '#switch is forbidden to use#'
|
|
||||||
- '#is neither abstract nor final#'
|
|
||||||
- '#on left side of \?\?\= always exists and is not nullable#'
|
|
||||||
- '#has a nullable return type declaration#' # perhaps throw errors instead?
|
|
||||||
- '#with a nullable type declaration#' # decide what action should be if param is null.
|
|
||||||
- '#with null as default value#'
|
|
||||||
-
|
|
||||||
message: '#Constructor in [a-zA-Z0-9\\_]+ has parameter \$[a-zA-Z0-9\\_]+ with default value#'
|
|
||||||
paths:
|
|
||||||
- ../app/Exceptions/IntervalException.php
|
|
||||||
- ../app/Support/Navigation.php
|
|
||||||
-
|
|
||||||
message: '#but containers should not be injected#'
|
|
||||||
paths:
|
|
||||||
- ../app/Support/Authentication/RemoteUserGuard.php
|
|
||||||
-
|
|
||||||
message: '#Function compact\(\) should not be used#' # too useful in template rendering.
|
|
||||||
paths:
|
|
||||||
- ../app/Generator/Report/Account/MonthReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Audit/MonthReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Budget/MonthReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Category/MonthReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Standard/MonthReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Standard/MultiYearReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Standard/YearReportGenerator.php
|
|
||||||
- ../app/Generator/Report/Tag/MonthReportGenerator.php
|
|
||||||
- ../app/Http/Controllers/Account/*.php
|
|
||||||
- ../app/Http/Controllers/Admin/*.php
|
|
||||||
- ../app/Http/Controllers/*.php
|
|
||||||
- ../app/Support/ExpandedForm.php
|
|
||||||
- ../app/Support/Form/AccountForm.php
|
|
||||||
- ../app/Support/Form/CurrencyForm.php
|
|
||||||
- ../app/Support/Form/FormSupport.php
|
|
||||||
-
|
|
||||||
message: '#Either catch a more specific exception#'
|
|
||||||
paths:
|
|
||||||
- ../app/Support/Form/FormSupport.php
|
|
||||||
paths:
|
paths:
|
||||||
- ../app
|
- ../app
|
||||||
- ../database
|
- ../database
|
||||||
- ../routes
|
- ../routes
|
||||||
- ../config
|
- ../config
|
||||||
- ../bootstrap/app.php
|
- ../bootstrap/app.php
|
||||||
|
universalObjectCratesClasses:
|
||||||
|
- Illuminate\Database\Eloquent\Model
|
||||||
|
# TODO: slowly remove these parameters and fix the issues found.
|
||||||
|
reportUnmatchedIgnoredErrors: true
|
||||||
|
ignoreErrors:
|
||||||
|
# TODO: slowly remove these exceptions and fix the issues found.
|
||||||
|
- '#Dynamic call to static method#' # all the Laravel ORM things depend on this.
|
||||||
|
- identifier: varTag.nativeType
|
||||||
|
- identifier: varTag.type
|
||||||
|
-
|
||||||
|
identifier: larastan.noEnvCallsOutsideOfConfig
|
||||||
|
path: ../app/Console/Commands/System/CreatesDatabase.php
|
||||||
|
- identifier: missingType.iterableValue # not interesting enough to fix.
|
||||||
|
- identifier: missingType.generics # not interesting enough to fix.
|
||||||
|
- "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
|
||||||
|
- '#expects view-string, string given#'
|
||||||
|
- '#expects view-string\|null, string given#'
|
||||||
|
|
||||||
|
# phpstan can't handle this so we ignore them.
|
||||||
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#'
|
||||||
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#'
|
||||||
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#'
|
||||||
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::accountTypeIn#'
|
||||||
|
- '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::withTrashed#'
|
||||||
|
|
||||||
# The level 8 is the highest level. original was 5
|
# The level 8 is the highest level. original was 5
|
||||||
# 7 is more than enough, higher just leaves NULL things.
|
# 7 is more than enough, higher just leaves NULL things.
|
||||||
|
82
.ci/rector.php
Normal file
82
.ci/rector.php
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rector.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Rector\Config\RectorConfig;
|
||||||
|
use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector;
|
||||||
|
use Rector\Php80\Rector\ClassMethod\AddParamBasedOnParentClassMethodRector;
|
||||||
|
use Rector\Transform\Rector\String_\StringToClassConstantRector;
|
||||||
|
use RectorLaravel\Set\LaravelLevelSetList;
|
||||||
|
|
||||||
|
|
||||||
|
return RectorConfig::configure()
|
||||||
|
->withSkip([
|
||||||
|
ChangeOrIfContinueToMultiContinueRector::class,
|
||||||
|
AddParamBasedOnParentClassMethodRector::class,
|
||||||
|
StringToClassConstantRector::class => [
|
||||||
|
__DIR__ . '/../app/Http/Controllers/Auth/LoginController.php',
|
||||||
|
],
|
||||||
|
__DIR__.'/../bootstrap/cache/*'
|
||||||
|
])
|
||||||
|
->withPaths([
|
||||||
|
__DIR__ . '/../app',
|
||||||
|
__DIR__ . '/../bootstrap',
|
||||||
|
__DIR__ . '/../config',
|
||||||
|
__DIR__ . '/../public',
|
||||||
|
__DIR__ . '/../resources/lang/en_US',
|
||||||
|
__DIR__ . '/../routes',
|
||||||
|
__DIR__ . '/../tests',
|
||||||
|
])
|
||||||
|
->withSets([
|
||||||
|
LaravelLevelSetList::UP_TO_LARAVEL_120,
|
||||||
|
])
|
||||||
|
// ->withConfiguredRule(ReplaceServiceContainerCallArgRector::class, [
|
||||||
|
// new ReplaceServiceContainerCallArg('log', new ClassConstFetch(new Name('Illuminate\Support\Facades\Log'), 'class')),
|
||||||
|
// ])
|
||||||
|
// uncomment to reach your current PHP version
|
||||||
|
->withPhpSets()
|
||||||
|
->withPreparedSets(
|
||||||
|
codingStyle: false, // leave false
|
||||||
|
privatization: false, // leave false.
|
||||||
|
naming: false, // leave false
|
||||||
|
instanceOf: true,
|
||||||
|
earlyReturn: true,
|
||||||
|
strictBooleans: true,
|
||||||
|
carbon: true,
|
||||||
|
rectorPreset: true,
|
||||||
|
phpunitCodeQuality: true,
|
||||||
|
doctrineCodeQuality: true,
|
||||||
|
symfonyCodeQuality: true,
|
||||||
|
symfonyConfigs: true
|
||||||
|
|
||||||
|
)
|
||||||
|
->withComposerBased(
|
||||||
|
twig: true,
|
||||||
|
doctrine: true,
|
||||||
|
phpunit: true,
|
||||||
|
symfony: true)
|
||||||
|
->withTypeCoverageLevel(0)
|
||||||
|
->withDeadCodeLevel(0)
|
||||||
|
->withCodeQualityLevel(0)
|
||||||
|
->withImportNames(removeUnusedImports: true);// import statements instead of full classes.
|
36
.ci/rector.sh
Executable file
36
.ci/rector.sh
Executable file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# phpstan.sh
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Install composer packages
|
||||||
|
#composer install --no-scripts --no-ansi
|
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
|
||||||
|
echo $1
|
||||||
|
|
||||||
|
if [ "$1" == "--dry-run" ]; then
|
||||||
|
echo "Running rector in dry run."
|
||||||
|
$SCRIPT_DIR/../vendor/bin/rector --config $SCRIPT_DIR/rector.php --dry-run
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
$SCRIPT_DIR/../vendor/bin/rector --config $SCRIPT_DIR/rector.php
|
33
.env.example
33
.env.example
@@ -19,7 +19,7 @@ SITE_OWNER=mail@example.com
|
|||||||
APP_KEY=SomeRandomStringOf32CharsExactly
|
APP_KEY=SomeRandomStringOf32CharsExactly
|
||||||
|
|
||||||
# Firefly III will launch using this language (for new users and unauthenticated visitors)
|
# 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
|
# For a list of available languages: https://github.com/firefly-iii/firefly-iii/blob/main/config/firefly.php#L123
|
||||||
#
|
#
|
||||||
# If text is still in English, remember that not everything may have been translated.
|
# If text is still in English, remember that not everything may have been translated.
|
||||||
DEFAULT_LANGUAGE=en_US
|
DEFAULT_LANGUAGE=en_US
|
||||||
@@ -164,6 +164,13 @@ MAIL_PASSWORD=null
|
|||||||
MAIL_ENCRYPTION=null
|
MAIL_ENCRYPTION=null
|
||||||
MAIL_SENDMAIL_COMMAND=
|
MAIL_SENDMAIL_COMMAND=
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you use self-signed certificates for your STMP server, you can use the following settings.
|
||||||
|
#
|
||||||
|
MAIL_ALLOW_SELF_SIGNED=false
|
||||||
|
MAIL_VERIFY_PEER=true
|
||||||
|
MAIL_VERIFY_PEER_NAME=true
|
||||||
|
|
||||||
# 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
|
||||||
MAILGUN_DOMAIN=
|
MAILGUN_DOMAIN=
|
||||||
@@ -176,6 +183,7 @@ MAILGUN_ENDPOINT=api.mailgun.net
|
|||||||
# 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
|
||||||
MANDRILL_SECRET=
|
MANDRILL_SECRET=
|
||||||
SPARKPOST_SECRET=
|
SPARKPOST_SECRET=
|
||||||
|
MAILERSEND_API_KEY=
|
||||||
|
|
||||||
# Firefly III can send you the following messages.
|
# Firefly III can send you the following messages.
|
||||||
SEND_ERROR_MESSAGE=true
|
SEND_ERROR_MESSAGE=true
|
||||||
@@ -188,7 +196,7 @@ SEND_REPORT_JOURNALS=true
|
|||||||
ENABLE_EXTERNAL_MAP=false
|
ENABLE_EXTERNAL_MAP=false
|
||||||
|
|
||||||
#
|
#
|
||||||
# Enable or disable exchange rate conversion. This function isn't used yet by Firefly III
|
# Enable or disable exchange rate conversion.
|
||||||
#
|
#
|
||||||
ENABLE_EXCHANGE_RATES=false
|
ENABLE_EXCHANGE_RATES=false
|
||||||
|
|
||||||
@@ -281,20 +289,13 @@ ALLOW_WEBHOOKS=false
|
|||||||
#
|
#
|
||||||
# You can set this variable from a file by appending it with _FILE
|
# You can set this variable from a file by appending it with _FILE
|
||||||
#
|
#
|
||||||
STATIC_CRON_TOKEN=
|
STATIC_CRON_TOKEN=PLEASE_REPLACE_WITH_32_CHAR_CODE
|
||||||
|
|
||||||
# You can fine tune the start-up of a Docker container by editing these environment variables.
|
# 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 lots of inconsistent data.
|
# Use this at your own risk. Disabling certain checks and features may result in lots of inconsistent data.
|
||||||
# However if you know what you're doing you can significantly speed up container start times.
|
# 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.
|
# Set each value to true to enable, or false to disable.
|
||||||
|
|
||||||
# Set this to true to build all locales supported by Firefly III.
|
|
||||||
# This may take quite some time (several minutes) and is generally not recommended.
|
|
||||||
# If you wish to change or alter the list of locales, start your Docker container with
|
|
||||||
# `docker run -v locale.gen:/etc/locale.gen -e DKR_BUILD_LOCALE=true`
|
|
||||||
# and make sure your preferred locales are in your own locale.gen.
|
|
||||||
DKR_BUILD_LOCALE=false
|
|
||||||
|
|
||||||
# Check if the SQLite database exists. Can be skipped if you're not using SQLite.
|
# Check if the SQLite database exists. Can be skipped if you're not using SQLite.
|
||||||
# Won't significantly speed up things.
|
# Won't significantly speed up things.
|
||||||
DKR_CHECK_SQLITE=true
|
DKR_CHECK_SQLITE=true
|
||||||
@@ -312,12 +313,24 @@ PUSHER_ID=
|
|||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
|
#
|
||||||
|
# Disable or enable the running balance column data
|
||||||
|
# Please disable this. It's a very experimental feature.
|
||||||
|
#
|
||||||
|
USE_RUNNING_BALANCE=false
|
||||||
|
|
||||||
#
|
#
|
||||||
# The v2 layout is very experimental. If it breaks you get to keep both parts.
|
# The v2 layout is very experimental. If it breaks you get to keep both parts.
|
||||||
# Be wary of data loss.
|
# Be wary of data loss.
|
||||||
#
|
#
|
||||||
FIREFLY_III_LAYOUT=v1
|
FIREFLY_III_LAYOUT=v1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Which Query Parser implementation to use for the search engine and rules
|
||||||
|
# 'new' is experimental, 'legacy' is the classic one
|
||||||
|
#
|
||||||
|
QUERY_PARSER_IMPLEMENTATION=new
|
||||||
|
|
||||||
#
|
#
|
||||||
# Please make sure this URL matches the external URL of your Firefly III installation.
|
# Please make sure this URL matches the external URL of your Firefly III installation.
|
||||||
# It is used to validate specific requests and to generate URLs in emails.
|
# It is used to validate specific requests and to generate URLs in emails.
|
||||||
|
13
.github/ISSUE_TEMPLATE/bug.yml
vendored
13
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Bug Report
|
name: Bug report
|
||||||
description: Report a bug in Firefly III (or associated tools)
|
description: Report a bug in Firefly III (or associated tools)
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
@@ -12,7 +12,7 @@ body:
|
|||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: I've found a bug and checked that ...
|
label: I've found a bug and checked that ...
|
||||||
description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, explain in detail why.
|
description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, please explain why.
|
||||||
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
|
||||||
@@ -33,13 +33,6 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Expected behaviour
|
|
||||||
description: Please describe precisely what you'd expect to happen. Be specific.
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Steps to reproduce
|
label: Steps to reproduce
|
||||||
@@ -54,4 +47,4 @@ body:
|
|||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Additional info
|
label: Additional info
|
||||||
description: Please provide any additional information that seem useful.
|
description: Please provide any additional information that seems useful.
|
||||||
|
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -3,3 +3,6 @@ contact_links:
|
|||||||
- name: Ask a question
|
- name: Ask a question
|
||||||
url: https://github.com/firefly-iii/firefly-iii/discussions
|
url: https://github.com/firefly-iii/firefly-iii/discussions
|
||||||
about: Please ask and answer questions here.
|
about: Please ask and answer questions here.
|
||||||
|
- name: I need support!
|
||||||
|
url: https://github.com/firefly-iii/firefly-iii/discussions
|
||||||
|
about: I think I broke something...
|
||||||
|
7
.github/ISSUE_TEMPLATE/fr.yml
vendored
7
.github/ISSUE_TEMPLATE/fr.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Feature Request
|
name: Feature request
|
||||||
description: Request a feature or enhancement in Firefly III (or associated tools)
|
description: Request a feature or enhancement in Firefly III (or associated tools)
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
@@ -31,11 +31,6 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: What are alternatives?
|
|
||||||
description: Please describe what alternatives currently exist.
|
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Additional context
|
label: Additional context
|
||||||
|
21
.github/label-actions.yml
vendored
21
.github/label-actions.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
# Configuration for Label Actions - https://github.com/dessant/label-actions
|
# Configuration for Label Actions - https://github.com/dessant/label-actions
|
||||||
|
|
||||||
# The `feature` label is added to issues
|
# The `feature` label is added to issues
|
||||||
feature:
|
fixed:
|
||||||
issues:
|
issues:
|
||||||
# Post a comment, `{issue-author}` is an optional placeholder
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
comment: |
|
comment: |
|
||||||
@@ -9,7 +9,21 @@ feature:
|
|||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
This issue has been marked as a feature request. The requested (new) feature will become a part of Firefly III or the data importer in due course.
|
This issue has been marked as fixed. Thanks for reporting! A new version will be released in due time. Unfortunately, [I cannot give an estimate](https://docs.firefly-iii.org/references/faq/firefly-iii/general/#when-will-you-release-version-the-next-version), but [the roadmap](https://roadmap.firefly-iii.org/) is available for your reading pleasure.
|
||||||
|
|
||||||
|
There is no need to close the issue. It will be closed automatically.
|
||||||
|
|
||||||
|
Thank you for your contributions.
|
||||||
|
feature:
|
||||||
|
issues:
|
||||||
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
|
unlabel: feature
|
||||||
|
comment: |
|
||||||
|
Hi there!
|
||||||
|
|
||||||
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
|
This issue has been marked as a feature request.
|
||||||
|
|
||||||
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
||||||
|
|
||||||
@@ -32,6 +46,7 @@ epic:
|
|||||||
Thank you for your contributions.
|
Thank you for your contributions.
|
||||||
|
|
||||||
enhancement:
|
enhancement:
|
||||||
|
unlabel: enhancement
|
||||||
issues:
|
issues:
|
||||||
# Post a comment, `{issue-author}` is an optional placeholder
|
# Post a comment, `{issue-author}` is an optional placeholder
|
||||||
comment: |
|
comment: |
|
||||||
@@ -39,7 +54,7 @@ enhancement:
|
|||||||
|
|
||||||
This is an automatic reply. `Share and enjoy`
|
This is an automatic reply. `Share and enjoy`
|
||||||
|
|
||||||
This issue has been marked as an enhancement. The requested enhancement to an existing feature will become a part of Firefly III or the data importer in due course.
|
This issue has been marked as an enhancement.
|
||||||
|
|
||||||
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
|
||||||
|
|
||||||
|
61
.github/mergify.yml
vendored
61
.github/mergify.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
---
|
|
||||||
pull_request_rules:
|
pull_request_rules:
|
||||||
|
- name: Make sure PR are up to date before merging
|
||||||
|
description: This automatically updates PRs when they are out-of-date with the
|
||||||
|
base branch to avoid semantic conflicts (next step is using a merge
|
||||||
|
queue).
|
||||||
|
conditions: []
|
||||||
|
actions:
|
||||||
|
update:
|
||||||
- name: Close all on main
|
- name: Close all on main
|
||||||
conditions:
|
conditions:
|
||||||
- base=main
|
- base=main
|
||||||
@@ -8,56 +14,3 @@ pull_request_rules:
|
|||||||
close:
|
close:
|
||||||
message: Please do not open PR's on the `main` branch, but on the `develop`
|
message: Please do not open PR's on the `main` branch, but on the `develop`
|
||||||
branch only. Thank you!
|
branch only. Thank you!
|
||||||
- name: No translations
|
|
||||||
conditions:
|
|
||||||
- -author~=^dependabot(|-preview)\[bot\]$
|
|
||||||
- base=develop
|
|
||||||
- or:
|
|
||||||
- files~=^resources/lang/bg_BG
|
|
||||||
- files~=^resources/lang/ca_ES
|
|
||||||
- files~=^resources/lang/cs_CZ
|
|
||||||
- files~=^resources/lang/da_DK
|
|
||||||
- files~=^resources/lang/de_DE
|
|
||||||
- files~=^resources/lang/el_GR
|
|
||||||
- files~=^resources/lang/en_GB
|
|
||||||
- files~=^resources/lang/es_ES
|
|
||||||
- files~=^resources/lang/et_EE
|
|
||||||
- files~=^resources/lang/fa_IR
|
|
||||||
- files~=^resources/lang/fi_FI
|
|
||||||
- files~=^resources/lang/fr_FR
|
|
||||||
- files~=^resources/lang/he_IL
|
|
||||||
- files~=^resources/lang/hu_HU
|
|
||||||
- files~=^resources/lang/id_ID
|
|
||||||
- files~=^resources/lang/is_IS
|
|
||||||
- files~=^resources/lang/it_IT
|
|
||||||
- files~=^resources/lang/ja_JP
|
|
||||||
- files~=^resources/lang/ko_KR
|
|
||||||
- files~=^resources/lang/lt_LT
|
|
||||||
- files~=^resources/lang/nb_NO
|
|
||||||
- files~=^resources/lang/nl_NL
|
|
||||||
- files~=^resources/lang/pl_PL
|
|
||||||
- files~=^resources/lang/pt_BR
|
|
||||||
- files~=^resources/lang/pt_PT
|
|
||||||
- files~=^resources/lang/ro_RO
|
|
||||||
- files~=^resources/lang/ru_RU
|
|
||||||
- files~=^resources/lang/si_LK
|
|
||||||
- files~=^resources/lang/sk_SK
|
|
||||||
- files~=^resources/lang/sl_SI
|
|
||||||
- files~=^resources/lang/sr_CS
|
|
||||||
- files~=^resources/lang/sv_SE
|
|
||||||
- files~=^resources/lang/th_TH
|
|
||||||
- files~=^resources/lang/tlh_AA
|
|
||||||
- files~=^resources/lang/tr_TR
|
|
||||||
- files~=^resources/lang/uk_UA
|
|
||||||
- files~=^resources/lang/vi_VN
|
|
||||||
- files~=^resources/lang/zh_CN
|
|
||||||
- files~=^resources/lang/zh_TW
|
|
||||||
actions:
|
|
||||||
comment:
|
|
||||||
message: >
|
|
||||||
Please do not submit translated strings in your PR. If you need new
|
|
||||||
sentences to be translated, add them to the `en_US` language strings.
|
|
||||||
New or changed translations for other languages can be submitted at
|
|
||||||
https://crowdin.com/project/firefly-iii
|
|
||||||
|
|
||||||
Thank you!
|
|
||||||
|
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -21,5 +21,3 @@ Changes in this pull request:
|
|||||||
-
|
-
|
||||||
-
|
-
|
||||||
-
|
-
|
||||||
|
|
||||||
@JC5
|
|
||||||
|
1
.github/workflows/cleanup.yml
vendored
1
.github/workflows/cleanup.yml
vendored
@@ -66,7 +66,6 @@ jobs:
|
|||||||
'label-actions.yml',
|
'label-actions.yml',
|
||||||
'lock.yml',
|
'lock.yml',
|
||||||
'release.yml',
|
'release.yml',
|
||||||
'sonarcloud.yml',
|
|
||||||
'stale.yml'
|
'stale.yml'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
2
.github/workflows/close-duplicates.yml
vendored
2
.github/workflows/close-duplicates.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
close_duplicates:
|
close_duplicates:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: github/command@v1.2.1
|
- uses: github/command@v2.0.1
|
||||||
id: command
|
id: command
|
||||||
with:
|
with:
|
||||||
allowed_contexts: "issue"
|
allowed_contexts: "issue"
|
||||||
|
2
.github/workflows/closed-issues.yml
vendored
2
.github/workflows/closed-issues.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
|||||||
command_and_close:
|
command_and_close:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: aws-actions/closed-issue-message@v1
|
- uses: aws-actions/closed-issue-message@v2
|
||||||
with:
|
with:
|
||||||
message: |
|
message: |
|
||||||
Hi there! This is an automatic reply. `Share and enjoy`
|
Hi there! This is an automatic reply. `Share and enjoy`
|
||||||
|
481
.github/workflows/release.yml
vendored
481
.github/workflows/release.yml
vendored
@@ -4,9 +4,13 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
description: 'Release "v1.2.3" or "develop"'
|
description: 'Release "v1.2.3" or "develop" or "branch-abc"'
|
||||||
required: true
|
required: true
|
||||||
default: 'develop'
|
default: 'develop'
|
||||||
|
phpversion:
|
||||||
|
description: 'PHP version'
|
||||||
|
required: true
|
||||||
|
default: '8.4'
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 3 * * MON'
|
- cron: '0 3 * * MON'
|
||||||
|
|
||||||
@@ -18,27 +22,65 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Switch branch
|
- name: Import GPG key
|
||||||
run: |
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
if [[ "develop" == "$version" ]]; then
|
with:
|
||||||
git checkout --track origin/develop
|
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
git pull
|
passphrase: ${{ secrets.PASSPHRASE }}
|
||||||
else
|
git_user_signingkey: true
|
||||||
git config user.name github-actions
|
git_commit_gpgsign: true
|
||||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
||||||
git checkout --track origin/develop
|
|
||||||
git pull
|
|
||||||
git checkout main
|
|
||||||
git merge develop
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
|
||||||
- name: Setup PHP
|
- name: Setup PHP
|
||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@v2
|
||||||
with:
|
with:
|
||||||
php-version: '8.3'
|
php-version: ${{ github.event.inputs.phpversion }}
|
||||||
extensions: mbstring, intl, zip, bcmath
|
extensions: mbstring, intl, zip, bcmath
|
||||||
- name: crowdin action
|
- name: Switch and pull
|
||||||
|
run: |
|
||||||
|
#
|
||||||
|
# Always check out origin/develop, unless its a branch release.
|
||||||
|
#
|
||||||
|
BRANCH_TO_PULL=origin/develop
|
||||||
|
if [[ "$version" == branch* ]]; then
|
||||||
|
BRANCH_TO_PULL=origin/$version
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Version is '$version', check out '$BRANCH_TO_PULL'-branch"
|
||||||
|
|
||||||
|
git checkout --track $BRANCH_TO_PULL
|
||||||
|
git pull
|
||||||
|
echo "Current branch is $(git branch --show-current)"
|
||||||
|
env:
|
||||||
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
- name: Configure Git
|
||||||
|
run: |
|
||||||
|
# do some configuration
|
||||||
|
sudo timedatectl set-timezone Europe/Amsterdam
|
||||||
|
git config user.name JC5
|
||||||
|
git config user.email release@firefly-iii.org
|
||||||
|
git config advice.addIgnoredFile false
|
||||||
|
git config push.autoSetupRemote true
|
||||||
|
- name: Lint PHP
|
||||||
|
run: |
|
||||||
|
php_lint_file()
|
||||||
|
{
|
||||||
|
local php_file="$1"
|
||||||
|
php -l "$php_file" &> /dev/null
|
||||||
|
if [ "$?" -ne 0 ]
|
||||||
|
then
|
||||||
|
echo -e "[FAIL] $php_file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
export -f php_lint_file
|
||||||
|
|
||||||
|
find . -path ./vendor -prune -o -name '*.php' | parallel -j 4 php_lint_file {}
|
||||||
|
|
||||||
|
if [ "$?" -ne 0 ]
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Crowdin action
|
||||||
uses: crowdin/github-action@v2
|
uses: crowdin/github-action@v2
|
||||||
with:
|
with:
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
@@ -49,15 +91,6 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ github.token }}
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }}
|
CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }}
|
||||||
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
|
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
|
||||||
- name: Cleanup translations
|
|
||||||
id: cleanup-transactions
|
|
||||||
uses: JC5/firefly-iii-dev@main
|
|
||||||
with:
|
|
||||||
action: 'ff3:crowdin-warning'
|
|
||||||
output: ''
|
|
||||||
env:
|
|
||||||
FIREFLY_III_ROOT: /github/workspace
|
|
||||||
GH_TOKEN: ''
|
|
||||||
- name: Cleanup changelog
|
- name: Cleanup changelog
|
||||||
id: cleanup-changelog
|
id: cleanup-changelog
|
||||||
uses: JC5/firefly-iii-dev@main
|
uses: JC5/firefly-iii-dev@main
|
||||||
@@ -76,15 +109,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
FIREFLY_III_ROOT: /github/workspace
|
FIREFLY_III_ROOT: /github/workspace
|
||||||
GH_TOKEN: ''
|
GH_TOKEN: ''
|
||||||
- name: Extract changelog
|
|
||||||
id: extract-changelog
|
|
||||||
uses: JC5/firefly-iii-dev@main
|
|
||||||
with:
|
|
||||||
action: 'ff3:extract-changelog'
|
|
||||||
output: 'output'
|
|
||||||
env:
|
|
||||||
FIREFLY_III_ROOT: /github/workspace
|
|
||||||
GH_TOKEN: ""
|
|
||||||
- name: Replace version
|
- name: Replace version
|
||||||
id: replace-version
|
id: replace-version
|
||||||
uses: JC5/firefly-iii-dev@main
|
uses: JC5/firefly-iii-dev@main
|
||||||
@@ -133,19 +157,9 @@ jobs:
|
|||||||
rm -rf vendor composer.lock
|
rm -rf vendor composer.lock
|
||||||
composer update --no-dev --no-scripts --no-plugins -q
|
composer update --no-dev --no-scripts --no-plugins -q
|
||||||
sudo chown -R runner:docker resources/lang
|
sudo chown -R runner:docker resources/lang
|
||||||
.ci/phpcs.sh
|
.ci/phpcs.sh || true
|
||||||
- name: Import GPG key
|
- name: Calculate variables
|
||||||
uses: crazy-max/ghaction-import-gpg@v6
|
|
||||||
with:
|
|
||||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
|
||||||
passphrase: ${{ secrets.PASSPHRASE }}
|
|
||||||
- name: Release
|
|
||||||
run: |
|
run: |
|
||||||
# do some configuration
|
|
||||||
sudo timedatectl set-timezone Europe/Amsterdam
|
|
||||||
git config user.name github-actions
|
|
||||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
||||||
git config advice.addIgnoredFile false
|
|
||||||
|
|
||||||
# set some variables
|
# set some variables
|
||||||
releaseName=$version
|
releaseName=$version
|
||||||
@@ -153,19 +167,25 @@ jobs:
|
|||||||
zipName=FireflyIII-$version.zip
|
zipName=FireflyIII-$version.zip
|
||||||
tarName=FireflyIII-$version.tar.gz
|
tarName=FireflyIII-$version.tar.gz
|
||||||
|
|
||||||
# update composer (again)
|
|
||||||
composer update --no-dev --no-scripts --no-plugins
|
|
||||||
composer dump-autoload
|
|
||||||
|
|
||||||
# if this is a develop build, slightly different variable names.
|
# if this is a develop build, slightly different variable names.
|
||||||
if [[ "develop" == "$version" ]]; then
|
if [[ "develop" == "$version" ]]; then
|
||||||
[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
|
#[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
|
||||||
releaseName=$version-$(date +'%Y%m%d')
|
releaseName=$version-$(date +'%Y%m%d')
|
||||||
originalName=$releaseName
|
originalName=$releaseName
|
||||||
zipName=FireflyIII-develop.zip
|
zipName=FireflyIII-develop.zip
|
||||||
tarName=FireflyIII-develop.tar.gz
|
tarName=FireflyIII-develop.tar.gz
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# if this is a branch build, also slightly different variable names.
|
||||||
|
if [[ "$version" == branch* ]]; then
|
||||||
|
#[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
|
||||||
|
# branch builds overrule develop
|
||||||
|
releaseName=$version-$(date +'%Y%m%d')
|
||||||
|
originalName=$releaseName
|
||||||
|
zipName=FireflyIII-$version.zip
|
||||||
|
tarName=FireflyIII-$version.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
# in both cases, if the release or tag already exists, add ".1" until it no longer exists.
|
# in both cases, if the release or tag already exists, add ".1" until it no longer exists.
|
||||||
tagFound=true
|
tagFound=true
|
||||||
tagCount=1
|
tagCount=1
|
||||||
@@ -181,23 +201,212 @@ jobs:
|
|||||||
tagFound=false
|
tagFound=false
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "Will use tag and release name $releaseName."
|
|
||||||
|
|
||||||
|
# set some variables
|
||||||
|
echo "Release name is $releaseName."
|
||||||
|
echo "Original name is $originalName."
|
||||||
|
echo "Zip name is $zipName."
|
||||||
|
echo "Tar name is $tarName."
|
||||||
|
|
||||||
|
# create a new branch to store the difference in.
|
||||||
|
BRANCH_NAME=release-$(date +'%s')
|
||||||
|
git checkout -b $BRANCH_NAME
|
||||||
|
|
||||||
|
echo "Temporary branch name is '$BRANCH_NAME'."
|
||||||
|
|
||||||
|
# share variables with next step.
|
||||||
|
echo "releaseName=$releaseName" >> "$GITHUB_ENV"
|
||||||
|
echo "originalName=$originalName" >> "$GITHUB_ENV"
|
||||||
|
echo "zipName=$zipName" >> "$GITHUB_ENV"
|
||||||
|
echo "tarName=$tarName" >> "$GITHUB_ENV"
|
||||||
|
echo "BRANCH_NAME=$BRANCH_NAME" >> "$GITHUB_ENV"
|
||||||
|
env:
|
||||||
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
- name: Commit all changes
|
||||||
|
run: |
|
||||||
# add all content, except output.txt (this contains the changelog and/or the download instructions)
|
# add all content, except output.txt (this contains the changelog and/or the download instructions)
|
||||||
echo 'Add all and reset output.txt'
|
echo 'Add all'
|
||||||
git add -A
|
git add -A
|
||||||
if test -f "output.txt"; then
|
# push to a new branch.
|
||||||
git reset output.txt
|
echo "Auto commit on branch '$(git branch --show-current)'."
|
||||||
fi
|
git commit -m "🤖 Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
|
||||||
git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
|
|
||||||
git push
|
git push
|
||||||
|
env:
|
||||||
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
- name: Extract changelog
|
||||||
|
id: extract-changelog
|
||||||
|
uses: JC5/firefly-iii-dev@main
|
||||||
|
with:
|
||||||
|
action: 'ff3:extract-changelog'
|
||||||
|
output: 'output'
|
||||||
|
env:
|
||||||
|
FIREFLY_III_ROOT: /github/workspace
|
||||||
|
GH_TOKEN: ""
|
||||||
|
- name: Describe new release
|
||||||
|
run: |
|
||||||
|
|
||||||
# zip and tar everything
|
# describe the development release.
|
||||||
echo 'Zip and tar...'
|
if [[ "develop" == "$version" ]]; then
|
||||||
zip -rq $zipName . -x "*.git*" "*.ci*" "*.github*" "*node_modules*" "*output.txt*"
|
echo 'Describe the latest develop release'
|
||||||
|
rm -f output.txt
|
||||||
|
touch output.txt
|
||||||
|
sudo chown -R runner:docker output.txt
|
||||||
|
echo "Weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt
|
||||||
|
echo "" >> output.txt
|
||||||
|
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
echo "" >> output.txt
|
||||||
|
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
||||||
|
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
||||||
|
echo "" >> output.txt
|
||||||
|
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
|
||||||
|
|
||||||
|
# donations!
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo '### Support Firefly III' >> output.txt
|
||||||
|
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
fi
|
||||||
|
# describe a branch release
|
||||||
|
if [[ "$version" == branch* ]]; then
|
||||||
|
echo 'Describe a branch release'
|
||||||
|
rm -f output.txt
|
||||||
|
touch output.txt
|
||||||
|
sudo chown -R runner:docker output.txt
|
||||||
|
echo "Irregular BRANCH release of Firefly III. This release contains specific features or changes. Docker users can find this release under the \`$version\` tag." >> output.txt
|
||||||
|
echo "" >> output.txt
|
||||||
|
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
echo "" >> output.txt
|
||||||
|
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
||||||
|
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
||||||
|
echo "" >> output.txt
|
||||||
|
echo ":warning: Please be careful with this branch pre-release, as it may not work as expected." >> output.txt
|
||||||
|
fi
|
||||||
|
# describe the main release
|
||||||
|
if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]] && [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then
|
||||||
|
echo 'Describe the latest release'
|
||||||
|
sudo chown -R runner:docker output.txt
|
||||||
|
|
||||||
|
# the changelog is in output.txt
|
||||||
|
mv output.txt output2.txt
|
||||||
|
|
||||||
|
touch output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo "Welcome to release $version of Firefly III. It contains the the latest fixes, translations and features. Docker users can find this release under the \`latest\` tag." >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
|
||||||
|
# add changelog to file.
|
||||||
|
cat output2.txt >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
rm -f output2.txt
|
||||||
|
|
||||||
|
echo '### Instructions' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
||||||
|
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
||||||
|
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
|
||||||
|
# donations!
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo '### Support Firefly III' >> output.txt
|
||||||
|
echo 'Did you know you can support the development of Firefly III? You can donate in many ways, like GitHub Sponsors or Patreon. For more information, please [follow this link](https://bit.ly/donate-to-Firefly-III) for more information.' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
fi
|
||||||
|
|
||||||
|
# describe alpha release
|
||||||
|
if [[ "$version" == *alpha* ]]; then
|
||||||
|
echo 'Describe an ALPHA release'
|
||||||
|
rm -f output.txt
|
||||||
|
touch output.txt
|
||||||
|
sudo chown -R runner:docker output.txt
|
||||||
|
echo "Very early ALPHA release of Firefly III. This release contains specific features or changes. Docker users can find this release under the \`$version\` tag." >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo '### Instructions' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
||||||
|
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
||||||
|
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# describe beta release
|
||||||
|
if [[ "$version" == *beta* ]]; then
|
||||||
|
echo 'Describe a BETA release'
|
||||||
|
rm -f output.txt
|
||||||
|
touch output.txt
|
||||||
|
sudo chown -R runner:docker output.txt
|
||||||
|
echo "Very early BETA release of Firefly III. This release contains specific features or changes. Docker users can find this release under the \`$version\` tag." >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo "This release was created on **$(date +'%Y-%m-%d %H:%M')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo '### Instructions' >> output.txt
|
||||||
|
echo '' >> output.txt
|
||||||
|
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
||||||
|
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
||||||
|
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
||||||
|
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
- name: Merge all into working branch
|
||||||
|
run: |
|
||||||
|
MERGE_INTO=develop
|
||||||
|
if [[ "$version" == branch* ]]; then
|
||||||
|
MERGE_INTO=$version
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Merge all changes from $BRANCH_NAME back into '$MERGE_INTO' using a PR"
|
||||||
|
PR_URL=$(gh pr create -B $MERGE_INTO -H $BRANCH_NAME --title "🤖 Automatic PR to merge all changes into the '$MERGE_INTO' branch." --body '🤖 Created by GitHub action')
|
||||||
|
echo "PR URL is '$PR_URL'"
|
||||||
|
IFS='/' read -ra parts <<< "$PR_URL"
|
||||||
|
PR_NR=$(printf %s\\n "${parts[@]:(-1)}")
|
||||||
|
echo "PR number is '$PR_NR'"
|
||||||
|
gh pr merge $PR_NR -b "🤖 Automatically merge the PR into the $MERGE_INTO branch." -d --merge
|
||||||
|
|
||||||
|
# pull the changes from the $MERGE_INTO branch.
|
||||||
|
git checkout $MERGE_INTO
|
||||||
|
git merge origin/$MERGE_INTO
|
||||||
|
git pull
|
||||||
|
git status
|
||||||
|
echo "Current branch '$(git branch --show-current)'."
|
||||||
|
|
||||||
|
if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]]; then
|
||||||
|
git checkout main
|
||||||
|
git merge origin/main
|
||||||
|
git pull
|
||||||
|
git status
|
||||||
|
|
||||||
|
echo "Also merge everything into main since this is a release."
|
||||||
|
echo 'create PR'
|
||||||
|
PR_URL=$(gh pr create -B main -H develop --title "🤖 Automatic PR to merge all changes into the main branch." --body "🤖 Created by GitHub action")
|
||||||
|
echo "PR URL is '$PR_URL'"
|
||||||
|
|
||||||
|
IFS='/' read -ra parts <<< "$PR_URL"
|
||||||
|
PR_NR=$(printf %s\\n "${parts[@]:(-1)}")
|
||||||
|
echo "PR number is '$PR_NR'"
|
||||||
|
|
||||||
|
echo 'Merge PR'
|
||||||
|
gh pr merge $PR_NR -b "🤖 Automatically merge the PR into the main branch." --merge
|
||||||
|
git checkout main
|
||||||
|
git merge origin/main
|
||||||
|
git pull
|
||||||
|
git status
|
||||||
|
echo "Current branch '$(git branch --show-current)'."
|
||||||
|
|
||||||
|
fi
|
||||||
|
echo "DONE!"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
- name: Create archives
|
||||||
|
run: |
|
||||||
|
echo "Create zip file $zipName"
|
||||||
|
zip -rq $zipName . -x "*.git*" "*.ci*" "*.github*" "*node_modules*" "*output.txt*" "*Procfile*" "*crowdin.yml*" "*sonar-project.properties*"
|
||||||
touch $tarName
|
touch $tarName
|
||||||
tar --exclude=$tarName --exclude=$zipName --exclude='./.git' --exclude='./.ci' --exclude='./.github' --exclude='./node_modules' --exclude='./output.txt' -czf $tarName .
|
|
||||||
|
|
||||||
|
echo "Create tar file $tarName"
|
||||||
|
tar --exclude=$tarName --exclude=$zipName --exclude='./.git' --exclude='./.ci' --exclude='./.github' --exclude='./node_modules' --exclude='./output.txt' --exclude='./Procfile' --exclude='../crowdin.yml' --exclude='./sonar-project.properties' -czf $tarName .
|
||||||
# add sha256 sum
|
# add sha256 sum
|
||||||
echo 'Sha sum ...'
|
echo 'Sha sum ...'
|
||||||
sha256sum -b $zipName > $zipName.sha256
|
sha256sum -b $zipName > $zipName.sha256
|
||||||
@@ -206,91 +415,107 @@ jobs:
|
|||||||
# add signatures:
|
# add signatures:
|
||||||
gpg --armor --detach-sign $zipName
|
gpg --armor --detach-sign $zipName
|
||||||
gpg --armor --detach-sign $tarName
|
gpg --armor --detach-sign $tarName
|
||||||
|
- name: Create release
|
||||||
|
run: |
|
||||||
|
|
||||||
# create a development (nightly) release:
|
# create a development release:
|
||||||
if [[ "develop" == "$version" ]]; then
|
if [[ "develop" == "$version" ]]; then
|
||||||
echo 'Develop release.'
|
# pull the changes from the develop branch.
|
||||||
# add text to output.txt (instructions)
|
git checkout develop
|
||||||
rm output.txt
|
git merge origin/develop
|
||||||
echo "Bi-weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt
|
git pull
|
||||||
echo "" >> output.txt
|
|
||||||
echo "This release was created on **$(date +'%Y-%m-%d')** and may contain unexpected bugs. Data loss is rare but is not impossible. The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "" >> output.txt
|
|
||||||
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
|
|
||||||
|
|
||||||
# create the release:
|
# create the release:
|
||||||
echo "Create nightly release."
|
echo "Create develop release under tag '$releaseName'."
|
||||||
git tag -a $releaseName -m "Nightly development release '$version' on $(date +'%Y-%m-%d')"
|
git tag -a $releaseName -m "🤖 Development release '$version' on $(date +'%Y-%m-%d')"
|
||||||
git push origin $releaseName
|
git push origin $releaseName
|
||||||
|
|
||||||
gh release create $releaseName -p --verify-tag \
|
gh release create $releaseName -p --verify-tag \
|
||||||
-t "Development release for $(date +'%Y-%m-%d')" \
|
-t "Development release for $(date +'%Y-%m-%d')" \
|
||||||
|
--latest=false \
|
||||||
-F output.txt
|
-F output.txt
|
||||||
|
|
||||||
# add zip file to release.
|
fi
|
||||||
gh release upload $releaseName $zipName
|
|
||||||
gh release upload $releaseName $tarName
|
|
||||||
|
|
||||||
# add sha256 sum to release
|
# create a branch release:
|
||||||
gh release upload $releaseName $zipName.sha256
|
if [[ "$version" == branch* ]]; then
|
||||||
gh release upload $releaseName $tarName.sha256
|
|
||||||
|
|
||||||
# add signatures to release
|
# pull the changes from the branch-* branch.
|
||||||
gh release upload $releaseName $zipName.asc
|
git checkout $version
|
||||||
gh release upload $releaseName $tarName.asc
|
git merge origin/$version
|
||||||
|
git pull
|
||||||
|
|
||||||
# get current HEAD and add as file to the release
|
# create the release:
|
||||||
HEAD=$(git rev-parse HEAD)
|
echo "Create branch release."
|
||||||
echo $HEAD > HEAD.txt
|
git tag -a $releaseName -m "Branch release '$version' on $(date +'%Y-%m-%d')"
|
||||||
gh release upload $releaseName HEAD.txt
|
|
||||||
else
|
|
||||||
echo 'MAIN (real) release'
|
|
||||||
sudo chown -R runner:docker output.txt
|
|
||||||
# add text to output.txt (more instructions)
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo '### Instructions' >> output.txt
|
|
||||||
echo '' >> output.txt
|
|
||||||
echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
|
|
||||||
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
|
|
||||||
echo "* The releases are signed, and you can verify them using the [Firefly III releases PGP key](https://docs.firefly-iii.org/explanation/more-information/signatures/)." >> output.txt
|
|
||||||
|
|
||||||
echo "Create default release."
|
|
||||||
git tag -a $releaseName -m "Here be changelog"
|
|
||||||
git push origin $releaseName
|
git push origin $releaseName
|
||||||
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag
|
|
||||||
|
|
||||||
# add archive files to release
|
gh release create $releaseName -p --verify-tag \
|
||||||
gh release upload $releaseName $zipName
|
-t "Branch release for $(date +'%Y-%m-%d')" \
|
||||||
gh release upload $releaseName $tarName
|
--latest=false \
|
||||||
|
-F output.txt
|
||||||
|
|
||||||
# add sha256 sums to release
|
fi
|
||||||
gh release upload $releaseName $zipName.sha256
|
|
||||||
gh release upload $releaseName $tarName.sha256
|
|
||||||
|
|
||||||
# add signatures to release
|
# Create a production release.
|
||||||
gh release upload $releaseName $zipName.asc
|
if [[ "develop" != "$version" ]] && [[ "$version" != branch* ]]; then
|
||||||
gh release upload $releaseName $tarName.asc
|
git checkout main
|
||||||
|
git merge origin/main
|
||||||
|
git pull
|
||||||
|
git status
|
||||||
|
|
||||||
# get current HEAD and add as file to the release
|
echo "Create prod release."
|
||||||
HEAD=$(git rev-parse HEAD)
|
git tag -a $releaseName -m "Release $version"
|
||||||
echo $HEAD > HEAD.txt
|
git push origin $releaseName
|
||||||
gh release upload $releaseName HEAD.txt
|
|
||||||
|
|
||||||
# remove all temporary files
|
# do not tag as latest when alpha or beta.
|
||||||
rm output.txt
|
if [[ "$version" == *alpha* ]] || [[ "$version" == *beta* ]]; then
|
||||||
rm HEAD.txt
|
echo 'Mark alpha or beta as NOT the latest.'
|
||||||
rm $zipName
|
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag --latest=false
|
||||||
rm $zipName.sha256
|
fi
|
||||||
rm $tarName
|
|
||||||
rm $tarName.sha256
|
|
||||||
|
|
||||||
# merge main back into develop
|
# tag as latest when NOT alpha or beta.
|
||||||
git checkout develop
|
if [[ "$version" != *alpha* ]] && [[ "$version" != *beta* ]]; then
|
||||||
git merge main
|
echo 'Mark prod as the latest.'
|
||||||
git push
|
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag --latest=true
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
- name: Upload artifacts
|
||||||
|
run: |
|
||||||
|
# add zip file to release.
|
||||||
|
echo "Upload $zipName to $releaseName"
|
||||||
|
gh release upload $releaseName $zipName
|
||||||
|
echo "Upload $tarName to $releaseName"
|
||||||
|
gh release upload $releaseName $tarName
|
||||||
|
|
||||||
|
# add sha256 sum to release
|
||||||
|
echo "Upload $zipName.sha256 to $releaseName"
|
||||||
|
gh release upload $releaseName $zipName.sha256
|
||||||
|
echo "Upload $tarName.sha256 to $releaseName"
|
||||||
|
gh release upload $releaseName $tarName.sha256
|
||||||
|
|
||||||
|
# add signatures to release
|
||||||
|
echo "Upload $zipName.asc to $releaseName"
|
||||||
|
gh release upload $releaseName $zipName.asc
|
||||||
|
echo "Upload $tarName.asc to $releaseName"
|
||||||
|
gh release upload $releaseName $tarName.asc
|
||||||
|
|
||||||
|
# get current HEAD and add as file to the release
|
||||||
|
HEAD=$(git rev-parse HEAD)
|
||||||
|
echo $HEAD > HEAD.txt
|
||||||
|
echo "Upload HEAD.txt to $releaseName"
|
||||||
|
gh release upload $releaseName HEAD.txt
|
||||||
|
|
||||||
|
# remove all temporary files
|
||||||
|
rm -f output.txt
|
||||||
|
rm -f HEAD.txt
|
||||||
|
rm -f $zipName
|
||||||
|
rm -f $zipName.sha256
|
||||||
|
rm -f $tarName
|
||||||
|
rm -f $tarName.sha256
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
|
||||||
|
67
.github/workflows/sonarcloud.yml
vendored
67
.github/workflows/sonarcloud.yml
vendored
@@ -1,67 +0,0 @@
|
|||||||
name: 'Code - Run Sonarcloud'
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- develop
|
|
||||||
env:
|
|
||||||
DB_CONNECTION: sqlite
|
|
||||||
APP_KEY: UfpBqqeXx7zpNodsC6yjYQcRfDdm4Bxh
|
|
||||||
jobs:
|
|
||||||
sonarcloud:
|
|
||||||
name: SonarCloud
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Setup PHP with Xdebug
|
|
||||||
uses: shivammathur/setup-php@v2
|
|
||||||
with:
|
|
||||||
php-version: '8.3'
|
|
||||||
coverage: xdebug
|
|
||||||
extensions: >-
|
|
||||||
bcmath
|
|
||||||
curl
|
|
||||||
fileinfo
|
|
||||||
iconv
|
|
||||||
intl
|
|
||||||
json
|
|
||||||
sqlite3
|
|
||||||
mbstring
|
|
||||||
openssl
|
|
||||||
pdo
|
|
||||||
session
|
|
||||||
simplexml
|
|
||||||
sodium
|
|
||||||
tokenizer
|
|
||||||
xml
|
|
||||||
xmlwriter
|
|
||||||
|
|
||||||
- name: Copy standard configuration
|
|
||||||
run: cp .env.testing .env
|
|
||||||
|
|
||||||
- name: Install Composer dependencies
|
|
||||||
run: composer install --prefer-dist --no-interaction --no-progress --no-scripts
|
|
||||||
|
|
||||||
- name: "Create database file"
|
|
||||||
run: touch storage/database/database.sqlite
|
|
||||||
|
|
||||||
- name: "Upgrades the database to the latest version"
|
|
||||||
run: php artisan firefly-iii:upgrade-database
|
|
||||||
|
|
||||||
- name: "Integrity Database Report"
|
|
||||||
run: php artisan firefly-iii:report-integrity
|
|
||||||
|
|
||||||
- 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 }}
|
|
4
.github/workflows/stale.yml
vendored
4
.github/workflows/stale.yml
vendored
@@ -12,6 +12,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
issues: write # for actions/stale to close stale issues
|
issues: write # for actions/stale to close stale issues
|
||||||
pull-requests: write # for actions/stale to close stale PRs
|
pull-requests: write # for actions/stale to close stale PRs
|
||||||
|
actions: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v9
|
||||||
@@ -35,4 +36,5 @@ 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,epic,triage'
|
exempt-all-milestones: true
|
||||||
|
exempt-issue-labels: 'triage'
|
||||||
|
10
.gitignore
vendored
10
.gitignore
vendored
@@ -7,6 +7,7 @@ yarn-error.log
|
|||||||
.env
|
.env
|
||||||
/.ci/php-cs-fixer/vendor
|
/.ci/php-cs-fixer/vendor
|
||||||
coverage.xml
|
coverage.xml
|
||||||
|
output.txt
|
||||||
|
|
||||||
# ignore generated files.
|
# ignore generated files.
|
||||||
public/build
|
public/build
|
||||||
@@ -14,7 +15,16 @@ public/build
|
|||||||
# ignore v1 build files
|
# ignore v1 build files
|
||||||
resources/assets/v1/node_modules
|
resources/assets/v1/node_modules
|
||||||
resources/assets/v1/build
|
resources/assets/v1/build
|
||||||
|
public/v1/js/app.js*
|
||||||
|
public/v1/js/app_vue.js*
|
||||||
|
public/v1/js/create*
|
||||||
|
public/v1/js/edit*
|
||||||
|
public/v1/js/profile*
|
||||||
|
public/v1/js/administrations
|
||||||
|
public/v1/js/exchange-rates
|
||||||
|
public/v1/js/webhooks
|
||||||
|
|
||||||
# ignore v2 build files
|
# ignore v2 build files
|
||||||
resources/assets/v2/node_modules
|
resources/assets/v2/node_modules
|
||||||
resources/assets/v2/build
|
resources/assets/v2/build
|
||||||
|
public/v2/i18n
|
||||||
|
12
THANKS.md
12
THANKS.md
@@ -3,7 +3,19 @@
|
|||||||
Over time, many people have contributed to Firefly III. Their efforts are not always visible, but always remembered and appreciated.
|
Over time, many people have contributed to Firefly III. Their efforts are not always visible, but always remembered and appreciated.
|
||||||
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
|
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
|
||||||
|
|
||||||
|
## 2025
|
||||||
|
- Denis Iskandarov
|
||||||
|
- =
|
||||||
|
- Lompi
|
||||||
|
- Jose Diaz-Gonzalez
|
||||||
|
- SoftBrix
|
||||||
|
|
||||||
## 2024
|
## 2024
|
||||||
|
- Sobuno
|
||||||
|
- TasneemTantawy
|
||||||
|
- Antônio Franco
|
||||||
|
- yparitcher
|
||||||
|
- Jhon Pedroza
|
||||||
- mzhubail
|
- mzhubail
|
||||||
- tasnim
|
- tasnim
|
||||||
- withbest
|
- withbest
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AccountController.php
|
* AccountController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -25,13 +26,16 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\AccountType;
|
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Debug\Timer;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\AccountFilter;
|
use FireflyIII\Support\Http\Api\AccountFilter;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AccountController
|
* Class AccountController
|
||||||
@@ -40,6 +44,9 @@ class AccountController extends Controller
|
|||||||
{
|
{
|
||||||
use AccountFilter;
|
use AccountFilter;
|
||||||
|
|
||||||
|
// this array only exists to test if the constructor will use it properly.
|
||||||
|
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
||||||
|
|
||||||
/** @var array<int, string> */
|
/** @var array<int, string> */
|
||||||
private array $balanceTypes;
|
private array $balanceTypes;
|
||||||
private AccountRepositoryInterface $repository;
|
private AccountRepositoryInterface $repository;
|
||||||
@@ -60,7 +67,7 @@ class AccountController extends Controller
|
|||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
$this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE];
|
$this->balanceTypes = [AccountTypeEnum::ASSET->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -77,22 +84,28 @@ class AccountController extends Controller
|
|||||||
$query = $data['query'];
|
$query = $data['query'];
|
||||||
$date = $data['date'] ?? today(config('app.timezone'));
|
$date = $data['date'] ?? today(config('app.timezone'));
|
||||||
$return = [];
|
$return = [];
|
||||||
|
Timer::start(sprintf('AC accounts "%s"', $query));
|
||||||
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit'));
|
$result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit'));
|
||||||
|
|
||||||
// TODO this code is duplicated in the V2 Autocomplete controller, which means this code is due to be deprecated.
|
// set date to subday + end-of-day for account balance. so it is at $date 23:59:59
|
||||||
$defaultCurrency = app('amount')->getDefaultCurrency();
|
$date->endOfDay();
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($result as $account) {
|
foreach ($result as $account) {
|
||||||
$nameWithBalance = $account->name;
|
$nameWithBalance = $account->name;
|
||||||
$currency = $this->repository->getAccountCurrency($account) ?? $defaultCurrency;
|
$currency = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency;
|
||||||
|
$useCurrency = $currency;
|
||||||
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
if (in_array($account->accountType->type, $this->balanceTypes, true)) {
|
||||||
$balance = app('steam')->balance($account, $date);
|
// this one is correct.
|
||||||
|
Log::debug(sprintf('accounts: Call finalAccountBalance with date/time "%s"', $date->toIso8601String()));
|
||||||
|
$balance = Steam::finalAccountBalance($account, $date);
|
||||||
|
$key = $this->convertToPrimary && $currency->id !== $this->primaryCurrency->id ? 'pc_balance' : 'balance';
|
||||||
|
$useCurrency = $this->convertToPrimary && $currency->id !== $this->primaryCurrency->id ? $this->primaryCurrency : $currency;
|
||||||
|
$amount = $balance[$key] ?? '0';
|
||||||
$nameWithBalance = sprintf(
|
$nameWithBalance = sprintf(
|
||||||
'%s (%s)',
|
'%s (%s)',
|
||||||
$account->name,
|
$account->name,
|
||||||
app('amount')->formatAnything($currency, $balance, false)
|
app('amount')->formatAnything($useCurrency, $amount, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,11 +114,16 @@ class AccountController extends Controller
|
|||||||
'name' => $account->name,
|
'name' => $account->name,
|
||||||
'name_with_balance' => $nameWithBalance,
|
'name_with_balance' => $nameWithBalance,
|
||||||
'type' => $account->accountType->type,
|
'type' => $account->accountType->type,
|
||||||
'currency_id' => (string)$currency->id,
|
'currency_id' => (string) $useCurrency->id,
|
||||||
'currency_name' => $currency->name,
|
'currency_name' => $useCurrency->name,
|
||||||
'currency_code' => $currency->code,
|
'currency_code' => $useCurrency->code,
|
||||||
'currency_symbol' => $currency->symbol,
|
'currency_symbol' => $useCurrency->symbol,
|
||||||
'currency_decimal_places' => $currency->decimal_places,
|
'currency_decimal_places' => $useCurrency->decimal_places,
|
||||||
|
'account_currency_id' => (string) $currency->id,
|
||||||
|
'account_currency_name' => $currency->name,
|
||||||
|
'account_currency_code' => $currency->code,
|
||||||
|
'account_currency_symbol' => $currency->symbol,
|
||||||
|
'account_currency_decimal_places' => $currency->decimal_places,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,14 +131,15 @@ class AccountController extends Controller
|
|||||||
usort(
|
usort(
|
||||||
$return,
|
$return,
|
||||||
static function (array $left, array $right) {
|
static function (array $left, array $right) {
|
||||||
$order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE];
|
$order = [AccountTypeEnum::ASSET->value, AccountTypeEnum::REVENUE->value, AccountTypeEnum::EXPENSE->value];
|
||||||
$posA = (int) array_search($left['type'], $order, true);
|
$posA = (int) array_search($left['type'], $order, true);
|
||||||
$posB = (int) array_search($right['type'], $order, true);
|
$posB = (int) array_search($right['type'], $order, true);
|
||||||
|
|
||||||
return $posA - $posB;
|
return $posA - $posB;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
Timer::stop(sprintf('AC accounts "%s"', $query));
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BillController.php
|
* BillController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -64,15 +65,13 @@ class BillController extends Controller
|
|||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
$result = $this->repository->searchBill($data['query'], $this->parameters->get('limit'));
|
$result = $this->repository->searchBill($data['query'], $this->parameters->get('limit'));
|
||||||
$filtered = $result->map(
|
$filtered = $result->map(
|
||||||
static function (Bill $item) {
|
static fn (Bill $item) => [
|
||||||
return [
|
|
||||||
'id' => (string) $item->id,
|
'id' => (string) $item->id,
|
||||||
'name' => $item->name,
|
'name' => $item->name,
|
||||||
'active' => $item->active,
|
'active' => $item->active,
|
||||||
];
|
]
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($filtered->toArray());
|
return response()->api($filtered->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BudgetController.php
|
* BudgetController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -64,14 +65,12 @@ class BudgetController extends Controller
|
|||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
$result = $this->repository->searchBudget($data['query'], $this->parameters->get('limit'));
|
$result = $this->repository->searchBudget($data['query'], $this->parameters->get('limit'));
|
||||||
$filtered = $result->map(
|
$filtered = $result->map(
|
||||||
static function (Budget $item) {
|
static fn (Budget $item) => [
|
||||||
return [
|
|
||||||
'id' => (string) $item->id,
|
'id' => (string) $item->id,
|
||||||
'name' => $item->name,
|
'name' => $item->name,
|
||||||
];
|
]
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($filtered);
|
return response()->api($filtered->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CategoryController.php
|
* CategoryController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -64,14 +65,12 @@ class CategoryController extends Controller
|
|||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
$result = $this->repository->searchCategory($data['query'], $this->parameters->get('limit'));
|
$result = $this->repository->searchCategory($data['query'], $this->parameters->get('limit'));
|
||||||
$filtered = $result->map(
|
$filtered = $result->map(
|
||||||
static function (Category $item) {
|
static fn (Category $item) => [
|
||||||
return [
|
|
||||||
'id' => (string) $item->id,
|
'id' => (string) $item->id,
|
||||||
'name' => $item->name,
|
'name' => $item->name,
|
||||||
];
|
]
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json($filtered);
|
return response()->api($filtered->toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CurrencyController.php
|
* CurrencyController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -23,10 +24,11 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
||||||
|
|
||||||
|
use Deprecated;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
@@ -76,15 +78,14 @@ class CurrencyController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($result);
|
return response()->api($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Documentation for this endpoint is at:
|
* Documentation for this endpoint is at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
|
||||||
*
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
|
#[Deprecated]
|
||||||
public function currenciesWithCode(AutocompleteRequest $request): JsonResponse
|
public function currenciesWithCode(AutocompleteRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
@@ -102,6 +103,6 @@ class CurrencyController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($result);
|
return response()->api($result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ObjectGroupController.php
|
* ObjectGroupController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -74,6 +75,6 @@ class ObjectGroupController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($return);
|
return response()->api($return);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PiggyBankController.php
|
* PiggyBankController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -67,12 +68,11 @@ class PiggyBankController extends Controller
|
|||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
|
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
|
||||||
$defaultCurrency = app('amount')->getDefaultCurrency();
|
|
||||||
$response = [];
|
$response = [];
|
||||||
|
|
||||||
/** @var PiggyBank $piggy */
|
/** @var PiggyBank $piggy */
|
||||||
foreach ($piggies as $piggy) {
|
foreach ($piggies as $piggy) {
|
||||||
$currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency;
|
$currency = $piggy->transactionCurrency;
|
||||||
$objectGroup = $piggy->objectGroups()->first();
|
$objectGroup = $piggy->objectGroups()->first();
|
||||||
$response[] = [
|
$response[] = [
|
||||||
'id' => (string) $piggy->id,
|
'id' => (string) $piggy->id,
|
||||||
@@ -87,7 +87,7 @@ class PiggyBankController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,13 +98,12 @@ class PiggyBankController extends Controller
|
|||||||
{
|
{
|
||||||
$data = $request->getData();
|
$data = $request->getData();
|
||||||
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
|
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
|
||||||
$defaultCurrency = app('amount')->getDefaultCurrency();
|
|
||||||
$response = [];
|
$response = [];
|
||||||
|
|
||||||
/** @var PiggyBank $piggy */
|
/** @var PiggyBank $piggy */
|
||||||
foreach ($piggies as $piggy) {
|
foreach ($piggies as $piggy) {
|
||||||
$currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency;
|
$currency = $piggy->transactionCurrency;
|
||||||
$currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0';
|
$currentAmount = $this->piggyRepository->getCurrentAmount($piggy);
|
||||||
$objectGroup = $piggy->objectGroups()->first();
|
$objectGroup = $piggy->objectGroups()->first();
|
||||||
$response[] = [
|
$response[] = [
|
||||||
'id' => (string) $piggy->id,
|
'id' => (string) $piggy->id,
|
||||||
@@ -113,7 +112,7 @@ class PiggyBankController extends Controller
|
|||||||
'%s (%s / %s)',
|
'%s (%s / %s)',
|
||||||
$piggy->name,
|
$piggy->name,
|
||||||
app('amount')->formatAnything($currency, $currentAmount, false),
|
app('amount')->formatAnything($currency, $currentAmount, false),
|
||||||
app('amount')->formatAnything($currency, $piggy->targetamount, false),
|
app('amount')->formatAnything($currency, $piggy->target_amount, false),
|
||||||
),
|
),
|
||||||
'currency_id' => (string) $currency->id,
|
'currency_id' => (string) $currency->id,
|
||||||
'currency_name' => $currency->name,
|
'currency_name' => $currency->name,
|
||||||
@@ -125,6 +124,6 @@ class PiggyBankController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RecurrenceController.php
|
* RecurrenceController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -72,6 +73,6 @@ class RecurrenceController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RuleController.php
|
* RuleController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -71,6 +72,6 @@ class RuleController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RuleGroupController.php
|
* RuleGroupController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -71,6 +72,6 @@ class RuleGroupController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($response);
|
return response()->api($response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TagController.php
|
* TagController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -74,6 +75,6 @@ class TagController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransactionController.php
|
* TransactionController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -23,8 +24,10 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
namespace FireflyIII\Api\V1\Controllers\Autocomplete;
|
||||||
|
|
||||||
|
use FireflyIII\Models\TransactionGroup;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
|
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
|
||||||
@@ -37,6 +40,7 @@ use Illuminate\Support\Collection;
|
|||||||
*/
|
*/
|
||||||
class TransactionController extends Controller
|
class TransactionController extends Controller
|
||||||
{
|
{
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
private TransactionGroupRepositoryInterface $groupRepository;
|
private TransactionGroupRepositoryInterface $groupRepository;
|
||||||
private JournalRepositoryInterface $repository;
|
private JournalRepositoryInterface $repository;
|
||||||
|
|
||||||
@@ -50,10 +54,12 @@ class TransactionController extends Controller
|
|||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
$userGroup = $this->validateUserGroup($request);
|
||||||
$this->repository = app(JournalRepositoryInterface::class);
|
$this->repository = app(JournalRepositoryInterface::class);
|
||||||
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($user);
|
||||||
$this->groupRepository->setUser($user);
|
$this->groupRepository->setUser($user);
|
||||||
|
$this->groupRepository->setUserGroup($userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -83,7 +89,7 @@ class TransactionController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -97,7 +103,7 @@ class TransactionController extends Controller
|
|||||||
if (is_numeric($data['query'])) {
|
if (is_numeric($data['query'])) {
|
||||||
// search for group, not journal.
|
// search for group, not journal.
|
||||||
$firstResult = $this->groupRepository->find((int) $data['query']);
|
$firstResult = $this->groupRepository->find((int) $data['query']);
|
||||||
if (null !== $firstResult) {
|
if ($firstResult instanceof TransactionGroup) {
|
||||||
// group may contain multiple journals, each a result:
|
// group may contain multiple journals, each a result:
|
||||||
foreach ($firstResult->transactionJournals as $journal) {
|
foreach ($firstResult->transactionJournals as $journal) {
|
||||||
$result->push($journal);
|
$result->push($journal);
|
||||||
@@ -121,6 +127,6 @@ class TransactionController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TransactionTypeController.php
|
* TransactionTypeController.php
|
||||||
* Copyright (c) 2020 james@firefly-iii.org
|
* Copyright (c) 2020 james@firefly-iii.org
|
||||||
@@ -71,6 +72,6 @@ class TransactionTypeController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($array);
|
return response()->api($array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,15 +26,23 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
|
||||||
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
||||||
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Exceptions\ValidationException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\AccountType;
|
|
||||||
use FireflyIII\Models\Preference;
|
use FireflyIII\Models\Preference;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Chart\ChartData;
|
||||||
|
use FireflyIII\Support\Facades\Preferences;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
use FireflyIII\Support\Http\Api\ApiSupport;
|
use FireflyIII\Support\Http\Api\ApiSupport;
|
||||||
|
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AccountController
|
* Class AccountController
|
||||||
@@ -42,7 +50,9 @@ use Illuminate\Http\JsonResponse;
|
|||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
use ApiSupport;
|
use ApiSupport;
|
||||||
|
use CollectsAccountsFromFilter;
|
||||||
|
|
||||||
|
private ChartData $chartData;
|
||||||
private AccountRepositoryInterface $repository;
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,6 +65,7 @@ class AccountController extends Controller
|
|||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
$this->chartData = new ChartData();
|
||||||
$this->repository = app(AccountRepositoryInterface::class);
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
$this->repository->setUser($user);
|
$this->repository->setUser($user);
|
||||||
|
|
||||||
@@ -63,45 +74,128 @@ class AccountController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO fix documentation
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function dashboard(ChartRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$queryParameters = $request->getParameters();
|
||||||
|
$accounts = $this->getAccountList($queryParameters);
|
||||||
|
|
||||||
|
// move date to end of day
|
||||||
|
$queryParameters['start']->startOfDay();
|
||||||
|
$queryParameters['end']->endOfDay();
|
||||||
|
Log::debug(sprintf('dashboard(), convert to primary: %s', var_export($this->convertToPrimary, true)));
|
||||||
|
|
||||||
|
// loop each account, and collect info:
|
||||||
|
/** @var Account $account */
|
||||||
|
foreach ($accounts as $account) {
|
||||||
|
Log::debug(sprintf('Account #%d ("%s")', $account->id, $account->name));
|
||||||
|
$this->renderAccountData($queryParameters, $account);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($this->chartData->render());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
private function renderAccountData(array $params, Account $account): void
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('Now in %s(array, #%d)', __METHOD__, $account->id));
|
||||||
|
$currency = $this->repository->getAccountCurrency($account);
|
||||||
|
$currentStart = clone $params['start'];
|
||||||
|
$range = Steam::finalAccountBalanceInRange($account, $params['start'], clone $params['end'], $this->convertToPrimary);
|
||||||
|
|
||||||
|
|
||||||
|
$previous = array_values($range)[0]['balance'];
|
||||||
|
$pcPrevious = null;
|
||||||
|
if (!$currency instanceof TransactionCurrency) {
|
||||||
|
$currency = $this->default;
|
||||||
|
}
|
||||||
|
$currentSet = [
|
||||||
|
'label' => $account->name,
|
||||||
|
|
||||||
|
// the currency that belongs to the account.
|
||||||
|
'currency_id' => (string)$currency->id,
|
||||||
|
'currency_code' => $currency->code,
|
||||||
|
'currency_symbol' => $currency->symbol,
|
||||||
|
'currency_decimal_places' => $currency->decimal_places,
|
||||||
|
|
||||||
|
// the default currency of the user (could be the same!)
|
||||||
|
'date' => $params['start']->toAtomString(),
|
||||||
|
'start' => $params['start']->toAtomString(),
|
||||||
|
'end' => $params['end']->toAtomString(),
|
||||||
|
'period' => '1D',
|
||||||
|
'entries' => [],
|
||||||
|
];
|
||||||
|
if ($this->convertToPrimary) {
|
||||||
|
$currentSet['pc_entries'] = [];
|
||||||
|
$currentSet['primary_currency_id'] = (string)$this->primaryCurrency->id;
|
||||||
|
$currentSet['primary_currency_code'] = $this->primaryCurrency->code;
|
||||||
|
$currentSet['primary_currency_symbol'] = $this->primaryCurrency->symbol;
|
||||||
|
$currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places;
|
||||||
|
$pcPrevious = array_values($range)[0]['pc_balance'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while ($currentStart <= $params['end']) {
|
||||||
|
$format = $currentStart->format('Y-m-d');
|
||||||
|
$label = $currentStart->toAtomString();
|
||||||
|
$balance = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous;
|
||||||
|
$previous = $balance;
|
||||||
|
$currentSet['entries'][$label] = $balance;
|
||||||
|
|
||||||
|
|
||||||
|
// do the same for the primary currency balance, if relevant:
|
||||||
|
$pcBalance = null;
|
||||||
|
if ($this->convertToPrimary) {
|
||||||
|
$pcBalance = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious;
|
||||||
|
$pcPrevious = $pcBalance;
|
||||||
|
$currentSet['pc_entries'][$label] = $pcBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentStart->addDay();
|
||||||
|
}
|
||||||
|
$this->chartData->add($currentSet);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
|
||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws ValidationException
|
||||||
*/
|
*/
|
||||||
public function overview(DateRequest $request): JsonResponse
|
public function overview(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
// parameters for chart:
|
// parameters for chart:
|
||||||
$dates = $request->getAll();
|
$dates = $request->getAll();
|
||||||
|
|
||||||
|
|
||||||
/** @var Carbon $start */
|
/** @var Carbon $start */
|
||||||
$start = $dates['start'];
|
$start = $dates['start'];
|
||||||
|
|
||||||
/** @var Carbon $end */
|
/** @var Carbon $end */
|
||||||
$end = $dates['end'];
|
$end = $dates['end'];
|
||||||
|
|
||||||
// user's preferences
|
// set dates to end of day + start of day:
|
||||||
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray();
|
$start->startOfDay();
|
||||||
|
$end->endOfDay();
|
||||||
|
|
||||||
/** @var Preference $frontpage */
|
$frontPageIds = $this->getFrontPageAccountIds();
|
||||||
$frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
|
$accounts = $this->repository->getAccountsById($frontPageIds);
|
||||||
$default = app('amount')->getDefaultCurrency();
|
|
||||||
|
|
||||||
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
|
||||||
$frontpage->data = $defaultSet;
|
|
||||||
$frontpage->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
// get accounts:
|
|
||||||
$accounts = $this->repository->getAccountsById($frontpage->data);
|
|
||||||
$chartData = [];
|
$chartData = [];
|
||||||
|
|
||||||
/** @var Account $account */
|
/** @var Account $account */
|
||||||
foreach ($accounts as $account) {
|
foreach ($accounts as $account) {
|
||||||
$currency = $this->repository->getAccountCurrency($account);
|
Log::debug(sprintf('Rendering chart data for account %s (%d)', $account->name, $account->id));
|
||||||
if (null === $currency) {
|
$currency = $this->repository->getAccountCurrency($account) ?? $this->primaryCurrency;
|
||||||
$currency = $default;
|
$currentStart = clone $start;
|
||||||
}
|
$range = Steam::finalAccountBalanceInRange($account, $start, clone $end, $this->convertToPrimary);
|
||||||
|
$previous = array_values($range)[0]['balance'];
|
||||||
|
$pcPrevious = null;
|
||||||
$currentSet = [
|
$currentSet = [
|
||||||
'label' => $account->name,
|
'label' => $account->name,
|
||||||
'currency_id' => (string)$currency->id,
|
'currency_id' => (string)$currency->id,
|
||||||
@@ -114,22 +208,57 @@ 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;
|
// add "pc_entries" if convertToPrimary is true:
|
||||||
$range = app('steam')->balanceInRange($account, $start, clone $end);
|
if ($this->convertToPrimary) {
|
||||||
// 2022-10-11 this method no longer converts to float.
|
$currentSet['pc_entries'] = [];
|
||||||
$previous = array_values($range)[0];
|
$currentSet['primary_currency_id'] = (string)$this->primaryCurrency->id;
|
||||||
|
$currentSet['primary_currency_code'] = $this->primaryCurrency->code;
|
||||||
|
$currentSet['primary_currency_symbol'] = $this->primaryCurrency->symbol;
|
||||||
|
$currentSet['primary_currency_decimal_places'] = $this->primaryCurrency->decimal_places;
|
||||||
|
$pcPrevious = array_values($range)[0]['pc_balance'];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// also get the primary balance if convertToPrimary is true:
|
||||||
while ($currentStart <= $end) {
|
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 is based on "balance" from the $range variable.
|
||||||
|
$balance = array_key_exists($format, $range) ? $range[$format]['balance'] : $previous;
|
||||||
$previous = $balance;
|
$previous = $balance;
|
||||||
$currentStart->addDay();
|
|
||||||
$currentSet['entries'][$label] = $balance;
|
$currentSet['entries'][$label] = $balance;
|
||||||
|
|
||||||
|
// do the same for the primary balance, if relevant:
|
||||||
|
$pcBalance = null;
|
||||||
|
if ($this->convertToPrimary) {
|
||||||
|
$pcBalance = array_key_exists($format, $range) ? $range[$format]['pc_balance'] : $pcPrevious;
|
||||||
|
$pcPrevious = $pcBalance;
|
||||||
|
$currentSet['pc_entries'][$label] = $pcBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentStart->addDay();
|
||||||
|
|
||||||
}
|
}
|
||||||
$chartData[] = $currentSet;
|
$chartData[] = $currentSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($chartData);
|
return response()->json($chartData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getFrontPageAccountIds(): array
|
||||||
|
{
|
||||||
|
$defaultSet = $this->repository->getAccountsByType([AccountTypeEnum::ASSET->value])->pluck('id')->toArray();
|
||||||
|
|
||||||
|
/** @var Preference $frontpage */
|
||||||
|
$frontpage = Preferences::get('frontpageAccounts', $defaultSet);
|
||||||
|
|
||||||
|
if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
|
||||||
|
$frontpage->data = $defaultSet;
|
||||||
|
$frontpage->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $frontpage->data ?? $defaultSet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,37 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
|
||||||
* 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Chart;
|
namespace FireflyIII\Api\V1\Controllers\Chart;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Chart\ChartRequest;
|
use FireflyIII\Api\V1\Requests\Chart\ChartRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
|
|
||||||
use FireflyIII\Support\Chart\ChartData;
|
use FireflyIII\Support\Chart\ChartData;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use FireflyIII\Support\Http\Api\AccountBalanceGrouped;
|
use FireflyIII\Support\Http\Api\AccountBalanceGrouped;
|
||||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
use FireflyIII\Support\Http\Api\CollectsAccountsFromFilter;
|
||||||
@@ -45,9 +26,10 @@ class BalanceController extends Controller
|
|||||||
use CleansChartData;
|
use CleansChartData;
|
||||||
use CollectsAccountsFromFilter;
|
use CollectsAccountsFromFilter;
|
||||||
|
|
||||||
private AccountRepositoryInterface $repository;
|
|
||||||
private GroupCollectorInterface $collector;
|
|
||||||
private ChartData $chartData;
|
private ChartData $chartData;
|
||||||
|
private GroupCollectorInterface $collector;
|
||||||
|
private AccountRepositoryInterface $repository;
|
||||||
|
|
||||||
// private TransactionCurrency $default;
|
// private TransactionCurrency $default;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
@@ -61,7 +43,7 @@ class BalanceController extends Controller
|
|||||||
$this->repository->setUserGroup($userGroup);
|
$this->repository->setUserGroup($userGroup);
|
||||||
$this->collector->setUserGroup($userGroup);
|
$this->collector->setUserGroup($userGroup);
|
||||||
$this->chartData = new ChartData();
|
$this->chartData = new ChartData();
|
||||||
// $this->default = app('amount')->getDefaultCurrency();
|
// $this->default = app('amount')->getPrimaryCurrency();
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -84,26 +66,22 @@ class BalanceController extends Controller
|
|||||||
$queryParameters = $request->getParameters();
|
$queryParameters = $request->getParameters();
|
||||||
$accounts = $this->getAccountList($queryParameters);
|
$accounts = $this->getAccountList($queryParameters);
|
||||||
|
|
||||||
// move date to end of day
|
|
||||||
$queryParameters['start']->startOfDay();
|
|
||||||
$queryParameters['end']->endOfDay();
|
|
||||||
|
|
||||||
// prepare for currency conversion and data collection:
|
// prepare for currency conversion and data collection:
|
||||||
/** @var TransactionCurrency $default */
|
/** @var TransactionCurrency $primary */
|
||||||
$default = app('amount')->getDefaultCurrency();
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
// get journals for entire period:
|
// get journals for entire period:
|
||||||
|
|
||||||
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
|
$this->collector->setRange($queryParameters['start'], $queryParameters['end'])
|
||||||
->withAccountInformation()
|
->withAccountInformation()
|
||||||
->setXorAccounts($accounts)
|
->setXorAccounts($accounts)
|
||||||
->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::RECONCILIATION, TransactionType::TRANSFER])
|
->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::RECONCILIATION->value, TransactionTypeEnum::TRANSFER->value])
|
||||||
;
|
;
|
||||||
$journals = $this->collector->getExtractedJournals();
|
$journals = $this->collector->getExtractedJournals();
|
||||||
|
|
||||||
$object = new AccountBalanceGrouped();
|
$object = new AccountBalanceGrouped();
|
||||||
$object->setPreferredRange($queryParameters['period']);
|
$object->setPreferredRange($queryParameters['period']);
|
||||||
$object->setDefault($default);
|
$object->setPrimary($primary);
|
||||||
$object->setAccounts($accounts);
|
$object->setAccounts($accounts);
|
||||||
$object->setJournals($journals);
|
$object->setJournals($journals);
|
||||||
$object->setStart($queryParameters['start']);
|
$object->setStart($queryParameters['start']);
|
@@ -22,18 +22,19 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Chart;
|
namespace FireflyIII\Api\V1\Controllers\Chart;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V2\Request\Generic\DateRequest;
|
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
use FireflyIII\Repositories\UserGroups\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Repositories\UserGroups\Budget\OperationsRepositoryInterface;
|
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\CleansChartData;
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
@@ -49,6 +50,8 @@ class BudgetController extends Controller
|
|||||||
use CleansChartData;
|
use CleansChartData;
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
protected OperationsRepositoryInterface $opsRepository;
|
protected OperationsRepositoryInterface $opsRepository;
|
||||||
private BudgetLimitRepositoryInterface $blRepository;
|
private BudgetLimitRepositoryInterface $blRepository;
|
||||||
private array $currencies = [];
|
private array $currencies = [];
|
||||||
@@ -63,10 +66,10 @@ class BudgetController extends Controller
|
|||||||
$this->repository = app(BudgetRepositoryInterface::class);
|
$this->repository = app(BudgetRepositoryInterface::class);
|
||||||
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
|
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
|
||||||
$this->opsRepository = app(OperationsRepositoryInterface::class);
|
$this->opsRepository = app(OperationsRepositoryInterface::class);
|
||||||
$this->currency = app('amount')->getDefaultCurrency();
|
|
||||||
$userGroup = $this->validateUserGroup($request);
|
$userGroup = $this->validateUserGroup($request);
|
||||||
$this->repository->setUserGroup($userGroup);
|
$this->repository->setUserGroup($userGroup);
|
||||||
$this->opsRepository->setUserGroup($userGroup);
|
$this->opsRepository->setUserGroup($userGroup);
|
||||||
|
$this->blRepository->setUserGroup($userGroup);
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
@@ -75,6 +78,8 @@ class BudgetController extends Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO see autocomplete/accountcontroller
|
* TODO see autocomplete/accountcontroller
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function dashboard(DateRequest $request): JsonResponse
|
public function dashboard(DateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
@@ -107,15 +112,33 @@ class BudgetController extends Controller
|
|||||||
// get all limits:
|
// get all limits:
|
||||||
$limits = $this->blRepository->getBudgetLimits($budget, $start, $end);
|
$limits = $this->blRepository->getBudgetLimits($budget, $start, $end);
|
||||||
$rows = [];
|
$rows = [];
|
||||||
|
$spent = $this->opsRepository->listExpenses($start, $end, null, new Collection([$budget]));
|
||||||
|
$expenses = $this->processExpenses($budget->id, $spent, $start, $end);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int $currencyId
|
||||||
|
* @var array $row
|
||||||
|
*/
|
||||||
|
foreach ($expenses as $currencyId => $row) {
|
||||||
|
// budgeted, left and overspent are now 0.
|
||||||
|
$limit = $this->filterLimit($currencyId, $limits);
|
||||||
|
if (null !== $limit) {
|
||||||
|
$row['budgeted'] = $limit->amount;
|
||||||
|
$row['left'] = bcsub($row['budgeted'], bcmul($row['spent'], '-1'));
|
||||||
|
$row['overspent'] = bcmul($row['left'], '-1');
|
||||||
|
$row['left'] = 1 === bccomp($row['left'], '0') ? $row['left'] : '0';
|
||||||
|
$row['overspent'] = 1 === bccomp($row['overspent'], '0') ? $row['overspent'] : '0';
|
||||||
|
}
|
||||||
|
$rows[] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// if no limits
|
// if no limits
|
||||||
if (0 === $limits->count()) {
|
// if (0 === $limits->count()) {
|
||||||
// return as a single item in an array
|
// return as a single item in an array
|
||||||
$rows = $this->noBudgetLimits($budget, $start, $end);
|
// $rows = $this->noBudgetLimits($budget, $start, $end);
|
||||||
}
|
// }
|
||||||
if ($limits->count() > 0) {
|
|
||||||
$rows = $this->budgetLimits($budget, $limits);
|
|
||||||
}
|
|
||||||
// is always an array
|
// is always an array
|
||||||
$return = [];
|
$return = [];
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
@@ -125,23 +148,15 @@ class BudgetController extends Controller
|
|||||||
'currency_code' => $row['currency_code'],
|
'currency_code' => $row['currency_code'],
|
||||||
'currency_name' => $row['currency_name'],
|
'currency_name' => $row['currency_name'],
|
||||||
'currency_decimal_places' => $row['currency_decimal_places'],
|
'currency_decimal_places' => $row['currency_decimal_places'],
|
||||||
'native_currency_id' => (string) $row['native_currency_id'],
|
|
||||||
'native_currency_code' => $row['native_currency_code'],
|
|
||||||
'native_currency_name' => $row['native_currency_name'],
|
|
||||||
'native_currency_decimal_places' => $row['native_currency_decimal_places'],
|
|
||||||
'period' => null,
|
'period' => null,
|
||||||
'start' => $row['start'],
|
'start' => $row['start'],
|
||||||
'end' => $row['end'],
|
'end' => $row['end'],
|
||||||
'entries' => [
|
'entries' => [
|
||||||
|
'budgeted' => $row['budgeted'],
|
||||||
'spent' => $row['spent'],
|
'spent' => $row['spent'],
|
||||||
'left' => $row['left'],
|
'left' => $row['left'],
|
||||||
'overspent' => $row['overspent'],
|
'overspent' => $row['overspent'],
|
||||||
],
|
],
|
||||||
'native_entries' => [
|
|
||||||
'spent' => $row['native_spent'],
|
|
||||||
'left' => $row['native_left'],
|
|
||||||
'overspent' => $row['native_overspent'],
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
$return[] = $current;
|
$return[] = $current;
|
||||||
}
|
}
|
||||||
@@ -166,14 +181,10 @@ class BudgetController extends Controller
|
|||||||
* Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return
|
* Shared between the "noBudgetLimits" function and "processLimit". Will take a single set of expenses and return
|
||||||
* its info.
|
* its info.
|
||||||
*
|
*
|
||||||
* @param array<int, array<int, string>> $array
|
|
||||||
*
|
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
private function processExpenses(int $budgetId, array $array, Carbon $start, Carbon $end): array
|
private function processExpenses(int $budgetId, array $spent, Carbon $start, Carbon $end): array
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('Created new ExchangeRateConverter in %s', __METHOD__));
|
|
||||||
$converter = new ExchangeRateConverter();
|
|
||||||
$return = [];
|
$return = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -183,7 +194,7 @@ class BudgetController extends Controller
|
|||||||
* @var int $currencyId
|
* @var int $currencyId
|
||||||
* @var array $block
|
* @var array $block
|
||||||
*/
|
*/
|
||||||
foreach ($array as $currencyId => $block) {
|
foreach ($spent as $currencyId => $block) {
|
||||||
$this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId);
|
$this->currencies[$currencyId] ??= TransactionCurrency::find($currencyId);
|
||||||
$return[$currencyId] ??= [
|
$return[$currencyId] ??= [
|
||||||
'currency_id' => (string)$currencyId,
|
'currency_id' => (string)$currencyId,
|
||||||
@@ -191,37 +202,21 @@ class BudgetController extends Controller
|
|||||||
'currency_name' => $block['currency_name'],
|
'currency_name' => $block['currency_name'],
|
||||||
'currency_symbol' => $block['currency_symbol'],
|
'currency_symbol' => $block['currency_symbol'],
|
||||||
'currency_decimal_places' => (int)$block['currency_decimal_places'],
|
'currency_decimal_places' => (int)$block['currency_decimal_places'],
|
||||||
'native_currency_id' => (string) $this->currency->id,
|
|
||||||
'native_currency_code' => $this->currency->code,
|
|
||||||
'native_currency_name' => $this->currency->name,
|
|
||||||
'native_currency_symbol' => $this->currency->symbol,
|
|
||||||
'native_currency_decimal_places' => $this->currency->decimal_places,
|
|
||||||
'start' => $start->toAtomString(),
|
'start' => $start->toAtomString(),
|
||||||
'end' => $end->toAtomString(),
|
'end' => $end->toAtomString(),
|
||||||
|
'budgeted' => '0',
|
||||||
'spent' => '0',
|
'spent' => '0',
|
||||||
'native_spent' => '0',
|
|
||||||
'left' => '0',
|
'left' => '0',
|
||||||
'native_left' => '0',
|
|
||||||
'overspent' => '0',
|
'overspent' => '0',
|
||||||
'native_overspent' => '0',
|
|
||||||
];
|
];
|
||||||
$currentBudgetArray = $block['budgets'][$budgetId];
|
$currentBudgetArray = $block['budgets'][$budgetId];
|
||||||
|
|
||||||
// var_dump($return);
|
// var_dump($return);
|
||||||
/** @var array $journal */
|
/** @var array $journal */
|
||||||
foreach ($currentBudgetArray['transaction_journals'] as $journal) {
|
foreach ($currentBudgetArray['transaction_journals'] as $journal) {
|
||||||
// convert the amount to the native currency.
|
$return[$currencyId]['spent'] = bcadd($return[$currencyId]['spent'], (string)$journal['amount']);
|
||||||
$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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$converter->summarize();
|
|
||||||
|
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
@@ -238,7 +233,7 @@ class BudgetController extends Controller
|
|||||||
*/
|
*/
|
||||||
private function budgetLimits(Budget $budget, Collection $limits): array
|
private function budgetLimits(Budget $budget, Collection $limits): array
|
||||||
{
|
{
|
||||||
app('log')->debug(sprintf('Now in budgetLimits(#%d)', $budget->id));
|
Log::debug(sprintf('Now in budgetLimits(#%d)', $budget->id));
|
||||||
$data = [];
|
$data = [];
|
||||||
|
|
||||||
/** @var BudgetLimit $limit */
|
/** @var BudgetLimit $limit */
|
||||||
@@ -259,35 +254,59 @@ class BudgetController extends Controller
|
|||||||
$end->endOfDay();
|
$end->endOfDay();
|
||||||
$spent = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget]));
|
$spent = $this->opsRepository->listExpenses($limit->start_date, $end, null, new Collection([$budget]));
|
||||||
$limitCurrencyId = $limit->transaction_currency_id;
|
$limitCurrencyId = $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 */
|
/** @var array $entry */
|
||||||
foreach ($spent as $currencyId => $entry) {
|
|
||||||
// only spent the entry where the entry's currency matches the budget limit's currency
|
// only spent the entry where the entry's currency matches the budget limit's currency
|
||||||
// so $filtered will only have 1 or 0 entries
|
// so $filtered will only have 1 or 0 entries
|
||||||
if ($entry['currency_id'] === $limitCurrencyId) {
|
$filtered = array_filter($spent, fn ($entry) => $entry['currency_id'] === $limitCurrencyId);
|
||||||
$filtered[$currencyId] = $entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
|
$result = $this->processExpenses($budget->id, $filtered, $limit->start_date, $end);
|
||||||
if (1 === count($result)) {
|
if (1 === count($result)) {
|
||||||
$compare = bccomp($limit->amount, app('steam')->positive($result[$limitCurrencyId]['spent']));
|
$compare = bccomp($limit->amount, (string)app('steam')->positive($result[$limitCurrencyId]['spent']));
|
||||||
|
$result[$limitCurrencyId]['budgeted'] = $limit->amount;
|
||||||
if (1 === $compare) {
|
if (1 === $compare) {
|
||||||
// convert this amount into the native currency:
|
// convert this amount into the primary currency:
|
||||||
$result[$limitCurrencyId]['left'] = bcadd($limit->amount, $result[$limitCurrencyId]['spent']);
|
$result[$limitCurrencyId]['left'] = bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']);
|
||||||
$result[$limitCurrencyId]['native_left'] = bcadd($convertedLimitAmount, $result[$limitCurrencyId]['native_spent']);
|
|
||||||
}
|
}
|
||||||
if ($compare <= 0) {
|
if ($compare <= 0) {
|
||||||
$result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, $result[$limitCurrencyId]['spent']));
|
$result[$limitCurrencyId]['overspent'] = app('steam')->positive(bcadd($limit->amount, (string)$result[$limitCurrencyId]['spent']));
|
||||||
$result[$limitCurrencyId]['native_overspent'] = app('steam')->positive(bcadd($convertedLimitAmount, $result[$limitCurrencyId]['native_spent']));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$converter->summarize();
|
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function filterLimit(int $currencyId, Collection $limits): ?BudgetLimit
|
||||||
|
{
|
||||||
|
$amount = '0';
|
||||||
|
$limit = null;
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
|
||||||
|
/** @var BudgetLimit $current */
|
||||||
|
foreach ($limits as $current) {
|
||||||
|
if (true === $this->convertToPrimary) {
|
||||||
|
if ($current->transaction_currency_id === $this->primaryCurrency->id) {
|
||||||
|
// simply add it.
|
||||||
|
$amount = bcadd($amount, (string)$current->amount);
|
||||||
|
Log::debug(sprintf('Set amount in limit to %s', $amount));
|
||||||
|
}
|
||||||
|
if ($current->transaction_currency_id !== $this->primaryCurrency->id) {
|
||||||
|
// convert and then add it.
|
||||||
|
$converted = $converter->convert($current->transactionCurrency, $this->primaryCurrency, $current->start_date, $current->amount);
|
||||||
|
$amount = bcadd($amount, $converted);
|
||||||
|
Log::debug(sprintf('Budgeted in limit #%d: %s %s, converted to %s %s', $current->id, $current->transactionCurrency->code, $current->amount, $this->primaryCurrency->code, $converted));
|
||||||
|
Log::debug(sprintf('Set amount in limit to %s', $amount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($current->transaction_currency_id === $currencyId) {
|
||||||
|
$limit = $current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (null !== $limit && true === $this->convertToPrimary) {
|
||||||
|
// convert and add all amounts.
|
||||||
|
$limit->amount = app('steam')->positive($amount);
|
||||||
|
Log::debug(sprintf('Final amount in limit with converted amount %s', $limit->amount));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $limit;
|
||||||
|
}
|
||||||
}
|
}
|
152
app/Api/V1/Controllers/Chart/CategoryController.php
Normal file
152
app/Api/V1/Controllers/Chart/CategoryController.php
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CategoryController.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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers\Chart;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Data\DateRequest;
|
||||||
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\CleansChartData;
|
||||||
|
use FireflyIII\Support\Http\Api\ExchangeRateConverter;
|
||||||
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BudgetController
|
||||||
|
*/
|
||||||
|
class CategoryController extends Controller
|
||||||
|
{
|
||||||
|
use CleansChartData;
|
||||||
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
|
||||||
|
|
||||||
|
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);
|
||||||
|
$userGroup = $this->validateUserGroup($request);
|
||||||
|
$this->accountRepos->setUserGroup($userGroup);
|
||||||
|
$this->currencyRepos->setUserGroup($userGroup);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO may be worth to move to a handler but the data is simple enough.
|
||||||
|
* TODO see autoComplete/account controller
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*
|
||||||
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
|
*/
|
||||||
|
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([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::ASSET->value]);
|
||||||
|
$currencies = [];
|
||||||
|
$return = [];
|
||||||
|
$converter = new ExchangeRateConverter();
|
||||||
|
|
||||||
|
// get journals for entire period:
|
||||||
|
/** @var GroupCollectorInterface $collector */
|
||||||
|
$collector = app(GroupCollectorInterface::class);
|
||||||
|
$collector->setRange($start, $end)->withAccountInformation();
|
||||||
|
$collector->setXorAccounts($accounts)->withCategoryInformation();
|
||||||
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::RECONCILIATION->value]);
|
||||||
|
$journals = $collector->getExtractedJournals();
|
||||||
|
|
||||||
|
/** @var array $journal */
|
||||||
|
foreach ($journals as $journal) {
|
||||||
|
// find journal:
|
||||||
|
$journalCurrencyId = (int)$journal['currency_id'];
|
||||||
|
$currency = $currencies[$journalCurrencyId] ?? $this->currencyRepos->find($journalCurrencyId);
|
||||||
|
$currencies[$journalCurrencyId] = $currency;
|
||||||
|
$currencyId = (int)$currency->id;
|
||||||
|
$currencyName = (string)$currency->name;
|
||||||
|
$currencyCode = (string)$currency->code;
|
||||||
|
$currencySymbol = (string)$currency->symbol;
|
||||||
|
$currencyDecimalPlaces = (int)$currency->decimal_places;
|
||||||
|
$amount = app('steam')->positive($journal['amount']);
|
||||||
|
|
||||||
|
// overrule if necessary:
|
||||||
|
if ($this->convertToPrimary && $journalCurrencyId !== $this->primaryCurrency->id) {
|
||||||
|
$currencyId = (int)$this->primaryCurrency->id;
|
||||||
|
$currencyName = (string)$this->primaryCurrency->name;
|
||||||
|
$currencyCode = (string)$this->primaryCurrency->code;
|
||||||
|
$currencySymbol = (string)$this->primaryCurrency->symbol;
|
||||||
|
$currencyDecimalPlaces = (int)$this->primaryCurrency->decimal_places;
|
||||||
|
$convertedAmount = $converter->convert($currency, $this->primaryCurrency, $journal['date'], $amount);
|
||||||
|
Log::debug(sprintf('Converted %s %s to %s %s', $journal['currency_code'], $amount, $this->primaryCurrency->code, $convertedAmount));
|
||||||
|
$amount = $convertedAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$categoryName = $journal['category_name'] ?? (string)trans('firefly.no_category');
|
||||||
|
$key = sprintf('%s-%s', $categoryName, $currencyCode);
|
||||||
|
// create arrays
|
||||||
|
$return[$key] ??= [
|
||||||
|
'label' => $categoryName,
|
||||||
|
'currency_id' => (string)$currencyId,
|
||||||
|
'currency_code' => $currencyCode,
|
||||||
|
'currency_name' => $currencyName,
|
||||||
|
'currency_symbol' => $currencySymbol,
|
||||||
|
'currency_decimal_places' => $currencyDecimalPlaces,
|
||||||
|
'period' => null,
|
||||||
|
'start' => $start->toAtomString(),
|
||||||
|
'end' => $end->toAtomString(),
|
||||||
|
'amount' => '0',
|
||||||
|
];
|
||||||
|
|
||||||
|
// add monies
|
||||||
|
$return[$key]['amount'] = bcadd($return[$key]['amount'], (string)$amount);
|
||||||
|
}
|
||||||
|
$return = array_values($return);
|
||||||
|
|
||||||
|
// order by amount
|
||||||
|
usort($return, static fn (array $a, array $b) => (float)$a['amount'] < (float)$b['amount'] ? 1 : -1);
|
||||||
|
|
||||||
|
return response()->json($this->clean($return));
|
||||||
|
}
|
||||||
|
}
|
@@ -25,15 +25,26 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers;
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Carbon\Exceptions\InvalidDateException;
|
|
||||||
use Carbon\Exceptions\InvalidFormatException;
|
use Carbon\Exceptions\InvalidFormatException;
|
||||||
|
use FireflyIII\Exceptions\BadHttpHeaderException;
|
||||||
use FireflyIII\Models\Preference;
|
use FireflyIII\Models\Preference;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
|
use FireflyIII\Support\Facades\Steam;
|
||||||
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
|
use FireflyIII\Transformers\AbstractTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Routing\Controller as BaseController;
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use League\Fractal\Manager;
|
use League\Fractal\Manager;
|
||||||
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
|
use League\Fractal\Resource\Item;
|
||||||
use League\Fractal\Serializer\JsonApiSerializer;
|
use League\Fractal\Serializer\JsonApiSerializer;
|
||||||
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
|
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
|
||||||
use Symfony\Component\HttpFoundation\ParameterBag;
|
use Symfony\Component\HttpFoundation\ParameterBag;
|
||||||
@@ -41,19 +52,24 @@ use Symfony\Component\HttpFoundation\ParameterBag;
|
|||||||
/**
|
/**
|
||||||
* Class Controller.
|
* Class Controller.
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
* @SuppressWarnings("PHPMD.CouplingBetweenObjects")
|
||||||
* @SuppressWarnings(PHPMD.NumberOfChildren)
|
* @SuppressWarnings("PHPMD.NumberOfChildren")
|
||||||
*/
|
*/
|
||||||
abstract class Controller extends BaseController
|
abstract class Controller extends BaseController
|
||||||
{
|
{
|
||||||
use AuthorizesRequests;
|
use AuthorizesRequests;
|
||||||
use DispatchesJobs;
|
use DispatchesJobs;
|
||||||
use ValidatesRequests;
|
use ValidatesRequests;
|
||||||
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
protected const string CONTENT_TYPE = 'application/vnd.api+json';
|
protected const string CONTENT_TYPE = 'application/vnd.api+json';
|
||||||
|
protected const string JSON_CONTENT_TYPE = 'application/json';
|
||||||
|
protected array $accepts = ['application/json', 'application/vnd.api+json'];
|
||||||
|
|
||||||
/** @var array<int, string> */
|
/** @var array<int, string> */
|
||||||
protected array $allowedSort;
|
protected array $allowedSort;
|
||||||
|
protected bool $convertToPrimary = false;
|
||||||
|
protected TransactionCurrency $primaryCurrency;
|
||||||
protected ParameterBag $parameters;
|
protected ParameterBag $parameters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,10 +83,19 @@ abstract class Controller extends BaseController
|
|||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->parameters = $this->getParameters();
|
$this->parameters = $this->getParameters();
|
||||||
if (auth()->check()) {
|
if (auth()->check()) {
|
||||||
$language = app('steam')->getLanguage();
|
$language = Steam::getLanguage();
|
||||||
|
$this->convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$this->primaryCurrency = Amount::getPrimaryCurrency();
|
||||||
app()->setLocale($language);
|
app()->setLocale($language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// filter down what this endpoint accepts.
|
||||||
|
if (!$request->accepts($this->accepts)) {
|
||||||
|
throw new BadHttpHeaderException(sprintf('Sorry, Accept header "%s" is not something this endpoint can provide.', $request->header('Accept')));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -99,18 +124,17 @@ abstract class Controller extends BaseController
|
|||||||
try {
|
try {
|
||||||
$date = request()->query->get($field);
|
$date = request()->query->get($field);
|
||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
app('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));
|
||||||
app('log')->error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
app('log')->error($e->getTraceAsString());
|
Log::error($e->getTraceAsString());
|
||||||
$value = null;
|
|
||||||
}
|
}
|
||||||
$obj = null;
|
$obj = null;
|
||||||
if (null !== $date) {
|
if (null !== $date) {
|
||||||
try {
|
try {
|
||||||
$obj = Carbon::parse((string) $date);
|
$obj = Carbon::parse((string) $date);
|
||||||
} catch (InvalidDateException|InvalidFormatException $e) {
|
} catch (InvalidFormatException $e) {
|
||||||
// don't care
|
// don't care
|
||||||
app('log')->warning(
|
Log::warning(
|
||||||
sprintf(
|
sprintf(
|
||||||
'Ignored invalid date "%s" in API controller parameter check: %s',
|
'Ignored invalid date "%s" in API controller parameter check: %s',
|
||||||
substr((string) $date, 0, 20),
|
substr((string) $date, 0, 20),
|
||||||
@@ -128,13 +152,21 @@ abstract class Controller extends BaseController
|
|||||||
try {
|
try {
|
||||||
$value = request()->query->get($integer);
|
$value = request()->query->get($integer);
|
||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
app('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));
|
||||||
app('log')->error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
app('log')->error($e->getTraceAsString());
|
Log::error($e->getTraceAsString());
|
||||||
$value = null;
|
$value = null;
|
||||||
}
|
}
|
||||||
if (null !== $value) {
|
if (null !== $value) {
|
||||||
$bag->set($integer, (int)$value);
|
$value = (int) $value;
|
||||||
|
if ($value < 1) {
|
||||||
|
$value = 1;
|
||||||
|
}
|
||||||
|
if ($value > 2 ** 16) {
|
||||||
|
$value = 2 ** 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
$bag->set($integer, $value);
|
||||||
}
|
}
|
||||||
if (null === $value
|
if (null === $value
|
||||||
&& 'limit' === $integer // @phpstan-ignore-line
|
&& 'limit' === $integer // @phpstan-ignore-line
|
||||||
@@ -160,9 +192,9 @@ abstract class Controller extends BaseController
|
|||||||
try {
|
try {
|
||||||
$param = (string) request()->query->get('sort');
|
$param = (string) request()->query->get('sort');
|
||||||
} catch (BadRequestException $e) {
|
} catch (BadRequestException $e) {
|
||||||
app('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.');
|
||||||
app('log')->error($e->getMessage());
|
Log::error($e->getMessage());
|
||||||
app('log')->error($e->getTraceAsString());
|
Log::error($e->getTraceAsString());
|
||||||
$param = '';
|
$param = '';
|
||||||
}
|
}
|
||||||
if ('' === $param) {
|
if ('' === $param) {
|
||||||
@@ -216,4 +248,45 @@ abstract class Controller extends BaseController
|
|||||||
|
|
||||||
return $manager;
|
return $manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array
|
||||||
|
{
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = sprintf('%s/api/v1/', request()->getSchemeAndHttpHost());
|
||||||
|
|
||||||
|
// TODO add stuff to path?
|
||||||
|
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$objects = $paginator->getCollection();
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
// $objects = $transformer->collectMetaData($objects);
|
||||||
|
$paginator->setCollection($objects);
|
||||||
|
|
||||||
|
$resource = new FractalCollection($objects, $transformer, $key);
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return $manager->createData($resource)->toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a JSON API object and returns it.
|
||||||
|
*
|
||||||
|
* @param array<int, mixed>|Model $object
|
||||||
|
*/
|
||||||
|
final protected function jsonApiObject(string $key, array|Model $object, AbstractTransformer $transformer): array
|
||||||
|
{
|
||||||
|
// create some objects:
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = sprintf('%s/api/v1', request()->getSchemeAndHttpHost());
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// $transformer->collectMetaData(new Collection([$object]));
|
||||||
|
|
||||||
|
$resource = new Item($object, $transformer, $key);
|
||||||
|
|
||||||
|
return $manager->createData($resource)->toArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -25,11 +26,11 @@ namespace FireflyIII\Api\V1\Controllers\Data;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Data\DestroyRequest;
|
use FireflyIII\Api\V1\Requests\Data\DestroyRequest;
|
||||||
|
use FireflyIII\Enums\AccountTypeEnum;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\AccountType;
|
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\Models\TransactionType;
|
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
|
||||||
@@ -63,12 +64,12 @@ class DestroyController extends Controller
|
|||||||
public function destroy(DestroyRequest $request): JsonResponse
|
public function destroy(DestroyRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$objects = $request->getObjects();
|
$objects = $request->getObjects();
|
||||||
$this->unused = $request->boolean('unused', false);
|
$this->unused = $request->boolean('unused');
|
||||||
|
|
||||||
$allExceptAssets = [AccountType::BENEFICIARY, AccountType::CASH, AccountType::CREDITCARD, AccountType::DEFAULT, AccountType::EXPENSE, AccountType::IMPORT, AccountType::INITIAL_BALANCE, AccountType::LIABILITY_CREDIT, AccountType::RECONCILIATION, AccountType::REVENUE];
|
$allExceptAssets = [AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::RECONCILIATION->value, AccountTypeEnum::REVENUE->value];
|
||||||
$all = [AccountType::ASSET, AccountType::BENEFICIARY, AccountType::CASH, AccountType::CREDITCARD, AccountType::DEBT, AccountType::DEFAULT, AccountType::EXPENSE, AccountType::IMPORT, AccountType::INITIAL_BALANCE, AccountType::LIABILITY_CREDIT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::RECONCILIATION];
|
$all = [AccountTypeEnum::ASSET->value, AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::CASH->value, AccountTypeEnum::CREDITCARD->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::DEFAULT->value, AccountTypeEnum::EXPENSE->value, AccountTypeEnum::IMPORT->value, AccountTypeEnum::INITIAL_BALANCE->value, AccountTypeEnum::LIABILITY_CREDIT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::RECONCILIATION->value];
|
||||||
$liabilities = [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD];
|
$liabilities = [AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::CREDITCARD->value];
|
||||||
$transactions = [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER, TransactionType::RECONCILIATION];
|
$transactions = [TransactionTypeEnum::WITHDRAWAL->value, TransactionTypeEnum::DEPOSIT->value, TransactionTypeEnum::TRANSFER->value, TransactionTypeEnum::RECONCILIATION->value];
|
||||||
|
|
||||||
match ($objects) {
|
match ($objects) {
|
||||||
'budgets' => $this->destroyBudgets(),
|
'budgets' => $this->destroyBudgets(),
|
||||||
@@ -81,14 +82,14 @@ class DestroyController extends Controller
|
|||||||
'object_groups' => $this->destroyObjectGroups(),
|
'object_groups' => $this->destroyObjectGroups(),
|
||||||
'not_assets_liabilities' => $this->destroyAccounts($allExceptAssets),
|
'not_assets_liabilities' => $this->destroyAccounts($allExceptAssets),
|
||||||
'accounts' => $this->destroyAccounts($all),
|
'accounts' => $this->destroyAccounts($all),
|
||||||
'asset_accounts' => $this->destroyAccounts([AccountType::ASSET, AccountType::DEFAULT]),
|
'asset_accounts' => $this->destroyAccounts([AccountTypeEnum::ASSET->value, AccountTypeEnum::DEFAULT->value]),
|
||||||
'expense_accounts' => $this->destroyAccounts([AccountType::BENEFICIARY, AccountType::EXPENSE]),
|
'expense_accounts' => $this->destroyAccounts([AccountTypeEnum::BENEFICIARY->value, AccountTypeEnum::EXPENSE->value]),
|
||||||
'revenue_accounts' => $this->destroyAccounts([AccountType::REVENUE]),
|
'revenue_accounts' => $this->destroyAccounts([AccountTypeEnum::REVENUE->value]),
|
||||||
'liabilities' => $this->destroyAccounts($liabilities),
|
'liabilities' => $this->destroyAccounts($liabilities),
|
||||||
'transactions' => $this->destroyTransactions($transactions),
|
'transactions' => $this->destroyTransactions($transactions),
|
||||||
'withdrawals' => $this->destroyTransactions([TransactionType::WITHDRAWAL]),
|
'withdrawals' => $this->destroyTransactions([TransactionTypeEnum::WITHDRAWAL->value]),
|
||||||
'deposits' => $this->destroyTransactions([TransactionType::DEPOSIT]),
|
'deposits' => $this->destroyTransactions([TransactionTypeEnum::DEPOSIT->value]),
|
||||||
'transfers' => $this->destroyTransactions([TransactionType::TRANSFER]),
|
'transfers' => $this->destroyTransactions([TransactionTypeEnum::TRANSFER->value]),
|
||||||
default => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)),
|
default => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -175,14 +176,14 @@ class DestroyController extends Controller
|
|||||||
foreach ($collection as $account) {
|
foreach ($collection as $account) {
|
||||||
$count = $account->transactions()->count();
|
$count = $account->transactions()->count();
|
||||||
if (true === $this->unused && 0 === $count) {
|
if (true === $this->unused && 0 === $count) {
|
||||||
app('log')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
|
Log::info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
|
||||||
Log::channel('audit')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
|
Log::channel('audit')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
|
||||||
$service->destroy($account, null);
|
$service->destroy($account, null);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (false === $this->unused) {
|
if (false === $this->unused) {
|
||||||
app('log')->info(sprintf('Deleting account #%d "%s"', $account->id, $account->name));
|
Log::info(sprintf('Deleting account #%d "%s"', $account->id, $account->name));
|
||||||
Log::channel('audit')->warning(sprintf('Deleted account #%d "%s"', $account->id, $account->name));
|
Log::channel('audit')->warning(sprintf('Deleted account #%d "%s"', $account->id, $account->name));
|
||||||
$service->destroy($account, null);
|
$service->destroy($account, null);
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,9 @@ 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 Safe\Exceptions\DatetimeException;
|
||||||
|
|
||||||
|
use function Safe\date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ExportController
|
* Class ExportController
|
||||||
@@ -59,7 +62,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function accounts(ExportRequest $request): LaravelResponse
|
public function accounts(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -70,6 +73,7 @@ class ExportController extends Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
|
* @throws DatetimeException
|
||||||
*/
|
*/
|
||||||
private function returnExport(string $key): LaravelResponse
|
private function returnExport(string $key): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -88,7 +92,7 @@ class ExportController extends Controller
|
|||||||
->header('Expires', '0')
|
->header('Expires', '0')
|
||||||
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
|
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
|
||||||
->header('Pragma', 'public')
|
->header('Pragma', 'public')
|
||||||
->header('Content-Length', (string)strlen($data[$key]))
|
->header('Content-Length', (string) strlen((string) $data[$key]))
|
||||||
;
|
;
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
@@ -100,7 +104,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function bills(ExportRequest $request): LaravelResponse
|
public function bills(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -115,7 +119,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function budgets(ExportRequest $request): LaravelResponse
|
public function budgets(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -130,7 +134,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function categories(ExportRequest $request): LaravelResponse
|
public function categories(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -145,7 +149,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function piggyBanks(ExportRequest $request): LaravelResponse
|
public function piggyBanks(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -160,7 +164,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function recurring(ExportRequest $request): LaravelResponse
|
public function recurring(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -175,7 +179,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function rules(ExportRequest $request): LaravelResponse
|
public function rules(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
@@ -190,7 +194,7 @@ class ExportController extends Controller
|
|||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function tags(ExportRequest $request): LaravelResponse
|
public function tags(ExportRequest $request): LaravelResponse
|
||||||
{
|
{
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PurgeController.php
|
* PurgeController.php
|
||||||
* Copyright (c) 2022 james@firefly-iii.org
|
* Copyright (c) 2022 james@firefly-iii.org
|
||||||
@@ -28,13 +29,13 @@ use FireflyIII\Models\Account;
|
|||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
use FireflyIII\Models\PiggyBank;
|
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Models\Rule;
|
use FireflyIII\Models\Rule;
|
||||||
use FireflyIII\Models\RuleGroup;
|
use FireflyIII\Models\RuleGroup;
|
||||||
use FireflyIII\Models\Tag;
|
use FireflyIII\Models\Tag;
|
||||||
use FireflyIII\Models\TransactionGroup;
|
use FireflyIII\Models\TransactionGroup;
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
@@ -62,14 +63,17 @@ class PurgeController extends Controller
|
|||||||
Bill::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
Bill::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
||||||
|
|
||||||
// piggies
|
// piggies
|
||||||
$set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id')
|
$repository = app(PiggyBankRepositoryInterface::class);
|
||||||
->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*'])
|
$repository->setUser($user);
|
||||||
;
|
$repository->purgeAll();
|
||||||
|
// $set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id')
|
||||||
/** @var PiggyBank $piggy */
|
// ->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*'])
|
||||||
foreach ($set as $piggy) {
|
// ;
|
||||||
$piggy->forceDelete();
|
//
|
||||||
}
|
// /** @var PiggyBank $piggy */
|
||||||
|
// foreach ($set as $piggy) {
|
||||||
|
// $piggy->forceDelete();
|
||||||
|
// }
|
||||||
|
|
||||||
// rule group
|
// rule group
|
||||||
RuleGroup::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
RuleGroup::whereUserId($user->id)->onlyTrashed()->forceDelete();
|
||||||
|
@@ -26,10 +26,12 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Expense;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class BillController
|
* Class BillController
|
||||||
@@ -67,6 +69,8 @@ class BillController extends Controller
|
|||||||
$bills = $request->getBills();
|
$bills = $request->getBills();
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
|
||||||
// get all bills:
|
// get all bills:
|
||||||
@@ -76,16 +80,29 @@ class BillController extends Controller
|
|||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts);
|
||||||
$collector->setBills($bills);
|
$collector->setBills($bills);
|
||||||
|
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
$billId = (int) $journal['bill_id'];
|
$billId = (int) $journal['bill_id'];
|
||||||
$currencyId = (int) $journal['currency_id'];
|
$currencyId = (int) $journal['currency_id'];
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyCode = $journal['currency_code'];
|
||||||
|
$field = 'amount';
|
||||||
|
|
||||||
|
// use the primary amount if the user wants to convert to primary currency
|
||||||
|
if ($convertToPrimary && $currencyId !== $primary->id) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
$field = 'pc_amount';
|
||||||
|
}
|
||||||
|
// use foreign amount when the foreign currency IS the default currency.
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
|
||||||
|
$field = 'foreign_amount';
|
||||||
|
}
|
||||||
|
Log::debug(sprintf('Journal #%d in bill #%d will use %s (%s %s)', $journal['transaction_group_id'], $billId, $field, $currencyCode, $journal[$field] ?? '0'));
|
||||||
|
|
||||||
$key = sprintf('%d-%d', $billId, $currencyId);
|
$key = sprintf('%d-%d', $billId, $currencyId);
|
||||||
$foreignKey = sprintf('%d-%d', $billId, $foreignCurrencyId);
|
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
if (0 !== $currencyId) {
|
||||||
$response[$key] ??= [
|
$response[$key] ??= [
|
||||||
@@ -94,21 +111,11 @@ class BillController extends Controller
|
|||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']);
|
$response[$key]['difference'] = bcadd($response[$key]['difference'], (string) ($journal[$field] ?? '0'));
|
||||||
$response[$key]['difference_float'] = (float) $response[$key]['difference']; // intentional float
|
$response[$key]['difference_float'] = (float) $response[$key]['difference']; // intentional float
|
||||||
}
|
}
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignKey] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']);
|
|
||||||
$response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; // intentional float
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
@@ -125,39 +132,44 @@ class BillController extends Controller
|
|||||||
$accounts = $request->getAssetAccounts();
|
$accounts = $request->getAssetAccounts();
|
||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts);
|
||||||
$collector->withoutBill();
|
$collector->withoutBill();
|
||||||
|
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
$currencyId = (int) $journal['currency_id'];
|
$currencyId = (int) $journal['currency_id'];
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyCode = $journal['currency_code'];
|
||||||
|
$field = 'amount';
|
||||||
|
|
||||||
|
// use the primary amount if the user wants to convert to primary currency
|
||||||
|
if ($convertToPrimary && $currencyId !== $primary->id) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
$field = 'pc_amount';
|
||||||
|
}
|
||||||
|
// use foreign amount when the foreign currency IS the default currency.
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
|
||||||
|
$field = 'foreign_amount';
|
||||||
|
}
|
||||||
|
Log::debug(sprintf('Journal #%d will use %s (%s %s)', $journal['transaction_group_id'], $field, $currencyCode, $journal[$field] ?? '0'));
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
if (0 !== $currencyId) {
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) ($journal[$field] ?? '0'));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // intentional float
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // intentional float
|
||||||
}
|
}
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // intentional float
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BudgetController.php
|
* BudgetController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PeriodController.php
|
* PeriodController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -25,9 +26,11 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Expense;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class PeriodController
|
* Class PeriodController
|
||||||
@@ -44,36 +47,46 @@ class PeriodController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type)
|
// collect all expenses in this period (regardless of type)
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
|
// same code as many other sumExpense methods. I think this needs some kind of generic method.
|
||||||
|
$amount = '0';
|
||||||
$currencyId = (int) $journal['currency_id'];
|
$currencyId = (int) $journal['currency_id'];
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyCode = $journal['currency_code'];
|
||||||
|
if ($convertToPrimary) {
|
||||||
|
$amount = Amount::getAmountFromJournal($journal);
|
||||||
|
if ($primary->id !== (int) $journal['currency_id'] && $primary->id !== (int) $journal['foreign_currency_id']) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
}
|
||||||
|
if ($primary->id !== (int) $journal['currency_id'] && $primary->id === (int) $journal['foreign_currency_id']) {
|
||||||
|
$currencyId = $journal['foreign_currency_id'];
|
||||||
|
$currencyCode = $journal['foreign_currency_code'];
|
||||||
|
}
|
||||||
|
Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount));
|
||||||
|
}
|
||||||
|
if (!$convertToPrimary) {
|
||||||
|
// ignore the amount in foreign currency.
|
||||||
|
Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount']));
|
||||||
|
$amount = $journal['amount'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $amount);
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // intentional float
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // intentional float
|
||||||
}
|
}
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // intentional float
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
}
|
}
|
||||||
|
@@ -26,10 +26,12 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Expense;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class TagController
|
* Class TagController
|
||||||
@@ -66,39 +68,48 @@ class TagController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts);
|
||||||
$collector->withoutTags();
|
$collector->withoutTags();
|
||||||
|
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
|
// same code as many other sumExpense methods. I think this needs some kind of generic method.
|
||||||
|
$amount = '0';
|
||||||
$currencyId = (int) $journal['currency_id'];
|
$currencyId = (int) $journal['currency_id'];
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyCode = $journal['currency_code'];
|
||||||
|
if ($convertToPrimary) {
|
||||||
|
$amount = Amount::getAmountFromJournal($journal);
|
||||||
|
if ($primary->id !== (int) $journal['currency_id'] && $primary->id !== (int) $journal['foreign_currency_id']) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
}
|
||||||
|
if ($primary->id !== (int) $journal['currency_id'] && $primary->id === (int) $journal['foreign_currency_id']) {
|
||||||
|
$currencyId = $journal['foreign_currency_id'];
|
||||||
|
$currencyCode = $journal['foreign_currency_code'];
|
||||||
|
}
|
||||||
|
Log::debug(sprintf('[a] Add amount %s %s', $currencyCode, $amount));
|
||||||
|
}
|
||||||
|
if (!$convertToPrimary) {
|
||||||
|
// ignore the amount in foreign currency.
|
||||||
|
Log::debug(sprintf('[b] Add amount %s %s', $currencyCode, $journal['amount']));
|
||||||
|
$amount = $journal['amount'];
|
||||||
|
}
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $amount);
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
|
||||||
}
|
}
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // float but on purpose.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
}
|
}
|
||||||
@@ -124,7 +135,7 @@ class TagController extends Controller
|
|||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::WITHDRAWAL->value])->setRange($start, $end)->setSourceAccounts($accounts);
|
||||||
$collector->setTags($tags);
|
$collector->setTags($tags);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
@@ -149,7 +160,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $journal['currency_code'],
|
||||||
];
|
];
|
||||||
$response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']);
|
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], (string) $journal['amount']);
|
||||||
$response[$key]['difference_float'] = (float) $response[$key]['difference']; // float but on purpose.
|
$response[$key]['difference_float'] = (float) $response[$key]['difference']; // float but on purpose.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +172,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $foreignCurrencyId,
|
'currency_id' => (string) $foreignCurrencyId,
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
'currency_code' => $journal['foreign_currency_code'],
|
||||||
];
|
];
|
||||||
$response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']);
|
$response[$foreignKey]['difference'] = bcadd((string) $response[$foreignKey]['difference'], (string) $journal['foreign_amount']);
|
||||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // float but on purpose.
|
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // float but on purpose.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -73,6 +73,7 @@ class AccountController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$assetAccounts = $request->getAssetAccounts();
|
$assetAccounts = $request->getAssetAccounts();
|
||||||
|
|
||||||
$income = $this->opsRepository->sumIncomeByDestination($start, $end, $assetAccounts);
|
$income = $this->opsRepository->sumIncomeByDestination($start, $end, $assetAccounts);
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PeriodController.php
|
* PeriodController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -25,8 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Income;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,39 +46,38 @@ class PeriodController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type)
|
// collect all expenses in this period (regardless of type)
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
$currencyId = (int)$journal['currency_id'];
|
// currency
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyId = $journal['currency_id'];
|
||||||
|
$currencyCode = $journal['currency_code'];
|
||||||
|
$field = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount';
|
||||||
|
|
||||||
|
// perhaps use default currency instead?
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
}
|
||||||
|
// use foreign amount when the foreign currency IS the default currency.
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
|
||||||
|
$field = 'foreign_amount';
|
||||||
|
}
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
|
||||||
}
|
}
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd(
|
|
||||||
$response[$foreignCurrencyId]['difference'],
|
|
||||||
app('steam')->positive($journal['foreign_amount'])
|
|
||||||
);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // float but on purpose.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
}
|
}
|
||||||
|
@@ -26,9 +26,10 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Income;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,41 +68,41 @@ class TagController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts);
|
||||||
$collector->withoutTags();
|
$collector->withoutTags();
|
||||||
|
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
$currencyId = (int)$journal['currency_id'];
|
// currency
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyId = $journal['currency_id'];
|
||||||
|
$currencyCode = $journal['currency_code'];
|
||||||
|
$field = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount';
|
||||||
|
|
||||||
|
// perhaps use default currency instead?
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
}
|
||||||
|
// use foreign amount when the foreign currency IS the default currency.
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
|
||||||
|
$field = 'foreign_amount';
|
||||||
|
}
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
||||||
}
|
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd(
|
|
||||||
$response[$foreignCurrencyId]['difference'],
|
|
||||||
app('steam')->positive($journal['foreign_amount'])
|
|
||||||
);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
@@ -128,7 +129,7 @@ class TagController extends Controller
|
|||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts);
|
||||||
$collector->setTags($tags);
|
$collector->setTags($tags);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
@@ -153,7 +154,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $journal['currency_code'],
|
||||||
];
|
];
|
||||||
$response[$key]['difference'] = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount']));
|
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], (string) app('steam')->positive($journal['amount']));
|
||||||
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,8 +167,8 @@ class TagController extends Controller
|
|||||||
'currency_code' => $journal['foreign_currency_code'],
|
'currency_code' => $journal['foreign_currency_code'],
|
||||||
];
|
];
|
||||||
$response[$foreignKey]['difference'] = bcadd(
|
$response[$foreignKey]['difference'] = bcadd(
|
||||||
$response[$foreignKey]['difference'],
|
(string) $response[$foreignKey]['difference'],
|
||||||
app('steam')->positive($journal['foreign_amount'])
|
(string) app('steam')->positive($journal['foreign_amount'])
|
||||||
);
|
);
|
||||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
|
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference'];
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AccountController.php
|
* AccountController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CategoryController.php
|
* CategoryController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PeriodController.php
|
* PeriodController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -25,8 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Transfer;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,38 +46,38 @@ class PeriodController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type)
|
// collect all expenses in this period (regardless of type)
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
$currencyId = (int)$journal['currency_id'];
|
// currency
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyId = $journal['currency_id'];
|
||||||
|
$currencyCode = $journal['currency_code'];
|
||||||
|
$field = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount';
|
||||||
|
|
||||||
|
// perhaps use default currency instead?
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
}
|
||||||
|
// use foreign amount when the foreign currency IS the default currency.
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
|
||||||
|
$field = 'foreign_amount';
|
||||||
|
}
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
||||||
}
|
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd(
|
|
||||||
$response[$foreignCurrencyId]['difference'],
|
|
||||||
app('steam')->positive($journal['foreign_amount'])
|
|
||||||
);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TagController.php
|
* TagController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -25,9 +26,10 @@ namespace FireflyIII\Api\V1\Controllers\Insight\Transfer;
|
|||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\TransactionType;
|
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Facades\Amount;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,41 +66,42 @@ class TagController extends Controller
|
|||||||
$start = $request->getStart();
|
$start = $request->getStart();
|
||||||
$end = $request->getEnd();
|
$end = $request->getEnd();
|
||||||
$response = [];
|
$response = [];
|
||||||
|
$convertToPrimary = Amount::convertToPrimary();
|
||||||
|
$primary = Amount::getPrimaryCurrency();
|
||||||
|
|
||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
|
||||||
$collector->withoutTags();
|
$collector->withoutTags();
|
||||||
|
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
foreach ($genericSet as $journal) {
|
foreach ($genericSet as $journal) {
|
||||||
$currencyId = (int)$journal['currency_id'];
|
// currency
|
||||||
$foreignCurrencyId = (int)$journal['foreign_currency_id'];
|
$currencyId = $journal['currency_id'];
|
||||||
|
$currencyCode = $journal['currency_code'];
|
||||||
|
$field = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount';
|
||||||
|
|
||||||
|
// perhaps use default currency instead?
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id) {
|
||||||
|
$currencyId = $primary->id;
|
||||||
|
$currencyCode = $primary->code;
|
||||||
|
}
|
||||||
|
// use foreign amount when the foreign currency IS the default currency.
|
||||||
|
if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) {
|
||||||
|
$field = 'foreign_amount';
|
||||||
|
}
|
||||||
|
|
||||||
if (0 !== $currencyId) {
|
|
||||||
$response[$currencyId] ??= [
|
$response[$currencyId] ??= [
|
||||||
'difference' => '0',
|
'difference' => '0',
|
||||||
'difference_float' => 0,
|
'difference_float' => 0,
|
||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $currencyCode,
|
||||||
];
|
];
|
||||||
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
|
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field]));
|
||||||
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference'];
|
||||||
}
|
|
||||||
if (0 !== $foreignCurrencyId) {
|
|
||||||
$response[$foreignCurrencyId] ??= [
|
|
||||||
'difference' => '0',
|
|
||||||
'difference_float' => 0,
|
|
||||||
'currency_id' => (string)$foreignCurrencyId,
|
|
||||||
'currency_code' => $journal['foreign_currency_code'],
|
|
||||||
];
|
|
||||||
$response[$foreignCurrencyId]['difference'] = bcadd(
|
|
||||||
$response[$foreignCurrencyId]['difference'],
|
|
||||||
app('steam')->positive($journal['foreign_amount'])
|
|
||||||
);
|
|
||||||
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array_values($response));
|
return response()->json(array_values($response));
|
||||||
@@ -125,7 +128,7 @@ class TagController extends Controller
|
|||||||
|
|
||||||
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
// collect all expenses in this period (regardless of type) by the given bills and accounts.
|
||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts);
|
$collector->setTypes([TransactionTypeEnum::TRANSFER->value])->setRange($start, $end)->setDestinationAccounts($accounts);
|
||||||
$collector->setTags($tags);
|
$collector->setTags($tags);
|
||||||
$genericSet = $collector->getExtractedJournals();
|
$genericSet = $collector->getExtractedJournals();
|
||||||
|
|
||||||
@@ -150,7 +153,7 @@ class TagController extends Controller
|
|||||||
'currency_id' => (string) $currencyId,
|
'currency_id' => (string) $currencyId,
|
||||||
'currency_code' => $journal['currency_code'],
|
'currency_code' => $journal['currency_code'],
|
||||||
];
|
];
|
||||||
$response[$key]['difference'] = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount']));
|
$response[$key]['difference'] = bcadd((string) $response[$key]['difference'], (string) app('steam')->positive($journal['amount']));
|
||||||
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
$response[$key]['difference_float'] = (float) $response[$key]['difference'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,8 +166,8 @@ class TagController extends Controller
|
|||||||
'currency_code' => $journal['foreign_currency_code'],
|
'currency_code' => $journal['foreign_currency_code'],
|
||||||
];
|
];
|
||||||
$response[$foreignKey]['difference'] = bcadd(
|
$response[$foreignKey]['difference'] = bcadd(
|
||||||
$response[$foreignKey]['difference'],
|
(string) $response[$foreignKey]['difference'],
|
||||||
app('steam')->positive($journal['foreign_amount'])
|
(string) app('steam')->positive($journal['foreign_amount'])
|
||||||
);
|
);
|
||||||
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
|
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AccountController.php
|
* AccountController.php
|
||||||
* Copyright (c) 2019 james@firefly-iii.org
|
* Copyright (c) 2019 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AccountController.php
|
* AccountController.php
|
||||||
* Copyright (c) 2019 james@firefly-iii.org
|
* Copyright (c) 2019 james@firefly-iii.org
|
||||||
@@ -29,6 +30,8 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
use FireflyIII\Transformers\AttachmentTransformer;
|
use FireflyIII\Transformers\AttachmentTransformer;
|
||||||
use FireflyIII\Transformers\PiggyBankTransformer;
|
use FireflyIII\Transformers\PiggyBankTransformer;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
@@ -110,11 +113,18 @@ class ListController extends Controller
|
|||||||
// types to get, page size:
|
// types to get, page size:
|
||||||
$pageSize = $this->parameters->get('limit');
|
$pageSize = $this->parameters->get('limit');
|
||||||
|
|
||||||
// get list of budgets. Count it and split it.
|
// get list of piggy banks. Count it and split it.
|
||||||
$collection = $this->repository->getPiggyBanks($account);
|
$collection = $this->repository->getPiggyBanks($account);
|
||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$piggyBanks = $enrichment->enrich($piggyBanks);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
|
||||||
@@ -123,7 +133,7 @@ class ListController extends Controller
|
|||||||
$transformer = app(PiggyBankTransformer::class);
|
$transformer = app(PiggyBankTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
|
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
@@ -164,13 +174,17 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.accounts.transactions', [$account->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.accounts.transactions', [$account->id]).$this->buildParams());
|
||||||
$groups = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new FractalCollection($groups, $transformer, 'transactions');
|
$resource = new FractalCollection($transactions, $transformer, 'transactions');
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -28,7 +29,9 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\AccountFilter;
|
use FireflyIII\Support\Http\Api\AccountFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
||||||
use FireflyIII\Transformers\AccountTransformer;
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
@@ -87,9 +90,16 @@ class ShowController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
|
|
||||||
// continue sort:
|
// continue sort:
|
||||||
|
|
||||||
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setDate($this->parameters->get('date'));
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$accounts = $enrichment->enrich($accounts);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.accounts.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.accounts.index').$this->buildParams());
|
||||||
@@ -117,6 +127,15 @@ class ShowController extends Controller
|
|||||||
$account->refresh();
|
$account->refresh();
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setDate($this->parameters->get('date'));
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$account = $enrichment->enrichSingle($account);
|
||||||
|
|
||||||
|
|
||||||
/** @var AccountTransformer $transformer */
|
/** @var AccountTransformer $transformer */
|
||||||
$transformer = app(AccountTransformer::class);
|
$transformer = app(AccountTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AccountController.php
|
* AccountController.php
|
||||||
* Copyright (c) 2019 james@firefly-iii.org
|
* Copyright (c) 2019 james@firefly-iii.org
|
||||||
@@ -26,7 +27,9 @@ namespace FireflyIII\Api\V1\Controllers\Models\Account;
|
|||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Api\V1\Requests\Models\Account\StoreRequest;
|
use FireflyIII\Api\V1\Requests\Models\Account\StoreRequest;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
||||||
use FireflyIII\Transformers\AccountTransformer;
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -68,6 +71,14 @@ class StoreController extends Controller
|
|||||||
$account = $this->repository->store($data);
|
$account = $this->repository->store($data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setDate(null);
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$account = $enrichment->enrichSingle($account);
|
||||||
|
|
||||||
/** @var AccountTransformer $transformer */
|
/** @var AccountTransformer $transformer */
|
||||||
$transformer = app(AccountTransformer::class);
|
$transformer = app(AccountTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AccountController.php
|
* AccountController.php
|
||||||
* Copyright (c) 2019 james@firefly-iii.org
|
* Copyright (c) 2019 james@firefly-iii.org
|
||||||
@@ -27,8 +28,11 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Account\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\Models\Account\UpdateRequest;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
||||||
use FireflyIII\Transformers\AccountTransformer;
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
|
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,7 +68,7 @@ class UpdateController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function update(UpdateRequest $request, Account $account): JsonResponse
|
public function update(UpdateRequest $request, Account $account): JsonResponse
|
||||||
{
|
{
|
||||||
app('log')->debug(sprintf('Now in %s', __METHOD__));
|
Log::debug(sprintf('Now in %s', __METHOD__));
|
||||||
$data = $request->getUpdateData();
|
$data = $request->getUpdateData();
|
||||||
$data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type);
|
$data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type);
|
||||||
$account = $this->repository->update($account, $data);
|
$account = $this->repository->update($account, $data);
|
||||||
@@ -72,6 +76,14 @@ class UpdateController extends Controller
|
|||||||
$account->refresh();
|
$account->refresh();
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setDate(null);
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$account = $enrichment->enrichSingle($account);
|
||||||
|
|
||||||
/** @var AccountTransformer $transformer */
|
/** @var AccountTransformer $transformer */
|
||||||
$transformer = app(AccountTransformer::class);
|
$transformer = app(AccountTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StoreController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -79,7 +80,7 @@ class StoreController extends Controller
|
|||||||
|
|
||||||
throw new NotFoundHttpException();
|
throw new NotFoundHttpException();
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Now in %s', __METHOD__));
|
Log::debug(sprintf('Now in %s', __METHOD__));
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
$attachment = $this->repository->store($data);
|
$attachment = $this->repository->store($data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
@@ -108,11 +109,16 @@ class StoreController extends Controller
|
|||||||
$helper = app(AttachmentHelperInterface::class);
|
$helper = app(AttachmentHelperInterface::class);
|
||||||
$body = $request->getContent();
|
$body = $request->getContent();
|
||||||
if ('' === $body) {
|
if ('' === $body) {
|
||||||
app('log')->error('Body of attachment is empty.');
|
Log::error('Body of attachment is empty.');
|
||||||
|
|
||||||
|
return response()->json([], 422);
|
||||||
|
}
|
||||||
|
$result = $helper->saveAttachmentFromApi($attachment, $body);
|
||||||
|
if (false === $result) {
|
||||||
|
Log::error('Could not save attachment from API.');
|
||||||
|
|
||||||
return response()->json([], 422);
|
return response()->json([], 422);
|
||||||
}
|
}
|
||||||
$helper->saveAttachmentFromApi($attachment, $body);
|
|
||||||
|
|
||||||
return response()->json([], 204);
|
return response()->json([], 204);
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\AvailableBudget;
|
use FireflyIII\Models\AvailableBudget;
|
||||||
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\AvailableBudgetEnrichment;
|
||||||
use FireflyIII\Transformers\AvailableBudgetTransformer;
|
use FireflyIII\Transformers\AvailableBudgetTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -74,7 +76,6 @@ class ShowController extends Controller
|
|||||||
|
|
||||||
// types to get, page size:
|
// types to get, page size:
|
||||||
$pageSize = $this->parameters->get('limit');
|
$pageSize = $this->parameters->get('limit');
|
||||||
|
|
||||||
$start = $this->parameters->get('start');
|
$start = $this->parameters->get('start');
|
||||||
$end = $this->parameters->get('end');
|
$end = $this->parameters->get('end');
|
||||||
|
|
||||||
@@ -83,6 +84,13 @@ class ShowController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AvailableBudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$availableBudgets = $enrichment->enrich($availableBudgets);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
|
||||||
@@ -106,11 +114,23 @@ class ShowController extends Controller
|
|||||||
public function show(AvailableBudget $availableBudget): JsonResponse
|
public function show(AvailableBudget $availableBudget): JsonResponse
|
||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
$start = $this->parameters->get('start');
|
||||||
|
$end = $this->parameters->get('end');
|
||||||
|
|
||||||
/** @var AvailableBudgetTransformer $transformer */
|
/** @var AvailableBudgetTransformer $transformer */
|
||||||
$transformer = app(AvailableBudgetTransformer::class);
|
$transformer = app(AvailableBudgetTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AvailableBudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($start);
|
||||||
|
$enrichment->setEnd($end);
|
||||||
|
$availableBudget = $enrichment->enrichSingle($availableBudget);
|
||||||
|
|
||||||
|
|
||||||
$resource = new Item($availableBudget, $transformer, 'available_budgets');
|
$resource = new Item($availableBudget, $transformer, 'available_budgets');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -29,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
|||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
use FireflyIII\Transformers\AttachmentTransformer;
|
use FireflyIII\Transformers\AttachmentTransformer;
|
||||||
use FireflyIII\Transformers\RuleTransformer;
|
use FireflyIII\Transformers\RuleTransformer;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
@@ -175,7 +177,11 @@ class ListController extends Controller
|
|||||||
// get paginator.
|
// get paginator.
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams());
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment;
|
||||||
use FireflyIII\Transformers\BillTransformer;
|
use FireflyIII\Transformers\BillTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
@@ -75,6 +78,15 @@ class ShowController extends Controller
|
|||||||
$bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new SubscriptionEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$bills = $enrichment->enrich($bills);
|
||||||
|
|
||||||
/** @var BillTransformer $transformer */
|
/** @var BillTransformer $transformer */
|
||||||
$transformer = app(BillTransformer::class);
|
$transformer = app(BillTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -95,6 +107,15 @@ class ShowController extends Controller
|
|||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new SubscriptionEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$bill = $enrichment->enrichSingle($bill);
|
||||||
|
|
||||||
/** @var BillTransformer $transformer */
|
/** @var BillTransformer $transformer */
|
||||||
$transformer = app(BillTransformer::class);
|
$transformer = app(BillTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StoreController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -28,7 +29,9 @@ use FireflyIII\Api\V1\Requests\Models\Bill\StoreRequest;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment;
|
||||||
use FireflyIII\Transformers\BillTransformer;
|
use FireflyIII\Transformers\BillTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -71,6 +74,15 @@ class StoreController extends Controller
|
|||||||
$bill = $this->repository->store($data);
|
$bill = $this->repository->store($data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new SubscriptionEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$bill = $enrichment->enrichSingle($bill);
|
||||||
|
|
||||||
/** @var BillTransformer $transformer */
|
/** @var BillTransformer $transformer */
|
||||||
$transformer = app(BillTransformer::class);
|
$transformer = app(BillTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Bill\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\Models\Bill\UpdateRequest;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Models\Bill;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment;
|
||||||
use FireflyIII\Transformers\BillTransformer;
|
use FireflyIII\Transformers\BillTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -66,6 +69,15 @@ class UpdateController extends Controller
|
|||||||
$bill = $this->repository->update($bill, $data);
|
$bill = $this->repository->update($bill, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new SubscriptionEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$bill = $enrichment->enrichSingle($bill);
|
||||||
|
|
||||||
/** @var BillTransformer $transformer */
|
/** @var BillTransformer $transformer */
|
||||||
$transformer = app(BillTransformer::class);
|
$transformer = app(BillTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -24,12 +25,15 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Api\V1\Controllers\Models\Budget;
|
namespace FireflyIII\Api\V1\Controllers\Models\Budget;
|
||||||
|
|
||||||
use FireflyIII\Api\V1\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Enums\TransactionTypeEnum;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
use FireflyIII\Transformers\AttachmentTransformer;
|
use FireflyIII\Transformers\AttachmentTransformer;
|
||||||
use FireflyIII\Transformers\BudgetLimitTransformer;
|
use FireflyIII\Transformers\BudgetLimitTransformer;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
@@ -114,6 +118,14 @@ class ListController extends Controller
|
|||||||
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams());
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budgetLimits = $enrichment->enrich($budgetLimits);
|
||||||
|
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -170,7 +182,11 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]).$this->buildParams());
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
@@ -207,6 +223,8 @@ class ListController extends Controller
|
|||||||
$collector = app(GroupCollectorInterface::class);
|
$collector = app(GroupCollectorInterface::class);
|
||||||
$collector
|
$collector
|
||||||
->setUser($admin)
|
->setUser($admin)
|
||||||
|
// withdrawals only
|
||||||
|
->setTypes([TransactionTypeEnum::WITHDRAWAL->value])
|
||||||
// filter on budget.
|
// filter on budget.
|
||||||
->withoutBudget()
|
->withoutBudget()
|
||||||
// all info needed for the API:
|
// all info needed for the API:
|
||||||
@@ -228,7 +246,11 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.budgets.without-budget').$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.without-budget').$this->buildParams());
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -28,7 +29,9 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetTransformer;
|
use FireflyIII\Transformers\BudgetTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
@@ -81,6 +84,15 @@ class ShowController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$budgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$budgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$budgets = $enrichment->enrich($budgets);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.budgets.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.index').$this->buildParams());
|
||||||
@@ -102,6 +114,15 @@ class ShowController extends Controller
|
|||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$budget = $enrichment->enrichSingle($budget);
|
||||||
|
|
||||||
/** @var BudgetTransformer $transformer */
|
/** @var BudgetTransformer $transformer */
|
||||||
$transformer = app(BudgetTransformer::class);
|
$transformer = app(BudgetTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StoreController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Budget\StoreRequest;
|
use FireflyIII\Api\V1\Requests\Models\Budget\StoreRequest;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetTransformer;
|
use FireflyIII\Transformers\BudgetTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -68,6 +71,13 @@ class StoreController extends Controller
|
|||||||
$budget->refresh();
|
$budget->refresh();
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budget = $enrichment->enrichSingle($budget);
|
||||||
|
|
||||||
/** @var BudgetTransformer $transformer */
|
/** @var BudgetTransformer $transformer */
|
||||||
$transformer = app(BudgetTransformer::class);
|
$transformer = app(BudgetTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Budget\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\Models\Budget\UpdateRequest;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetTransformer;
|
use FireflyIII\Transformers\BudgetTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -66,6 +69,13 @@ class UpdateController extends Controller
|
|||||||
$budget = $this->repository->update($budget, $data);
|
$budget = $this->repository->update($budget, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budget = $enrichment->enrichSingle($budget);
|
||||||
|
|
||||||
/** @var BudgetTransformer $transformer */
|
/** @var BudgetTransformer $transformer */
|
||||||
$transformer = app(BudgetTransformer::class);
|
$transformer = app(BudgetTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -29,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
|||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -83,7 +85,11 @@ class ListController extends Controller
|
|||||||
$collector->setTypes($types);
|
$collector->setTypes($types);
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]).$this->buildParams());
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -30,6 +31,7 @@ use FireflyIII\Models\Budget;
|
|||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetLimitTransformer;
|
use FireflyIII\Transformers\BudgetLimitTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -83,6 +85,14 @@ class ShowController extends Controller
|
|||||||
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams());
|
||||||
|
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budgetLimits = $enrichment->enrich($budgetLimits);
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -99,7 +109,7 @@ class ShowController extends Controller
|
|||||||
*
|
*
|
||||||
* Display a listing of the budget limits for this budget.
|
* Display a listing of the budget limits for this budget.
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
|
||||||
*/
|
*/
|
||||||
public function indexAll(SameDateRequest $request): JsonResponse
|
public function indexAll(SameDateRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
@@ -112,6 +122,13 @@ class ShowController extends Controller
|
|||||||
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams());
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budgetLimits = $enrichment->enrich($budgetLimits);
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
@@ -136,6 +153,13 @@ class ShowController extends Controller
|
|||||||
// continue!
|
// continue!
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budgetLimit = $enrichment->enrichSingle($budgetLimit);
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StoreController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,6 +28,7 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest;
|
use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetLimitTransformer;
|
use FireflyIII\Transformers\BudgetLimitTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -73,6 +75,13 @@ class StoreController extends Controller
|
|||||||
$budgetLimit = $this->blRepository->store($data);
|
$budgetLimit = $this->blRepository->store($data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budgetLimit = $enrichment->enrichSingle($budgetLimit);
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -29,6 +30,7 @@ use FireflyIII\Exceptions\FireflyException;
|
|||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\BudgetLimitEnrichment;
|
||||||
use FireflyIII\Transformers\BudgetLimitTransformer;
|
use FireflyIII\Transformers\BudgetLimitTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -79,6 +81,13 @@ class UpdateController extends Controller
|
|||||||
$budgetLimit = $this->blRepository->update($budgetLimit, $data);
|
$budgetLimit = $this->blRepository->update($budgetLimit, $data);
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new BudgetLimitEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$budgetLimit = $enrichment->enrich($budgetLimit);
|
||||||
|
|
||||||
/** @var BudgetLimitTransformer $transformer */
|
/** @var BudgetLimitTransformer $transformer */
|
||||||
$transformer = app(BudgetLimitTransformer::class);
|
$transformer = app(BudgetLimitTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -29,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
|||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
use FireflyIII\Transformers\AttachmentTransformer;
|
use FireflyIII\Transformers\AttachmentTransformer;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
@@ -138,7 +140,11 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.categories.transactions', [$category->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.categories.transactions', [$category->id]).$this->buildParams());
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment;
|
||||||
use FireflyIII\Transformers\CategoryTransformer;
|
use FireflyIII\Transformers\CategoryTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
@@ -77,6 +80,15 @@ class ShowController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new CategoryEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$categories = $enrichment->enrich($categories);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.categories.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.categories.index').$this->buildParams());
|
||||||
@@ -104,6 +116,15 @@ class ShowController extends Controller
|
|||||||
$transformer = app(CategoryTransformer::class);
|
$transformer = app(CategoryTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new CategoryEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$category = $enrichment->enrichSingle($category);
|
||||||
|
|
||||||
$resource = new Item($category, $transformer, 'categories');
|
$resource = new Item($category, $transformer, 'categories');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StoreController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Category\StoreRequest;
|
use FireflyIII\Api\V1\Requests\Models\Category\StoreRequest;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment;
|
||||||
use FireflyIII\Transformers\CategoryTransformer;
|
use FireflyIII\Transformers\CategoryTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -71,6 +74,15 @@ class StoreController extends Controller
|
|||||||
$transformer = app(CategoryTransformer::class);
|
$transformer = app(CategoryTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new CategoryEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$category = $enrichment->enrichSingle($category);
|
||||||
|
|
||||||
$resource = new Item($category, $transformer, 'categories');
|
$resource = new Item($category, $transformer, 'categories');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\Category\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\Models\Category\UpdateRequest;
|
||||||
use FireflyIII\Models\Category;
|
use FireflyIII\Models\Category;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\CategoryEnrichment;
|
||||||
use FireflyIII\Transformers\CategoryTransformer;
|
use FireflyIII\Transformers\CategoryTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -70,6 +73,15 @@ class UpdateController extends Controller
|
|||||||
$transformer = app(CategoryTransformer::class);
|
$transformer = app(CategoryTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new CategoryEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$category = $enrichment->enrichSingle($category);
|
||||||
|
|
||||||
$resource = new Item($category, $transformer, 'categories');
|
$resource = new Item($category, $transformer, 'categories');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DestroyController.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Exceptions\ValidationException;
|
||||||
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
|
|
||||||
|
class DestroyController extends Controller
|
||||||
|
{
|
||||||
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(ExchangeRateRepositoryInterface::class);
|
||||||
|
$this->repository->setUserGroup($this->validateUserGroup($request));
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
||||||
|
{
|
||||||
|
$date = $request->getDate();
|
||||||
|
if (!$date instanceof Carbon) {
|
||||||
|
throw new ValidationException('Date is required');
|
||||||
|
}
|
||||||
|
$rate = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if (!$rate instanceof CurrencyExchangeRate) {
|
||||||
|
throw new NotFoundHttpException();
|
||||||
|
}
|
||||||
|
$this->repository->deleteRate($rate);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroySingle(CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
|
{
|
||||||
|
$this->repository->deleteRate($exchangeRate);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* IndexController.php
|
||||||
* Copyright (c) 2023 james@firefly-iii.org
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -17,17 +17,18 @@
|
|||||||
* GNU Affero General Public License for more details.
|
* GNU Affero General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\PiggyBank;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Repositories\UserGroups\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Transformers\V2\PiggyBankTransformer;
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
|
||||||
@@ -38,14 +39,16 @@ class IndexController extends Controller
|
|||||||
{
|
{
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
private PiggyBankRepositoryInterface $repository;
|
public const string RESOURCE_KEY = 'currency_exchange_rates';
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(PiggyBankRepositoryInterface::class);
|
$this->repository = app(ExchangeRateRepositoryInterface::class);
|
||||||
$this->repository->setUserGroup($this->validateUserGroup($request));
|
$this->repository->setUserGroup($this->validateUserGroup($request));
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
@@ -53,21 +56,18 @@ class IndexController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO see autocomplete/accountcontroller for list.
|
|
||||||
*/
|
|
||||||
public function index(): JsonResponse
|
public function index(): JsonResponse
|
||||||
{
|
{
|
||||||
$piggies = $this->repository->getPiggyBanks();
|
$entries = $this->repository->getAll();
|
||||||
$pageSize = $this->parameters->get('limit');
|
$pageSize = $this->parameters->get('limit');
|
||||||
$count = $piggies->count();
|
$count = $entries->count();
|
||||||
$piggies = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$entries = $entries->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
$paginator = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($entries, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$transformer = new PiggyBankTransformer();
|
$transformer = new ExchangeRateTransformer();
|
||||||
$transformer->setParameters($this->parameters); // give params to transformer
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
return response()
|
return response()
|
||||||
->json($this->jsonApiList('piggy-banks', $paginator, $transformer))
|
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
|
||||||
->header('Content-Type', self::CONTENT_TYPE)
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
;
|
;
|
||||||
}
|
}
|
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ShowController.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ShowController
|
||||||
|
*/
|
||||||
|
class ShowController extends Controller
|
||||||
|
{
|
||||||
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(ExchangeRateRepositoryInterface::class);
|
||||||
|
$this->repository->setUserGroup($this->validateUserGroup($request));
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function show(TransactionCurrency $from, TransactionCurrency $to): JsonResponse
|
||||||
|
{
|
||||||
|
$pageSize = $this->parameters->get('limit');
|
||||||
|
$page = $this->parameters->get('page');
|
||||||
|
$rates = $this->repository->getRates($from, $to);
|
||||||
|
$count = $rates->count();
|
||||||
|
$rates = $rates->slice(($page - 1) * $pageSize, $pageSize);
|
||||||
|
$paginator = new LengthAwarePaginator($rates, $count, $pageSize, $page);
|
||||||
|
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters); // give params to transformer
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showSingle(CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
|
{
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StoreController.php
|
||||||
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest;
|
||||||
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
class StoreController extends Controller
|
||||||
|
{
|
||||||
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
$this->repository = app(ExchangeRateRepositoryInterface::class);
|
||||||
|
$this->repository->setUserGroup($this->validateUserGroup($request));
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(StoreRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$date = $request->getDate();
|
||||||
|
$rate = $request->getRate();
|
||||||
|
$from = $request->getFromCurrency();
|
||||||
|
$to = $request->getToCurrency();
|
||||||
|
|
||||||
|
// already has rate?
|
||||||
|
$object = $this->repository->getSpecificRateOnDate($from, $to, $date);
|
||||||
|
if ($object instanceof CurrencyExchangeRate) {
|
||||||
|
// just update it, no matter.
|
||||||
|
$rate = $this->repository->updateExchangeRate($object, $rate, $date);
|
||||||
|
}
|
||||||
|
if (!$object instanceof CurrencyExchangeRate) {
|
||||||
|
// store new
|
||||||
|
$rate = $this->repository->storeExchangeRate($from, $to, $rate, $date);
|
||||||
|
}
|
||||||
|
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
return response()
|
||||||
|
->api($this->jsonApiObject(self::RESOURCE_KEY, $rate, $transformer))
|
||||||
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2023 james@firefly-iii.org
|
* Copyright (c) 2025 james@firefly-iii.org.
|
||||||
*
|
*
|
||||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||||
*
|
*
|
||||||
@@ -17,35 +17,36 @@
|
|||||||
* GNU Affero General Public License for more details.
|
* GNU Affero General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace FireflyIII\Api\V2\Controllers\Model\Bill;
|
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
|
||||||
|
|
||||||
use FireflyIII\Api\V2\Controllers\Controller;
|
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest;
|
||||||
use FireflyIII\Models\Bill;
|
use FireflyIII\Api\V1\Controllers\Controller;
|
||||||
use FireflyIII\Repositories\UserGroups\Bill\BillRepositoryInterface;
|
use FireflyIII\Enums\UserRoleEnum;
|
||||||
|
use FireflyIII\Models\CurrencyExchangeRate;
|
||||||
|
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
|
||||||
use FireflyIII\Transformers\V2\BillTransformer;
|
use FireflyIII\Transformers\ExchangeRateTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
/**
|
class UpdateController extends Controller
|
||||||
* Class ShowController
|
|
||||||
*/
|
|
||||||
class ShowController extends Controller
|
|
||||||
{
|
{
|
||||||
use ValidatesUserGroupTrait;
|
use ValidatesUserGroupTrait;
|
||||||
|
|
||||||
private BillRepositoryInterface $repository;
|
public const string RESOURCE_KEY = 'exchange-rates';
|
||||||
|
protected array $acceptedRoles = [UserRoleEnum::OWNER];
|
||||||
|
private ExchangeRateRepositoryInterface $repository;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->middleware(
|
$this->middleware(
|
||||||
function ($request, $next) {
|
function ($request, $next) {
|
||||||
$this->repository = app(BillRepositoryInterface::class);
|
$this->repository = app(ExchangeRateRepositoryInterface::class);
|
||||||
$this->repository->setUserGroup($this->validateUserGroup($request));
|
$this->repository->setUserGroup($this->validateUserGroup($request));
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
@@ -53,16 +54,16 @@ class ShowController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function update(UpdateRequest $request, CurrencyExchangeRate $exchangeRate): JsonResponse
|
||||||
* TODO this endpoint is not documented
|
|
||||||
*/
|
|
||||||
public function show(Bill $bill): JsonResponse
|
|
||||||
{
|
{
|
||||||
$transformer = new BillTransformer();
|
$date = $request->getDate();
|
||||||
|
$rate = $request->getRate();
|
||||||
|
$exchangeRate = $this->repository->updateExchangeRate($exchangeRate, $rate, $date);
|
||||||
|
$transformer = new ExchangeRateTransformer();
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
return response()
|
return response()
|
||||||
->api($this->jsonApiObject('subscriptions', $bill, $transformer))
|
->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer))
|
||||||
->header('Content-Type', self::CONTENT_TYPE)
|
->header('Content-Type', self::CONTENT_TYPE)
|
||||||
;
|
;
|
||||||
}
|
}
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,6 +28,8 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\ObjectGroup;
|
use FireflyIII\Models\ObjectGroup;
|
||||||
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
|
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\SubscriptionEnrichment;
|
||||||
use FireflyIII\Transformers\BillTransformer;
|
use FireflyIII\Transformers\BillTransformer;
|
||||||
use FireflyIII\Transformers\PiggyBankTransformer;
|
use FireflyIII\Transformers\PiggyBankTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
@@ -78,6 +81,15 @@ class ListController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new SubscriptionEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$enrichment->setStart($this->parameters->get('start'));
|
||||||
|
$enrichment->setEnd($this->parameters->get('end'));
|
||||||
|
$bills = $enrichment->enrich($bills);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]).$this->buildParams());
|
||||||
@@ -113,6 +125,13 @@ class ListController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$piggyBanks = $enrichment->enrich($piggyBanks);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]).$this->buildParams());
|
||||||
@@ -121,7 +140,7 @@ class ListController extends Controller
|
|||||||
$transformer = app(PiggyBankTransformer::class);
|
$transformer = app(PiggyBankTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
|
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,8 +28,12 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEventEnrichment;
|
||||||
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
use FireflyIII\Transformers\AttachmentTransformer;
|
use FireflyIII\Transformers\AttachmentTransformer;
|
||||||
use FireflyIII\Transformers\PiggyBankEventTransformer;
|
use FireflyIII\Transformers\PiggyBankEventTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
@@ -57,6 +62,46 @@ class ListController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This endpoint is documented at:
|
||||||
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAccountByPiggyBank
|
||||||
|
*
|
||||||
|
* List single resource.
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function accounts(PiggyBank $piggyBank): JsonResponse
|
||||||
|
{
|
||||||
|
// types to get, page size:
|
||||||
|
$pageSize = $this->parameters->get('limit');
|
||||||
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
$collection = $piggyBank->accounts;
|
||||||
|
$count = $collection->count();
|
||||||
|
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new AccountEnrichment();
|
||||||
|
$enrichment->setDate($this->parameters->get('date'));
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$accounts = $enrichment->enrich($accounts);
|
||||||
|
|
||||||
|
// make paginator:
|
||||||
|
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
$paginator->setPath(route('api.v1.piggy-banks.accounts', [$piggyBank->id]).$this->buildParams());
|
||||||
|
|
||||||
|
/** @var AccountTransformer $transformer */
|
||||||
|
$transformer = app(AccountTransformer::class);
|
||||||
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
|
$resource = new FractalCollection($accounts, $transformer, 'accounts');
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This endpoint is documented at:
|
* This endpoint is documented at:
|
||||||
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAttachmentByPiggyBank
|
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAttachmentByPiggyBank
|
||||||
@@ -104,6 +149,13 @@ class ListController extends Controller
|
|||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEventEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$events = $enrichment->enrich($events);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]).$this->buildParams());
|
$paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]).$this->buildParams());
|
||||||
@@ -112,7 +164,7 @@ class ListController extends Controller
|
|||||||
$transformer = app(PiggyBankEventTransformer::class);
|
$transformer = app(PiggyBankEventTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new FractalCollection($events, $transformer, 'piggy_bank_events');
|
$resource = new FractalCollection($events, $transformer, sprintf('piggy-banks/%d/events', $piggyBank->id));
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment;
|
||||||
use FireflyIII\Transformers\PiggyBankTransformer;
|
use FireflyIII\Transformers\PiggyBankTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
@@ -71,11 +74,18 @@ class ShowController extends Controller
|
|||||||
// types to get, page size:
|
// types to get, page size:
|
||||||
$pageSize = $this->parameters->get('limit');
|
$pageSize = $this->parameters->get('limit');
|
||||||
|
|
||||||
// get list of budgets. Count it and split it.
|
// get list of piggy banks. Count it and split it.
|
||||||
$collection = $this->repository->getPiggyBanks();
|
$collection = $this->repository->getPiggyBanks();
|
||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$piggyBanks = $enrichment->enrich($piggyBanks);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.piggy-banks.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.piggy-banks.index').$this->buildParams());
|
||||||
@@ -84,7 +94,7 @@ class ShowController extends Controller
|
|||||||
$transformer = app(PiggyBankTransformer::class);
|
$transformer = app(PiggyBankTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
|
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
@@ -100,11 +110,19 @@ class ShowController extends Controller
|
|||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$piggyBank = $enrichment->enrichSingle($piggyBank);
|
||||||
|
|
||||||
|
|
||||||
/** @var PiggyBankTransformer $transformer */
|
/** @var PiggyBankTransformer $transformer */
|
||||||
$transformer = app(PiggyBankTransformer::class);
|
$transformer = app(PiggyBankTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
|
$resource = new Item($piggyBank, $transformer, 'piggy-banks');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* StoreController.php
|
* StoreController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\PiggyBank\StoreRequest;
|
use FireflyIII\Api\V1\Requests\Models\PiggyBank\StoreRequest;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment;
|
||||||
use FireflyIII\Transformers\PiggyBankTransformer;
|
use FireflyIII\Transformers\PiggyBankTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -67,6 +70,13 @@ class StoreController extends Controller
|
|||||||
$piggyBank = $this->repository->store($request->getAll());
|
$piggyBank = $this->repository->store($request->getAll());
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$piggyBank = $enrichment->enrichSingle($piggyBank);
|
||||||
|
|
||||||
/** @var PiggyBankTransformer $transformer */
|
/** @var PiggyBankTransformer $transformer */
|
||||||
$transformer = app(PiggyBankTransformer::class);
|
$transformer = app(PiggyBankTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UpdateController.php
|
* UpdateController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Api\V1\Requests\Models\PiggyBank\UpdateRequest;
|
use FireflyIII\Api\V1\Requests\Models\PiggyBank\UpdateRequest;
|
||||||
use FireflyIII\Models\PiggyBank;
|
use FireflyIII\Models\PiggyBank;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\PiggyBankEnrichment;
|
||||||
use FireflyIII\Transformers\PiggyBankTransformer;
|
use FireflyIII\Transformers\PiggyBankTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use League\Fractal\Resource\Item;
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
@@ -69,13 +72,20 @@ class UpdateController extends Controller
|
|||||||
$this->repository->setCurrentAmount($piggyBank, $data['current_amount']);
|
$this->repository->setCurrentAmount($piggyBank, $data['current_amount']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new PiggyBankEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$piggyBank = $enrichment->enrichSingle($piggyBank);
|
||||||
|
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
/** @var PiggyBankTransformer $transformer */
|
/** @var PiggyBankTransformer $transformer */
|
||||||
$transformer = app(PiggyBankTransformer::class);
|
$transformer = app(PiggyBankTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
|
$resource = new Item($piggyBank, $transformer, 'piggy-banks');
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DestroyController.php
|
* DestroyController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ListController.php
|
* ListController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -29,6 +30,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
|||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\TransactionGroupEnrichment;
|
||||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
@@ -109,7 +111,11 @@ class ListController extends Controller
|
|||||||
|
|
||||||
$paginator = $collector->getPaginatedGroups();
|
$paginator = $collector->getPaginatedGroups();
|
||||||
$paginator->setPath(route('api.v1.transactions.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.transactions.index').$this->buildParams());
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
// enrich
|
||||||
|
$enrichment = new TransactionGroupEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$transactions = $enrichment->enrich($paginator->getCollection());
|
||||||
|
|
||||||
/** @var TransactionGroupTransformer $transformer */
|
/** @var TransactionGroupTransformer $transformer */
|
||||||
$transformer = app(TransactionGroupTransformer::class);
|
$transformer = app(TransactionGroupTransformer::class);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ShowController.php
|
* ShowController.php
|
||||||
* Copyright (c) 2021 james@firefly-iii.org
|
* Copyright (c) 2021 james@firefly-iii.org
|
||||||
@@ -27,7 +28,9 @@ use FireflyIII\Api\V1\Controllers\Controller;
|
|||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
|
use FireflyIII\Support\JsonApi\Enrichments\RecurringEnrichment;
|
||||||
use FireflyIII\Transformers\RecurrenceTransformer;
|
use FireflyIII\Transformers\RecurrenceTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
@@ -75,17 +78,24 @@ class ShowController extends Controller
|
|||||||
// get list of budgets. Count it and split it.
|
// get list of budgets. Count it and split it.
|
||||||
$collection = $this->repository->get();
|
$collection = $this->repository->get();
|
||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$recurrences = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new RecurringEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$recurrences = $enrichment->enrich($recurrences);
|
||||||
|
|
||||||
// make paginator:
|
// make paginator:
|
||||||
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
|
$paginator = new LengthAwarePaginator($recurrences, $count, $pageSize, $this->parameters->get('page'));
|
||||||
$paginator->setPath(route('api.v1.recurrences.index').$this->buildParams());
|
$paginator->setPath(route('api.v1.recurrences.index').$this->buildParams());
|
||||||
|
|
||||||
/** @var RecurrenceTransformer $transformer */
|
/** @var RecurrenceTransformer $transformer */
|
||||||
$transformer = app(RecurrenceTransformer::class);
|
$transformer = app(RecurrenceTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
|
||||||
$resource = new FractalCollection($piggyBanks, $transformer, 'recurrences');
|
$resource = new FractalCollection($recurrences, $transformer, 'recurrences');
|
||||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
|
||||||
@@ -101,6 +111,13 @@ class ShowController extends Controller
|
|||||||
{
|
{
|
||||||
$manager = $this->getManager();
|
$manager = $this->getManager();
|
||||||
|
|
||||||
|
// enrich
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
$enrichment = new RecurringEnrichment();
|
||||||
|
$enrichment->setUser($admin);
|
||||||
|
$recurrence = $enrichment->enrichSingle($recurrence);
|
||||||
|
|
||||||
/** @var RecurrenceTransformer $transformer */
|
/** @var RecurrenceTransformer $transformer */
|
||||||
$transformer = app(RecurrenceTransformer::class);
|
$transformer = app(RecurrenceTransformer::class);
|
||||||
$transformer->setParameters($this->parameters);
|
$transformer->setParameters($this->parameters);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user