mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-12-20 10:11:21 +00:00
Compare commits
526 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37b02e3d5b | ||
|
|
093bdd6090 | ||
|
|
52656b25da | ||
|
|
1386c9d915 | ||
|
|
02c9441727 | ||
|
|
b1e926f2cb | ||
|
|
df9dcb395b | ||
|
|
ad59dad921 | ||
|
|
46e75968f5 | ||
|
|
0df5c5121d | ||
|
|
16f04b45ac | ||
|
|
5ce35a50c2 | ||
|
|
7110c1178a | ||
|
|
220f5e2913 | ||
|
|
9f8c75efc6 | ||
|
|
8f3e84df4d | ||
|
|
08ff3d8ad0 | ||
|
|
5c4d7734ac | ||
|
|
15f8cd49d3 | ||
|
|
62b3986fcd | ||
|
|
55b6d711f3 | ||
|
|
7e51d57d21 | ||
|
|
170d23d768 | ||
|
|
40266c6821 | ||
|
|
0a71077513 | ||
|
|
be5c44af61 | ||
|
|
720dcb0fe5 | ||
|
|
c86b207b1c | ||
|
|
413c1bc2fe | ||
|
|
5ca31ea3dd | ||
|
|
dd5d2d1616 | ||
|
|
5f08790f12 | ||
|
|
d5ef5ee5a7 | ||
|
|
f641c70172 | ||
|
|
992657b942 | ||
|
|
41e468b507 | ||
|
|
6660306ac4 | ||
|
|
dd9694890a | ||
|
|
0b8654d865 | ||
|
|
f07dc7bd81 | ||
|
|
6a6482dc7f | ||
|
|
3c9b7c07af | ||
|
|
796ab4bf2c | ||
|
|
55602d632d | ||
|
|
310ed9f504 | ||
|
|
dafddfa39a | ||
|
|
3e22c9860e | ||
|
|
fb0a0c3fb5 | ||
|
|
3b735c7533 | ||
|
|
1645490f5c | ||
|
|
aecffe10d9 | ||
|
|
4e69bc0e32 | ||
|
|
909f72e6be | ||
|
|
6a1d39d5f8 | ||
|
|
c5d4ec17c3 | ||
|
|
ed33a72945 | ||
|
|
d8c0091680 | ||
|
|
6419d68626 | ||
|
|
e2ecaf5bcf | ||
|
|
31146954d1 | ||
|
|
601ca9ec80 | ||
|
|
082b5ba895 | ||
|
|
e06361d5d7 | ||
|
|
552a8e130c | ||
|
|
40787bc29a | ||
|
|
6ab03bb228 | ||
|
|
3fdb782321 | ||
|
|
c8f52a1c40 | ||
|
|
eb63090387 | ||
|
|
5bc8f31c31 | ||
|
|
5776de7745 | ||
|
|
f45d0bb317 | ||
|
|
93aa5b7753 | ||
|
|
dd6a6a565f | ||
|
|
aba8025645 | ||
|
|
b12872e5de | ||
|
|
5a7b1ba292 | ||
|
|
24715c72a2 | ||
|
|
ed3a4e4663 | ||
|
|
e97283b34b | ||
|
|
c2dfbcba10 | ||
|
|
a9870b35be | ||
|
|
ed5cd2b9ca | ||
|
|
a9356ca1e2 | ||
|
|
cfba11e9ca | ||
|
|
4304a3c916 | ||
|
|
9e6194bfdc | ||
|
|
7d6c8aa9dc | ||
|
|
aad0864018 | ||
|
|
a55d18709c | ||
|
|
dd2f3c861b | ||
|
|
da1dc67e1c | ||
|
|
0c2b35e542 | ||
|
|
85dc1263ea | ||
|
|
c8ecb3e0ee | ||
|
|
ce10036a27 | ||
|
|
30e49846e0 | ||
|
|
be97dd1c57 | ||
|
|
648a6dca42 | ||
|
|
0566d0d198 | ||
|
|
dfc25722c9 | ||
|
|
a436c55c50 | ||
|
|
0d58530f55 | ||
|
|
04b2eaf535 | ||
|
|
ace2ed8bd0 | ||
|
|
dff2d716a1 | ||
|
|
ad18b9b81b | ||
|
|
eabfe0769b | ||
|
|
19f7027718 | ||
|
|
f537945351 | ||
|
|
d02372ab90 | ||
|
|
1b020c522f | ||
|
|
79d0450c77 | ||
|
|
bc32bc8831 | ||
|
|
f68a307eeb | ||
|
|
82e7479cfe | ||
|
|
462fe5d89f | ||
|
|
b0d8ac83ae | ||
|
|
d8ac817c91 | ||
|
|
5105bc6f64 | ||
|
|
47c9f1e9b8 | ||
|
|
49d0ed0c1b | ||
|
|
99f5151aab | ||
|
|
0a056ad02d | ||
|
|
c76b634d0b | ||
|
|
a81698d50f | ||
|
|
bae79063e1 | ||
|
|
fb5323c283 | ||
|
|
e2d1de94b7 | ||
|
|
7109fd8196 | ||
|
|
a5fd821e0c | ||
|
|
6c63583e49 | ||
|
|
dd16e1b784 | ||
|
|
d52d8d7970 | ||
|
|
f349aa47ce | ||
|
|
ef4018934c | ||
|
|
951aa9535e | ||
|
|
de1fe36226 | ||
|
|
64fd36d437 | ||
|
|
6f9ecc0ffa | ||
|
|
a97bfc92e1 | ||
|
|
0d72fcdf02 | ||
|
|
0e84ca1df5 | ||
|
|
b28bdda510 | ||
|
|
72314e2d9f | ||
|
|
d22fb9f438 | ||
|
|
04b8552d27 | ||
|
|
5d6f44cd91 | ||
|
|
afc8ad7ff5 | ||
|
|
ae039bf1c7 | ||
|
|
8fa25e9d37 | ||
|
|
0daab491ec | ||
|
|
4f825bac1a | ||
|
|
39c8b79ebb | ||
|
|
7d66c90beb | ||
|
|
1b8b65582a | ||
|
|
d25971cb44 | ||
|
|
89a56e661d | ||
|
|
3482746d7c | ||
|
|
d5aeca6222 | ||
|
|
03f46638e1 | ||
|
|
c2b000d910 | ||
|
|
88eb702d7b | ||
|
|
b1d98f026f | ||
|
|
28dfe7b02c | ||
|
|
84f0ee183c | ||
|
|
7eedd6c2fc | ||
|
|
e7b80c6d10 | ||
|
|
d165609476 | ||
|
|
2f17521c06 | ||
|
|
8b52006959 | ||
|
|
8eb3d43123 | ||
|
|
a511368229 | ||
|
|
f0006a0743 | ||
|
|
7171e69715 | ||
|
|
2ab44fb33a | ||
|
|
7542175258 | ||
|
|
9dc4c50527 | ||
|
|
99d116f4ce | ||
|
|
9475fef8f6 | ||
|
|
60339a0f6a | ||
|
|
36113f84be | ||
|
|
139c2284b8 | ||
|
|
91909a70d7 | ||
|
|
a23d97563f | ||
|
|
bf538e2514 | ||
|
|
149b62f486 | ||
|
|
06dc8a499b | ||
|
|
5b8479f3a4 | ||
|
|
e803a5e26e | ||
|
|
959f798a7f | ||
|
|
5b8adbfd0c | ||
|
|
54ba18975a | ||
|
|
fdd2dedfc6 | ||
|
|
46f4fa1a7d | ||
|
|
28debb46be | ||
|
|
5f132be94d | ||
|
|
9f9feea159 | ||
|
|
3bd9e0bcd4 | ||
|
|
c80a76f8c0 | ||
|
|
c71f498587 | ||
|
|
e658d447ca | ||
|
|
33def5b45d | ||
|
|
9fc26a8ee0 | ||
|
|
1b304bf85e | ||
|
|
99983a5c8f | ||
|
|
d01b370cd7 | ||
|
|
1a643e2042 | ||
|
|
1aaf5fd288 | ||
|
|
8a758b8df0 | ||
|
|
211caa07dc | ||
|
|
ac66e89edb | ||
|
|
6fe5b50410 | ||
|
|
166cdad58b | ||
|
|
1a721ac6b5 | ||
|
|
6591fa9fb4 | ||
|
|
d804093f8b | ||
|
|
5261b784b0 | ||
|
|
5a188ceca3 | ||
|
|
ce56cc538d | ||
|
|
269433bf00 | ||
|
|
dae3371c69 | ||
|
|
38c1d332e2 | ||
|
|
b627d42160 | ||
|
|
4e923057ae | ||
|
|
35d0bd1985 | ||
|
|
085eb650e7 | ||
|
|
b4157e8ce0 | ||
|
|
81221038f0 | ||
|
|
9f37bf5875 | ||
|
|
140a5b20db | ||
|
|
e9b6b45fc4 | ||
|
|
f16760d607 | ||
|
|
9d457787f7 | ||
|
|
4e6afd5afc | ||
|
|
36354c3846 | ||
|
|
9f63dfb9cb | ||
|
|
cae4faad0a | ||
|
|
e389d0f7fa | ||
|
|
6b32213735 | ||
|
|
b3fe24b713 | ||
|
|
5bb7530642 | ||
|
|
0b61c16eb0 | ||
|
|
77aced6734 | ||
|
|
94a7b6b9bd | ||
|
|
f8bf6c163f | ||
|
|
eb0da038fb | ||
|
|
6cda9f2900 | ||
|
|
ecd4a862ff | ||
|
|
632d50a0d0 | ||
|
|
0f1cc46b71 | ||
|
|
60b225d61c | ||
|
|
23e540a57a | ||
|
|
1998412a3c | ||
|
|
7bbfb692de | ||
|
|
c6da990748 | ||
|
|
049e57d578 | ||
|
|
78ba0f749c | ||
|
|
9cc1bfb4b5 | ||
|
|
278b7ac52b | ||
|
|
645a29e22b | ||
|
|
b22d30bc65 | ||
|
|
2ee0490141 | ||
|
|
1fd783de69 | ||
|
|
8073896965 | ||
|
|
8a26e43c40 | ||
|
|
a302aba3ab | ||
|
|
0458058cb1 | ||
|
|
999bb5ed49 | ||
|
|
c9f4a1eb7b | ||
|
|
45aa76afce | ||
|
|
e89a77efb1 | ||
|
|
8f930d6dd5 | ||
|
|
9d62b4c70d | ||
|
|
834032f58e | ||
|
|
33db99ffd3 | ||
|
|
28b00f6507 | ||
|
|
6559076c48 | ||
|
|
60f6311e00 | ||
|
|
574a5630e0 | ||
|
|
d3294be1bc | ||
|
|
22fdc81de2 | ||
|
|
370e9b25d1 | ||
|
|
30f821af3e | ||
|
|
7a5aa1c39b | ||
|
|
f674df4422 | ||
|
|
c2da5931ec | ||
|
|
94f6bd34c7 | ||
|
|
e066a6421c | ||
|
|
ef338e2515 | ||
|
|
dcf549261c | ||
|
|
8b868b426a | ||
|
|
2ef1022c92 | ||
|
|
9b3abd3b19 | ||
|
|
db02fefcf4 | ||
|
|
523ae83811 | ||
|
|
4eb010f807 | ||
|
|
4958f28052 | ||
|
|
7e727b63ed | ||
|
|
138c38fbb5 | ||
|
|
2e61bb7375 | ||
|
|
fce4c9174d | ||
|
|
2220963899 | ||
|
|
e69e6c1ce8 | ||
|
|
0f09a9db4d | ||
|
|
53a6c10ada | ||
|
|
14772469ed | ||
|
|
55f13ef121 | ||
|
|
95648c37b3 | ||
|
|
ac98822a55 | ||
|
|
c460419166 | ||
|
|
d2a8819dd4 | ||
|
|
d393c693de | ||
|
|
d4a84ed198 | ||
|
|
e8c7986a58 | ||
|
|
809e40c5ce | ||
|
|
f445a95c26 | ||
|
|
909dc212fb | ||
|
|
eacc1da157 | ||
|
|
587ad1298d | ||
|
|
fae7dabbc2 | ||
|
|
3a813c30b4 | ||
|
|
3de46f55fa | ||
|
|
3aa922341c | ||
|
|
e94043edc2 | ||
|
|
da91645ec0 | ||
|
|
178072d3af | ||
|
|
811d8e330f | ||
|
|
d3c8d06114 | ||
|
|
82dc0045ba | ||
|
|
3d06f0ac14 | ||
|
|
b5c0ef01d9 | ||
|
|
3a5d3016c7 | ||
|
|
20690b4d5b | ||
|
|
2816a4a325 | ||
|
|
2f4f37778c | ||
|
|
c4507a7f75 | ||
|
|
9a0672e359 | ||
|
|
f128db35c6 | ||
|
|
a2cfaa0867 | ||
|
|
5850c5e20a | ||
|
|
e77a1e403f | ||
|
|
b72e8db7b1 | ||
|
|
07506784f4 | ||
|
|
0435e42b3d | ||
|
|
31884bbba6 | ||
|
|
6b38faf84e | ||
|
|
2f95f99890 | ||
|
|
9b78069f41 | ||
|
|
559c2042ac | ||
|
|
ae3b369e9a | ||
|
|
31a6565e17 | ||
|
|
f488bbde02 | ||
|
|
e668b88fb5 | ||
|
|
2d0aa4af96 | ||
|
|
6e67416c83 | ||
|
|
1ef28cbc02 | ||
|
|
58bdf14f6b | ||
|
|
9f4ecb0963 | ||
|
|
b1259a014f | ||
|
|
142d0b5af2 | ||
|
|
450e2bad1c | ||
|
|
089300d57e | ||
|
|
36f67793cb | ||
|
|
c335a9bbc8 | ||
|
|
029688a594 | ||
|
|
6f2eb33fd0 | ||
|
|
8351020913 | ||
|
|
220efca8d7 | ||
|
|
28579f7b80 | ||
|
|
f1d77bdb50 | ||
|
|
ca8b4cb11a | ||
|
|
31dbb7b111 | ||
|
|
352cdf75c8 | ||
|
|
d81c99bcda | ||
|
|
1e2c979341 | ||
|
|
d8664096f9 | ||
|
|
0d9a221b00 | ||
|
|
de85f17cac | ||
|
|
e3d6f4f00f | ||
|
|
d0e0054b00 | ||
|
|
735222a8ed | ||
|
|
66f299cd06 | ||
|
|
e3c5268143 | ||
|
|
df32493d77 | ||
|
|
86faf44153 | ||
|
|
e2f3e4b555 | ||
|
|
e57ed6015c | ||
|
|
9c34ca7fc4 | ||
|
|
7b94f4a441 | ||
|
|
693f8d0738 | ||
|
|
d6ecbc06bf | ||
|
|
c31674fffc | ||
|
|
b08de8cc00 | ||
|
|
4c503e4c7c | ||
|
|
dd4158c6b4 | ||
|
|
5fd7ea2b96 | ||
|
|
b9ff80eb5a | ||
|
|
afc725bbc8 | ||
|
|
0342c371cc | ||
|
|
2da4e6b048 | ||
|
|
f50550d79c | ||
|
|
3fa39a6805 | ||
|
|
3dbe6d4870 | ||
|
|
59c48268ab | ||
|
|
1f83c5195d | ||
|
|
49a95a08fe | ||
|
|
c86c5ccfe9 | ||
|
|
8a2497fc67 | ||
|
|
7c70732247 | ||
|
|
53fc4f2740 | ||
|
|
f3ade5621e | ||
|
|
ec2e08e33a | ||
|
|
b9a26faa4d | ||
|
|
1a434d0c83 | ||
|
|
9a2c6c2967 | ||
|
|
602b35d589 | ||
|
|
f42cd0c7c3 | ||
|
|
cb81855a17 | ||
|
|
89cf351ad0 | ||
|
|
3f70a3f06c | ||
|
|
9df360f010 | ||
|
|
9a26d6d49f | ||
|
|
bc4d801c12 | ||
|
|
f2d8e13576 | ||
|
|
ec0b5db973 | ||
|
|
46a0d1ce35 | ||
|
|
cb81446ca6 | ||
|
|
9350b4939c | ||
|
|
33e8c8c415 | ||
|
|
48fa86cc54 | ||
|
|
d5e6d1c578 | ||
|
|
0bc688795a | ||
|
|
eb76ed5591 | ||
|
|
839cbaf37a | ||
|
|
788fc9204d | ||
|
|
3e3e304ef3 | ||
|
|
447d453fdc | ||
|
|
36fd7884f3 | ||
|
|
54da08b2f2 | ||
|
|
3f02072ae9 | ||
|
|
a9c117703b | ||
|
|
c137255155 | ||
|
|
e7829ecc38 | ||
|
|
529bdafa31 | ||
|
|
e2af0caa41 | ||
|
|
80f96abf08 | ||
|
|
70da38193f | ||
|
|
13df973873 | ||
|
|
3ccb791674 | ||
|
|
ccf1a6c182 | ||
|
|
493543c1f5 | ||
|
|
5f5725e0e3 | ||
|
|
107dd42957 | ||
|
|
a9f3fe4d3a | ||
|
|
3e62e17b9e | ||
|
|
57855b1930 | ||
|
|
aa9e8227bb | ||
|
|
a80f083b6e | ||
|
|
474e066d4a | ||
|
|
4428ccefbf | ||
|
|
d568a6c8a9 | ||
|
|
97e9ad6cb2 | ||
|
|
00607d2a6d | ||
|
|
c2a425121d | ||
|
|
435694e9ea | ||
|
|
f59135a9ca | ||
|
|
102b106402 | ||
|
|
5c27c8e633 | ||
|
|
edd5215b21 | ||
|
|
94b173ae6b | ||
|
|
7d96b281b6 | ||
|
|
a5515ac89f | ||
|
|
fb863b0bf2 | ||
|
|
50882f309b | ||
|
|
ce854fbb43 | ||
|
|
6799268ec4 | ||
|
|
6fe5ce0485 | ||
|
|
cbeaf8e16a | ||
|
|
04de4c9b36 | ||
|
|
517731cb59 | ||
|
|
e34e43173c | ||
|
|
79d6055a78 | ||
|
|
7ac4d2a2f4 | ||
|
|
4984eda320 | ||
|
|
89e0791e2f | ||
|
|
922d487821 | ||
|
|
4b789979ac | ||
|
|
554b38ccff | ||
|
|
9614310208 | ||
|
|
d9ec3ac354 | ||
|
|
f326f08f7b | ||
|
|
0ae8418f32 | ||
|
|
309f9cd076 | ||
|
|
61f5ed3874 | ||
|
|
91178d2604 | ||
|
|
87dae6ea18 | ||
|
|
2e495c38d1 | ||
|
|
c2987aaf4c | ||
|
|
f4f4eecb7b | ||
|
|
84d9287251 | ||
|
|
b71f334744 | ||
|
|
ad306e4d01 | ||
|
|
e40d4ef829 | ||
|
|
48c16c3dcc | ||
|
|
c045193246 | ||
|
|
a816e59a97 | ||
|
|
892074eaf2 | ||
|
|
3e501e429d | ||
|
|
0f40accb4c | ||
|
|
3dae6c99a4 | ||
|
|
b185c83597 | ||
|
|
ef6b4120f1 | ||
|
|
a43eef01fc | ||
|
|
2cb9aa537f | ||
|
|
2edd49a8b4 | ||
|
|
a57554d380 | ||
|
|
c89486b6d9 | ||
|
|
f737cb7235 | ||
|
|
f1fe169553 | ||
|
|
2fc760780e | ||
|
|
8c3290bf6f | ||
|
|
495158b9c9 | ||
|
|
f9fc9b1889 | ||
|
|
11ff2ab9d1 | ||
|
|
52b138e6b2 |
12
.codeclimate.yml
Normal file
12
.codeclimate.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
exclude_patterns:
|
||||||
|
- public/lib/
|
||||||
|
- public/js/lib/
|
||||||
|
- public/fonts/
|
||||||
|
- public/css/jquery-ui/
|
||||||
|
- public/css/bootstrap-multiselect.css
|
||||||
|
- public/css/bootstrap-sortable.css
|
||||||
|
- public/css/bootstrap-tagsinput.css
|
||||||
|
- public/css/daterangepicker.css
|
||||||
|
- public/css/google-fonts.css
|
||||||
|
- .sandstorm/
|
||||||
82
.deploy/kubernetes/firefly.yaml
Normal file
82
.deploy/kubernetes/firefly.yaml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: mysql-pv-export-claim
|
||||||
|
labels:
|
||||||
|
app: firefly-local
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 20Gi
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: mysql-pv-upload-claim
|
||||||
|
labels:
|
||||||
|
app: firefly-local
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 20Gi
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: firefly-local
|
||||||
|
namespace: firefly
|
||||||
|
labels:
|
||||||
|
app: firefly-local
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: firefly-local
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: firefly-local
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: firefly-local
|
||||||
|
name: firefly-local
|
||||||
|
env:
|
||||||
|
- name: FF_APP_ENV
|
||||||
|
value: "local"
|
||||||
|
- name: FF_APP_KEY
|
||||||
|
value: "S0m3R@nd0mString0f32Ch@rsEx@ct1y"
|
||||||
|
- name: FF_DB_HOST
|
||||||
|
value: "172.17.0.9"
|
||||||
|
- name: FF_DB_NAME
|
||||||
|
value: "firefly_db"
|
||||||
|
- name: FF_DB_USER
|
||||||
|
value: "firefly_db"
|
||||||
|
- name: FF_DB_PASSWORD
|
||||||
|
value: "password"
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: "/var/www/firefly-iii/storage/export"
|
||||||
|
name: mysql-persistent-export
|
||||||
|
- mountPath: "/var/www/firefly-iii/storage/upload"
|
||||||
|
name: mysql-persistent-upload
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
volumes:
|
||||||
|
- name: mysql-persistent-export
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: mysql-pv-export-claim
|
||||||
|
- name: mysql-persistent-upload
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: mysql-pv-upload-claim
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: firefly-local
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
type: NodePort
|
||||||
|
selector:
|
||||||
|
app: firefly-local
|
||||||
49
.deploy/kubernetes/sql.yaml
Normal file
49
.deploy/kubernetes/sql.yaml
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: sql-pass
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
password: cGFzc3dvcmQ=
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mysql
|
||||||
|
namespace: firefly
|
||||||
|
labels:
|
||||||
|
app: mysql
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: mysql
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mysql
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: mysql
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
name: mysql
|
||||||
|
env:
|
||||||
|
- name: MYSQL_ROOT_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: sql-pass
|
||||||
|
key: password
|
||||||
|
ports:
|
||||||
|
- containerPort: 3306
|
||||||
|
name: mysql
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: mysql
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 3306
|
||||||
|
type: NodePort
|
||||||
|
selector:
|
||||||
|
app: mysql
|
||||||
|
|
||||||
102
.env.docker
102
.env.docker
@@ -1,60 +1,98 @@
|
|||||||
|
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
||||||
|
# Never set it to "testing".
|
||||||
APP_ENV=${FF_APP_ENV}
|
APP_ENV=${FF_APP_ENV}
|
||||||
APP_DEBUG=false
|
|
||||||
APP_NAME=FireflyIII
|
|
||||||
APP_KEY=${FF_APP_KEY}
|
|
||||||
APP_LOG=daily
|
|
||||||
APP_LOG_LEVEL=warning
|
|
||||||
APP_URL=http://localhost
|
|
||||||
TRUSTED_PROXIES=
|
|
||||||
|
|
||||||
|
# Set to true if you want to see debug information in error screens.
|
||||||
|
APP_DEBUG=${APP_DEBUG}
|
||||||
|
|
||||||
|
# This should be your email address
|
||||||
|
SITE_OWNER=${SITE_OWNER}
|
||||||
|
|
||||||
|
# The encryption key for your database and sessions. Keep this very secure.
|
||||||
|
# If you generate a new one all existing data must be considered LOST.
|
||||||
|
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
|
||||||
|
APP_KEY=${FF_APP_KEY}
|
||||||
|
|
||||||
|
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
|
||||||
|
APP_URL=${APP_URL}
|
||||||
|
TRUSTED_PROXIES=${TRUSTED_PROXIES}
|
||||||
|
|
||||||
|
# The log channel defines where your log entries go to.
|
||||||
|
LOG_CHANNEL=${LOG_CHANNEL}
|
||||||
|
|
||||||
|
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||||
|
# If you use SQLite, set connection to `sqlite` and remove the database, username and password settings.
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
DB_HOST=${FF_DB_HOST}
|
DB_HOST=${FF_DB_HOST}
|
||||||
DB_PORT=3306
|
DB_PORT=${FF_DB_PORT}
|
||||||
DB_DATABASE=${FF_DB_NAME}
|
DB_DATABASE=${FF_DB_NAME}
|
||||||
DB_USERNAME=${FF_DB_USER}
|
DB_USERNAME=${FF_DB_USER}
|
||||||
DB_PASSWORD=${FF_DB_PASSWORD}
|
DB_PASSWORD=${FF_DB_PASSWORD}
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
||||||
|
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
||||||
|
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
|
||||||
|
APP_LOG=syslog
|
||||||
|
|
||||||
|
# Log level. You can set this from least severe to most severe:
|
||||||
|
# debug, info, notice, warning, error, critical, alert, emergency
|
||||||
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
||||||
|
# nothing will get logged, ever.
|
||||||
|
APP_LOG_LEVEL=info
|
||||||
|
|
||||||
|
# If you're looking for performance improvements, you could install memcached.
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
|
|
||||||
|
# Cookie settings. Should not be necessary to change these.
|
||||||
COOKIE_PATH="/"
|
COOKIE_PATH="/"
|
||||||
COOKIE_DOMAIN=
|
COOKIE_DOMAIN=
|
||||||
COOKIE_SECURE=false
|
COOKIE_SECURE=false
|
||||||
|
|
||||||
|
# If you want Firefly III to mail you, update these settings
|
||||||
|
MAIL_DRIVER=${MAIL_DRIVER}
|
||||||
|
MAIL_HOST=${MAIL_HOST}
|
||||||
|
MAIL_PORT=${MAIL_PORT}
|
||||||
|
MAIL_FROM=${MAIL_FROM}
|
||||||
|
MAIL_USERNAME=${MAIL_USERNAME}
|
||||||
|
MAIL_PASSWORD=${MAIL_PASSWORD}
|
||||||
|
MAIL_ENCRYPTION=${MAIL_ENCRYPTION}
|
||||||
|
|
||||||
|
# Firefly III can send you the following messages
|
||||||
|
SEND_REGISTRATION_MAIL=true
|
||||||
|
SEND_ERROR_MESSAGE=false
|
||||||
|
|
||||||
|
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
|
||||||
|
MAPBOX_API_KEY=${MAPBOX_API_KEY}
|
||||||
|
|
||||||
|
# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
|
||||||
|
# Please note that this will only work for paid fixer.io accounts because they severly limited
|
||||||
|
# the free API up to the point where you might as well offer nothing.
|
||||||
|
FIXER_API_KEY=${FIXER_API_KEY}
|
||||||
|
|
||||||
|
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
|
||||||
|
ANALYTICS_ID=${ANALYTICS_ID}
|
||||||
|
|
||||||
|
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
|
||||||
|
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
|
||||||
|
USE_ENCRYPTION=true
|
||||||
|
|
||||||
|
# Leave the following configuration vars as is.
|
||||||
|
# Unless you like to tinker and know what you're doing.
|
||||||
|
APP_NAME=FireflyIII
|
||||||
|
BROADCAST_DRIVER=log
|
||||||
|
QUEUE_DRIVER=sync
|
||||||
REDIS_HOST=127.0.0.1
|
REDIS_HOST=127.0.0.1
|
||||||
REDIS_PASSWORD=null
|
REDIS_PASSWORD=null
|
||||||
REDIS_PORT=6379
|
REDIS_PORT=6379
|
||||||
|
|
||||||
MAIL_DRIVER=smtp
|
|
||||||
MAIL_HOST=smtp.mailtrap.io
|
|
||||||
MAIL_PORT=2525
|
|
||||||
MAIL_FROM=changeme@example.com
|
|
||||||
MAIL_USERNAME=null
|
|
||||||
MAIL_PASSWORD=null
|
|
||||||
MAIL_ENCRYPTION=null
|
|
||||||
|
|
||||||
SEND_REGISTRATION_MAIL=true
|
|
||||||
SEND_ERROR_MESSAGE=true
|
|
||||||
|
|
||||||
CACHE_PREFIX=firefly
|
CACHE_PREFIX=firefly
|
||||||
|
|
||||||
SEARCH_RESULT_LIMIT=50
|
SEARCH_RESULT_LIMIT=50
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
|
||||||
|
|
||||||
MAPBOX_API_KEY=
|
|
||||||
ANALYTICS_ID=
|
|
||||||
SITE_OWNER=mail@example.com
|
|
||||||
USE_ENCRYPTION=true
|
|
||||||
|
|
||||||
PUSHER_KEY=
|
PUSHER_KEY=
|
||||||
PUSHER_SECRET=
|
PUSHER_SECRET=
|
||||||
PUSHER_ID=
|
PUSHER_ID=
|
||||||
|
|
||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
IS_DOCKER=true
|
IS_DOCKER=true
|
||||||
IS_SANDSTORM=false
|
IS_SANDSTORM=false
|
||||||
IS_HEROKU=false
|
IS_HEROKU=false
|
||||||
|
TZ=${TZ}
|
||||||
|
|||||||
75
.env.example
75
.env.example
@@ -1,12 +1,31 @@
|
|||||||
|
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
||||||
|
# Never set it to "testing".
|
||||||
APP_ENV=local
|
APP_ENV=local
|
||||||
|
|
||||||
|
# Set to true if you want to see debug information in error screens.
|
||||||
APP_DEBUG=false
|
APP_DEBUG=false
|
||||||
APP_NAME=FireflyIII
|
|
||||||
|
# This should be your email address
|
||||||
|
SITE_OWNER=mail@example.com
|
||||||
|
|
||||||
|
# The encryption key for your database and sessions. Keep this very secure.
|
||||||
|
# If you generate a new one all existing data must be considered LOST.
|
||||||
|
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
|
||||||
APP_KEY=SomeRandomStringOf32CharsExactly
|
APP_KEY=SomeRandomStringOf32CharsExactly
|
||||||
APP_LOG=daily
|
|
||||||
APP_LOG_LEVEL=notice
|
# Change this value to your preferred time zone.
|
||||||
|
# Example: Europe/Amsterdam
|
||||||
|
TZ=UTC
|
||||||
|
|
||||||
|
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
TRUSTED_PROXIES=
|
TRUSTED_PROXIES=
|
||||||
|
|
||||||
|
# The log channel defines where your log entries go to.
|
||||||
|
LOG_CHANNEL=daily
|
||||||
|
|
||||||
|
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||||
|
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
DB_HOST=127.0.0.1
|
DB_HOST=127.0.0.1
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
@@ -14,19 +33,27 @@ DB_DATABASE=homestead
|
|||||||
DB_USERNAME=homestead
|
DB_USERNAME=homestead
|
||||||
DB_PASSWORD=secret
|
DB_PASSWORD=secret
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
||||||
|
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
||||||
|
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
|
||||||
|
APP_LOG=daily
|
||||||
|
|
||||||
|
# Log level. You can set this from least severe to most severe:
|
||||||
|
# debug, info, notice, warning, error, critical, alert, emergency
|
||||||
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
||||||
|
# nothing will get logged, ever.
|
||||||
|
APP_LOG_LEVEL=notice
|
||||||
|
|
||||||
|
# If you're looking for performance improvements, you could install memcached.
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
|
|
||||||
|
# Cookie settings. Should not be necessary to change these.
|
||||||
COOKIE_PATH="/"
|
COOKIE_PATH="/"
|
||||||
COOKIE_DOMAIN=
|
COOKIE_DOMAIN=
|
||||||
COOKIE_SECURE=false
|
COOKIE_SECURE=false
|
||||||
|
|
||||||
REDIS_HOST=127.0.0.1
|
# If you want Firefly III to mail you, update these settings
|
||||||
REDIS_PASSWORD=null
|
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
MAIL_DRIVER=smtp
|
MAIL_DRIVER=smtp
|
||||||
MAIL_HOST=smtp.mailtrap.io
|
MAIL_HOST=smtp.mailtrap.io
|
||||||
MAIL_PORT=2525
|
MAIL_PORT=2525
|
||||||
@@ -35,26 +62,40 @@ MAIL_USERNAME=null
|
|||||||
MAIL_PASSWORD=null
|
MAIL_PASSWORD=null
|
||||||
MAIL_ENCRYPTION=null
|
MAIL_ENCRYPTION=null
|
||||||
|
|
||||||
|
# Firefly III can send you the following messages
|
||||||
SEND_REGISTRATION_MAIL=true
|
SEND_REGISTRATION_MAIL=true
|
||||||
SEND_ERROR_MESSAGE=true
|
SEND_ERROR_MESSAGE=true
|
||||||
|
|
||||||
CACHE_PREFIX=firefly
|
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
|
||||||
|
|
||||||
SEARCH_RESULT_LIMIT=50
|
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
|
||||||
|
|
||||||
MAPBOX_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
|
|
||||||
|
# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
|
||||||
|
# Please note that this will only work for paid fixer.io accounts because they severly limited
|
||||||
|
# the free API up to the point where you might as well offer nothing.
|
||||||
|
FIXER_API_KEY=
|
||||||
|
|
||||||
|
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
|
||||||
ANALYTICS_ID=
|
ANALYTICS_ID=
|
||||||
SITE_OWNER=mail@example.com
|
|
||||||
|
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
|
||||||
|
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
|
||||||
USE_ENCRYPTION=true
|
USE_ENCRYPTION=true
|
||||||
|
|
||||||
|
# Leave the following configuration vars as is.
|
||||||
|
# Unless you like to tinker and know what you're doing.
|
||||||
|
APP_NAME=FireflyIII
|
||||||
|
BROADCAST_DRIVER=log
|
||||||
|
QUEUE_DRIVER=sync
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PASSWORD=null
|
||||||
|
REDIS_PORT=6379
|
||||||
|
CACHE_PREFIX=firefly
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
PUSHER_KEY=
|
PUSHER_KEY=
|
||||||
PUSHER_SECRET=
|
PUSHER_SECRET=
|
||||||
PUSHER_ID=
|
PUSHER_ID=
|
||||||
|
|
||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
IS_DOCKER=false
|
IS_DOCKER=false
|
||||||
IS_SANDSTORM=false
|
IS_SANDSTORM=false
|
||||||
IS_HEROKU=false
|
IS_HEROKU=false
|
||||||
|
|||||||
83
.env.heroku
83
.env.heroku
@@ -1,12 +1,31 @@
|
|||||||
|
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
||||||
|
# Never set it to "testing".
|
||||||
APP_ENV=heroku
|
APP_ENV=heroku
|
||||||
APP_DEBUG=true
|
|
||||||
APP_NAME=FireflyIII
|
|
||||||
APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2
|
|
||||||
APP_LOG=errorlog
|
|
||||||
APP_LOG_LEVEL=debug
|
|
||||||
APP_URL=http://localhost
|
|
||||||
TRUSTED_PROXIES=*
|
|
||||||
|
|
||||||
|
# Set to true if you want to see debug information in error screens.
|
||||||
|
APP_DEBUG=false
|
||||||
|
|
||||||
|
# This should be your email address
|
||||||
|
SITE_OWNER=heroku@example.com
|
||||||
|
|
||||||
|
# The encryption key for your database and sessions. Keep this very secure.
|
||||||
|
# If you generate a new one all existing data must be considered LOST.
|
||||||
|
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
|
||||||
|
APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2
|
||||||
|
|
||||||
|
# Change this value to your preferred time zone.
|
||||||
|
# Example: Europe/Amsterdam
|
||||||
|
TZ=UTC
|
||||||
|
|
||||||
|
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
|
||||||
|
APP_URL=http://localhost
|
||||||
|
TRUSTED_PROXIES=
|
||||||
|
|
||||||
|
# The log channel defines where your log entries go to.
|
||||||
|
LOG_CHANNEL=syslog
|
||||||
|
|
||||||
|
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||||
|
# If you use SQLite, set connection to `sqlite` and remove the database, username and password settings.
|
||||||
DB_CONNECTION=pgsql
|
DB_CONNECTION=pgsql
|
||||||
|
|
||||||
|
|
||||||
@@ -14,19 +33,27 @@ DB_CONNECTION=pgsql
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
||||||
|
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
||||||
|
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
|
||||||
|
APP_LOG=errorlog
|
||||||
|
|
||||||
|
# Log level. You can set this from least severe to most severe:
|
||||||
|
# debug, info, notice, warning, error, critical, alert, emergency
|
||||||
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
||||||
|
# nothing will get logged, ever.
|
||||||
|
APP_LOG_LEVEL=debug
|
||||||
|
|
||||||
|
# If you're looking for performance improvements, you could install memcached.
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
|
|
||||||
|
# Cookie settings. Should not be necessary to change these.
|
||||||
COOKIE_PATH="/"
|
COOKIE_PATH="/"
|
||||||
COOKIE_DOMAIN=
|
COOKIE_DOMAIN=
|
||||||
COOKIE_SECURE=false
|
COOKIE_SECURE=false
|
||||||
|
|
||||||
REDIS_HOST=127.0.0.1
|
# If you want Firefly III to mail you, update these settings
|
||||||
REDIS_PASSWORD=null
|
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
MAIL_DRIVER=smtp
|
MAIL_DRIVER=smtp
|
||||||
MAIL_HOST=smtp.mailtrap.io
|
MAIL_HOST=smtp.mailtrap.io
|
||||||
MAIL_PORT=2525
|
MAIL_PORT=2525
|
||||||
@@ -35,26 +62,40 @@ MAIL_USERNAME=null
|
|||||||
MAIL_PASSWORD=null
|
MAIL_PASSWORD=null
|
||||||
MAIL_ENCRYPTION=null
|
MAIL_ENCRYPTION=null
|
||||||
|
|
||||||
|
# Firefly III can send you the following messages
|
||||||
SEND_REGISTRATION_MAIL=true
|
SEND_REGISTRATION_MAIL=true
|
||||||
SEND_ERROR_MESSAGE=true
|
SEND_ERROR_MESSAGE=true
|
||||||
|
|
||||||
CACHE_PREFIX=firefly
|
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
|
||||||
|
|
||||||
SEARCH_RESULT_LIMIT=50
|
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
|
||||||
|
|
||||||
MAPBOX_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
|
|
||||||
|
# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
|
||||||
|
# Please note that this will only work for paid fixer.io accounts because they severly limited
|
||||||
|
# the free API up to the point where you might as well offer nothing.
|
||||||
|
FIXER_API_KEY=
|
||||||
|
|
||||||
|
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
|
||||||
ANALYTICS_ID=
|
ANALYTICS_ID=
|
||||||
SITE_OWNER=heroku@example.com
|
|
||||||
|
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
|
||||||
|
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
|
||||||
USE_ENCRYPTION=true
|
USE_ENCRYPTION=true
|
||||||
|
|
||||||
|
# Leave the following configuration vars as is.
|
||||||
|
# Unless you like to tinker and know what you're doing.
|
||||||
|
APP_NAME=FireflyIII
|
||||||
|
BROADCAST_DRIVER=log
|
||||||
|
QUEUE_DRIVER=sync
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PASSWORD=null
|
||||||
|
REDIS_PORT=6379
|
||||||
|
CACHE_PREFIX=firefly
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
PUSHER_KEY=
|
PUSHER_KEY=
|
||||||
PUSHER_SECRET=
|
PUSHER_SECRET=
|
||||||
PUSHER_ID=
|
PUSHER_ID=
|
||||||
|
|
||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
IS_DOCKER=false
|
IS_DOCKER=false
|
||||||
IS_SANDSTORM=false
|
IS_SANDSTORM=false
|
||||||
IS_HEROKU=true
|
IS_HEROKU=true
|
||||||
|
|||||||
@@ -1,12 +1,31 @@
|
|||||||
|
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
||||||
|
# Never set it to "testing".
|
||||||
APP_ENV=local
|
APP_ENV=local
|
||||||
|
|
||||||
|
# Set to true if you want to see debug information in error screens.
|
||||||
APP_DEBUG=false
|
APP_DEBUG=false
|
||||||
APP_NAME=FireflyIII
|
|
||||||
|
# This should be your email address
|
||||||
|
SITE_OWNER=sandstorm@example.com
|
||||||
|
|
||||||
|
# The encryption key for your database and sessions. Keep this very secure.
|
||||||
|
# If you generate a new one all existing data must be considered LOST.
|
||||||
|
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
|
||||||
APP_KEY=SomeRandomStringOf32CharsExactly
|
APP_KEY=SomeRandomStringOf32CharsExactly
|
||||||
APP_LOG=syslog
|
|
||||||
APP_LOG_LEVEL=info
|
# Change this value to your preferred time zone.
|
||||||
|
# Example: Europe/Amsterdam
|
||||||
|
TZ=UTC
|
||||||
|
|
||||||
|
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
TRUSTED_PROXIES=
|
TRUSTED_PROXIES=
|
||||||
|
|
||||||
|
# The log channel defines where your log entries go to.
|
||||||
|
LOG_CHANNEL=syslog
|
||||||
|
|
||||||
|
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||||
|
# If you use SQLite, set connection to `sqlite` and remove the database, username and password settings.
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
DB_HOST=127.0.0.1
|
DB_HOST=127.0.0.1
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
@@ -14,19 +33,27 @@ DB_DATABASE=firefly
|
|||||||
DB_USERNAME=firefly
|
DB_USERNAME=firefly
|
||||||
DB_PASSWORD=firefly
|
DB_PASSWORD=firefly
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
||||||
|
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
||||||
|
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
|
||||||
|
APP_LOG=syslog
|
||||||
|
|
||||||
|
# Log level. You can set this from least severe to most severe:
|
||||||
|
# debug, info, notice, warning, error, critical, alert, emergency
|
||||||
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
||||||
|
# nothing will get logged, ever.
|
||||||
|
APP_LOG_LEVEL=info
|
||||||
|
|
||||||
|
# If you're looking for performance improvements, you could install memcached.
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
|
|
||||||
|
# Cookie settings. Should not be necessary to change these.
|
||||||
COOKIE_PATH="/"
|
COOKIE_PATH="/"
|
||||||
COOKIE_DOMAIN=
|
COOKIE_DOMAIN=
|
||||||
COOKIE_SECURE=false
|
COOKIE_SECURE=false
|
||||||
|
|
||||||
REDIS_HOST=127.0.0.1
|
# If you want Firefly III to mail you, update these settings
|
||||||
REDIS_PASSWORD=null
|
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
MAIL_DRIVER=smtp
|
MAIL_DRIVER=smtp
|
||||||
MAIL_HOST=smtp.mailtrap.io
|
MAIL_HOST=smtp.mailtrap.io
|
||||||
MAIL_PORT=2525
|
MAIL_PORT=2525
|
||||||
@@ -35,26 +62,40 @@ MAIL_USERNAME=null
|
|||||||
MAIL_PASSWORD=null
|
MAIL_PASSWORD=null
|
||||||
MAIL_ENCRYPTION=null
|
MAIL_ENCRYPTION=null
|
||||||
|
|
||||||
|
# Firefly III can send you the following messages
|
||||||
SEND_REGISTRATION_MAIL=true
|
SEND_REGISTRATION_MAIL=true
|
||||||
SEND_ERROR_MESSAGE=true
|
SEND_ERROR_MESSAGE=true
|
||||||
|
|
||||||
CACHE_PREFIX=firefly
|
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
|
||||||
|
|
||||||
SEARCH_RESULT_LIMIT=50
|
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
|
||||||
|
|
||||||
MAPBOX_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
|
|
||||||
|
# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
|
||||||
|
# Please note that this will only work for paid fixer.io accounts because they severly limited
|
||||||
|
# the free API up to the point where you might as well offer nothing.
|
||||||
|
FIXER_API_KEY=
|
||||||
|
|
||||||
|
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
|
||||||
ANALYTICS_ID=
|
ANALYTICS_ID=
|
||||||
SITE_OWNER=mail@example.com
|
|
||||||
|
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
|
||||||
|
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
|
||||||
USE_ENCRYPTION=true
|
USE_ENCRYPTION=true
|
||||||
|
|
||||||
|
# Leave the following configuration vars as is.
|
||||||
|
# Unless you like to tinker and know what you're doing.
|
||||||
|
APP_NAME=FireflyIII
|
||||||
|
BROADCAST_DRIVER=log
|
||||||
|
QUEUE_DRIVER=sync
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PASSWORD=null
|
||||||
|
REDIS_PORT=6379
|
||||||
|
CACHE_PREFIX=firefly
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
PUSHER_KEY=
|
PUSHER_KEY=
|
||||||
PUSHER_SECRET=
|
PUSHER_SECRET=
|
||||||
PUSHER_ID=
|
PUSHER_ID=
|
||||||
|
|
||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
IS_DOCKER=false
|
IS_DOCKER=false
|
||||||
IS_SANDSTORM=true
|
IS_SANDSTORM=true
|
||||||
IS_HEROKU=false
|
IS_HEROKU=false
|
||||||
|
|||||||
89
.env.testing
89
.env.testing
@@ -1,33 +1,55 @@
|
|||||||
|
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
||||||
|
# Never set it to "testing".
|
||||||
APP_ENV=testing
|
APP_ENV=testing
|
||||||
|
|
||||||
|
# Set to true if you want to see debug information in error screens.
|
||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
APP_NAME=FireflyIII
|
|
||||||
|
# This should be your email address
|
||||||
|
SITE_OWNER=thegrumpydictator+testing@gmail.com
|
||||||
|
|
||||||
|
# The encryption key for your database and sessions. Keep this very secure.
|
||||||
|
# If you generate a new one all existing data must be considered LOST.
|
||||||
|
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
|
||||||
APP_KEY=TestTestTestTestTestTestTestTest
|
APP_KEY=TestTestTestTestTestTestTestTest
|
||||||
APP_LOG=daily
|
|
||||||
APP_LOG_LEVEL=debug
|
# Change this value to your preferred time zone.
|
||||||
|
# Example: Europe/Amsterdam
|
||||||
|
TZ=Europe/Amsterdam
|
||||||
|
|
||||||
|
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
TRUSTED_PROXIES=
|
TRUSTED_PROXIES=
|
||||||
|
|
||||||
DB_CONNECTION=sqlite
|
# The log channel defines where your log entries go to.
|
||||||
DB_HOST=127.0.0.1
|
LOG_CHANNEL=dailytest
|
||||||
DB_PORT=3306
|
|
||||||
#DB_DATABASE=firefly
|
|
||||||
DB_USERNAME=homestead
|
|
||||||
DB_PASSWORD=
|
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||||
|
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
|
||||||
|
DB_CONNECTION=sqlite
|
||||||
|
|
||||||
|
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
||||||
|
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
||||||
|
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
|
||||||
|
APP_LOG=daily
|
||||||
|
|
||||||
|
# Log level. You can set this from least severe to most severe:
|
||||||
|
# debug, info, notice, warning, error, critical, alert, emergency
|
||||||
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
||||||
|
# nothing will get logged, ever.
|
||||||
|
APP_LOG_LEVEL=debug
|
||||||
|
|
||||||
|
# If you're looking for performance improvements, you could install memcached.
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
|
|
||||||
|
# Cookie settings. Should not be necessary to change these.
|
||||||
COOKIE_PATH="/"
|
COOKIE_PATH="/"
|
||||||
COOKIE_DOMAIN=
|
COOKIE_DOMAIN=
|
||||||
COOKIE_SECURE=false
|
COOKIE_SECURE=false
|
||||||
|
|
||||||
REDIS_HOST=127.0.0.1
|
# If you want Firefly III to mail you, update these settings
|
||||||
REDIS_PASSWORD=null
|
MAIL_DRIVER=log
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
MAIL_DRIVER=smtp
|
|
||||||
MAIL_HOST=smtp.mailtrap.io
|
MAIL_HOST=smtp.mailtrap.io
|
||||||
MAIL_PORT=2525
|
MAIL_PORT=2525
|
||||||
MAIL_FROM=changeme@example.com
|
MAIL_FROM=changeme@example.com
|
||||||
@@ -35,26 +57,41 @@ MAIL_USERNAME=null
|
|||||||
MAIL_PASSWORD=null
|
MAIL_PASSWORD=null
|
||||||
MAIL_ENCRYPTION=null
|
MAIL_ENCRYPTION=null
|
||||||
|
|
||||||
|
# Firefly III can send you the following messages
|
||||||
SEND_REGISTRATION_MAIL=true
|
SEND_REGISTRATION_MAIL=true
|
||||||
SEND_ERROR_MESSAGE=true
|
SEND_ERROR_MESSAGE=false
|
||||||
|
|
||||||
CACHE_PREFIX=firefly
|
|
||||||
|
|
||||||
SEARCH_RESULT_LIMIT=50
|
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
|
||||||
|
|
||||||
|
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
|
||||||
MAPBOX_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
ANALYTICS_ID=
|
|
||||||
SITE_OWNER=mail@example.com
|
|
||||||
USE_ENCRYPTION=true
|
|
||||||
|
|
||||||
|
# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
|
||||||
|
# Please note that this will only work for paid fixer.io accounts because they severly limited
|
||||||
|
# the free API up to the point where you might as well offer nothing.
|
||||||
|
FIXER_API_KEY=
|
||||||
|
|
||||||
|
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
|
||||||
|
ANALYTICS_ID=
|
||||||
|
|
||||||
|
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
|
||||||
|
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
|
||||||
|
USE_ENCRYPTION=false
|
||||||
|
|
||||||
|
# Leave the following configuration vars as is.
|
||||||
|
# Unless you like to tinker and know what you're doing.
|
||||||
|
APP_NAME=FireflyIII
|
||||||
|
BROADCAST_DRIVER=log
|
||||||
|
QUEUE_DRIVER=sync
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PASSWORD=null
|
||||||
|
REDIS_PORT=6379
|
||||||
|
CACHE_PREFIX=firefly_tst
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
PUSHER_KEY=
|
PUSHER_KEY=
|
||||||
PUSHER_SECRET=
|
PUSHER_SECRET=
|
||||||
PUSHER_ID=
|
PUSHER_ID=
|
||||||
|
|
||||||
DEMO_USERNAME=
|
DEMO_USERNAME=
|
||||||
DEMO_PASSWORD=
|
DEMO_PASSWORD=
|
||||||
|
|
||||||
IS_DOCKER=false
|
IS_DOCKER=false
|
||||||
IS_SANDSTORM=false
|
IS_SANDSTORM=false
|
||||||
IS_HEROKU=false
|
IS_HEROKU=false
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Feature requests
|
## Feature requests
|
||||||
|
|
||||||
I am always interested in expanding Firefly III's many features. If you are requesting a new feature, please check out the list of [often requested features](https://firefly-iii.org/requested-features/).
|
I am always interested in expanding Firefly III's many features. Just open a ticket or [drop me a line](mailto:thegrumpydictator@gmail.com).
|
||||||
|
|
||||||
## Pull requests
|
## Pull requests
|
||||||
|
|
||||||
0
.github/SUPPORT.md → .github/support.md
vendored
0
.github/SUPPORT.md → .github/support.md
vendored
@@ -3,10 +3,9 @@
|
|||||||
# This script only runs once, when the app connects to sandstorm.
|
# This script only runs once, when the app connects to sandstorm.
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "In build.sh"
|
||||||
|
|
||||||
cd /opt/app
|
cd /opt/app
|
||||||
|
|
||||||
cp .env.sandstorm .env
|
cp .env.sandstorm .env
|
||||||
|
|
||||||
if [ -f /opt/app/composer.json ] ; then
|
if [ -f /opt/app/composer.json ] ; then
|
||||||
|
|||||||
@@ -1,3 +1,94 @@
|
|||||||
|
# 4.7.2
|
||||||
|
- [Issue 1123](https://github.com/firefly-iii/firefly-iii/issues/1123) First browser based update routine.
|
||||||
|
- Add support for Italian.
|
||||||
|
- [Issue 1232](https://github.com/firefly-iii/firefly-iii/issues/1232) Allow user to specify Docker database port.
|
||||||
|
- [Issue 1197](https://github.com/firefly-iii/firefly-iii/issues/1197) Beter account list overview
|
||||||
|
- [Issue 1202](https://github.com/firefly-iii/firefly-iii/issues/1202) Some budgetary warnings
|
||||||
|
- [Issue 1284](https://github.com/firefly-iii/firefly-iii/issues/1284) Experimental support for bunq import
|
||||||
|
- [Issue 1248](https://github.com/firefly-iii/firefly-iii/issues/1248) Ability to import BIC, ability to import SEPA fields.
|
||||||
|
- [Issue 1102](https://github.com/firefly-iii/firefly-iii/issues/1102) Summary line for bills
|
||||||
|
- More info to debug page.
|
||||||
|
- [Issue 1186](https://github.com/firefly-iii/firefly-iii/issues/1186) You can see the latest account balance in CRUD forms
|
||||||
|
- Add Kubernetes YAML files, kindly created by a FF3 user.
|
||||||
|
- [Issue 1244](https://github.com/firefly-iii/firefly-iii/issues/1244) Better line for "today" marker and add it to other chart as well ([issue 1214](https://github.com/firefly-iii/firefly-iii/issues/1214))
|
||||||
|
- [Issue 1219](https://github.com/firefly-iii/firefly-iii/issues/1219) Languages in dropdown
|
||||||
|
- [Issue 1189](https://github.com/firefly-iii/firefly-iii/issues/1189) Inactive accounts get removed from net worth
|
||||||
|
- [Issue 1220](https://github.com/firefly-iii/firefly-iii/issues/1220) Attachment description and notes migrated to just "notes".
|
||||||
|
- [Issue 1236](https://github.com/firefly-iii/firefly-iii/issues/1236) Multi currency balance box
|
||||||
|
- [Issue 1240](https://github.com/firefly-iii/firefly-iii/issues/1240) Better overview for accounts.
|
||||||
|
- [Issue 1292](https://github.com/firefly-iii/firefly-iii/issues/1292) Removed some charts from the "all"-overview of budgets and categories
|
||||||
|
- [Issue 1245](https://github.com/firefly-iii/firefly-iii/issues/1245) Improved recognition of IBANs
|
||||||
|
- Improved import routine.
|
||||||
|
- Update notifier will wait three days before notifying users.
|
||||||
|
- [Issue 1300](https://github.com/firefly-iii/firefly-iii/issues/1300) Virtual balance of credit cards does not count for net worth
|
||||||
|
- [Issue 1247](https://github.com/firefly-iii/firefly-iii/issues/1247) Can now see overspent amount
|
||||||
|
- [Issue 1221](https://github.com/firefly-iii/firefly-iii/issues/1221) Upgrade to Laravel 5.6
|
||||||
|
- [Issue 1187](https://github.com/firefly-iii/firefly-iii/issues/1187) Updated the password verifier to use Troy Hunt's new API
|
||||||
|
- Revenue chart is now on frontpage permanently
|
||||||
|
- [Issue 1153](https://github.com/firefly-iii/firefly-iii/issues/1153) 2FA settings are in your profile now
|
||||||
|
- [Issue 1227](https://github.com/firefly-iii/firefly-iii/issues/1227) Can set the timezone in config or in Docker
|
||||||
|
- [Issue 1294](https://github.com/firefly-iii/firefly-iii/issues/1294) Ability to link a transaction to itself
|
||||||
|
- Correct reference to journal description in split form.
|
||||||
|
- [Issue 1234](https://github.com/firefly-iii/firefly-iii/issues/1234) Fix budget page issues in SQLite
|
||||||
|
- [Issue 1262](https://github.com/firefly-iii/firefly-iii/issues/1262) Can now use double and epty headers in CSV files
|
||||||
|
- [Issue 1258](https://github.com/firefly-iii/firefly-iii/issues/1258) Fixed a possible date mismatch in piggy banks
|
||||||
|
- [Issue 1283](https://github.com/firefly-iii/firefly-iii/issues/1283) Bulk delete was broken
|
||||||
|
- [Issue 1293](https://github.com/firefly-iii/firefly-iii/issues/1293) Layout problem with notes
|
||||||
|
- [Issue 1257](https://github.com/firefly-iii/firefly-iii/issues/1257) Improve transaction lists query count
|
||||||
|
- [Issue 1291](https://github.com/firefly-iii/firefly-iii/issues/1291) Fixer IO problems
|
||||||
|
- [Issue 1239](https://github.com/firefly-iii/firefly-iii/issues/1239) Could not edit expense or revenue accounts ([issue 1298](https://github.com/firefly-iii/firefly-iii/issues/1298))
|
||||||
|
- [Issue 1297](https://github.com/firefly-iii/firefly-iii/issues/1297) Could not convert to withdrawal
|
||||||
|
- [Issue 1226](https://github.com/firefly-iii/firefly-iii/issues/1226) Category overview in default report shows no income.
|
||||||
|
- Various other bugs and problems ([issue 1198](https://github.com/firefly-iii/firefly-iii/issues/1198), [issue 1213](https://github.com/firefly-iii/firefly-iii/issues/1213), [issue 1237](https://github.com/firefly-iii/firefly-iii/issues/1237), [issue 1238](https://github.com/firefly-iii/firefly-iii/issues/1238), [issue 1199](https://github.com/firefly-iii/firefly-iii/issues/1199), [issue 1200](https://github.com/firefly-iii/firefly-iii/issues/1200))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- Fixed an issue with token validation on the command line.
|
||||||
|
|
||||||
|
# 4.7.1
|
||||||
|
- A brand new API. Read about it in the [documentation](http://firefly-iii.readthedocs.io/en/latest/).
|
||||||
|
- Add support for Spanish. [issue 1194](https://github.com/firefly-iii/firefly-iii/issues/1194)
|
||||||
|
- Some custom preferences are selected by default for a better user experience.
|
||||||
|
- Some new currencies [issue 1211](https://github.com/firefly-iii/firefly-iii/issues/1211)
|
||||||
|
- Fixed [issue 1155](https://github.com/firefly-iii/firefly-iii/issues/1155) (reported by [ndandanov](https://github.com/ndandanov))
|
||||||
|
- [Issue 1156](https://github.com/firefly-iii/firefly-iii/issues/1156) [issue 1182](https://github.com/firefly-iii/firefly-iii/issues/1182) and other issues related to SQLite databases.
|
||||||
|
- Multi-page budget overview was broken (reported by [jinformatique](https://github.com/jinformatique))
|
||||||
|
- Importing CSV files with semi-colons in them did not work [issue 1172](https://github.com/firefly-iii/firefly-iii/issues/1172) [issue 1183](https://github.com/firefly-iii/firefly-iii/issues/1183) [issue 1210](https://github.com/firefly-iii/firefly-iii/issues/1210)
|
||||||
|
- Could not use account number that was in use by a deleted account [issue 1174](https://github.com/firefly-iii/firefly-iii/issues/1174)
|
||||||
|
- Fixed spelling error that lead to 404's [issue 1175](https://github.com/firefly-iii/firefly-iii/issues/1175) [issue 1190](https://github.com/firefly-iii/firefly-iii/issues/1190)
|
||||||
|
- Fixed tag autocomplete [issue 1178](https://github.com/firefly-iii/firefly-iii/issues/1178)
|
||||||
|
- Better links for "new transaction" buttons [issue 1185](https://github.com/firefly-iii/firefly-iii/issues/1185)
|
||||||
|
- Cache errors in budget charts [issue 1192](https://github.com/firefly-iii/firefly-iii/issues/1192)
|
||||||
|
- Deleting transactions that are linked to other other transactions would lead to errors [issue 1209](https://github.com/firefly-iii/firefly-iii/issues/1209)
|
||||||
|
|
||||||
|
# 4.7.0
|
||||||
|
- Support for Russian and Portuguese (Brazil)
|
||||||
|
- Support for the Spectre API (Salt Edge)
|
||||||
|
- Many strings now translatable thanks to [Nik-vr](https://github.com/Nik-vr) ([issue 1118](https://github.com/firefly-iii/firefly-iii/issues/1118), [issue 1116](https://github.com/firefly-iii/firefly-iii/issues/1116), [issue 1109](https://github.com/firefly-iii/firefly-iii/issues/1109), )
|
||||||
|
- Many buttons to quickly create stuff
|
||||||
|
- Sum of tables in reports, requested by [MacPaille](https://github.com/MacPaille) ([issue 1106](https://github.com/firefly-iii/firefly-iii/issues/1106))
|
||||||
|
- Future versions of Firefly III will notify you there is a new version, as suggested by [8bitgentleman](https://github.com/8bitgentleman) in [issue 1050](https://github.com/firefly-iii/firefly-iii/issues/1050)
|
||||||
|
- Improved net worth box [issue 1101](https://github.com/firefly-iii/firefly-iii/issues/1101) ([Nik-vr](https://github.com/Nik-vr))
|
||||||
|
- Nice dropdown in transaction list [issue 1082](https://github.com/firefly-iii/firefly-iii/issues/1082)
|
||||||
|
- Better support for local fonts thanks to [devlearner](https://github.com/devlearner) ([issue 1145](https://github.com/firefly-iii/firefly-iii/issues/1145))
|
||||||
|
- Improve attachment support and view capabilities (suggested by [trinhit](https://github.com/trinhit) in [issue 1146](https://github.com/firefly-iii/firefly-iii/issues/1146))
|
||||||
|
- Whole new [read me file](https://github.com/firefly-iii/firefly-iii/blob/master/readme.md), [new end user documentation](https://firefly-iii.readthedocs.io/en/latest/) and an [updated website](https://www.firefly-iii.org/)!
|
||||||
|
- Many charts and info-blocks now scale property ([issue 989](https://github.com/firefly-iii/firefly-iii/issues/989) and [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040))
|
||||||
|
- Charts work in IE thanks to [devlearner](https://github.com/devlearner) ([issue 1107](https://github.com/firefly-iii/firefly-iii/issues/1107))
|
||||||
|
- Various fixes in import routine
|
||||||
|
- Bug that left charts empty ([issue 1088](https://github.com/firefly-iii/firefly-iii/issues/1088)), reported by various users amongst which [jinformatique](https://github.com/jinformatique)
|
||||||
|
- [Issue 1124](https://github.com/firefly-iii/firefly-iii/issues/1124), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 1125](https://github.com/firefly-iii/firefly-iii/issues/1125), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 1126](https://github.com/firefly-iii/firefly-iii/issues/1126), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 1131](https://github.com/firefly-iii/firefly-iii/issues/1131), as reported by [dp87](https://github.com/dp87)
|
||||||
|
- [Issue 1129](https://github.com/firefly-iii/firefly-iii/issues/1129), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 1132](https://github.com/firefly-iii/firefly-iii/issues/1132), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- Issue with cache in Sandstorm ([issue 1130](https://github.com/firefly-iii/firefly-iii/issues/1130))
|
||||||
|
- [Issue 1134](https://github.com/firefly-iii/firefly-iii/issues/1134)
|
||||||
|
- [Issue 1140](https://github.com/firefly-iii/firefly-iii/issues/1140)
|
||||||
|
- [Issue 1141](https://github.com/firefly-iii/firefly-iii/issues/1141), reported by [ErikFontanel](https://github.com/ErikFontanel)
|
||||||
|
- [Issue 1142](https://github.com/firefly-iii/firefly-iii/issues/1142)
|
||||||
|
- Removed many access rights from the demo user
|
||||||
|
|
||||||
# 4.6.13
|
# 4.6.13
|
||||||
- [Issue 1074](https://github.com/firefly-iii/firefly-iii/issues/1074), suggested by [MacPaille](https://github.com/MacPaille)
|
- [Issue 1074](https://github.com/firefly-iii/firefly-iii/issues/1074), suggested by [MacPaille](https://github.com/MacPaille)
|
||||||
- [Issue 1077](https://github.com/firefly-iii/firefly-iii/issues/1077), suggested by [wtercato](https://github.com/wtercato)
|
- [Issue 1077](https://github.com/firefly-iii/firefly-iii/issues/1077), suggested by [wtercato](https://github.com/wtercato)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Runs every time we create a new grain!
|
# Runs every time we create a new grain!
|
||||||
|
echo "Now in launcher.sh"
|
||||||
|
|
||||||
# Create a bunch of folders under the clean /var that php, nginx, and mysql expect to exist
|
# Create a bunch of folders under the clean /var that php, nginx, and mysql expect to exist
|
||||||
mkdir -p /var/lib/mysql
|
mkdir -p /var/lib/mysql
|
||||||
@@ -30,7 +31,6 @@ mkdir -p /var/storage/framework/views
|
|||||||
mkdir -p /var/storage/logs
|
mkdir -p /var/storage/logs
|
||||||
mkdir -p /var/storage/upload
|
mkdir -p /var/storage/upload
|
||||||
|
|
||||||
|
|
||||||
# Ensure mysql tables created
|
# Ensure mysql tables created
|
||||||
HOME=/etc/mysql /usr/bin/mysql_install_db --force
|
HOME=/etc/mysql /usr/bin/mysql_install_db --force
|
||||||
|
|
||||||
@@ -58,5 +58,9 @@ echo "Migrating..."
|
|||||||
php /opt/app/artisan migrate --seed --force
|
php /opt/app/artisan migrate --seed --force
|
||||||
echo "Done!"
|
echo "Done!"
|
||||||
|
|
||||||
|
echo "Clear cache.."
|
||||||
|
php /opt/app/artisan cache:clear
|
||||||
|
echo "Done"
|
||||||
|
|
||||||
# Start nginx.
|
# Start nginx.
|
||||||
/usr/sbin/nginx -c /opt/app/.sandstorm/service-config/nginx.conf -g "daemon off;"
|
/usr/sbin/nginx -c /opt/app/.sandstorm/service-config/nginx.conf -g "daemon off;"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
|
|||||||
|
|
||||||
manifest = (
|
manifest = (
|
||||||
appTitle = (defaultText = "Firefly III"),
|
appTitle = (defaultText = "Firefly III"),
|
||||||
appVersion = 7,
|
appVersion = 10,
|
||||||
appMarketingVersion = (defaultText = "4.6.13"),
|
appMarketingVersion = (defaultText = "4.7.2"),
|
||||||
|
|
||||||
actions = [
|
actions = [
|
||||||
# Define your "new document" handlers here.
|
# Define your "new document" handlers here.
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ http {
|
|||||||
fastcgi_index index.php;
|
fastcgi_index index.php;
|
||||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_read_timeout 900;
|
||||||
|
|
||||||
|
|
||||||
fastcgi_param QUERY_STRING $query_string;
|
fastcgi_param QUERY_STRING $query_string;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
# When you change this file, you must take manual action. Read this doc:
|
# When you change this file, you must take manual action. Read this doc:
|
||||||
# - https://docs.sandstorm.io/en/latest/vagrant-spk/customizing/#setupsh
|
# - https://docs.sandstorm.io/en/latest/vagrant-spk/customizing/#setupsh
|
||||||
|
echo "Now in setup.sh"
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -14,8 +15,11 @@ apt-get install -y python-software-properties software-properties-common
|
|||||||
# install all languages
|
# install all languages
|
||||||
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
|
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
|
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
sed -i 's/# id_ID.UTF-8 UTF-8/id_ID.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen
|
sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen
|
sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
sed -i 's/# tr_TR.UTF-8 UTF-8/tr_TR.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
dpkg-reconfigure --frontend=noninteractive locales
|
dpkg-reconfigure --frontend=noninteractive locales
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
105
.scrutinizer.yml
105
.scrutinizer.yml
@@ -1,51 +1,58 @@
|
|||||||
# .scrutinizer.yml
|
---
|
||||||
tools:
|
build:
|
||||||
external_code_coverage: false
|
nodes:
|
||||||
filter:
|
analysis:
|
||||||
paths:
|
project_setup:
|
||||||
|
override: true
|
||||||
|
tests:
|
||||||
|
override:
|
||||||
|
- php-scrutinizer-run
|
||||||
|
checks:
|
||||||
|
javascript: true
|
||||||
|
php:
|
||||||
|
align_assignments: true
|
||||||
|
avoid_fixme_comments: true
|
||||||
|
avoid_multiple_statements_on_same_line: true
|
||||||
|
avoid_perl_style_comments: true
|
||||||
|
avoid_todo_comments: true
|
||||||
|
duplication: false
|
||||||
|
encourage_single_quotes: true
|
||||||
|
newline_at_end_of_file: true
|
||||||
|
no_goto: true
|
||||||
|
no_long_variable_names:
|
||||||
|
maximum: "20"
|
||||||
|
no_short_method_names:
|
||||||
|
minimum: "3"
|
||||||
|
no_short_variable_names:
|
||||||
|
minimum: "3"
|
||||||
|
optional_parameters_at_the_end: true
|
||||||
|
parameter_doc_comments: true
|
||||||
|
remove_extra_empty_lines: true
|
||||||
|
return_doc_comment_if_not_inferrable: true
|
||||||
|
return_doc_comments: true
|
||||||
|
uppercase_constants: true
|
||||||
|
use_self_instead_of_fqcn: true
|
||||||
|
coding_style:
|
||||||
|
php:
|
||||||
|
spaces:
|
||||||
|
around_operators:
|
||||||
|
concatenation: true
|
||||||
|
other:
|
||||||
|
after_type_cast: false
|
||||||
|
filter:
|
||||||
|
excluded_paths:
|
||||||
|
- database/migrations/*
|
||||||
|
- bootstrap/*
|
||||||
|
- config/*
|
||||||
|
- docker/*
|
||||||
|
- public/js/lib/*
|
||||||
|
- public/lib/adminlte/js/*
|
||||||
|
- public/lib/bootstrap/js/*
|
||||||
|
- resources/*
|
||||||
|
- routes/*
|
||||||
|
- storage/*
|
||||||
|
paths:
|
||||||
- app/*
|
- app/*
|
||||||
- public/js/ff/*
|
- public/js/ff/*
|
||||||
excluded_paths:
|
tools:
|
||||||
- "database/migrations/*"
|
external_code_coverage: false
|
||||||
- "bootstrap/*"
|
|
||||||
- "config/*"
|
|
||||||
- "docker/*"
|
|
||||||
- "public/js/lib/*"
|
|
||||||
- "public/lib/adminlte/js/*"
|
|
||||||
- "public/lib/bootstrap/js/*"
|
|
||||||
- "resources/*"
|
|
||||||
- "routes/*"
|
|
||||||
- "storage/*"
|
|
||||||
checks:
|
|
||||||
php:
|
|
||||||
use_self_instead_of_fqcn: true
|
|
||||||
uppercase_constants: true
|
|
||||||
return_doc_comments: true
|
|
||||||
return_doc_comment_if_not_inferrable: true
|
|
||||||
remove_extra_empty_lines: true
|
|
||||||
parameter_doc_comments: true
|
|
||||||
optional_parameters_at_the_end: true
|
|
||||||
no_short_variable_names:
|
|
||||||
minimum: '3'
|
|
||||||
no_short_method_names:
|
|
||||||
minimum: '3'
|
|
||||||
no_long_variable_names:
|
|
||||||
maximum: '20'
|
|
||||||
no_goto: true
|
|
||||||
newline_at_end_of_file: true
|
|
||||||
encourage_single_quotes: true
|
|
||||||
avoid_todo_comments: true
|
|
||||||
avoid_perl_style_comments: true
|
|
||||||
avoid_fixme_comments: true
|
|
||||||
avoid_multiple_statements_on_same_line: true
|
|
||||||
align_assignments: true
|
|
||||||
duplication: false
|
|
||||||
javascript: true
|
|
||||||
|
|
||||||
coding_style:
|
|
||||||
php:
|
|
||||||
spaces:
|
|
||||||
around_operators:
|
|
||||||
concatenation: true
|
|
||||||
other:
|
|
||||||
after_type_cast: false
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
language: php
|
language: php
|
||||||
php:
|
php:
|
||||||
- 7.1
|
- 7.1
|
||||||
- 7.2
|
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
@@ -13,14 +12,13 @@ install:
|
|||||||
- composer update --no-scripts
|
- composer update --no-scripts
|
||||||
- cp .env.testing .env
|
- cp .env.testing .env
|
||||||
- php artisan clear-compiled
|
- php artisan clear-compiled
|
||||||
- php artisan optimize
|
|
||||||
- php artisan env
|
- php artisan env
|
||||||
- cp .env.testing .env
|
- cp .env.testing .env
|
||||||
- wget -q https://github.com/firefly-iii/test-data/raw/master/storage/database.sqlite -O storage/database/database.sqlite
|
- wget -q https://github.com/firefly-iii/test-data/raw/master/storage/database.sqlite -O storage/database/database.sqlite
|
||||||
- mkdir -p build/logs
|
- mkdir -p build/logs
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- phpunit -c phpunit.coverage.xml
|
- ./vendor/bin/phpunit -c phpunit.coverage.xml
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- travis_retry php vendor/bin/php-coveralls -x storage/build/clover-all.xml
|
- travis_retry php vendor/bin/php-coveralls -x storage/build/clover-all.xml
|
||||||
@@ -29,4 +27,4 @@ after_success:
|
|||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
- master
|
- master
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ RUN docker-php-ext-install -j$(nproc) curl gd intl json readline tidy zip bcmath
|
|||||||
RUN echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
|
RUN echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
|
||||||
|
|
||||||
# copy Apache config to correct spot.
|
# copy Apache config to correct spot.
|
||||||
COPY ./docker/apache2.conf /etc/apache2/apache2.conf
|
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
|
||||||
|
|
||||||
# Enable apache mod rewrite..
|
# Enable apache mod rewrite..
|
||||||
RUN a2enmod rewrite
|
RUN a2enmod rewrite
|
||||||
@@ -46,7 +46,7 @@ VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
|
|||||||
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
||||||
|
|
||||||
# Enable default site (Firefly III)
|
# Enable default site (Firefly III)
|
||||||
COPY ./docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
|
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
|
||||||
|
|
||||||
# Make sure we own Firefly III directory
|
# Make sure we own Firefly III directory
|
||||||
RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage
|
RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage
|
||||||
@@ -58,4 +58,4 @@ RUN composer install --prefer-dist --no-dev --no-scripts --no-suggest
|
|||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
# Run entrypoint thing
|
# Run entrypoint thing
|
||||||
ENTRYPOINT ["docker/entrypoint.sh"]
|
ENTRYPOINT [".deploy/docker/entrypoint.sh"]
|
||||||
89
README.md
89
README.md
@@ -1,89 +0,0 @@
|
|||||||
# Firefly III: A personal finances manager
|
|
||||||
|
|
||||||
[](https://secure.php.net/downloads.php) [](https://packagist.org/packages/grumpydictator/firefly-iii) [](https://www.gnu.org/licenses/gpl.html) [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA)
|
|
||||||
|
|
||||||
[](https://firefly-iii.org/static/screenshots/4.6.12/index.png) [](https://firefly-iii.org/static/screenshots/4.6.12/account.png)
|
|
||||||
|
|
||||||
[](https://firefly-iii.org/static/screenshots/4.6.12/budget.png) [](https://firefly-iii.org/static/screenshots/4.6.12/category.png)
|
|
||||||
|
|
||||||
[](https://firefly-iii.org/static/screenshots/4.6.12/report1.png) [](https://firefly-iii.org/static/screenshots/4.6.12/report2.png)
|
|
||||||
|
|
||||||
"Firefly III" is a financial manager for your personal finances. It can help you keep track of your expenses and income.
|
|
||||||
Firefly III supports the use of budgets. You can categorize and tag your transactions.
|
|
||||||
It also supports credit cards, shared household accounts and savings accounts.
|
|
||||||
There are many financial reports available.
|
|
||||||
|
|
||||||
## Want to try Firefly III?
|
|
||||||
|
|
||||||
There is a **[demo site](https://demo.firefly-iii.org)** with an example financial administration already present. You can use Docker, Heroku or Sandstorm.io (see below) to quickly setup your own instance.
|
|
||||||
|
|
||||||
## Install Firefly III
|
|
||||||
|
|
||||||
### Using docker
|
|
||||||
|
|
||||||
You can use docker-compose to [set up your personal secure](https://firefly-iii.org/using-docker.html) Firefly III environment. Advanced users can use the Dockerfile directly.
|
|
||||||
|
|
||||||
### Using vagrant (or other VMs)
|
|
||||||
|
|
||||||
You can install Firefly III on any Linux or Windows machine. You'll need a web server (preferrably on Linux) and access to the command line. Please read the [installation guide](https://firefly-iii.org/using-installing.html).
|
|
||||||
|
|
||||||
### Using Heroku
|
|
||||||
|
|
||||||
[](https://heroku.com/deploy?template=https://github.com/firefly-iii/firefly-iii/tree/master)
|
|
||||||
|
|
||||||
Register for a free Heroku account and instantly run Firefly III on your very own cloud instance.
|
|
||||||
|
|
||||||
### Using Sandstorm.io
|
|
||||||
|
|
||||||
You can find Firefly III in [the Sandstorm.io marketplace](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70). You can run it on your own installation or on Oasis.
|
|
||||||
|
|
||||||
### Other options
|
|
||||||
|
|
||||||
Firefly III is also available as a package on [https://softaculous.com/](Softaculous) and [AMPPS](https://www.ampps.com/).
|
|
||||||
|
|
||||||
## More about Firefly III
|
|
||||||
|
|
||||||
Personal financial management is pretty difficult, and everybody has their own approach to it.
|
|
||||||
Some people make budgets, other people limit their cashflow by throwing away their credit cards,
|
|
||||||
others try to increase their current cashflow. There are tons of ways to save and earn money.
|
|
||||||
|
|
||||||
Firefly works on the principle that if you know where you're money is going, you can stop it from going there.
|
|
||||||
|
|
||||||
### Some advantages of using Firefly
|
|
||||||
|
|
||||||
- Firefly can import any CSV file, so migrating from other systems is easy.
|
|
||||||
- Firefly runs on your own server, so you are fully in control of your data. Remember, there is no such thing as "the cloud", it’s just somebody else’s computer!
|
|
||||||
- Firefly has lots of features without being fancy or bloated.
|
|
||||||
- If you feel you're missing something you can just ask me and I'll add it!
|
|
||||||
|
|
||||||
Firefly III has become pretty awesome over the years! (but please excuse me for bragging, it's just that I'm proud of it).
|
|
||||||
[You can read more about Firefly III, and its features, on the website](https://firefly-iii.org/).
|
|
||||||
|
|
||||||
### Contributing
|
|
||||||
|
|
||||||
Please read [CONTRIBUTING.md](https://github.com/firefly-iii/firefly-iii/blob/master/.github/CONTRIBUTING.md) for details on contributing, and the process for submitting pull requests. Please check out the [code of conduct](https://github.com/firefly-iii/firefly-iii/blob/master/CODE_OF_CONDUCT.md) as well.
|
|
||||||
|
|
||||||
### Versioning
|
|
||||||
|
|
||||||
We use [SemVer](http://semver.org/) for versioning. For the versions available, see [the tags](https://github.com/firefly-iii/firefly-iii/tags) on this repository.
|
|
||||||
|
|
||||||
### Authors
|
|
||||||
|
|
||||||
* James Cole
|
|
||||||
* Over time, [many people have contributed to Firefly III](https://github.com/firefly-iii/firefly-iii/graphs/contributors).
|
|
||||||
|
|
||||||
### License
|
|
||||||
|
|
||||||
This work [is licensed](https://github.com/firefly-iii/firefly-iii/blob/master/LICENSE) under the [GPL v3](https://www.gnu.org/licenses/gpl.html).
|
|
||||||
|
|
||||||
### Other stuff
|
|
||||||
|
|
||||||
If you like Firefly III and if it helps you save lots of money, why not send me [a dime for every dollar saved](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA) (this is a joke, although the Paypal form works just fine, try it!)
|
|
||||||
|
|
||||||
If you want to contact me, please open an issue or [email me](mailto:thegrumpydictator@gmail.com).
|
|
||||||
|
|
||||||
### Alternatives
|
|
||||||
|
|
||||||
If you are looking for alternatives, check out [Kickball's Awesome-Selfhosted list](https://github.com/Kickball/awesome-selfhosted) which features not only Firefly III but also noteworthy alternatives such as [Silverstrike](https://github.com/agstrike/silverstrike).
|
|
||||||
|
|
||||||
[](https://travis-ci.org/firefly-iii/firefly-iii) [](https://scrutinizer-ci.com/g/firefly-iii/firefly-iii/?branch=master) [](https://coveralls.io/github/firefly-iii/firefly-iii?branch=master)
|
|
||||||
84
app/Api/V1/Controllers/AboutController.php
Normal file
84
app/Api/V1/Controllers/AboutController.php
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* AboutController.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use DB;
|
||||||
|
use FireflyIII\Transformers\UserTransformer;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use League\Fractal\Manager;
|
||||||
|
use League\Fractal\Resource\Item;
|
||||||
|
use League\Fractal\Serializer\JsonApiSerializer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class AboutController
|
||||||
|
*/
|
||||||
|
class AboutController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* AccountController constructor.
|
||||||
|
*
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function about()
|
||||||
|
{
|
||||||
|
$search = ['~', '#'];
|
||||||
|
$replace = ['\~', '# '];
|
||||||
|
$phpVersion = str_replace($search, $replace, PHP_VERSION);
|
||||||
|
$phpOs = str_replace($search, $replace, PHP_OS);
|
||||||
|
$currentDriver = DB::getDriverName();
|
||||||
|
$data
|
||||||
|
= [
|
||||||
|
'version' => config('firefly.version'),
|
||||||
|
'api_version' => config('firefly.api_version'),
|
||||||
|
'php_version' => $phpVersion,
|
||||||
|
'os' => $phpOs,
|
||||||
|
'driver' => $currentDriver,
|
||||||
|
];
|
||||||
|
|
||||||
|
return response()->json(['data' => $data], 200)->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function user(Request $request)
|
||||||
|
{
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
$resource = new Item(auth()->user(), new UserTransformer($this->parameters), 'users');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
}
|
||||||
261
app/Api/V1/Controllers/AccountController.php
Normal file
261
app/Api/V1/Controllers/AccountController.php
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* AccountController.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\AccountRequest;
|
||||||
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Transformers\AccountTransformer;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
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 Preferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class AccountController
|
||||||
|
*/
|
||||||
|
class AccountController extends Controller
|
||||||
|
{
|
||||||
|
/** @var CurrencyRepositoryInterface */
|
||||||
|
private $currencyRepository;
|
||||||
|
/** @var AccountRepositoryInterface */
|
||||||
|
private $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AccountController constructor.
|
||||||
|
*
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
// @var AccountRepositoryInterface repository
|
||||||
|
$this->repository = app(AccountRepositoryInterface::class);
|
||||||
|
$this->repository->setUser(auth()->user());
|
||||||
|
|
||||||
|
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
|
||||||
|
$this->currencyRepository->setUser(auth()->user());
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param \FireflyIII\Models\Account $account
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function delete(Account $account)
|
||||||
|
{
|
||||||
|
$this->repository->destroy($account, null);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
// create some objects:
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
|
||||||
|
// read type from URI
|
||||||
|
$type = $request->get('type') ?? 'all';
|
||||||
|
$this->parameters->set('type', $type);
|
||||||
|
|
||||||
|
// types to get, page size:
|
||||||
|
$types = $this->mapTypes($this->parameters->get('type'));
|
||||||
|
$pageSize = intval(Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data);
|
||||||
|
|
||||||
|
// get list of accounts. Count it and split it.
|
||||||
|
$collection = $this->repository->getAccountsByType($types);
|
||||||
|
$count = $collection->count();
|
||||||
|
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// make paginator:
|
||||||
|
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
$paginator->setPath(route('api.v1.accounts.index') . $this->buildParams());
|
||||||
|
|
||||||
|
// present to user.
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
$resource = new FractalCollection($accounts, new AccountTransformer($this->parameters), 'accounts');
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @param Account $account
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function show(Request $request, Account $account)
|
||||||
|
{
|
||||||
|
$manager = new Manager();
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param AccountRequest $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function store(AccountRequest $request)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
// if currency ID is 0, find the currency by the code:
|
||||||
|
if (0 === $data['currency_id']) {
|
||||||
|
$currency = $this->currencyRepository->findByCodeNull($data['currency_code']);
|
||||||
|
$data['currency_id'] = is_null($currency) ? 0 : $currency->id;
|
||||||
|
}
|
||||||
|
$account = $this->repository->store($data);
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update account.
|
||||||
|
*
|
||||||
|
* @param AccountRequest $request
|
||||||
|
* @param Account $account
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function update(AccountRequest $request, Account $account)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
// if currency ID is 0, find the currency by the code:
|
||||||
|
if (0 === $data['currency_id']) {
|
||||||
|
$currency = $this->currencyRepository->findByCodeNull($data['currency_code']);
|
||||||
|
$data['currency_id'] = is_null($currency) ? 0 : $currency->id;
|
||||||
|
}
|
||||||
|
// set correct type:
|
||||||
|
$data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type);
|
||||||
|
$this->repository->update($account, $data);
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function mapTypes(string $type): array
|
||||||
|
{
|
||||||
|
$types = [
|
||||||
|
'all' => [
|
||||||
|
AccountType::DEFAULT,
|
||||||
|
AccountType::CASH,
|
||||||
|
AccountType::ASSET,
|
||||||
|
AccountType::EXPENSE,
|
||||||
|
AccountType::REVENUE,
|
||||||
|
AccountType::INITIAL_BALANCE,
|
||||||
|
AccountType::BENEFICIARY,
|
||||||
|
AccountType::IMPORT,
|
||||||
|
AccountType::RECONCILIATION,
|
||||||
|
AccountType::LOAN,
|
||||||
|
],
|
||||||
|
'asset' => [
|
||||||
|
AccountType::DEFAULT,
|
||||||
|
AccountType::ASSET,
|
||||||
|
],
|
||||||
|
'cash' => [
|
||||||
|
AccountType::CASH,
|
||||||
|
],
|
||||||
|
'expense' => [
|
||||||
|
AccountType::EXPENSE,
|
||||||
|
AccountType::BENEFICIARY,
|
||||||
|
],
|
||||||
|
'revenue' => [
|
||||||
|
AccountType::REVENUE,
|
||||||
|
],
|
||||||
|
'special' => [
|
||||||
|
AccountType::CASH,
|
||||||
|
AccountType::INITIAL_BALANCE,
|
||||||
|
AccountType::IMPORT,
|
||||||
|
AccountType::RECONCILIATION,
|
||||||
|
AccountType::LOAN,
|
||||||
|
],
|
||||||
|
'hidden' => [
|
||||||
|
AccountType::INITIAL_BALANCE,
|
||||||
|
AccountType::IMPORT,
|
||||||
|
AccountType::RECONCILIATION,
|
||||||
|
AccountType::LOAN,
|
||||||
|
],
|
||||||
|
AccountType::DEFAULT => [AccountType::DEFAULT],
|
||||||
|
AccountType::CASH => [AccountType::CASH],
|
||||||
|
AccountType::ASSET => [AccountType::ASSET],
|
||||||
|
AccountType::EXPENSE => [AccountType::EXPENSE],
|
||||||
|
AccountType::REVENUE => [AccountType::REVENUE],
|
||||||
|
AccountType::INITIAL_BALANCE => [AccountType::INITIAL_BALANCE],
|
||||||
|
AccountType::BENEFICIARY => [AccountType::BENEFICIARY],
|
||||||
|
AccountType::IMPORT => [AccountType::IMPORT],
|
||||||
|
AccountType::RECONCILIATION => [AccountType::RECONCILIATION],
|
||||||
|
AccountType::LOAN => [AccountType::LOAN],
|
||||||
|
];
|
||||||
|
if (isset($types[$type])) {
|
||||||
|
return $types[$type];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $types['all']; // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
}
|
||||||
163
app/Api/V1/Controllers/BillController.php
Normal file
163
app/Api/V1/Controllers/BillController.php
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* BillController.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\BillRequest;
|
||||||
|
use FireflyIII\Models\Bill;
|
||||||
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Transformers\BillTransformer;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
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 Preferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BillController
|
||||||
|
*/
|
||||||
|
class BillController extends Controller
|
||||||
|
{
|
||||||
|
/** @var BillRepositoryInterface */
|
||||||
|
private $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BillController constructor.
|
||||||
|
*
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
/** @var BillRepositoryInterface repository */
|
||||||
|
$this->repository = app(BillRepositoryInterface::class);
|
||||||
|
$this->repository->setUser(auth()->user());
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param \FireflyIII\Models\Bill $bill
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function delete(Bill $bill)
|
||||||
|
{
|
||||||
|
$this->repository->destroy($bill);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$pageSize = intval(Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data);
|
||||||
|
$paginator = $this->repository->getPaginator($pageSize);
|
||||||
|
/** @var Collection $bills */
|
||||||
|
$bills = $paginator->getCollection();
|
||||||
|
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$resource = new FractalCollection($bills, new BillTransformer($this->parameters), 'bills');
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @param Bill $bill
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function show(Request $request, Bill $bill)
|
||||||
|
{
|
||||||
|
$manager = new Manager();
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param BillRequest $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function store(BillRequest $request)
|
||||||
|
{
|
||||||
|
$bill = $this->repository->store($request->getAll());
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param BillRequest $request
|
||||||
|
* @param Bill $bill
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function update(BillRequest $request, Bill $bill)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
$bill = $this->repository->update($bill, $data);
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
124
app/Api/V1/Controllers/Controller.php
Normal file
124
app/Api/V1/Controllers/Controller.php
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Controller.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Carbon\Exceptions\InvalidDateException;
|
||||||
|
use FireflyConfig;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||||
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
|
use Log;
|
||||||
|
use Symfony\Component\HttpFoundation\ParameterBag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Controller.
|
||||||
|
*
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*/
|
||||||
|
class Controller extends BaseController
|
||||||
|
{
|
||||||
|
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||||
|
|
||||||
|
/** @var ParameterBag */
|
||||||
|
protected $parameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller constructor.
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// is site a demo site?
|
||||||
|
$isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
|
||||||
|
|
||||||
|
// do not expose API on demo site:
|
||||||
|
if (true === $isDemoSite) {
|
||||||
|
throw new FireflyException('The API is not available on the demo site.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// get global parameters
|
||||||
|
$this->parameters = $this->getParameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function buildParams(): string
|
||||||
|
{
|
||||||
|
$return = '?';
|
||||||
|
$params = [];
|
||||||
|
foreach ($this->parameters as $key => $value) {
|
||||||
|
if ($key === 'page') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($value instanceof Carbon) {
|
||||||
|
$params[$key] = $value->format('Y-m-d');
|
||||||
|
}
|
||||||
|
if (!$value instanceof Carbon) {
|
||||||
|
$params[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$return .= http_build_query($params);
|
||||||
|
if (strlen($return) === 1) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ParameterBag
|
||||||
|
*/
|
||||||
|
private function getParameters(): ParameterBag
|
||||||
|
{
|
||||||
|
$bag = new ParameterBag;
|
||||||
|
$page = (int)request()->get('page');
|
||||||
|
if ($page === 0) {
|
||||||
|
$page = 1;
|
||||||
|
}
|
||||||
|
$bag->set('page', $page);
|
||||||
|
|
||||||
|
// some date fields:
|
||||||
|
$dates = ['start', 'end', 'date'];
|
||||||
|
foreach ($dates as $field) {
|
||||||
|
$date = request()->get($field);
|
||||||
|
$obj = null;
|
||||||
|
if (!is_null($date)) {
|
||||||
|
try {
|
||||||
|
$obj = new Carbon($date);
|
||||||
|
} catch (InvalidDateException $e) {
|
||||||
|
// don't care
|
||||||
|
Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$bag->set($field, $obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $bag;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
334
app/Api/V1/Controllers/TransactionController.php
Normal file
334
app/Api/V1/Controllers/TransactionController.php
Normal file
@@ -0,0 +1,334 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionController.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\TransactionRequest;
|
||||||
|
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
||||||
|
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
||||||
|
use FireflyIII\Helpers\Filter\NegativeAmountFilter;
|
||||||
|
use FireflyIII\Helpers\Filter\PositiveAmountFilter;
|
||||||
|
use FireflyIII\Models\Transaction;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
|
use FireflyIII\Transformers\TransactionTransformer;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use League\Fractal\Manager;
|
||||||
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||||
|
use League\Fractal\Resource\Collection as FractalCollection;
|
||||||
|
use League\Fractal\Serializer\JsonApiSerializer;
|
||||||
|
use Log;
|
||||||
|
use Preferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TransactionController
|
||||||
|
*/
|
||||||
|
class TransactionController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var JournalRepositoryInterface */
|
||||||
|
private $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TransactionController constructor.
|
||||||
|
*
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
/** @var JournalRepositoryInterface repository */
|
||||||
|
$this->repository = app(JournalRepositoryInterface::class);
|
||||||
|
$this->repository->setUser(auth()->user());
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param \FireflyIII\Models\Transaction $transaction
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function delete(Transaction $transaction)
|
||||||
|
{
|
||||||
|
$journal = $transaction->transactionJournal;
|
||||||
|
$this->repository->destroy($journal);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$pageSize = intval(Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data);
|
||||||
|
|
||||||
|
// read type from URI
|
||||||
|
$type = $request->get('type') ?? 'default';
|
||||||
|
$this->parameters->set('type', $type);
|
||||||
|
|
||||||
|
// types to get, page size:
|
||||||
|
$types = $this->mapTypes($this->parameters->get('type'));
|
||||||
|
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// collect transactions using the journal collector
|
||||||
|
$collector = app(JournalCollectorInterface::class);
|
||||||
|
$collector->setUser(auth()->user());
|
||||||
|
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
||||||
|
$collector->setAllAssetAccounts();
|
||||||
|
|
||||||
|
// remove internal transfer filter:
|
||||||
|
if (in_array(TransactionType::TRANSFER, $types)) {
|
||||||
|
$collector->removeFilter(InternalTransferFilter::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($this->parameters->get('start')) && !is_null($this->parameters->get('end'))) {
|
||||||
|
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
|
||||||
|
}
|
||||||
|
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
||||||
|
$collector->setTypes($types);
|
||||||
|
$paginator = $collector->getPaginatedJournals();
|
||||||
|
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
|
||||||
|
$transactions = $paginator->getCollection();
|
||||||
|
|
||||||
|
|
||||||
|
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @param Transaction $transaction
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function show(Request $request, Transaction $transaction)
|
||||||
|
{
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
// collect transactions using the journal collector
|
||||||
|
$collector = app(JournalCollectorInterface::class);
|
||||||
|
$collector->setUser(auth()->user());
|
||||||
|
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
||||||
|
// filter on specific journals.
|
||||||
|
$collector->setJournals(new Collection([$transaction->transactionJournal]));
|
||||||
|
|
||||||
|
// add filter to remove transactions:
|
||||||
|
$transactionType = $transaction->transactionJournal->transactionType->type;
|
||||||
|
if ($transactionType === TransactionType::WITHDRAWAL) {
|
||||||
|
$collector->addFilter(PositiveAmountFilter::class);
|
||||||
|
}
|
||||||
|
if (!($transactionType === TransactionType::WITHDRAWAL)) {
|
||||||
|
$collector->addFilter(NegativeAmountFilter::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
$transactions = $collector->getJournals();
|
||||||
|
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param TransactionRequest $request
|
||||||
|
*
|
||||||
|
* @param JournalRepositoryInterface $repository
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function store(TransactionRequest $request, JournalRepositoryInterface $repository)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
$data['user'] = auth()->user()->id;
|
||||||
|
$journal = $repository->store($data);
|
||||||
|
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
// collect transactions using the journal collector
|
||||||
|
$collector = app(JournalCollectorInterface::class);
|
||||||
|
$collector->setUser(auth()->user());
|
||||||
|
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
||||||
|
// filter on specific journals.
|
||||||
|
$collector->setJournals(new Collection([$journal]));
|
||||||
|
|
||||||
|
// add filter to remove transactions:
|
||||||
|
$transactionType = $journal->transactionType->type;
|
||||||
|
if ($transactionType === TransactionType::WITHDRAWAL) {
|
||||||
|
$collector->addFilter(PositiveAmountFilter::class);
|
||||||
|
}
|
||||||
|
if (!($transactionType === TransactionType::WITHDRAWAL)) {
|
||||||
|
$collector->addFilter(NegativeAmountFilter::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
$transactions = $collector->getJournals();
|
||||||
|
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param TransactionRequest $request
|
||||||
|
* @param JournalRepositoryInterface $repository
|
||||||
|
* @param Transaction $transaction
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function update(TransactionRequest $request, JournalRepositoryInterface $repository, Transaction $transaction)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
$data['user'] = auth()->user()->id;
|
||||||
|
|
||||||
|
Log::debug('Inside transaction update');
|
||||||
|
|
||||||
|
$journal = $repository->update($transaction->transactionJournal, $data);
|
||||||
|
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
// needs a lot of extra data to match the journal collector. Or just expand that one.
|
||||||
|
// collect transactions using the journal collector
|
||||||
|
$collector = app(JournalCollectorInterface::class);
|
||||||
|
$collector->setUser(auth()->user());
|
||||||
|
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
||||||
|
// filter on specific journals.
|
||||||
|
$collector->setJournals(new Collection([$journal]));
|
||||||
|
|
||||||
|
// add filter to remove transactions:
|
||||||
|
$transactionType = $journal->transactionType->type;
|
||||||
|
if ($transactionType === TransactionType::WITHDRAWAL) {
|
||||||
|
$collector->addFilter(PositiveAmountFilter::class);
|
||||||
|
}
|
||||||
|
if (!($transactionType === TransactionType::WITHDRAWAL)) {
|
||||||
|
$collector->addFilter(NegativeAmountFilter::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
$transactions = $collector->getJournals();
|
||||||
|
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function mapTypes(string $type): array
|
||||||
|
{
|
||||||
|
$types = [
|
||||||
|
'all' => [
|
||||||
|
TransactionType::WITHDRAWAL,
|
||||||
|
TransactionType::DEPOSIT,
|
||||||
|
TransactionType::TRANSFER,
|
||||||
|
TransactionType::OPENING_BALANCE,
|
||||||
|
TransactionType::RECONCILIATION,
|
||||||
|
],
|
||||||
|
'withdrawal' => [
|
||||||
|
TransactionType::WITHDRAWAL,
|
||||||
|
],
|
||||||
|
'withdrawals' => [
|
||||||
|
TransactionType::WITHDRAWAL,
|
||||||
|
],
|
||||||
|
'expense' => [
|
||||||
|
TransactionType::WITHDRAWAL,
|
||||||
|
],
|
||||||
|
'income' => [
|
||||||
|
TransactionType::DEPOSIT,
|
||||||
|
],
|
||||||
|
'deposit' => [
|
||||||
|
TransactionType::DEPOSIT,
|
||||||
|
],
|
||||||
|
'deposits' => [
|
||||||
|
TransactionType::DEPOSIT,
|
||||||
|
],
|
||||||
|
'transfer' => [
|
||||||
|
TransactionType::TRANSFER,
|
||||||
|
],
|
||||||
|
'transfers' => [
|
||||||
|
TransactionType::TRANSFER,
|
||||||
|
],
|
||||||
|
'opening_balance' => [
|
||||||
|
TransactionType::OPENING_BALANCE,
|
||||||
|
],
|
||||||
|
'reconciliation' => [
|
||||||
|
TransactionType::RECONCILIATION,
|
||||||
|
],
|
||||||
|
'reconciliations' => [
|
||||||
|
TransactionType::RECONCILIATION,
|
||||||
|
],
|
||||||
|
'special' => [
|
||||||
|
TransactionType::OPENING_BALANCE,
|
||||||
|
TransactionType::RECONCILIATION,
|
||||||
|
],
|
||||||
|
'specials' => [
|
||||||
|
TransactionType::OPENING_BALANCE,
|
||||||
|
TransactionType::RECONCILIATION,
|
||||||
|
],
|
||||||
|
'default' => [
|
||||||
|
TransactionType::WITHDRAWAL,
|
||||||
|
TransactionType::DEPOSIT,
|
||||||
|
TransactionType::TRANSFER,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
if (isset($types[$type])) {
|
||||||
|
return $types[$type];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $types['default']; // @codeCoverageIgnore
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
193
app/Api/V1/Controllers/UserController.php
Normal file
193
app/Api/V1/Controllers/UserController.php
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* UserController.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\UserRequest;
|
||||||
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
|
use FireflyIII\Transformers\UserTransformer;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
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 Preferences;
|
||||||
|
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class UserController
|
||||||
|
*/
|
||||||
|
class UserController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var UserRepositoryInterface */
|
||||||
|
private $repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UserController constructor.
|
||||||
|
*
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
/** @var UserRepositoryInterface repository */
|
||||||
|
$this->repository = app(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param \FireflyIII\User $user
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
* @throws \Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException
|
||||||
|
*/
|
||||||
|
public function delete(User $user)
|
||||||
|
{
|
||||||
|
if (auth()->user()->hasRole('owner')) {
|
||||||
|
$this->repository->destroy($user);
|
||||||
|
|
||||||
|
return response()->json([], 204);
|
||||||
|
}
|
||||||
|
throw new AccessDeniedException(''); // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
// user preferences
|
||||||
|
$pageSize = intval(Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data);
|
||||||
|
|
||||||
|
// make manager
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// build collection
|
||||||
|
$collection = $this->repository->all();
|
||||||
|
$count = $collection->count();
|
||||||
|
$users = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
// make paginator:
|
||||||
|
$paginator = new LengthAwarePaginator($users, $count, $pageSize, $this->parameters->get('page'));
|
||||||
|
$paginator->setPath(route('api.v1.users.index') . $this->buildParams());
|
||||||
|
|
||||||
|
// make resource
|
||||||
|
$resource = new FractalCollection($users, new UserTransformer($this->parameters), 'users');
|
||||||
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @param User $user
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function show(Request $request, User $user)
|
||||||
|
{
|
||||||
|
// make manager
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
// make resource
|
||||||
|
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param UserRequest $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function store(UserRequest $request)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
$user = $this->repository->store($data);
|
||||||
|
|
||||||
|
// make manager
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
// make resource
|
||||||
|
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param UserRequest $request
|
||||||
|
* @param User $user
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function update(UserRequest $request, User $user)
|
||||||
|
{
|
||||||
|
$data = $request->getAll();
|
||||||
|
$user = $this->repository->update($user, $data);
|
||||||
|
|
||||||
|
// make manager
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
// add include parameter:
|
||||||
|
$include = $request->get('include') ?? '';
|
||||||
|
$manager->parseIncludes($include);
|
||||||
|
|
||||||
|
// make resource
|
||||||
|
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
|
||||||
|
|
||||||
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
107
app/Api/V1/Requests/AccountRequest.php
Normal file
107
app/Api/V1/Requests/AccountRequest.php
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* AccountRequest.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class AccountRequest
|
||||||
|
*/
|
||||||
|
class AccountRequest extends Request
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
// Only allow authenticated users
|
||||||
|
return auth()->check();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'name' => $this->string('name'),
|
||||||
|
'active' => $this->boolean('active'),
|
||||||
|
'accountType' => $this->string('type'),
|
||||||
|
'account_type_id' => null,
|
||||||
|
'currency_id' => $this->integer('currency_id'),
|
||||||
|
'currency_code' => $this->string('currency_code'),
|
||||||
|
'virtualBalance' => $this->string('virtual_balance'),
|
||||||
|
'iban' => $this->string('iban'),
|
||||||
|
'BIC' => $this->string('bic'),
|
||||||
|
'accountNumber' => $this->string('account_number'),
|
||||||
|
'accountRole' => $this->string('account_role'),
|
||||||
|
'openingBalance' => $this->string('opening_balance'),
|
||||||
|
'openingBalanceDate' => $this->date('opening_balance_date'),
|
||||||
|
'ccType' => $this->string('cc_type'),
|
||||||
|
'ccMonthlyPaymentDate' => $this->string('cc_monthly_payment_date'),
|
||||||
|
'notes' => $this->string('notes'),
|
||||||
|
];
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$accountRoles = implode(',', config('firefly.accountRoles'));
|
||||||
|
$types = implode(',', array_keys(config('firefly.subTitlesByIdentifier')));
|
||||||
|
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
|
||||||
|
$rules = [
|
||||||
|
'name' => 'required|min:1|uniqueAccountForUser',
|
||||||
|
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
|
||||||
|
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
|
||||||
|
'iban' => 'iban|nullable',
|
||||||
|
'bic' => 'bic|nullable',
|
||||||
|
'virtual_balance' => 'numeric|nullable',
|
||||||
|
'currency_id' => 'numeric|exists:transaction_currencies,id|required_without:currency_code',
|
||||||
|
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code|required_without:currency_id',
|
||||||
|
'account_number' => 'between:1,255|nullable|uniqueAccountNumberForUser',
|
||||||
|
'account_role' => 'in:' . $accountRoles . '|required_if:type,asset',
|
||||||
|
'active' => 'required|boolean',
|
||||||
|
'cc_type' => 'in:' . $ccPaymentTypes . '|required_if:account_role,ccAsset',
|
||||||
|
'cc_monthly_payment_date' => 'date' . '|required_if:account_role,ccAsset|required_if:cc_type,monthlyFull',
|
||||||
|
'type' => 'required|in:' . $types,
|
||||||
|
'notes' => 'min:0|max:65536',
|
||||||
|
];
|
||||||
|
switch ($this->method()) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case 'PUT':
|
||||||
|
case 'PATCH':
|
||||||
|
$account = $this->route()->parameter('account');
|
||||||
|
$rules['name'] .= ':' . $account->id;
|
||||||
|
$rules['account_number'] .= ':' . $account->id;
|
||||||
|
$rules['type'] = 'in:' . $types;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rules;
|
||||||
|
}
|
||||||
|
}
|
||||||
119
app/Api/V1/Requests/BillRequest.php
Normal file
119
app/Api/V1/Requests/BillRequest.php
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* BillRequest.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BillRequest
|
||||||
|
*/
|
||||||
|
class BillRequest extends Request
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
// Only allow authenticated users
|
||||||
|
return auth()->check();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'name' => $this->string('name'),
|
||||||
|
'match' => $this->string('match'),
|
||||||
|
'amount_min' => $this->string('amount_min'),
|
||||||
|
'amount_max' => $this->string('amount_max'),
|
||||||
|
//'currency_id' => $this->integer('currency_id'),
|
||||||
|
//'currency_code' => $this->string('currency_code'),
|
||||||
|
'date' => $this->date('date'),
|
||||||
|
'repeat_freq' => $this->string('repeat_freq'),
|
||||||
|
'skip' => $this->integer('skip'),
|
||||||
|
'automatch' => $this->boolean('automatch'),
|
||||||
|
'active' => $this->boolean('active'),
|
||||||
|
'notes' => $this->string('notes'),
|
||||||
|
];
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
'name' => 'required|between:1,255|uniqueObjectForUser:bills,name',
|
||||||
|
'match' => 'required|between:1,255|uniqueObjectForUser:bills,match',
|
||||||
|
'amount_min' => 'required|numeric|more:0',
|
||||||
|
'amount_max' => 'required|numeric|more:0',
|
||||||
|
//'currency_id' => 'numeric|exists:transaction_currencies,id|required_without:currency_code',
|
||||||
|
//'currency_code' => 'min:3|max:3|exists:transaction_currencies,code|required_without:currency_id',
|
||||||
|
'date' => 'required|date',
|
||||||
|
'repeat_freq' => 'required|in:weekly,monthly,quarterly,half-year,yearly',
|
||||||
|
'skip' => 'required|between:0,31',
|
||||||
|
'automatch' => 'required|boolean',
|
||||||
|
'active' => 'required|boolean',
|
||||||
|
'notes' => 'between:1,65536',
|
||||||
|
];
|
||||||
|
switch ($this->method()) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case 'PUT':
|
||||||
|
case 'PATCH':
|
||||||
|
$bill = $this->route()->parameter('bill');
|
||||||
|
$rules['name'] .= ',' . $bill->id;
|
||||||
|
$rules['match'] .= ',' . $bill->id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rules;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the validator instance.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$validator->after(
|
||||||
|
function (Validator $validator) {
|
||||||
|
$data = $validator->getData();
|
||||||
|
$min = floatval($data['amount_min'] ?? 0);
|
||||||
|
$max = floatval($data['amount_max'] ?? 0);
|
||||||
|
if ($min > $max) {
|
||||||
|
$validator->errors()->add('amount_min', trans('validation.amount_min_over_max'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
33
app/Api/V1/Requests/Request.php
Normal file
33
app/Api/V1/Requests/Request.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Request.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests;
|
||||||
|
|
||||||
|
use FireflyIII\Http\Requests\Request as FireflyIIIRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Request.
|
||||||
|
*/
|
||||||
|
class Request extends FireflyIIIRequest
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
514
app/Api/V1/Requests/TransactionRequest.php
Normal file
514
app/Api/V1/Requests/TransactionRequest.php
Normal file
@@ -0,0 +1,514 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionRequest.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests;
|
||||||
|
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Models\Transaction;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Rules\BelongsUser;
|
||||||
|
use Illuminate\Validation\Validator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TransactionRequest
|
||||||
|
*/
|
||||||
|
class TransactionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
// Only allow authenticated users
|
||||||
|
return auth()->check();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
// basic fields for journal:
|
||||||
|
'type' => $this->string('type'),
|
||||||
|
'date' => $this->date('date'),
|
||||||
|
'description' => $this->string('description'),
|
||||||
|
'piggy_bank_id' => $this->integer('piggy_bank_id'),
|
||||||
|
'piggy_bank_name' => $this->string('piggy_bank_name'),
|
||||||
|
'bill_id' => $this->integer('bill_id'),
|
||||||
|
'bill_name' => $this->string('bill_name'),
|
||||||
|
'tags' => explode(',', $this->string('tags')),
|
||||||
|
|
||||||
|
// then, custom fields for journal
|
||||||
|
'interest_date' => $this->date('interest_date'),
|
||||||
|
'book_date' => $this->date('book_date'),
|
||||||
|
'process_date' => $this->date('process_date'),
|
||||||
|
'due_date' => $this->date('due_date'),
|
||||||
|
'payment_date' => $this->date('payment_date'),
|
||||||
|
'invoice_date' => $this->date('invoice_date'),
|
||||||
|
'internal_reference' => $this->string('internal_reference'),
|
||||||
|
'notes' => $this->string('notes'),
|
||||||
|
|
||||||
|
// then, transactions (see below).
|
||||||
|
'transactions' => [],
|
||||||
|
|
||||||
|
];
|
||||||
|
foreach ($this->get('transactions') as $index => $transaction) {
|
||||||
|
$array = [
|
||||||
|
'description' => $transaction['description'] ?? null,
|
||||||
|
'amount' => $transaction['amount'],
|
||||||
|
'currency_id' => isset($transaction['currency_id']) ? intval($transaction['currency_id']) : null,
|
||||||
|
'currency_code' => isset($transaction['currency_code']) ? $transaction['currency_code'] : null,
|
||||||
|
'foreign_amount' => $transaction['foreign_amount'] ?? null,
|
||||||
|
'foreign_currency_id' => isset($transaction['foreign_currency_id']) ? intval($transaction['foreign_currency_id']) : null,
|
||||||
|
'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null,
|
||||||
|
'budget_id' => isset($transaction['budget_id']) ? intval($transaction['budget_id']) : null,
|
||||||
|
'budget_name' => $transaction['budget_name'] ?? null,
|
||||||
|
'category_id' => isset($transaction['category_id']) ? intval($transaction['category_id']) : null,
|
||||||
|
'category_name' => $transaction['category_name'] ?? null,
|
||||||
|
'source_id' => isset($transaction['source_id']) ? intval($transaction['source_id']) : null,
|
||||||
|
'source_name' => isset($transaction['source_name']) ? strval($transaction['source_name']) : null,
|
||||||
|
'destination_id' => isset($transaction['destination_id']) ? intval($transaction['destination_id']) : null,
|
||||||
|
'destination_name' => isset($transaction['destination_name']) ? strval($transaction['destination_name']) : null,
|
||||||
|
'reconciled' => $transaction['reconciled'] ?? false,
|
||||||
|
'identifier' => $index,
|
||||||
|
];
|
||||||
|
$data['transactions'][] = $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
// basic fields for journal:
|
||||||
|
'type' => 'required|in:withdrawal,deposit,transfer',
|
||||||
|
'date' => 'required|date',
|
||||||
|
'description' => 'between:1,255',
|
||||||
|
'piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser],
|
||||||
|
'piggy_bank_name' => ['between:1,255', 'nullable', new BelongsUser],
|
||||||
|
'bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser],
|
||||||
|
'bill_name' => ['between:1,255', 'nullable', new BelongsUser],
|
||||||
|
'tags' => 'between:1,255',
|
||||||
|
|
||||||
|
// then, custom fields for journal
|
||||||
|
'interest_date' => 'date|nullable',
|
||||||
|
'book_date' => 'date|nullable',
|
||||||
|
'process_date' => 'date|nullable',
|
||||||
|
'due_date' => 'date|nullable',
|
||||||
|
'payment_date' => 'date|nullable',
|
||||||
|
'invoice_date' => 'date|nullable',
|
||||||
|
'internal_reference' => 'min:1,max:255|nullable',
|
||||||
|
'notes' => 'min:1,max:50000|nullable',
|
||||||
|
|
||||||
|
// transaction rules (in array for splits):
|
||||||
|
'transactions.*.description' => 'nullable|between:1,255',
|
||||||
|
'transactions.*.amount' => 'required|numeric|more:0',
|
||||||
|
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|required_without:transactions.*.currency_code',
|
||||||
|
'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code|required_without:transactions.*.currency_id',
|
||||||
|
'transactions.*.foreign_amount' => 'numeric|more:0',
|
||||||
|
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id',
|
||||||
|
'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
|
||||||
|
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser],
|
||||||
|
'transactions.*.budget_name' => ['between:1,255', 'nullable', new BelongsUser],
|
||||||
|
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser],
|
||||||
|
'transactions.*.category_name' => 'between:1,255|nullable',
|
||||||
|
'transactions.*.reconciled' => 'boolean|nullable',
|
||||||
|
// basic rules will be expanded later.
|
||||||
|
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser],
|
||||||
|
'transactions.*.source_name' => 'between:1,255|nullable',
|
||||||
|
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser],
|
||||||
|
'transactions.*.destination_name' => 'between:1,255|nullable',
|
||||||
|
];
|
||||||
|
|
||||||
|
switch ($this->method()) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case 'PUT':
|
||||||
|
case 'PATCH':
|
||||||
|
unset($rules['type'], $rules['piggy_bank_id'], $rules['piggy_bank_name']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rules;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the validator instance.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$validator->after(
|
||||||
|
function (Validator $validator) {
|
||||||
|
$this->atLeastOneTransaction($validator);
|
||||||
|
$this->checkValidDescriptions($validator);
|
||||||
|
$this->equalToJournalDescription($validator);
|
||||||
|
$this->emptySplitDescriptions($validator);
|
||||||
|
$this->foreignCurrencyInformation($validator);
|
||||||
|
$this->validateAccountInformation($validator);
|
||||||
|
$this->validateSplitAccounts($validator);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an error when this asset account is invalid.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
* @param int|null $accountId
|
||||||
|
* @param null|string $accountName
|
||||||
|
* @param string $idField
|
||||||
|
* @param string $nameField
|
||||||
|
*
|
||||||
|
* @return null|Account
|
||||||
|
*/
|
||||||
|
protected function assetAccountExists(Validator $validator, ?int $accountId, ?string $accountName, string $idField, string $nameField): ?Account
|
||||||
|
{
|
||||||
|
|
||||||
|
$accountId = intval($accountId);
|
||||||
|
$accountName = strval($accountName);
|
||||||
|
// both empty? hard exit.
|
||||||
|
if ($accountId < 1 && strlen($accountName) === 0) {
|
||||||
|
$validator->errors()->add($idField, trans('validation.filled', ['attribute' => $idField]));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// ID belongs to user and is asset account:
|
||||||
|
/** @var AccountRepositoryInterface $repository */
|
||||||
|
$repository = app(AccountRepositoryInterface::class);
|
||||||
|
$repository->setUser(auth()->user());
|
||||||
|
$set = $repository->getAccountsById([$accountId]);
|
||||||
|
if ($set->count() === 1) {
|
||||||
|
/** @var Account $first */
|
||||||
|
$first = $set->first();
|
||||||
|
if ($first->accountType->type !== AccountType::ASSET) {
|
||||||
|
$validator->errors()->add($idField, trans('validation.belongs_user'));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we ignore the account name at this point.
|
||||||
|
return $first;
|
||||||
|
}
|
||||||
|
|
||||||
|
$account = $repository->findByNameNull($accountName, [AccountType::ASSET]);
|
||||||
|
if (is_null($account)) {
|
||||||
|
$validator->errors()->add($nameField, trans('validation.belongs_user'));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $account;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an error to the validator when there are no transactions in the array of data.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*/
|
||||||
|
protected function atLeastOneTransaction(Validator $validator): void
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactions = $data['transactions'] ?? [];
|
||||||
|
// need at least one transaction
|
||||||
|
if (count($transactions) === 0) {
|
||||||
|
$validator->errors()->add('description', trans('validation.at_least_one_transaction'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an error to the "description" field when the user has submitted no descriptions and no
|
||||||
|
* journal description.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*/
|
||||||
|
protected function checkValidDescriptions(Validator $validator)
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactions = $data['transactions'] ?? [];
|
||||||
|
$journalDescription = strval($data['description'] ?? '');
|
||||||
|
$validDescriptions = 0;
|
||||||
|
foreach ($transactions as $index => $transaction) {
|
||||||
|
if (strlen(strval($transaction['description'] ?? '')) > 0) {
|
||||||
|
$validDescriptions++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no valid descriptions and empty journal description? error.
|
||||||
|
if ($validDescriptions === 0 && strlen($journalDescription) === 0) {
|
||||||
|
$validator->errors()->add('description', trans('validation.filled', ['attribute' => trans('validation.attributes.description')]));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an error to the validator when the user submits a split transaction (more than 1 transactions)
|
||||||
|
* but does not give them a description.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*/
|
||||||
|
protected function emptySplitDescriptions(Validator $validator): void
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactions = $data['transactions'] ?? [];
|
||||||
|
foreach ($transactions as $index => $transaction) {
|
||||||
|
$description = strval($transaction['description'] ?? '');
|
||||||
|
// filled description is mandatory for split transactions.
|
||||||
|
if (count($transactions) > 1 && strlen($description) === 0) {
|
||||||
|
$validator->errors()->add(
|
||||||
|
'transactions.' . $index . '.description',
|
||||||
|
trans('validation.filled', ['attribute' => trans('validation.attributes.transaction_description')])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an error to the validator when any transaction descriptions are equal to the journal description.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*/
|
||||||
|
protected function equalToJournalDescription(Validator $validator): void
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactions = $data['transactions'] ?? [];
|
||||||
|
$journalDescription = strval($data['description'] ?? '');
|
||||||
|
foreach ($transactions as $index => $transaction) {
|
||||||
|
$description = strval($transaction['description'] ?? '');
|
||||||
|
// description cannot be equal to journal description.
|
||||||
|
if ($description === $journalDescription) {
|
||||||
|
$validator->errors()->add('transactions.' . $index . '.description', trans('validation.equal_description'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the transactions contain foreign amounts, there must also be foreign currency information.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*/
|
||||||
|
protected function foreignCurrencyInformation(Validator $validator): void
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactions = $data['transactions'] ?? [];
|
||||||
|
foreach ($transactions as $index => $transaction) {
|
||||||
|
// must have currency info.
|
||||||
|
if (isset($transaction['foreign_amount'])
|
||||||
|
&& !(isset($transaction['foreign_currency_id'])
|
||||||
|
|| isset($transaction['foreign_currency_code']))) {
|
||||||
|
$validator->errors()->add(
|
||||||
|
'transactions.' . $index . '.foreign_amount',
|
||||||
|
trans('validation.require_currency_info')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an error when the given opposing account (of type $type) is invalid.
|
||||||
|
* Empty data is allowed, system will default to cash.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
* @param string $type
|
||||||
|
* @param int|null $accountId
|
||||||
|
* @param null|string $accountName
|
||||||
|
* @param string $idField
|
||||||
|
*
|
||||||
|
* @return null|Account
|
||||||
|
*/
|
||||||
|
protected function opposingAccountExists(Validator $validator, string $type, ?int $accountId, ?string $accountName, string $idField): ?Account
|
||||||
|
{
|
||||||
|
$accountId = intval($accountId);
|
||||||
|
$accountName = strval($accountName);
|
||||||
|
// both empty? done!
|
||||||
|
if ($accountId < 1 && strlen($accountName) === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ($accountId !== 0) {
|
||||||
|
// ID belongs to user and is $type account:
|
||||||
|
/** @var AccountRepositoryInterface $repository */
|
||||||
|
$repository = app(AccountRepositoryInterface::class);
|
||||||
|
$repository->setUser(auth()->user());
|
||||||
|
$set = $repository->getAccountsById([$accountId]);
|
||||||
|
if ($set->count() === 1) {
|
||||||
|
/** @var Account $first */
|
||||||
|
$first = $set->first();
|
||||||
|
if ($first->accountType->type !== $type) {
|
||||||
|
$validator->errors()->add($idField, trans('validation.belongs_user'));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we ignore the account name at this point.
|
||||||
|
return $first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// not having an opposing account by this name is NOT a problem.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the given account information. Switches on given transaction type.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
protected function validateAccountInformation(Validator $validator): void
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactions = $data['transactions'] ?? [];
|
||||||
|
if (!isset($data['type'])) {
|
||||||
|
// the journal may exist in the request:
|
||||||
|
/** @var Transaction $transaction */
|
||||||
|
$transaction = $this->route()->parameter('transaction');
|
||||||
|
if (is_null($transaction)) {
|
||||||
|
return; // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
$data['type'] = strtolower($transaction->transactionJournal->transactionType->type);
|
||||||
|
}
|
||||||
|
foreach ($transactions as $index => $transaction) {
|
||||||
|
$sourceId = isset($transaction['source_id']) ? intval($transaction['source_id']) : null;
|
||||||
|
$sourceName = $transaction['source_name'] ?? null;
|
||||||
|
$destinationId = isset($transaction['destination_id']) ? intval($transaction['destination_id']) : null;
|
||||||
|
$destinationName = $transaction['destination_name'] ?? null;
|
||||||
|
$sourceAccount = null;
|
||||||
|
$destinationAccount = null;
|
||||||
|
switch ($data['type']) {
|
||||||
|
case 'withdrawal':
|
||||||
|
$idField = 'transactions.' . $index . '.source_id';
|
||||||
|
$nameField = 'transactions.' . $index . '.source_name';
|
||||||
|
$sourceAccount = $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField);
|
||||||
|
$idField = 'transactions.' . $index . '.destination_id';
|
||||||
|
$destinationAccount = $this->opposingAccountExists($validator, AccountType::EXPENSE, $destinationId, $destinationName, $idField);
|
||||||
|
break;
|
||||||
|
case 'deposit':
|
||||||
|
$idField = 'transactions.' . $index . '.source_id';
|
||||||
|
$sourceAccount = $this->opposingAccountExists($validator, AccountType::REVENUE, $sourceId, $sourceName, $idField);
|
||||||
|
|
||||||
|
$idField = 'transactions.' . $index . '.destination_id';
|
||||||
|
$nameField = 'transactions.' . $index . '.destination_name';
|
||||||
|
$destinationAccount = $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField);
|
||||||
|
break;
|
||||||
|
case 'transfer':
|
||||||
|
$idField = 'transactions.' . $index . '.source_id';
|
||||||
|
$nameField = 'transactions.' . $index . '.source_name';
|
||||||
|
$sourceAccount = $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField);
|
||||||
|
|
||||||
|
$idField = 'transactions.' . $index . '.destination_id';
|
||||||
|
$nameField = 'transactions.' . $index . '.destination_name';
|
||||||
|
$destinationAccount = $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
throw new FireflyException(
|
||||||
|
sprintf('The validator cannot handle transaction type "%s" in validateAccountInformation().', $data['type'])
|
||||||
|
);
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
|
||||||
|
}
|
||||||
|
// add some errors in case of same account submitted:
|
||||||
|
if (null !== $sourceAccount && null !== $destinationAccount && $sourceAccount->id === $destinationAccount->id) {
|
||||||
|
$validator->errors()->add($idField, trans('validation.source_equals_destination'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Validator $validator
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
protected function validateSplitAccounts(Validator $validator)
|
||||||
|
{
|
||||||
|
$data = $validator->getData();
|
||||||
|
$count = isset($data['transactions']) ? count($data['transactions']) : 0;
|
||||||
|
if ($count < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// this is pretty much impossible:
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
if (!isset($data['type'])) {
|
||||||
|
// the journal may exist in the request:
|
||||||
|
/** @var Transaction $transaction */
|
||||||
|
$transaction = $this->route()->parameter('transaction');
|
||||||
|
if (null === $transaction) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$data['type'] = strtolower($transaction->transactionJournal->transactionType->type);
|
||||||
|
}
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
|
||||||
|
// collect all source ID's and destination ID's, if present:
|
||||||
|
$sources = [];
|
||||||
|
$destinations = [];
|
||||||
|
|
||||||
|
foreach ($data['transactions'] as $transaction) {
|
||||||
|
$sources[] = isset($transaction['source_id']) ? intval($transaction['source_id']) : 0;
|
||||||
|
$destinations[] = isset($transaction['destination_id']) ? intval($transaction['destination_id']) : 0;
|
||||||
|
}
|
||||||
|
$destinations = array_unique($destinations);
|
||||||
|
$sources = array_unique($sources);
|
||||||
|
// switch on type:
|
||||||
|
switch ($data['type']) {
|
||||||
|
case 'withdrawal':
|
||||||
|
if (count($sources) > 1) {
|
||||||
|
$validator->errors()->add('transactions.0.source_id', trans('validation.all_accounts_equal'));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'deposit':
|
||||||
|
if (count($destinations) > 1) {
|
||||||
|
$validator->errors()->add('transactions.0.destination_id', trans('validation.all_accounts_equal'));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'transfer':
|
||||||
|
if (count($sources) > 1 || count($destinations) > 1) {
|
||||||
|
$validator->errors()->add('transactions.0.source_id', trans('validation.all_accounts_equal'));
|
||||||
|
$validator->errors()->add('transactions.0.destination_id', trans('validation.all_accounts_equal'));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
throw new FireflyException(
|
||||||
|
sprintf('The validator cannot handle transaction type "%s" in validateSplitAccounts().', $data['type'])
|
||||||
|
);
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
89
app/Api/V1/Requests/UserRequest.php
Normal file
89
app/Api/V1/Requests/UserRequest.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* UserRequest.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Api\V1\Requests;
|
||||||
|
|
||||||
|
use FireflyIII\User;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class UserRequest
|
||||||
|
*/
|
||||||
|
class UserRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
// Only allow authenticated users
|
||||||
|
if (!auth()->check()) {
|
||||||
|
return false; // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
/** @var User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
if (!$user->hasRole('owner')) {
|
||||||
|
return false; // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAll(): array
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'email' => $this->string('email'),
|
||||||
|
'blocked' => $this->boolean('blocked'),
|
||||||
|
'blocked_code' => $this->string('blocked_code'),
|
||||||
|
];
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
'email' => 'required|email|unique:users,email,',
|
||||||
|
'blocked' => 'required|boolean',
|
||||||
|
'blocked_code' => 'in:email_changed',
|
||||||
|
];
|
||||||
|
switch ($this->method()) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case 'PUT':
|
||||||
|
case 'PATCH':
|
||||||
|
$user = $this->route()->parameter('user');
|
||||||
|
$rules['email'] = 'required|email|unique:users,email,' . $user->id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rules;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* CreateExport.php
|
* CreateExport.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
@@ -60,17 +60,6 @@ class CreateExport extends Command
|
|||||||
{--with_uploads : Include user\'s uploads?}';
|
{--with_uploads : Include user\'s uploads?}';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new command instance.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five its fine.
|
|
||||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
|
||||||
*
|
|
||||||
* Execute the console command.
|
* Execute the console command.
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -80,7 +69,7 @@ class CreateExport extends Command
|
|||||||
if (!$this->verifyAccessToken()) {
|
if (!$this->verifyAccessToken()) {
|
||||||
$this->error('Invalid access token.');
|
$this->error('Invalid access token.');
|
||||||
|
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
$this->line('Full export is running...');
|
$this->line('Full export is running...');
|
||||||
// make repositories
|
// make repositories
|
||||||
@@ -94,7 +83,7 @@ class CreateExport extends Command
|
|||||||
$journalRepository = app(JournalRepositoryInterface::class);
|
$journalRepository = app(JournalRepositoryInterface::class);
|
||||||
|
|
||||||
// set user
|
// set user
|
||||||
$user = $userRepository->find(intval($this->option('user')));
|
$user = $userRepository->findNull((int)$this->option('user'));
|
||||||
$jobRepository->setUser($user);
|
$jobRepository->setUser($user);
|
||||||
$journalRepository->setUser($user);
|
$journalRepository->setUser($user);
|
||||||
$accountRepository->setUser($user);
|
$accountRepository->setUser($user);
|
||||||
@@ -140,7 +129,5 @@ class CreateExport extends Command
|
|||||||
|
|
||||||
$this->line('The export has finished! You can find the ZIP file in this location:');
|
$this->line('The export has finished! You can find the ZIP file in this location:');
|
||||||
$this->line(storage_path(sprintf('export/%s', $fileName)));
|
$this->line(storage_path(sprintf('export/%s', $fileName)));
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* CreateImport.php
|
* CreateImport.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,20 +19,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
use Artisan;
|
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Import\Logging\CommandHandler;
|
|
||||||
use FireflyIII\Import\Routine\RoutineInterface;
|
use FireflyIII\Import\Routine\RoutineInterface;
|
||||||
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
|
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
|
||||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
|
use FireflyIII\Services\Internal\File\EncryptService;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Illuminate\Support\MessageBag;
|
use Illuminate\Support\MessageBag;
|
||||||
use Log;
|
use Log;
|
||||||
use Monolog\Formatter\LineFormatter;
|
|
||||||
use Preferences;
|
use Preferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,76 +59,67 @@ class CreateImport extends Command
|
|||||||
{--token= : The user\'s access token.}
|
{--token= : The user\'s access token.}
|
||||||
{--start : Starts the job immediately.}';
|
{--start : Starts the job immediately.}';
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command instance.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the command.
|
* Run the command.
|
||||||
*
|
*
|
||||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped
|
* @noinspection MultipleReturnStatementsInspection
|
||||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly.
|
|
||||||
*
|
*
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle(): int
|
||||||
{
|
{
|
||||||
if (!$this->verifyAccessToken()) {
|
if (!$this->verifyAccessToken()) {
|
||||||
$this->error('Invalid access token.');
|
$this->errorLine('Invalid access token.');
|
||||||
|
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
/** @var UserRepositoryInterface $userRepository */
|
/** @var UserRepositoryInterface $userRepository */
|
||||||
$userRepository = app(UserRepositoryInterface::class);
|
$userRepository = app(UserRepositoryInterface::class);
|
||||||
$file = $this->argument('file');
|
$file = $this->argument('file');
|
||||||
$configuration = $this->argument('configuration');
|
$configuration = $this->argument('configuration');
|
||||||
$user = $userRepository->find(intval($this->option('user')));
|
$user = $userRepository->findNull((int)$this->option('user'));
|
||||||
$cwd = getcwd();
|
$cwd = getcwd();
|
||||||
$type = strtolower($this->option('type'));
|
$type = strtolower($this->option('type'));
|
||||||
|
|
||||||
if (!$this->validArguments()) {
|
if (!$this->validArguments()) {
|
||||||
return;
|
$this->errorLine('Invalid arguments.');
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$configurationData = json_decode(file_get_contents($configuration), true);
|
$configurationData = json_decode(file_get_contents($configuration), true);
|
||||||
if (null === $configurationData) {
|
if (null === $configurationData) {
|
||||||
$this->error(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd));
|
$this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd));
|
||||||
|
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->line(sprintf('Going to create a job to import file: %s', $file));
|
$this->infoLine(sprintf('Going to create a job to import file: %s', $file));
|
||||||
$this->line(sprintf('Using configuration file: %s', $configuration));
|
$this->infoLine(sprintf('Using configuration file: %s', $configuration));
|
||||||
$this->line(sprintf('Import into user: #%d (%s)', $user->id, $user->email));
|
$this->infoLine(sprintf('Import into user: #%d (%s)', $user->id, $user->email));
|
||||||
$this->line(sprintf('Type of import: %s', $type));
|
$this->infoLine(sprintf('Type of import: %s', $type));
|
||||||
|
|
||||||
/** @var ImportJobRepositoryInterface $jobRepository */
|
/** @var ImportJobRepositoryInterface $jobRepository */
|
||||||
$jobRepository = app(ImportJobRepositoryInterface::class);
|
$jobRepository = app(ImportJobRepositoryInterface::class);
|
||||||
$jobRepository->setUser($user);
|
$jobRepository->setUser($user);
|
||||||
$job = $jobRepository->create($type);
|
$job = $jobRepository->create($type);
|
||||||
$this->line(sprintf('Created job "%s"', $job->key));
|
$this->infoLine(sprintf('Created job "%s"', $job->key));
|
||||||
|
|
||||||
Artisan::call('firefly:encrypt-file', ['file' => $file, 'key' => $job->key]);
|
/** @var EncryptService $service */
|
||||||
$this->line('Stored import data...');
|
$service = app(EncryptService::class);
|
||||||
|
$service->encrypt($file, $job->key);
|
||||||
|
|
||||||
|
$this->infoLine('Stored import data...');
|
||||||
|
|
||||||
$jobRepository->setConfiguration($job, $configurationData);
|
$jobRepository->setConfiguration($job, $configurationData);
|
||||||
$jobRepository->updateStatus($job, 'configured');
|
$jobRepository->updateStatus($job, 'configured');
|
||||||
$this->line('Stored configuration...');
|
$this->infoLine('Stored configuration...');
|
||||||
|
|
||||||
if (true === $this->option('start')) {
|
if (true === $this->option('start')) {
|
||||||
$this->line('The import will start in a moment. This process is not visible...');
|
$this->infoLine('The import will start in a moment. This process is not visible...');
|
||||||
Log::debug('Go for import!');
|
Log::debug('Go for import!');
|
||||||
|
|
||||||
// normally would refer to other firefly:start-import but that doesn't seem to work all to well...
|
// normally would refer to other firefly:start-import but that doesn't seem to work all to well...
|
||||||
$monolog = Log::getMonolog();
|
|
||||||
$handler = new CommandHandler($this);
|
|
||||||
$formatter = new LineFormatter(null, null, false, true);
|
|
||||||
$handler->setFormatter($formatter);
|
|
||||||
$monolog->pushHandler($handler);
|
|
||||||
|
|
||||||
// start the actual routine:
|
// start the actual routine:
|
||||||
$type = 'csv' === $job->file_type ? 'file' : $job->file_type;
|
$type = 'csv' === $job->file_type ? 'file' : $job->file_type;
|
||||||
@@ -147,9 +136,9 @@ class CreateImport extends Command
|
|||||||
// give feedback.
|
// give feedback.
|
||||||
/** @var MessageBag $error */
|
/** @var MessageBag $error */
|
||||||
foreach ($routine->getErrors() as $index => $error) {
|
foreach ($routine->getErrors() as $index => $error) {
|
||||||
$this->error(sprintf('Error importing line #%d: %s', $index, $error));
|
$this->errorLine(sprintf('Error importing line #%d: %s', $index, $error));
|
||||||
}
|
}
|
||||||
$this->line(
|
$this->infoLine(
|
||||||
sprintf(
|
sprintf(
|
||||||
'The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines()
|
'The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines()
|
||||||
)
|
)
|
||||||
@@ -159,45 +148,58 @@ class CreateImport extends Command
|
|||||||
// clear cache for user:
|
// clear cache for user:
|
||||||
Preferences::setForUser($user, 'lastActivity', microtime());
|
Preferences::setForUser($user, 'lastActivity', microtime());
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $message
|
||||||
|
* @param array|null $data
|
||||||
|
*/
|
||||||
|
private function errorLine(string $message, array $data = null): void
|
||||||
|
{
|
||||||
|
Log::error($message, $data ?? []);
|
||||||
|
$this->error($message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $message
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
private function infoLine(string $message, array $data = null): void
|
||||||
|
{
|
||||||
|
Log::info($message, $data ?? []);
|
||||||
|
$this->line($message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify user inserts correct arguments.
|
* Verify user inserts correct arguments.
|
||||||
*
|
*
|
||||||
|
* @noinspection MultipleReturnStatementsInspection
|
||||||
* @return bool
|
* @return bool
|
||||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly.
|
|
||||||
*/
|
*/
|
||||||
private function validArguments(): bool
|
private function validArguments(): bool
|
||||||
{
|
{
|
||||||
/** @var UserRepositoryInterface $userRepository */
|
$file = $this->argument('file');
|
||||||
$userRepository = app(UserRepositoryInterface::class);
|
$configuration = $this->argument('configuration');
|
||||||
$file = $this->argument('file');
|
$cwd = getcwd();
|
||||||
$configuration = $this->argument('configuration');
|
$validTypes = config('import.options.file.import_formats');
|
||||||
$user = $userRepository->find(intval($this->option('user')));
|
$type = strtolower($this->option('type'));
|
||||||
$cwd = getcwd();
|
|
||||||
$validTypes = config('import.options.file.import_formats');
|
|
||||||
$type = strtolower($this->option('type'));
|
|
||||||
if (null === $user->id) {
|
|
||||||
$this->error(sprintf('There is no user with ID %d.', $this->option('user')));
|
|
||||||
|
|
||||||
return false;
|
if (!\in_array($type, $validTypes, true)) {
|
||||||
}
|
$this->errorLine(sprintf('Cannot import file of type "%s"', $type));
|
||||||
|
|
||||||
if (!in_array($type, $validTypes)) {
|
|
||||||
$this->error(sprintf('Cannot import file of type "%s"', $type));
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists($file)) {
|
if (!file_exists($file)) {
|
||||||
$this->error(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd));
|
$this->errorLine(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists($configuration)) {
|
if (!file_exists($configuration)) {
|
||||||
$this->error(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd));
|
$this->errorLine(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* DecryptAttachment.php
|
* DecryptAttachment.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* EncryptFile.php
|
* EncryptFile.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,11 +19,11 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
use Crypt;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Services\Internal\File\EncryptService;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,31 +45,26 @@ class EncryptFile extends Command
|
|||||||
*/
|
*/
|
||||||
protected $signature = 'firefly:encrypt-file {file} {key}';
|
protected $signature = 'firefly:encrypt-file {file} {key}';
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command instance.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the console command.
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @throws \Illuminate\Contracts\Encryption\EncryptException
|
||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle(): int
|
||||||
{
|
{
|
||||||
$file = e(strval($this->argument('file')));
|
$code = 0;
|
||||||
if (!file_exists($file)) {
|
$file = (string)$this->argument('file');
|
||||||
$this->error(sprintf('File "%s" does not seem to exist.', $file));
|
$key = (string)$this->argument('key');
|
||||||
|
/** @var EncryptService $service */
|
||||||
|
$service = app(EncryptService::class);
|
||||||
|
|
||||||
return;
|
try {
|
||||||
|
$service->encrypt($file, $key);
|
||||||
|
} catch (FireflyException $e) {
|
||||||
|
$this->error($e->getMessage());
|
||||||
|
$code = 1;
|
||||||
}
|
}
|
||||||
$content = file_get_contents($file);
|
|
||||||
$content = Crypt::encrypt($content);
|
|
||||||
$newName = e(strval($this->argument('key'))) . '.upload';
|
|
||||||
|
|
||||||
$path = storage_path('upload') . '/' . $newName;
|
return $code;
|
||||||
file_put_contents($path, $content);
|
|
||||||
$this->line(sprintf('Encrypted "%s" and put it in "%s"', $file, $path));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* Import.php
|
* Import.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,12 +19,10 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Import\Logging\CommandHandler;
|
|
||||||
use FireflyIII\Import\Routine\RoutineInterface;
|
use FireflyIII\Import\Routine\RoutineInterface;
|
||||||
use FireflyIII\Models\ImportJob;
|
use FireflyIII\Models\ImportJob;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
@@ -68,25 +67,21 @@ class Import extends Command
|
|||||||
$jobKey = $this->argument('key');
|
$jobKey = $this->argument('key');
|
||||||
$job = ImportJob::where('key', $jobKey)->first();
|
$job = ImportJob::where('key', $jobKey)->first();
|
||||||
if (null === $job) {
|
if (null === $job) {
|
||||||
$this->error(sprintf('No job found with key "%s"', $jobKey));
|
$this->errorLine(sprintf('No job found with key "%s"', $jobKey));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!$this->isValid($job)) {
|
if (!$this->isValid($job)) {
|
||||||
Log::error('Job is not valid for some reason. Exit.');
|
$this->errorLine('Job is not valid for some reason. Exit.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->line(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type));
|
$this->infoLine(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type));
|
||||||
|
|
||||||
$monolog = Log::getMonolog();
|
|
||||||
$handler = new CommandHandler($this);
|
|
||||||
$monolog->pushHandler($handler);
|
|
||||||
|
|
||||||
// actually start job:
|
// actually start job:
|
||||||
$type = 'csv' === $job->file_type ? 'file' : $job->file_type;
|
$type = 'csv' === $job->file_type ? 'file' : $job->file_type;
|
||||||
$key = sprintf('import.routine.%s', $type);
|
$key = sprintf('import.routine.%s', $type);
|
||||||
$className = config($key);
|
$className = config($key);
|
||||||
if (null === $className || !class_exists($className)) {
|
if (null === $className || !class_exists($className)) {
|
||||||
throw new FireflyException(sprintf('Cannot find import routine class for job of type "%s".', $type)); // @codeCoverageIgnore
|
throw new FireflyException(sprintf('Cannot find import routine class for job of type "%s".', $type)); // @codeCoverageIgnore
|
||||||
@@ -99,16 +94,37 @@ class Import extends Command
|
|||||||
|
|
||||||
/** @var MessageBag $error */
|
/** @var MessageBag $error */
|
||||||
foreach ($routine->getErrors() as $index => $error) {
|
foreach ($routine->getErrors() as $index => $error) {
|
||||||
$this->error(sprintf('Error importing line #%d: %s', $index, $error));
|
$this->errorLine(sprintf('Error importing line #%d: %s', $index, $error));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->line(
|
$this->infoLine(
|
||||||
sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines())
|
sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines())
|
||||||
);
|
);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $message
|
||||||
|
* @param array|null $data
|
||||||
|
*/
|
||||||
|
private function errorLine(string $message, array $data = null): void
|
||||||
|
{
|
||||||
|
Log::error($message, $data ?? []);
|
||||||
|
$this->error($message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $message
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
private function infoLine(string $message, array $data = null): void
|
||||||
|
{
|
||||||
|
Log::info($message, $data ?? []);
|
||||||
|
$this->line($message);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if job is valid to be imported.
|
* Check if job is valid to be imported.
|
||||||
*
|
*
|
||||||
@@ -119,15 +135,14 @@ class Import extends Command
|
|||||||
private function isValid(ImportJob $job): bool
|
private function isValid(ImportJob $job): bool
|
||||||
{
|
{
|
||||||
if (null === $job) {
|
if (null === $job) {
|
||||||
Log::error('This job does not seem to exist.');
|
$this->errorLine('This job does not seem to exist.');
|
||||||
$this->error('This job does not seem to exist.');
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('configured' !== $job->status) {
|
if ('configured' !== $job->status) {
|
||||||
Log::error(sprintf('This job is not ready to be imported (status is %s).', $job->status));
|
Log::error(sprintf('This job is not ready to be imported (status is %s).', $job->status));
|
||||||
$this->error('This job is not ready to be imported.');
|
$this->errorLine('This job is not ready to be imported.');
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* ScanAttachments.php
|
* ScanAttachments.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* UpgradeDatabase.php
|
* UpgradeDatabase.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
@@ -26,6 +26,7 @@ use DB;
|
|||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
use FireflyIII\Models\AccountMeta;
|
use FireflyIII\Models\AccountMeta;
|
||||||
use FireflyIII\Models\AccountType;
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
use FireflyIII\Models\Note;
|
use FireflyIII\Models\Note;
|
||||||
use FireflyIII\Models\Transaction;
|
use FireflyIII\Models\Transaction;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
@@ -86,6 +87,7 @@ class UpgradeDatabase extends Command
|
|||||||
$this->updateOtherCurrencies();
|
$this->updateOtherCurrencies();
|
||||||
$this->line('Done updating currency information..');
|
$this->line('Done updating currency information..');
|
||||||
$this->migrateNotes();
|
$this->migrateNotes();
|
||||||
|
$this->migrateAttachmentData();
|
||||||
$this->info('Firefly III database is up to date.');
|
$this->info('Firefly III database is up to date.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -220,7 +222,7 @@ class UpgradeDatabase extends Command
|
|||||||
|
|
||||||
// when mismatch in transaction:
|
// when mismatch in transaction:
|
||||||
if (!(intval($transaction->transaction_currency_id) === intval($currency->id))) {
|
if (!(intval($transaction->transaction_currency_id) === intval($currency->id))) {
|
||||||
$transaction->foreign_currency_id = $transaction->transaction_currency_id;
|
$transaction->foreign_currency_id = intval($transaction->transaction_currency_id);
|
||||||
$transaction->foreign_amount = $transaction->amount;
|
$transaction->foreign_amount = $transaction->amount;
|
||||||
$transaction->transaction_currency_id = $currency->id;
|
$transaction->transaction_currency_id = $currency->id;
|
||||||
$transaction->save();
|
$transaction->save();
|
||||||
@@ -281,6 +283,38 @@ class UpgradeDatabase extends Command
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move the description of each attachment (when not NULL) to the notes or to a new note object
|
||||||
|
* for all attachments.
|
||||||
|
*/
|
||||||
|
private function migrateAttachmentData(): void
|
||||||
|
{
|
||||||
|
$attachments = Attachment::get();
|
||||||
|
|
||||||
|
/** @var Attachment $att */
|
||||||
|
foreach ($attachments as $att) {
|
||||||
|
|
||||||
|
// move description:
|
||||||
|
$description = strval($att->description);
|
||||||
|
if (strlen($description) > 0) {
|
||||||
|
// find or create note:
|
||||||
|
$note = $att->notes()->first();
|
||||||
|
if (is_null($note)) {
|
||||||
|
$note = new Note;
|
||||||
|
$note->noteable()->associate($att);
|
||||||
|
}
|
||||||
|
$note->text = $description;
|
||||||
|
$note->save();
|
||||||
|
|
||||||
|
// clear description:
|
||||||
|
$att->description = '';
|
||||||
|
$att->save();
|
||||||
|
|
||||||
|
Log::debug(sprintf('Migrated attachment #%s description to note #%d', $att->id, $note->id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move all the journal_meta notes to their note object counter parts.
|
* Move all the journal_meta notes to their note object counter parts.
|
||||||
*
|
*
|
||||||
@@ -412,12 +446,10 @@ class UpgradeDatabase extends Command
|
|||||||
if (!(intval($transaction->transaction_currency_id) === intval($currency->id)) && null === $transaction->foreign_amount) {
|
if (!(intval($transaction->transaction_currency_id) === intval($currency->id)) && null === $transaction->foreign_amount) {
|
||||||
Log::debug(
|
Log::debug(
|
||||||
sprintf(
|
sprintf(
|
||||||
'Transaction #%d has a currency setting (#%d) (%s) that should be #%d (%s). Amount remains %s, currency is changed.',
|
'Transaction #%d has a currency setting #%d that should be #%d. Amount remains %s, currency is changed.',
|
||||||
$transaction->id,
|
$transaction->id,
|
||||||
$transaction->transaction_currency_id,
|
$transaction->transaction_currency_id,
|
||||||
$this->var_dump_ret(intval($transaction->transaction_currency_id)),
|
|
||||||
$currency->id,
|
$currency->id,
|
||||||
$this->var_dump_ret(intval($currency->id)),
|
|
||||||
$transaction->amount
|
$transaction->amount
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -504,19 +536,4 @@ class UpgradeDatabase extends Command
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param null $mixed
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
private function var_dump_ret($mixed = null): string
|
|
||||||
{
|
|
||||||
ob_start();
|
|
||||||
var_dump($mixed);
|
|
||||||
$content = ob_get_contents();
|
|
||||||
ob_end_clean();
|
|
||||||
|
|
||||||
return trim($content);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* UpgradeFireflyInstructions.php
|
* UpgradeFireflyInstructions.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UseEncryption.php
|
* UseEncryption.php
|
||||||
@@ -19,7 +20,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* VerifiesAccessToken.php
|
* VerifiesAccessToken.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ trait VerifiesAccessToken
|
|||||||
/**
|
/**
|
||||||
* Abstract method to make sure trait knows about method "option".
|
* Abstract method to make sure trait knows about method "option".
|
||||||
*
|
*
|
||||||
* @param null $key
|
* @param string|null $key
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@@ -49,13 +49,13 @@ trait VerifiesAccessToken
|
|||||||
*/
|
*/
|
||||||
protected function verifyAccessToken(): bool
|
protected function verifyAccessToken(): bool
|
||||||
{
|
{
|
||||||
$userId = intval($this->option('user'));
|
$userId = (int)$this->option('user');
|
||||||
$token = strval($this->option('token'));
|
$token = (string)$this->option('token');
|
||||||
/** @var UserRepositoryInterface $repository */
|
/** @var UserRepositoryInterface $repository */
|
||||||
$repository = app(UserRepositoryInterface::class);
|
$repository = app(UserRepositoryInterface::class);
|
||||||
$user = $repository->find($userId);
|
$user = $repository->findNull($userId);
|
||||||
|
|
||||||
if (null === $user->id) {
|
if (null === $user) {
|
||||||
Log::error(sprintf('verifyAccessToken(): no such user for input "%d"', $userId));
|
Log::error(sprintf('verifyAccessToken(): no such user for input "%d"', $userId));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -68,7 +68,7 @@ trait VerifiesAccessToken
|
|||||||
}
|
}
|
||||||
if (!($accessToken->data === $token)) {
|
if (!($accessToken->data === $token)) {
|
||||||
Log::error(sprintf('Invalid access token for user #%d.', $userId));
|
Log::error(sprintf('Invalid access token for user #%d.', $userId));
|
||||||
Log::error(sprintf('Token given is "%s", expected "%s".', $token, $accessToken->data));
|
Log::error(sprintf('Token given is "%s", expected something else.', $token));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* VerifyDatabase.php
|
* VerifyDatabase.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console\Commands;
|
namespace FireflyIII\Console\Commands;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* Kernel.php
|
* Kernel.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Console;
|
namespace FireflyIII\Console;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* AdminRequestedTestMessage.php
|
* AdminRequestedTestMessage.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* Event.php
|
* Event.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* RegisteredUser.php
|
* RegisteredUser.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* RequestedNewPassword.php
|
* RequestedNewPassword.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* RequestedVersionCheckStatus.php
|
* RequestedVersionCheckStatus.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -19,7 +20,6 @@
|
|||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
@@ -49,4 +49,4 @@ class RequestedVersionCheckStatus extends Event
|
|||||||
{
|
{
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* StoredTransactionJournal.php
|
* StoredTransactionJournal.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
@@ -26,6 +26,7 @@ use FireflyIII\Models\TransactionJournal;
|
|||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @codeCoverageIgnore
|
||||||
* Class StoredTransactionJournal.
|
* Class StoredTransactionJournal.
|
||||||
*/
|
*/
|
||||||
class StoredTransactionJournal extends Event
|
class StoredTransactionJournal extends Event
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* UpdatedTransactionJournal.php
|
* UpdatedTransactionJournal.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
@@ -27,6 +27,9 @@ use Illuminate\Queue\SerializesModels;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class UpdatedTransactionJournal.
|
* Class UpdatedTransactionJournal.
|
||||||
|
*
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
class UpdatedTransactionJournal extends Event
|
class UpdatedTransactionJournal extends Event
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* UserChangedEmail.php
|
* UserChangedEmail.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Events;
|
namespace FireflyIII\Events;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* FireflyException.php
|
* FireflyException.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,13 +19,14 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Exceptions;
|
namespace FireflyIII\Exceptions;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class FireflyException.
|
* Class FireflyException.
|
||||||
*/
|
*/
|
||||||
class FireflyException extends \Exception
|
class FireflyException extends Exception
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* Handler.php
|
* Handler.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,15 +19,17 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Exceptions;
|
namespace FireflyIII\Exceptions;
|
||||||
|
|
||||||
use ErrorException;
|
use ErrorException;
|
||||||
use Exception;
|
use Exception;
|
||||||
use FireflyIII\Jobs\MailError;
|
use FireflyIII\Jobs\MailError;
|
||||||
|
use Illuminate\Auth\AuthenticationException;
|
||||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||||
|
use Illuminate\Validation\ValidationException;
|
||||||
use Request;
|
use Request;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Handler
|
* Class Handler
|
||||||
@@ -62,6 +65,37 @@ class Handler extends ExceptionHandler
|
|||||||
*/
|
*/
|
||||||
public function render($request, Exception $exception)
|
public function render($request, Exception $exception)
|
||||||
{
|
{
|
||||||
|
if ($exception instanceof ValidationException && $request->expectsJson()) {
|
||||||
|
// ignore it: controller will handle it.
|
||||||
|
return parent::render($request, $exception);
|
||||||
|
}
|
||||||
|
if ($exception instanceof NotFoundHttpException && $request->expectsJson()) {
|
||||||
|
// JSON error:
|
||||||
|
return response()->json(['message' => 'Resource not found', 'exception' => 'NotFoundHttpException'], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($exception instanceof AuthenticationException && $request->expectsJson()) {
|
||||||
|
// somehow Laravel handler does not catch this:
|
||||||
|
return response()->json(['message' => 'Unauthenticated', 'exception' => 'AuthenticationException'], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->expectsJson()) {
|
||||||
|
$isDebug = config('app.debug', false);
|
||||||
|
if ($isDebug) {
|
||||||
|
return response()->json(
|
||||||
|
[
|
||||||
|
'message' => $exception->getMessage(),
|
||||||
|
'exception' => get_class($exception),
|
||||||
|
'line' => $exception->getLine(),
|
||||||
|
'file' => $exception->getFile(),
|
||||||
|
'trace' => $exception->getTrace(),
|
||||||
|
], 500
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['message' => 'Internal Firefly III Exception. See log files.', 'exception' => get_class($exception)], 500);
|
||||||
|
}
|
||||||
|
|
||||||
if ($exception instanceof FireflyException || $exception instanceof ErrorException) {
|
if ($exception instanceof FireflyException || $exception instanceof ErrorException) {
|
||||||
$isDebug = env('APP_DEBUG', false);
|
$isDebug = env('APP_DEBUG', false);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* NotImplementedException.php
|
* NotImplementedException.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Exceptions;
|
namespace FireflyIII\Exceptions;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* ValidationException.php
|
* ValidationException.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Exceptions;
|
namespace FireflyIII\Exceptions;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* AttachmentCollector.php
|
* AttachmentCollector.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Collector;
|
namespace FireflyIII\Export\Collector;
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface
|
|||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
// @var AttachmentRepositoryInterface repository
|
/** @var AttachmentRepositoryInterface repository */
|
||||||
$this->repository = app(AttachmentRepositoryInterface::class);
|
$this->repository = app(AttachmentRepositoryInterface::class);
|
||||||
// make storage:
|
// make storage:
|
||||||
$this->uploadDisk = Storage::disk('upload');
|
$this->uploadDisk = Storage::disk('upload');
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* BasicCollector.php
|
* BasicCollector.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Collector;
|
namespace FireflyIII\Export\Collector;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* CollectorInterface.php
|
* CollectorInterface.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Collector;
|
namespace FireflyIII\Export\Collector;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* UploadCollector.php
|
* UploadCollector.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,13 +19,12 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Collector;
|
namespace FireflyIII\Export\Collector;
|
||||||
|
|
||||||
use Crypt;
|
use Crypt;
|
||||||
|
use Exception;
|
||||||
use Illuminate\Contracts\Encryption\DecryptException;
|
use Illuminate\Contracts\Encryption\DecryptException;
|
||||||
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
|
||||||
use Log;
|
use Log;
|
||||||
use Storage;
|
use Storage;
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ class UploadCollector extends BasicCollector implements CollectorInterface
|
|||||||
$content = '';
|
$content = '';
|
||||||
try {
|
try {
|
||||||
$content = Crypt::decrypt($this->uploadDisk->get(sprintf('%s.upload', $key)));
|
$content = Crypt::decrypt($this->uploadDisk->get(sprintf('%s.upload', $key)));
|
||||||
} catch (FileNotFoundException | DecryptException $e) {
|
} catch (Exception | DecryptException $e) {
|
||||||
Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage()));
|
Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* Entry.php
|
* Entry.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Entry;
|
namespace FireflyIII\Export\Entry;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* ExpandedProcessor.php
|
* ExpandedProcessor.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export;
|
namespace FireflyIII\Export;
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ class ExpandedProcessor implements ProcessorInterface
|
|||||||
$currencyId = $ibans[$accountId]['currency_id'] ?? 0;
|
$currencyId = $ibans[$accountId]['currency_id'] ?? 0;
|
||||||
$opposingCurrencyId = $ibans[$opposingId]['currency_id'] ?? 0;
|
$opposingCurrencyId = $ibans[$opposingId]['currency_id'] ?? 0;
|
||||||
$transaction->notes = $notes[$journalId] ?? '';
|
$transaction->notes = $notes[$journalId] ?? '';
|
||||||
$transaction->tags = join(',', $tags[$journalId] ?? []);
|
$transaction->tags = implode(',', $tags[$journalId] ?? []);
|
||||||
$transaction->account_number = $ibans[$accountId]['accountNumber'] ?? '';
|
$transaction->account_number = $ibans[$accountId]['accountNumber'] ?? '';
|
||||||
$transaction->account_bic = $ibans[$accountId]['BIC'] ?? '';
|
$transaction->account_bic = $ibans[$accountId]['BIC'] ?? '';
|
||||||
$transaction->account_currency_code = $currencies[$currencyId] ?? '';
|
$transaction->account_currency_code = $currencies[$currencyId] ?? '';
|
||||||
@@ -331,6 +331,7 @@ class ExpandedProcessor implements ProcessorInterface
|
|||||||
* @param array $array
|
* @param array $array
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws \Illuminate\Contracts\Encryption\DecryptException
|
||||||
*/
|
*/
|
||||||
private function getTags(array $array): array
|
private function getTags(array $array): array
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* BasicExporter.php
|
* BasicExporter.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Exporter;
|
namespace FireflyIII\Export\Exporter;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* CsvExporter.php
|
* CsvExporter.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Exporter;
|
namespace FireflyIII\Export\Exporter;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* ExporterInterface.php
|
* ExporterInterface.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export\Exporter;
|
namespace FireflyIII\Export\Exporter;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
/**
|
/**
|
||||||
* ProcessorInterface.php
|
* ProcessorInterface.php
|
||||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace FireflyIII\Export;
|
namespace FireflyIII\Export;
|
||||||
|
|
||||||
|
|||||||
179
app/Factory/AccountFactory.php
Normal file
179
app/Factory/AccountFactory.php
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* AccountFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Services\Internal\Support\AccountServiceTrait;
|
||||||
|
use FireflyIII\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory to create or return accounts.
|
||||||
|
*
|
||||||
|
* Class AccountFactory
|
||||||
|
*/
|
||||||
|
class AccountFactory
|
||||||
|
{
|
||||||
|
use AccountServiceTrait;
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return Account
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function create(array $data): Account
|
||||||
|
{
|
||||||
|
$type = $this->getAccountType($data['account_type_id'], $data['accountType']);
|
||||||
|
$data['iban'] = $this->filterIban($data['iban']);
|
||||||
|
|
||||||
|
|
||||||
|
// account may exist already:
|
||||||
|
$existingAccount = $this->find($data['name'], $type->type);
|
||||||
|
if (null !== $existingAccount) {
|
||||||
|
return $existingAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// create it:
|
||||||
|
$databaseData
|
||||||
|
= [
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'account_type_id' => $type->id,
|
||||||
|
'name' => $data['name'],
|
||||||
|
'virtual_balance' => strlen(strval($data['virtualBalance'])) === 0 ? '0' : $data['virtualBalance'],
|
||||||
|
'active' => true === $data['active'] ? true : false,
|
||||||
|
'iban' => $data['iban'],
|
||||||
|
];
|
||||||
|
|
||||||
|
// remove virtual balance when not an asset account:
|
||||||
|
if ($type->type !== AccountType::ASSET) {
|
||||||
|
$databaseData['virtual_balance'] = '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
$newAccount = Account::create($databaseData);
|
||||||
|
$this->updateMetaData($newAccount, $data);
|
||||||
|
|
||||||
|
if ($this->validIBData($data) && $type->type === AccountType::ASSET) {
|
||||||
|
$this->updateIB($newAccount, $data);
|
||||||
|
}
|
||||||
|
if (!$this->validIBData($data) && $type->type === AccountType::ASSET) {
|
||||||
|
$this->deleteIB($newAccount);
|
||||||
|
}
|
||||||
|
// update note:
|
||||||
|
if (isset($data['notes'])) {
|
||||||
|
$this->updateNote($newAccount, $data['notes']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $newAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $accountName
|
||||||
|
* @param string $accountType
|
||||||
|
*
|
||||||
|
* @return Account|null
|
||||||
|
*/
|
||||||
|
public function find(string $accountName, string $accountType): ?Account
|
||||||
|
{
|
||||||
|
$type = AccountType::whereType($accountType)->first();
|
||||||
|
$accounts = $this->user->accounts()->where('account_type_id', $type->id)->get(['accounts.*']);
|
||||||
|
|
||||||
|
/** @var Account $object */
|
||||||
|
foreach ($accounts as $object) {
|
||||||
|
if ($object->name === $accountName) {
|
||||||
|
return $object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $accountName
|
||||||
|
* @param string $accountType
|
||||||
|
*
|
||||||
|
* @return Account
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
|
*/
|
||||||
|
public function findOrCreate(string $accountName, string $accountType): Account
|
||||||
|
{
|
||||||
|
$type = AccountType::whereType($accountType)->first();
|
||||||
|
$accounts = $this->user->accounts()->where('account_type_id', $type->id)->get(['accounts.*']);
|
||||||
|
|
||||||
|
/** @var Account $object */
|
||||||
|
foreach ($accounts as $object) {
|
||||||
|
if ($object->name === $accountName) {
|
||||||
|
return $object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->create(
|
||||||
|
[
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'name' => $accountName,
|
||||||
|
'account_type_id' => $type->id,
|
||||||
|
'accountType' => null,
|
||||||
|
'virtualBalance' => '0',
|
||||||
|
'iban' => null,
|
||||||
|
'active' => true,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user): void
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int|null $accountTypeId
|
||||||
|
* @param null|string $accountType
|
||||||
|
*
|
||||||
|
* @return AccountType|null
|
||||||
|
*/
|
||||||
|
protected function getAccountType(?int $accountTypeId, ?string $accountType): ?AccountType
|
||||||
|
{
|
||||||
|
$accountTypeId = intval($accountTypeId);
|
||||||
|
if ($accountTypeId > 0) {
|
||||||
|
return AccountType::find($accountTypeId);
|
||||||
|
}
|
||||||
|
$type = config('firefly.accountTypeByIdentifier.' . strval($accountType));
|
||||||
|
$result = AccountType::whereType($type)->first();
|
||||||
|
if (is_null($result) && !is_null($accountType)) {
|
||||||
|
// try as full name:
|
||||||
|
$result = AccountType::whereType($accountType)->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
43
app/Factory/AccountMetaFactory.php
Normal file
43
app/Factory/AccountMetaFactory.php
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* AccountMetaFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\AccountMeta;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class AccountMetaFactory
|
||||||
|
*/
|
||||||
|
class AccountMetaFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return AccountMeta|null
|
||||||
|
*/
|
||||||
|
public function create(array $data): ?AccountMeta
|
||||||
|
{
|
||||||
|
return AccountMeta::create($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
137
app/Factory/BillFactory.php
Normal file
137
app/Factory/BillFactory.php
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* BillFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Bill;
|
||||||
|
use FireflyIII\Services\Internal\Support\BillServiceTrait;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BillFactory
|
||||||
|
*/
|
||||||
|
class BillFactory
|
||||||
|
{
|
||||||
|
use BillServiceTrait;
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return Bill|null
|
||||||
|
*/
|
||||||
|
public function create(array $data): ?Bill
|
||||||
|
{
|
||||||
|
$matchArray = explode(',', $data['match']);
|
||||||
|
$matchArray = array_unique($matchArray);
|
||||||
|
$match = join(',', $matchArray);
|
||||||
|
|
||||||
|
/** @var Bill $bill */
|
||||||
|
$bill = Bill::create(
|
||||||
|
[
|
||||||
|
'name' => $data['name'],
|
||||||
|
'match' => $match,
|
||||||
|
'amount_min' => $data['amount_min'],
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'amount_max' => $data['amount_max'],
|
||||||
|
'date' => $data['date'],
|
||||||
|
'repeat_freq' => $data['repeat_freq'],
|
||||||
|
'skip' => $data['skip'],
|
||||||
|
'automatch' => $data['automatch'],
|
||||||
|
'active' => $data['active'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// update note:
|
||||||
|
if (isset($data['notes'])) {
|
||||||
|
$this->updateNote($bill, $data['notes']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $bill;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int|null $billId
|
||||||
|
* @param null|string $billName
|
||||||
|
*
|
||||||
|
* @return Bill|null
|
||||||
|
*/
|
||||||
|
public function find(?int $billId, ?string $billName): ?Bill
|
||||||
|
{
|
||||||
|
$billId = intval($billId);
|
||||||
|
$billName = strval($billName);
|
||||||
|
|
||||||
|
// first find by ID:
|
||||||
|
if ($billId > 0) {
|
||||||
|
/** @var Bill $bill */
|
||||||
|
$bill = $this->user->bills()->find($billId);
|
||||||
|
if (!is_null($bill)) {
|
||||||
|
return $bill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// then find by name:
|
||||||
|
if (strlen($billName) > 0) {
|
||||||
|
$bill = $this->findByName($billName);
|
||||||
|
if (!is_null($bill)) {
|
||||||
|
return $bill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return Bill|null
|
||||||
|
*/
|
||||||
|
public function findByName(string $name): ?Bill
|
||||||
|
{
|
||||||
|
/** @var Collection $collection */
|
||||||
|
$collection = $this->user->bills()->get();
|
||||||
|
/** @var Bill $bill */
|
||||||
|
foreach ($collection as $bill) {
|
||||||
|
Log::debug(sprintf('"%s" vs. "%s"', $bill->name, $name));
|
||||||
|
if ($bill->name === $name) {
|
||||||
|
return $bill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log::debug(sprintf('Bill::Find by name returns NULL based on "%s"', $name));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
100
app/Factory/BudgetFactory.php
Normal file
100
app/Factory/BudgetFactory.php
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* BudgetFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Budget;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BudgetFactory
|
||||||
|
*/
|
||||||
|
class BudgetFactory
|
||||||
|
{
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int|null $budgetId
|
||||||
|
* @param null|string $budgetName
|
||||||
|
*
|
||||||
|
* @return Budget|null
|
||||||
|
*/
|
||||||
|
public function find(?int $budgetId, ?string $budgetName): ?Budget
|
||||||
|
{
|
||||||
|
$budgetId = intval($budgetId);
|
||||||
|
$budgetName = strval($budgetName);
|
||||||
|
|
||||||
|
if (strlen($budgetName) === 0 && $budgetId === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first by ID:
|
||||||
|
if ($budgetId > 0) {
|
||||||
|
/** @var Budget $budget */
|
||||||
|
$budget = $this->user->budgets()->find($budgetId);
|
||||||
|
if (!is_null($budget)) {
|
||||||
|
return $budget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($budgetName) > 0) {
|
||||||
|
$budget = $this->findByName($budgetName);
|
||||||
|
if (!is_null($budget)) {
|
||||||
|
return $budget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return Budget|null
|
||||||
|
*/
|
||||||
|
public function findByName(string $name): ?Budget
|
||||||
|
{
|
||||||
|
/** @var Collection $collection */
|
||||||
|
$collection = $this->user->budgets()->get();
|
||||||
|
/** @var Budget $budget */
|
||||||
|
foreach ($collection as $budget) {
|
||||||
|
if ($budget->name === $name) {
|
||||||
|
return $budget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
109
app/Factory/CategoryFactory.php
Normal file
109
app/Factory/CategoryFactory.php
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* CategoryFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
|
||||||
|
use FireflyIII\Models\Category;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CategoryFactory
|
||||||
|
*/
|
||||||
|
class CategoryFactory
|
||||||
|
{
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return Category|null
|
||||||
|
*/
|
||||||
|
public function findByName(string $name): ?Category
|
||||||
|
{
|
||||||
|
/** @var Collection $collection */
|
||||||
|
$collection = $this->user->categories()->get();
|
||||||
|
/** @var Category $category */
|
||||||
|
foreach ($collection as $category) {
|
||||||
|
if ($category->name === $name) {
|
||||||
|
return $category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int|null $categoryId
|
||||||
|
* @param null|string $categoryName
|
||||||
|
*
|
||||||
|
* @return Category|null
|
||||||
|
*/
|
||||||
|
public function findOrCreate(?int $categoryId, ?string $categoryName): ?Category
|
||||||
|
{
|
||||||
|
$categoryId = intval($categoryId);
|
||||||
|
$categoryName = strval($categoryName);
|
||||||
|
|
||||||
|
Log::debug(sprintf('Going to find category with ID %d and name "%s"', $categoryId, $categoryName));
|
||||||
|
|
||||||
|
if (strlen($categoryName) === 0 && $categoryId === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// first by ID:
|
||||||
|
if ($categoryId > 0) {
|
||||||
|
/** @var Category $category */
|
||||||
|
$category = $this->user->categories()->find($categoryId);
|
||||||
|
if (!is_null($category)) {
|
||||||
|
return $category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($categoryName) > 0) {
|
||||||
|
$category = $this->findByName($categoryName);
|
||||||
|
if (!is_null($category)) {
|
||||||
|
return $category;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Category::create(
|
||||||
|
[
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'name' => $categoryName,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
88
app/Factory/PiggyBankEventFactory.php
Normal file
88
app/Factory/PiggyBankEventFactory.php
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* PiggyBankEventFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\PiggyBank;
|
||||||
|
use FireflyIII\Models\PiggyBankEvent;
|
||||||
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create piggy bank events.
|
||||||
|
*
|
||||||
|
* Class PiggyBankEventFactory
|
||||||
|
*/
|
||||||
|
class PiggyBankEventFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param TransactionJournal $journal
|
||||||
|
* @param PiggyBank|null $piggyBank
|
||||||
|
*
|
||||||
|
* @return PiggyBankEvent|null
|
||||||
|
*/
|
||||||
|
public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): ?PiggyBankEvent
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type));
|
||||||
|
if (is_null($piggyBank)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// is a transfer?
|
||||||
|
if (!(TransactionType::TRANSFER === $journal->transactionType->type)) {
|
||||||
|
Log::info(sprintf('Will not connect %s #%d to a piggy bank.', $journal->transactionType->type, $journal->id));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var PiggyBankRepositoryInterface $piggyRepos */
|
||||||
|
$piggyRepos = app(PiggyBankRepositoryInterface::class);
|
||||||
|
$piggyRepos->setUser($journal->user);
|
||||||
|
|
||||||
|
// repetition exists?
|
||||||
|
$repetition = $piggyRepos->getRepetition($piggyBank, $journal->date);
|
||||||
|
if (null === $repetition->id) {
|
||||||
|
Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d')));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the amount
|
||||||
|
$amount = $piggyRepos->getExactAmount($piggyBank, $repetition, $journal);
|
||||||
|
if (0 === bccomp($amount, '0')) {
|
||||||
|
Log::debug('Amount is zero, will not create event.');
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update amount
|
||||||
|
$piggyRepos->addAmountToRepetition($repetition, $amount);
|
||||||
|
$event = $piggyRepos->createEventWithJournal($piggyBank, $amount, $journal);
|
||||||
|
|
||||||
|
Log::debug(sprintf('Created piggy bank event #%d', $event->id));
|
||||||
|
|
||||||
|
return $event;
|
||||||
|
}
|
||||||
|
}
|
||||||
100
app/Factory/PiggyBankFactory.php
Normal file
100
app/Factory/PiggyBankFactory.php
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* PiggyBankFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
|
||||||
|
use FireflyIII\Models\PiggyBank;
|
||||||
|
use FireflyIII\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PiggyBankFactory
|
||||||
|
*/
|
||||||
|
class PiggyBankFactory
|
||||||
|
{
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int|null $piggyBankId
|
||||||
|
* @param null|string $piggyBankName
|
||||||
|
*
|
||||||
|
* @return PiggyBank|null
|
||||||
|
*/
|
||||||
|
public function find(?int $piggyBankId, ?string $piggyBankName): ?PiggyBank
|
||||||
|
{
|
||||||
|
$piggyBankId = intval($piggyBankId);
|
||||||
|
$piggyBankName = strval($piggyBankName);
|
||||||
|
if (strlen($piggyBankName) === 0 && $piggyBankId === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// first find by ID:
|
||||||
|
if ($piggyBankId > 0) {
|
||||||
|
/** @var PiggyBank $piggyBank */
|
||||||
|
$piggyBank = $this->user->piggyBanks()->find($piggyBankId);
|
||||||
|
if (!is_null($piggyBank)) {
|
||||||
|
return $piggyBank;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// then find by name:
|
||||||
|
if (strlen($piggyBankName) > 0) {
|
||||||
|
/** @var PiggyBank $piggyBank */
|
||||||
|
$piggyBank = $this->findByName($piggyBankName);
|
||||||
|
if (!is_null($piggyBank)) {
|
||||||
|
return $piggyBank;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return PiggyBank|null
|
||||||
|
*/
|
||||||
|
public function findByName(string $name): ?PiggyBank
|
||||||
|
{
|
||||||
|
$set = $this->user->piggyBanks()->get();
|
||||||
|
/** @var PiggyBank $piggy */
|
||||||
|
foreach ($set as $piggy) {
|
||||||
|
if ($piggy->name === $name) {
|
||||||
|
return $piggy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
102
app/Factory/TagFactory.php
Normal file
102
app/Factory/TagFactory.php
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TagFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\Tag;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TagFactory
|
||||||
|
*/
|
||||||
|
class TagFactory
|
||||||
|
{
|
||||||
|
/** @var Collection */
|
||||||
|
private $tags;
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return Tag|null
|
||||||
|
*/
|
||||||
|
public function create(array $data): ?Tag
|
||||||
|
{
|
||||||
|
return Tag::create(
|
||||||
|
[
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'tag' => $data['tag'],
|
||||||
|
'tagMode' => 'nothing',
|
||||||
|
'date' => $data['date'],
|
||||||
|
'description' => $data['description'],
|
||||||
|
'latitude' => $data['latitude'],
|
||||||
|
'longitude ' => $data['longitude'],
|
||||||
|
'zoomLevel' => $data['zoom_level'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $tag
|
||||||
|
*
|
||||||
|
* @return Tag|null
|
||||||
|
*/
|
||||||
|
public function findOrCreate(string $tag): ?Tag
|
||||||
|
{
|
||||||
|
if (is_null($this->tags)) {
|
||||||
|
$this->tags = $this->user->tags()->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var Tag $object */
|
||||||
|
foreach ($this->tags as $object) {
|
||||||
|
if ($object->tag === $tag) {
|
||||||
|
return $object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$newTag = $this->create(
|
||||||
|
[
|
||||||
|
'tag' => $tag,
|
||||||
|
'date' => null,
|
||||||
|
'description' => null,
|
||||||
|
'latitude' => null,
|
||||||
|
'longitude' => null,
|
||||||
|
'zoom_level' => null,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$this->tags->push($newTag);
|
||||||
|
|
||||||
|
return $newTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user): void
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
94
app/Factory/TransactionCurrencyFactory.php
Normal file
94
app/Factory/TransactionCurrencyFactory.php
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionCurrencyFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use Illuminate\Database\QueryException;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TransactionCurrencyFactory
|
||||||
|
*/
|
||||||
|
class TransactionCurrencyFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return TransactionCurrency|null
|
||||||
|
*/
|
||||||
|
public function create(array $data): ?TransactionCurrency
|
||||||
|
{
|
||||||
|
$result = null;
|
||||||
|
try {
|
||||||
|
/** @var TransactionCurrency $currency */
|
||||||
|
$result = TransactionCurrency::create(
|
||||||
|
[
|
||||||
|
'name' => $data['name'],
|
||||||
|
'code' => $data['code'],
|
||||||
|
'symbol' => $data['symbol'],
|
||||||
|
'decimal_places' => $data['decimal_places'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
} catch (QueryException $e) {
|
||||||
|
Log::error(sprintf('Could not create new currency: %s', $e->getMessage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int|null $currencyId
|
||||||
|
* @param null|string $currencyCode
|
||||||
|
*
|
||||||
|
* @return TransactionCurrency|null
|
||||||
|
*/
|
||||||
|
public function find(?int $currencyId, ?string $currencyCode): ?TransactionCurrency
|
||||||
|
{
|
||||||
|
$currencyCode = strval($currencyCode);
|
||||||
|
$currencyId = intval($currencyId);
|
||||||
|
|
||||||
|
if (strlen($currencyCode) === 0 && intval($currencyId) === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first by ID:
|
||||||
|
if ($currencyId > 0) {
|
||||||
|
$currency = TransactionCurrency::find($currencyId);
|
||||||
|
if (!is_null($currency)) {
|
||||||
|
return $currency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// then by code:
|
||||||
|
if (strlen($currencyCode) > 0) {
|
||||||
|
$currency = TransactionCurrency::whereCode($currencyCode)->first();
|
||||||
|
if (!is_null($currency)) {
|
||||||
|
return $currency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
154
app/Factory/TransactionFactory.php
Normal file
154
app/Factory/TransactionFactory.php
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
|
||||||
|
use FireflyIII\Models\Transaction;
|
||||||
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Services\Internal\Support\TransactionServiceTrait;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TransactionFactory
|
||||||
|
*/
|
||||||
|
class TransactionFactory
|
||||||
|
{
|
||||||
|
use TransactionServiceTrait;
|
||||||
|
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return Transaction
|
||||||
|
*/
|
||||||
|
public function create(array $data): Transaction
|
||||||
|
{
|
||||||
|
$currencyId = isset($data['currency']) ? $data['currency']->id : $data['currency_id'];
|
||||||
|
|
||||||
|
return Transaction::create(
|
||||||
|
[
|
||||||
|
'reconciled' => $data['reconciled'],
|
||||||
|
'account_id' => $data['account']->id,
|
||||||
|
'transaction_journal_id' => $data['transaction_journal']->id,
|
||||||
|
'description' => $data['description'],
|
||||||
|
'transaction_currency_id' => $currencyId,
|
||||||
|
'amount' => $data['amount'],
|
||||||
|
'foreign_amount' => $data['foreign_amount'],
|
||||||
|
'foreign_currency_id' => null,
|
||||||
|
'identifier' => $data['identifier'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a pair of transactions based on the data given in the array.
|
||||||
|
*
|
||||||
|
* @param TransactionJournal $journal
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return Collection
|
||||||
|
*/
|
||||||
|
public function createPair(TransactionJournal $journal, array $data): Collection
|
||||||
|
{
|
||||||
|
// all this data is the same for both transactions:
|
||||||
|
$currency = $this->findCurrency($data['currency_id'], $data['currency_code']);
|
||||||
|
$description = $journal->description === $data['description'] ? null : $data['description'];
|
||||||
|
|
||||||
|
// type of source account depends on journal type:
|
||||||
|
$sourceType = $this->accountType($journal, 'source');
|
||||||
|
$sourceAccount = $this->findAccount($sourceType, $data['source_id'], $data['source_name']);
|
||||||
|
|
||||||
|
// same for destination account:
|
||||||
|
$destinationType = $this->accountType($journal, 'destination');
|
||||||
|
$destinationAccount = $this->findAccount($destinationType, $data['destination_id'], $data['destination_name']);
|
||||||
|
// first make a "negative" (source) transaction based on the data in the array.
|
||||||
|
$source = $this->create(
|
||||||
|
[
|
||||||
|
'description' => $description,
|
||||||
|
'amount' => app('steam')->negative(strval($data['amount'])),
|
||||||
|
'foreign_amount' => null,
|
||||||
|
'currency' => $currency,
|
||||||
|
'account' => $sourceAccount,
|
||||||
|
'transaction_journal' => $journal,
|
||||||
|
'reconciled' => $data['reconciled'],
|
||||||
|
'identifier' => $data['identifier'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
// then make a "positive" transaction based on the data in the array.
|
||||||
|
$dest = $this->create(
|
||||||
|
[
|
||||||
|
'description' => $description,
|
||||||
|
'amount' => app('steam')->positive(strval($data['amount'])),
|
||||||
|
'foreign_amount' => null,
|
||||||
|
'currency' => $currency,
|
||||||
|
'account' => $destinationAccount,
|
||||||
|
'transaction_journal' => $journal,
|
||||||
|
'reconciled' => $data['reconciled'],
|
||||||
|
'identifier' => $data['identifier'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// set foreign currency
|
||||||
|
$foreign = $this->findCurrency($data['foreign_currency_id'], $data['foreign_currency_code']);
|
||||||
|
$this->setForeignCurrency($source, $foreign);
|
||||||
|
$this->setForeignCurrency($dest, $foreign);
|
||||||
|
|
||||||
|
// set foreign amount:
|
||||||
|
if (!is_null($data['foreign_amount'])) {
|
||||||
|
$this->setForeignAmount($source, app('steam')->negative(strval($data['foreign_amount'])));
|
||||||
|
$this->setForeignAmount($dest, app('steam')->positive(strval($data['foreign_amount'])));
|
||||||
|
}
|
||||||
|
|
||||||
|
// set budget:
|
||||||
|
if ($journal->transactionType->type === TransactionType::TRANSFER) {
|
||||||
|
$data['budget_id'] = null;
|
||||||
|
$data['budget_name'] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$budget = $this->findBudget($data['budget_id'], $data['budget_name']);
|
||||||
|
$this->setBudget($source, $budget);
|
||||||
|
$this->setBudget($dest, $budget);
|
||||||
|
|
||||||
|
// set category
|
||||||
|
$category = $this->findCategory($data['category_id'], $data['category_name']);
|
||||||
|
$this->setCategory($source, $category);
|
||||||
|
$this->setCategory($dest, $category);
|
||||||
|
|
||||||
|
return new Collection([$source, $dest]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
154
app/Factory/TransactionJournalFactory.php
Normal file
154
app/Factory/TransactionJournalFactory.php
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionJournalFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Models\TransactionJournal;
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Services\Internal\Support\JournalServiceTrait;
|
||||||
|
use FireflyIII\User;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TransactionJournalFactory
|
||||||
|
*/
|
||||||
|
class TransactionJournalFactory
|
||||||
|
{
|
||||||
|
use JournalServiceTrait;
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new transaction journal and associated transactions.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return TransactionJournal
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function create(array $data): TransactionJournal
|
||||||
|
{
|
||||||
|
Log::debug('Start of TransactionJournalFactory::create()');
|
||||||
|
// store basic journal first.
|
||||||
|
$type = $this->findTransactionType($data['type']);
|
||||||
|
$defaultCurrency = app('amount')->getDefaultCurrencyByUser($this->user);
|
||||||
|
$journal = TransactionJournal::create(
|
||||||
|
[
|
||||||
|
'user_id' => $data['user'],
|
||||||
|
'transaction_type_id' => $type->id,
|
||||||
|
'bill_id' => null,
|
||||||
|
'transaction_currency_id' => $defaultCurrency->id,
|
||||||
|
'description' => $data['description'],
|
||||||
|
'date' => $data['date']->format('Y-m-d'),
|
||||||
|
'order' => 0,
|
||||||
|
'tag_count' => 0,
|
||||||
|
'completed' => 0,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// store basic transactions:
|
||||||
|
/** @var TransactionFactory $factory */
|
||||||
|
$factory = app(TransactionFactory::class);
|
||||||
|
$factory->setUser($this->user);
|
||||||
|
|
||||||
|
/** @var array $trData */
|
||||||
|
foreach ($data['transactions'] as $trData) {
|
||||||
|
$factory->createPair($journal, $trData);
|
||||||
|
}
|
||||||
|
$journal->completed = true;
|
||||||
|
$journal->save();
|
||||||
|
|
||||||
|
// link bill:
|
||||||
|
$this->connectBill($journal, $data);
|
||||||
|
|
||||||
|
// link piggy bank (if transfer)
|
||||||
|
$this->connectPiggyBank($journal, $data);
|
||||||
|
|
||||||
|
// link tags:
|
||||||
|
$this->connectTags($journal, $data);
|
||||||
|
|
||||||
|
// store note:
|
||||||
|
$this->storeNote($journal, strval($data['notes']));
|
||||||
|
|
||||||
|
// store date meta fields (if present):
|
||||||
|
$fields = ['sepa-cc', 'sepa-ct-op', 'sepa-ct-id', 'sepa-db', 'sepa-country', 'sepa-ep', 'sepa-ci', 'interest_date', 'book_date', 'process_date',
|
||||||
|
'due_date', 'payment_date', 'invoice_date', 'internal_reference','bunq_payment_id'];
|
||||||
|
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$this->storeMeta($journal, $data, $field);
|
||||||
|
}
|
||||||
|
Log::debug('End of TransactionJournalFactory::create()');
|
||||||
|
|
||||||
|
return $journal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the user.
|
||||||
|
*
|
||||||
|
* @param User $user
|
||||||
|
*/
|
||||||
|
public function setUser(User $user): void
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param TransactionJournal $journal
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
protected function connectPiggyBank(TransactionJournal $journal, array $data): void
|
||||||
|
{
|
||||||
|
/** @var PiggyBankFactory $factory */
|
||||||
|
$factory = app(PiggyBankFactory::class);
|
||||||
|
$factory->setUser($this->user);
|
||||||
|
|
||||||
|
$piggyBank = $factory->find($data['piggy_bank_id'], $data['piggy_bank_name']);
|
||||||
|
if (!is_null($piggyBank)) {
|
||||||
|
/** @var PiggyBankEventFactory $factory */
|
||||||
|
$factory = app(PiggyBankEventFactory::class);
|
||||||
|
$factory->create($journal, $piggyBank);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the transaction type. Since this is mandatory, will throw an exception when nothing comes up. Will always
|
||||||
|
* use TransactionType repository.
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return TransactionType
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
protected function findTransactionType(string $type): TransactionType
|
||||||
|
{
|
||||||
|
$factory = app(TransactionTypeFactory::class);
|
||||||
|
$transactionType = $factory->find($type);
|
||||||
|
if (is_null($transactionType)) {
|
||||||
|
throw new FireflyException(sprintf('Could not find transaction type for "%s"', $type)); // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
|
||||||
|
return $transactionType;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
83
app/Factory/TransactionJournalMetaFactory.php
Normal file
83
app/Factory/TransactionJournalMetaFactory.php
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionJournalMetaFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Exception;
|
||||||
|
use FireflyIII\Models\TransactionJournalMeta;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TransactionJournalMetaFactory
|
||||||
|
*/
|
||||||
|
class TransactionJournalMetaFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*
|
||||||
|
* @return TransactionJournalMeta|null
|
||||||
|
*/
|
||||||
|
public function updateOrCreate(array $data): ?TransactionJournalMeta
|
||||||
|
{
|
||||||
|
$value = $data['data'];
|
||||||
|
/** @var TransactionJournalMeta $entry */
|
||||||
|
$entry = $data['journal']->transactionJournalMeta()->where('name', $data['name'])->first();
|
||||||
|
if (null === $value && null !== $entry) {
|
||||||
|
try {
|
||||||
|
$entry->delete();
|
||||||
|
} catch (Exception $e) { // @codeCoverageIgnore
|
||||||
|
Log::error(sprintf('Could not delete transaction journal meta: %s', $e->getMessage())); // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($data['data'] instanceof Carbon) {
|
||||||
|
$value = $data['data']->toW3cString();
|
||||||
|
}
|
||||||
|
if ((string)$value === '') {
|
||||||
|
// don't store blank strings.
|
||||||
|
if (null !== $entry) {
|
||||||
|
try {
|
||||||
|
$entry->delete();
|
||||||
|
} catch (Exception $e) { // @codeCoverageIgnore
|
||||||
|
Log::error(sprintf('Could not delete transaction journal meta: %s', $e->getMessage())); // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $entry) {
|
||||||
|
$entry = new TransactionJournalMeta();
|
||||||
|
$entry->transactionJournal()->associate($data['journal']);
|
||||||
|
$entry->name = $data['name'];
|
||||||
|
}
|
||||||
|
$entry->data = $value;
|
||||||
|
$entry->save();
|
||||||
|
|
||||||
|
return $entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
44
app/Factory/TransactionTypeFactory.php
Normal file
44
app/Factory/TransactionTypeFactory.php
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* TransactionTypeFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace FireflyIII\Factory;
|
||||||
|
|
||||||
|
use FireflyIII\Models\TransactionType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
* Class TransactionTypeFactory
|
||||||
|
*/
|
||||||
|
class TransactionTypeFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return TransactionType|null
|
||||||
|
*/
|
||||||
|
public function find(string $type): ?TransactionType
|
||||||
|
{
|
||||||
|
return TransactionType::whereType(ucfirst($type))->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -26,6 +26,7 @@ use Carbon\Carbon;
|
|||||||
use FireflyIII\Generator\Report\ReportGeneratorInterface;
|
use FireflyIII\Generator\Report\ReportGeneratorInterface;
|
||||||
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\Transaction;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Steam;
|
use Steam;
|
||||||
@@ -44,6 +45,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function generate(): string
|
public function generate(): string
|
||||||
{
|
{
|
||||||
@@ -173,7 +175,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
|
|||||||
$startBalance = $dayBeforeBalance;
|
$startBalance = $dayBeforeBalance;
|
||||||
$currency = $currencyRepos->find(intval($account->getMeta('currency_id')));
|
$currency = $currencyRepos->find(intval($account->getMeta('currency_id')));
|
||||||
|
|
||||||
// @var Transaction $journal
|
/** @var Transaction $transaction */
|
||||||
foreach ($journals as $transaction) {
|
foreach ($journals as $transaction) {
|
||||||
$transaction->before = $startBalance;
|
$transaction->before = $startBalance;
|
||||||
$transactionAmount = $transaction->transaction_amount;
|
$transactionAmount = $transaction->transaction_amount;
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function generate(): string
|
public function generate(): string
|
||||||
{
|
{
|
||||||
@@ -194,7 +195,9 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface
|
|||||||
*/
|
*/
|
||||||
private function summarizeByBudget(Collection $collection): array
|
private function summarizeByBudget(Collection $collection): array
|
||||||
{
|
{
|
||||||
$result = [];
|
$result = [
|
||||||
|
'sum' => '0',
|
||||||
|
];
|
||||||
/** @var Transaction $transaction */
|
/** @var Transaction $transaction */
|
||||||
foreach ($collection as $transaction) {
|
foreach ($collection as $transaction) {
|
||||||
$jrnlBudId = intval($transaction->transaction_journal_budget_id);
|
$jrnlBudId = intval($transaction->transaction_journal_budget_id);
|
||||||
@@ -202,6 +205,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface
|
|||||||
$budgetId = max($jrnlBudId, $transBudId);
|
$budgetId = max($jrnlBudId, $transBudId);
|
||||||
$result[$budgetId] = $result[$budgetId] ?? '0';
|
$result[$budgetId] = $result[$budgetId] ?? '0';
|
||||||
$result[$budgetId] = bcadd($transaction->transaction_amount, $result[$budgetId]);
|
$result[$budgetId] = bcadd($transaction->transaction_amount, $result[$budgetId]);
|
||||||
|
$result['sum'] = bcadd($result['sum'], $transaction->transaction_amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function generate(): string
|
public function generate(): string
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -102,7 +102,12 @@ class Support
|
|||||||
*/
|
*/
|
||||||
protected function getObjectSummary(array $spent, array $earned): array
|
protected function getObjectSummary(array $spent, array $earned): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [
|
||||||
|
'sum' => [
|
||||||
|
'spent' => '0',
|
||||||
|
'earned' => '0',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
* @var int
|
||||||
@@ -110,10 +115,11 @@ class Support
|
|||||||
*/
|
*/
|
||||||
foreach ($spent as $objectId => $entry) {
|
foreach ($spent as $objectId => $entry) {
|
||||||
if (!isset($return[$objectId])) {
|
if (!isset($return[$objectId])) {
|
||||||
$return[$objectId] = ['spent' => 0, 'earned' => 0];
|
$return[$objectId] = ['spent' => '0', 'earned' => '0'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$return[$objectId]['spent'] = $entry;
|
$return[$objectId]['spent'] = $entry;
|
||||||
|
$return['sum']['spent'] = bcadd($return['sum']['spent'], $entry);
|
||||||
}
|
}
|
||||||
unset($entry);
|
unset($entry);
|
||||||
|
|
||||||
@@ -123,10 +129,11 @@ class Support
|
|||||||
*/
|
*/
|
||||||
foreach ($earned as $objectId => $entry) {
|
foreach ($earned as $objectId => $entry) {
|
||||||
if (!isset($return[$objectId])) {
|
if (!isset($return[$objectId])) {
|
||||||
$return[$objectId] = ['spent' => 0, 'earned' => 0];
|
$return[$objectId] = ['spent' => '0', 'earned' => '0'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$return[$objectId]['earned'] = $entry;
|
$return[$objectId]['earned'] = $entry;
|
||||||
|
$return['sum']['earned'] = bcadd($return['sum']['earned'], $entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $return;
|
return $return;
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace FireflyIII\Handlers\Events;
|
|||||||
|
|
||||||
use FireflyIII\Events\AdminRequestedTestMessage;
|
use FireflyIII\Events\AdminRequestedTestMessage;
|
||||||
use FireflyIII\Mail\AdminTestMail;
|
use FireflyIII\Mail\AdminTestMail;
|
||||||
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
use Log;
|
use Log;
|
||||||
use Mail;
|
use Mail;
|
||||||
use Session;
|
use Session;
|
||||||
@@ -43,6 +44,15 @@ class AdminEventHandler
|
|||||||
*/
|
*/
|
||||||
public function sendTestMessage(AdminRequestedTestMessage $event): bool
|
public function sendTestMessage(AdminRequestedTestMessage $event): bool
|
||||||
{
|
{
|
||||||
|
/** @var UserRepositoryInterface $repository */
|
||||||
|
$repository = app(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
// is user even admin?
|
||||||
|
if (!$repository->hasRole($event->user, 'owner')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$email = $event->user->email;
|
$email = $event->user->email;
|
||||||
$ipAddress = $event->ipAddress;
|
$ipAddress = $event->ipAddress;
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface as PRI;
|
|||||||
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface as RGRI;
|
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface as RGRI;
|
||||||
use FireflyIII\Support\Events\BillScanner;
|
use FireflyIII\Support\Events\BillScanner;
|
||||||
use FireflyIII\TransactionRules\Processor;
|
use FireflyIII\TransactionRules\Processor;
|
||||||
use Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @codeCoverageIgnore
|
* @codeCoverageIgnore
|
||||||
@@ -61,67 +60,13 @@ class StoredJournalEventHandler
|
|||||||
$this->ruleGroupRepository = $ruleGroupRepository;
|
$this->ruleGroupRepository = $ruleGroupRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This method connects a new transfer to a piggy bank.
|
|
||||||
*
|
|
||||||
* @param StoredTransactionJournal $event
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*
|
|
||||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
|
||||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
|
||||||
*/
|
|
||||||
public function connectToPiggyBank(StoredTransactionJournal $event): bool
|
|
||||||
{
|
|
||||||
$journal = $event->journal;
|
|
||||||
$piggyBankId = $event->piggyBankId;
|
|
||||||
$piggyBank = $this->repository->find($piggyBankId);
|
|
||||||
|
|
||||||
// is a transfer?
|
|
||||||
if (!$this->journalRepository->isTransfer($journal)) {
|
|
||||||
Log::info(sprintf('Will not connect %s #%d to a piggy bank.', $journal->transactionType->type, $journal->id));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// piggy exists?
|
|
||||||
if (null === $piggyBank->id) {
|
|
||||||
Log::error(sprintf('There is no piggy bank with ID #%d', $piggyBankId));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// repetition exists?
|
|
||||||
$repetition = $this->repository->getRepetition($piggyBank, $journal->date);
|
|
||||||
if (null === $repetition->id) {
|
|
||||||
Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d')));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the amount
|
|
||||||
$amount = $this->repository->getExactAmount($piggyBank, $repetition, $journal);
|
|
||||||
if (0 === bccomp($amount, '0')) {
|
|
||||||
Log::debug('Amount is zero, will not create event.');
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// update amount
|
|
||||||
$this->repository->addAmountToRepetition($repetition, $amount);
|
|
||||||
$event = $this->repository->createEventWithJournal($piggyBank, $amount, $journal);
|
|
||||||
|
|
||||||
Log::debug(sprintf('Created piggy bank event #%d', $event->id));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method grabs all the users rules and processes them.
|
* This method grabs all the users rules and processes them.
|
||||||
*
|
*
|
||||||
* @param StoredTransactionJournal $storedJournalEvent
|
* @param StoredTransactionJournal $storedJournalEvent
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
*/
|
*/
|
||||||
public function processRules(StoredTransactionJournal $storedJournalEvent): bool
|
public function processRules(StoredTransactionJournal $storedJournalEvent): bool
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ class UpdatedJournalEventHandler
|
|||||||
* @param UpdatedTransactionJournal $updatedJournalEvent
|
* @param UpdatedTransactionJournal $updatedJournalEvent
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
|
* @throws \FireflyIII\Exceptions\FireflyException
|
||||||
*/
|
*/
|
||||||
public function processRules(UpdatedTransactionJournal $updatedJournalEvent): bool
|
public function processRules(UpdatedTransactionJournal $updatedJournalEvent): bool
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,11 +25,11 @@ namespace FireflyIII\Handlers\Events;
|
|||||||
use FireflyIII\Events\RegisteredUser;
|
use FireflyIII\Events\RegisteredUser;
|
||||||
use FireflyIII\Events\RequestedNewPassword;
|
use FireflyIII\Events\RequestedNewPassword;
|
||||||
use FireflyIII\Events\UserChangedEmail;
|
use FireflyIII\Events\UserChangedEmail;
|
||||||
|
use FireflyIII\Factories\RoleFactory;
|
||||||
use FireflyIII\Mail\ConfirmEmailChangeMail;
|
use FireflyIII\Mail\ConfirmEmailChangeMail;
|
||||||
use FireflyIII\Mail\RegisteredUser as RegisteredUserMail;
|
use FireflyIII\Mail\RegisteredUser as RegisteredUserMail;
|
||||||
use FireflyIII\Mail\RequestedNewPassword as RequestedNewPasswordMail;
|
use FireflyIII\Mail\RequestedNewPassword as RequestedNewPasswordMail;
|
||||||
use FireflyIII\Mail\UndoEmailChangeMail;
|
use FireflyIII\Mail\UndoEmailChangeMail;
|
||||||
use FireflyIII\Models\Role;
|
|
||||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Auth\Events\Login;
|
use Illuminate\Auth\Events\Login;
|
||||||
@@ -74,11 +74,12 @@ class UserEventHandler
|
|||||||
*/
|
*/
|
||||||
public function checkSingleUserIsAdmin(Login $event): bool
|
public function checkSingleUserIsAdmin(Login $event): bool
|
||||||
{
|
{
|
||||||
Log::debug('In checkSingleUserIsAdmin');
|
/** @var UserRepositoryInterface $repository */
|
||||||
|
$repository = app(UserRepositoryInterface::class);
|
||||||
|
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = $event->user;
|
$user = $event->user;
|
||||||
$count = User::count();
|
$count = $repository->count();
|
||||||
|
|
||||||
if ($count > 1) {
|
if ($count > 1) {
|
||||||
// if more than one user, do nothing.
|
// if more than one user, do nothing.
|
||||||
@@ -93,17 +94,16 @@ class UserEventHandler
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// user is the only user but does not have role "owner".
|
// user is the only user but does not have role "owner".
|
||||||
$role = Role::where('name', 'owner')->first();
|
$role = $repository->getRole('owner');
|
||||||
if (is_null($role)) {
|
if (is_null($role)) {
|
||||||
// create role, does not exist. Very strange situation so let's raise a big fuss about it.
|
// create role, does not exist. Very strange situation so let's raise a big fuss about it.
|
||||||
$role = Role::create(['name' => 'owner', 'display_name' => 'Site Owner', 'description' => 'User runs this instance of FF3']);
|
$role = $repository->createRole('owner', 'Site Owner', 'User runs this instance of FF3');
|
||||||
Log::error('Could not find role "owner". This is weird.');
|
Log::error('Could not find role "owner". This is weird.');
|
||||||
}
|
}
|
||||||
|
|
||||||
Log::info(sprintf('Gave user #%d role #%d ("%s")', $user->id, $role->id, $role->name));
|
Log::info(sprintf('Gave user #%d role #%d ("%s")', $user->id, $role->id, $role->name));
|
||||||
// give user the role
|
// give user the role
|
||||||
$user->attachRole($role);
|
$repository->attachRole($user, 'owner');
|
||||||
$user->save();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ namespace FireflyIII\Handlers\Events;
|
|||||||
|
|
||||||
use FireflyConfig;
|
use FireflyConfig;
|
||||||
use FireflyIII\Events\RequestedVersionCheckStatus;
|
use FireflyIII\Events\RequestedVersionCheckStatus;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
|
use FireflyIII\Services\Github\Object\Release;
|
||||||
|
use FireflyIII\Services\Github\Request\UpdateRequest;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Log;
|
use Log;
|
||||||
|
|
||||||
@@ -40,22 +44,27 @@ class VersionCheckEventHandler
|
|||||||
public function checkForUpdates(RequestedVersionCheckStatus $event)
|
public function checkForUpdates(RequestedVersionCheckStatus $event)
|
||||||
{
|
{
|
||||||
// in Sandstorm, cannot check for updates:
|
// in Sandstorm, cannot check for updates:
|
||||||
$sandstorm = 1 === intval(getenv('SANDSTORM'));
|
$sandstorm = 1 === (int)getenv('SANDSTORM');
|
||||||
if ($sandstorm === true) {
|
if ($sandstorm === true) {
|
||||||
return;
|
return; // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @var UserRepositoryInterface $repository */
|
||||||
|
$repository = app(UserRepositoryInterface::class);
|
||||||
|
|
||||||
/** @var User $user */
|
/** @var User $user */
|
||||||
$user = $event->user;
|
$user = $event->user;
|
||||||
if (!$user->hasRole('owner')) {
|
if (!$repository->hasRole($user, 'owner')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$permission = FireflyConfig::get('permission_update_check', -1);
|
$permission = FireflyConfig::get('permission_update_check', -1);
|
||||||
$lastCheckTime = FireflyConfig::get('last_update_check', time());
|
$lastCheckTime = FireflyConfig::get('last_update_check', time());
|
||||||
$now = time();
|
$now = time();
|
||||||
if ($now - $lastCheckTime->data < 604800) {
|
$diff = $now - $lastCheckTime->data;
|
||||||
Log::debug('Checked for updates less than a week ago.');
|
Log::debug(sprintf('Difference is %d seconds.', $diff));
|
||||||
|
if ($diff < 604800) {
|
||||||
|
Log::debug(sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s', $lastCheckTime->data)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -66,13 +75,48 @@ class VersionCheckEventHandler
|
|||||||
// have actual permission?
|
// have actual permission?
|
||||||
if ($permission->data === -1) {
|
if ($permission->data === -1) {
|
||||||
// never asked before.
|
// never asked before.
|
||||||
session()->flash('info', strval(trans('firefly.check_for_updates_permission', ['link' => route('admin.update-check')])));
|
session()->flash('info', (string)trans('firefly.check_for_updates_permission', ['link' => route('admin.update-check')]));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// actually check for update and inform the user.
|
$current = config('firefly.version');
|
||||||
|
/** @var UpdateRequest $request */
|
||||||
|
$request = app(UpdateRequest::class);
|
||||||
|
$check = -2;
|
||||||
|
$first = new Release(['id' => '0', 'title' => '0.2', 'updated' => '2017-01-01', 'content' => '']);
|
||||||
|
try {
|
||||||
|
$request->call();
|
||||||
|
$releases = $request->getReleases();
|
||||||
|
// first entry should be the latest entry:
|
||||||
|
/** @var Release $first */
|
||||||
|
$first = reset($releases);
|
||||||
|
$check = version_compare($current, $first->getTitle());
|
||||||
|
Log::debug(sprintf('Comparing %s with %s, result is %s', $current, $first->getTitle(), $check));
|
||||||
|
FireflyConfig::set('last_update_check', time());
|
||||||
|
} catch (FireflyException $e) {
|
||||||
|
Log::error(sprintf('Could not check for updates: %s', $e->getMessage()));
|
||||||
|
}
|
||||||
|
$string = 'no result: ' . $check;
|
||||||
|
if ($check === -2) {
|
||||||
|
$string = strval(trans('firefly.update_check_error'));
|
||||||
|
}
|
||||||
|
if ($check === -1) {
|
||||||
|
// there is a new FF version!
|
||||||
|
$monthAndDayFormat = (string)trans('config.month_and_day');
|
||||||
|
$string = (string)trans(
|
||||||
|
'firefly.update_new_version_alert',
|
||||||
|
[
|
||||||
|
'your_version' => $current,
|
||||||
|
'new_version' => $first->getTitle(),
|
||||||
|
'date' => $first->getUpdated()->formatLocalized($monthAndDayFormat),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($check !== 0) {
|
||||||
|
// flash info
|
||||||
|
session()->flash('info', $string);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,8 +50,9 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
|
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
|
||||||
protected $uploadDisk;
|
protected $uploadDisk;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* AttachmentHelper constructor.
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@@ -154,6 +155,7 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
* @param Model $model
|
* @param Model $model
|
||||||
*
|
*
|
||||||
* @return Attachment
|
* @return Attachment
|
||||||
|
* @throws \Illuminate\Contracts\Encryption\EncryptException
|
||||||
*/
|
*/
|
||||||
protected function processFile(UploadedFile $file, Model $model): Attachment
|
protected function processFile(UploadedFile $file, Model $model): Attachment
|
||||||
{
|
{
|
||||||
@@ -205,7 +207,7 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
Log::debug('Now in validMime()');
|
Log::debug('Now in validMime()');
|
||||||
$mime = e($file->getMimeType());
|
$mime = e($file->getMimeType());
|
||||||
$name = e($file->getClientOriginalName());
|
$name = e($file->getClientOriginalName());
|
||||||
Log::debug(sprintf('Name is %, and mime is %s', $name, $mime));
|
Log::debug(sprintf('Name is %s, and mime is %s', $name, $mime));
|
||||||
Log::debug('Valid mimes are', $this->allowedMimes);
|
Log::debug('Valid mimes are', $this->allowedMimes);
|
||||||
|
|
||||||
if (!in_array($mime, $this->allowedMimes)) {
|
if (!in_array($mime, $this->allowedMimes)) {
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ class MetaPieChart implements MetaPieChartInterface
|
|||||||
/** @var User */
|
/** @var User */
|
||||||
protected $user;
|
protected $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MetaPieChart constructor.
|
||||||
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->accounts = new Collection;
|
$this->accounts = new Collection;
|
||||||
@@ -273,12 +276,15 @@ class MetaPieChart implements MetaPieChartInterface
|
|||||||
$collector->setBudgets($this->budgets);
|
$collector->setBudgets($this->budgets);
|
||||||
$collector->setCategories($this->categories);
|
$collector->setCategories($this->categories);
|
||||||
|
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
if ($this->tags->count() > 0) {
|
if ($this->tags->count() > 0) {
|
||||||
$collector->setTags($this->tags);
|
$collector->setTags($this->tags);
|
||||||
$collector->withCategoryInformation();
|
$collector->withCategoryInformation();
|
||||||
$collector->withBudgetInformation();
|
$collector->withBudgetInformation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
|
||||||
return $collector->getJournals();
|
return $collector->getJournals();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,7 +300,7 @@ class MetaPieChart implements MetaPieChartInterface
|
|||||||
{
|
{
|
||||||
if (0 === count($fields) && $this->tags->count() > 0) {
|
if (0 === count($fields) && $this->tags->count() > 0) {
|
||||||
// do a special group on tags:
|
// do a special group on tags:
|
||||||
return $this->groupByTag($set);
|
return $this->groupByTag($set); // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
|
|
||||||
$grouped = [];
|
$grouped = [];
|
||||||
@@ -338,6 +344,8 @@ class MetaPieChart implements MetaPieChartInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*
|
||||||
* @param Collection $set
|
* @param Collection $set
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
|
|||||||
@@ -35,15 +35,15 @@ class BalanceLine
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
const ROLE_DEFAULTROLE = 1;
|
public const ROLE_DEFAULTROLE = 1;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
const ROLE_TAGROLE = 2;
|
public const ROLE_TAGROLE = 2;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
const ROLE_DIFFROLE = 3;
|
public const ROLE_DIFFROLE = 3;
|
||||||
|
|
||||||
/** @var Collection */
|
/** @var Collection */
|
||||||
protected $balanceEntries;
|
protected $balanceEntries;
|
||||||
|
|||||||
@@ -25,11 +25,13 @@ namespace FireflyIII\Helpers\Collector;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use DB;
|
use DB;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Helpers\Filter\CountAttachmentsFilter;
|
||||||
use FireflyIII\Helpers\Filter\FilterInterface;
|
use FireflyIII\Helpers\Filter\FilterInterface;
|
||||||
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
||||||
use FireflyIII\Helpers\Filter\NegativeAmountFilter;
|
use FireflyIII\Helpers\Filter\NegativeAmountFilter;
|
||||||
use FireflyIII\Helpers\Filter\OpposingAccountFilter;
|
use FireflyIII\Helpers\Filter\OpposingAccountFilter;
|
||||||
use FireflyIII\Helpers\Filter\PositiveAmountFilter;
|
use FireflyIII\Helpers\Filter\PositiveAmountFilter;
|
||||||
|
use FireflyIII\Helpers\Filter\SplitIndicatorFilter;
|
||||||
use FireflyIII\Helpers\Filter\TransferFilter;
|
use FireflyIII\Helpers\Filter\TransferFilter;
|
||||||
use FireflyIII\Models\AccountType;
|
use FireflyIII\Models\AccountType;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
@@ -37,6 +39,7 @@ use FireflyIII\Models\Category;
|
|||||||
use FireflyIII\Models\Tag;
|
use FireflyIII\Models\Tag;
|
||||||
use FireflyIII\Models\Transaction;
|
use FireflyIII\Models\Transaction;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Support\CacheProperties;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||||
use Illuminate\Database\Query\JoinClause;
|
use Illuminate\Database\Query\JoinClause;
|
||||||
@@ -68,6 +71,8 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
'transaction_journals.description',
|
'transaction_journals.description',
|
||||||
'transaction_journals.date',
|
'transaction_journals.date',
|
||||||
'transaction_journals.encrypted',
|
'transaction_journals.encrypted',
|
||||||
|
'transaction_journals.created_at',
|
||||||
|
'transaction_journals.updated_at',
|
||||||
'transaction_types.type as transaction_type_type',
|
'transaction_types.type as transaction_type_type',
|
||||||
'transaction_journals.bill_id',
|
'transaction_journals.bill_id',
|
||||||
'transaction_journals.updated_at',
|
'transaction_journals.updated_at',
|
||||||
@@ -232,7 +237,7 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
$countQuery->getQuery()->groups = null;
|
$countQuery->getQuery()->groups = null;
|
||||||
$countQuery->getQuery()->orders = null;
|
$countQuery->getQuery()->orders = null;
|
||||||
$countQuery->groupBy('accounts.user_id');
|
$countQuery->groupBy('accounts.user_id');
|
||||||
$this->count = $countQuery->count();
|
$this->count = intval($countQuery->count());
|
||||||
|
|
||||||
return $this->count;
|
return $this->count;
|
||||||
}
|
}
|
||||||
@@ -243,6 +248,18 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
public function getJournals(): Collection
|
public function getJournals(): Collection
|
||||||
{
|
{
|
||||||
$this->run = true;
|
$this->run = true;
|
||||||
|
|
||||||
|
// find query set in cache.
|
||||||
|
$hash = hash('sha256', $this->query->toSql() . serialize($this->query->getBindings()));
|
||||||
|
$key = 'query-' . substr($hash, -8);
|
||||||
|
$cache = new CacheProperties;
|
||||||
|
$cache->addProperty($key);
|
||||||
|
if ($cache->has()) {
|
||||||
|
Log::debug(sprintf('Return cache of query with ID "%s".', $key));
|
||||||
|
|
||||||
|
return $cache->get(); // @codeCoverageIgnore
|
||||||
|
}
|
||||||
|
|
||||||
/** @var Collection $set */
|
/** @var Collection $set */
|
||||||
$set = $this->query->get(array_values($this->fields));
|
$set = $this->query->get(array_values($this->fields));
|
||||||
|
|
||||||
@@ -258,11 +275,22 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
if (null !== $transaction->bill_name) {
|
if (null !== $transaction->bill_name) {
|
||||||
$transaction->bill_name = Steam::decrypt(intval($transaction->bill_name_encrypted), $transaction->bill_name);
|
$transaction->bill_name = Steam::decrypt(intval($transaction->bill_name_encrypted), $transaction->bill_name);
|
||||||
}
|
}
|
||||||
|
$transaction->account_name = app('steam')->tryDecrypt($transaction->account_name);
|
||||||
$transaction->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name);
|
$transaction->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name);
|
||||||
$transaction->account_iban = app('steam')->tryDecrypt($transaction->account_iban);
|
$transaction->account_iban = app('steam')->tryDecrypt($transaction->account_iban);
|
||||||
$transaction->opposing_account_iban = app('steam')->tryDecrypt($transaction->opposing_account_iban);
|
$transaction->opposing_account_iban = app('steam')->tryDecrypt($transaction->opposing_account_iban);
|
||||||
|
|
||||||
|
// budget name
|
||||||
|
$transaction->transaction_journal_budget_name = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name);
|
||||||
|
$transaction->transaction_budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name);
|
||||||
|
// category name:
|
||||||
|
$transaction->transaction_journal_category_name = app('steam')->tryDecrypt($transaction->transaction_journal_category_name);
|
||||||
|
$transaction->transaction_category_name = app('steam')->tryDecrypt($transaction->transaction_category_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
);
|
);
|
||||||
|
Log::debug(sprintf('Cached query with ID "%s".', $key));
|
||||||
|
$cache->store($set);
|
||||||
|
|
||||||
return $set;
|
return $set;
|
||||||
}
|
}
|
||||||
@@ -328,7 +356,7 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
*/
|
*/
|
||||||
public function setAfter(Carbon $after): JournalCollectorInterface
|
public function setAfter(Carbon $after): JournalCollectorInterface
|
||||||
{
|
{
|
||||||
$afterStr = $after->format('Y-m-d');
|
$afterStr = $after->format('Y-m-d 00:00:00');
|
||||||
$this->query->where('transaction_journals.date', '>=', $afterStr);
|
$this->query->where('transaction_journals.date', '>=', $afterStr);
|
||||||
Log::debug(sprintf('JournalCollector range is now after %s (inclusive)', $afterStr));
|
Log::debug(sprintf('JournalCollector range is now after %s (inclusive)', $afterStr));
|
||||||
|
|
||||||
@@ -364,7 +392,7 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
*/
|
*/
|
||||||
public function setBefore(Carbon $before): JournalCollectorInterface
|
public function setBefore(Carbon $before): JournalCollectorInterface
|
||||||
{
|
{
|
||||||
$beforeStr = $before->format('Y-m-d');
|
$beforeStr = $before->format('Y-m-d 00:00:00');
|
||||||
$this->query->where('transaction_journals.date', '<=', $beforeStr);
|
$this->query->where('transaction_journals.date', '<=', $beforeStr);
|
||||||
Log::debug(sprintf('JournalCollector range is now before %s (inclusive)', $beforeStr));
|
Log::debug(sprintf('JournalCollector range is now before %s (inclusive)', $beforeStr));
|
||||||
|
|
||||||
@@ -471,6 +499,23 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Collection $journals
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function setJournals(Collection $journals): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
$ids = $journals->pluck('id')->toArray();
|
||||||
|
$this->query->where(
|
||||||
|
function (EloquentBuilder $q) use ($ids) {
|
||||||
|
$q->whereIn('transaction_journals.id', $ids);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $limit
|
* @param int $limit
|
||||||
*
|
*
|
||||||
@@ -551,8 +596,8 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
public function setRange(Carbon $start, Carbon $end): JournalCollectorInterface
|
public function setRange(Carbon $start, Carbon $end): JournalCollectorInterface
|
||||||
{
|
{
|
||||||
if ($start <= $end) {
|
if ($start <= $end) {
|
||||||
$startStr = $start->format('Y-m-d');
|
$startStr = $start->format('Y-m-d 00:00:00');
|
||||||
$endStr = $end->format('Y-m-d');
|
$endStr = $end->format('Y-m-d 23:59:59');
|
||||||
$this->query->where('transaction_journals.date', '>=', $startStr);
|
$this->query->where('transaction_journals.date', '>=', $startStr);
|
||||||
$this->query->where('transaction_journals.date', '<=', $endStr);
|
$this->query->where('transaction_journals.date', '<=', $endStr);
|
||||||
Log::debug(sprintf('JournalCollector range is now %s - %s (inclusive)', $startStr, $endStr));
|
Log::debug(sprintf('JournalCollector range is now %s - %s (inclusive)', $startStr, $endStr));
|
||||||
@@ -717,6 +762,8 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
TransferFilter::class => new TransferFilter,
|
TransferFilter::class => new TransferFilter,
|
||||||
PositiveAmountFilter::class => new PositiveAmountFilter,
|
PositiveAmountFilter::class => new PositiveAmountFilter,
|
||||||
NegativeAmountFilter::class => new NegativeAmountFilter,
|
NegativeAmountFilter::class => new NegativeAmountFilter,
|
||||||
|
SplitIndicatorFilter::class => new SplitIndicatorFilter,
|
||||||
|
CountAttachmentsFilter::class => new CountAttachmentsFilter,
|
||||||
];
|
];
|
||||||
Log::debug(sprintf('Will run %d filters on the set.', count($this->filters)));
|
Log::debug(sprintf('Will run %d filters on the set.', count($this->filters)));
|
||||||
foreach ($this->filters as $enabled) {
|
foreach ($this->filters as $enabled) {
|
||||||
@@ -787,6 +834,7 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
*/
|
*/
|
||||||
private function joinOpposingTables()
|
private function joinOpposingTables()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -146,6 +146,13 @@ interface JournalCollectorInterface
|
|||||||
*/
|
*/
|
||||||
public function setCategory(Category $category): JournalCollectorInterface;
|
public function setCategory(Category $category): JournalCollectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Collection $journals
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function setJournals(Collection $journals): JournalCollectorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $limit
|
* @param int $limit
|
||||||
*
|
*
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user