Compare commits

..

2306 Commits

Author SHA1 Message Date
James Cole
09990acaa2 Merge branch 'release/5.2.6' 2020-05-22 17:54:02 +02:00
James Cole
a73247ec8c Some last minute translations. 2020-05-22 17:53:09 +02:00
James Cole
e98d43dd65 New meta files for 5.2.6 2020-05-22 14:15:57 +02:00
James Cole
dbd68cedc9 Code for #3309 2020-05-22 13:52:33 +02:00
James Cole
e6e8200912 Merge pull request #3381 from bpatath/feature/add-single-sign-on
Feature/add single sign on
2020-05-22 04:27:39 +00:00
bpatath
7b1380366b Register SSO middleware if enabled in configuration 2020-05-21 21:05:03 +02:00
bpatath
1eda806c17 Fix outdated AdLdap2 configuration files 2020-05-21 21:04:17 +02:00
James Cole
782ecca6a9 Warning if people disabled update checking. Every 4 weeks. 2020-05-20 06:40:18 +02:00
James Cole
e6338705a7 Fix #3376 2020-05-19 19:37:12 +02:00
James Cole
09226e6f12 New translations. 2020-05-19 13:29:47 +02:00
James Cole
5ff1991cdc Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-05-19 11:19:13 +02:00
James Cole
4ebb6de520 Reset rule order on index. #3376 2020-05-19 11:18:58 +02:00
James Cole
1ba7d65582 Warning if demo user. 2020-05-18 21:21:34 +02:00
James Cole
4e6063a4f8 Demo user can't set locale 2020-05-18 21:19:45 +02:00
James Cole
85476f3549 Fix some strings. 2020-05-18 21:17:59 +02:00
James Cole
ef9714b7e0 Fix #3374 2020-05-18 14:50:07 +02:00
James Cole
8d20029557 Fix #3368 2020-05-17 19:17:19 +02:00
James Cole
0f04b44ca1 Fix # 2020-05-17 06:49:26 +02:00
James Cole
44ed45502e Change in error handling. 2020-05-16 16:57:48 +02:00
James Cole
5bcafe1311 Change in error handling. 2020-05-16 16:57:26 +02:00
James Cole
5a771ccc5f Run yarn again #3363 2020-05-16 16:56:08 +02:00
James Cole
c6145b4a3b Auto generated JSON files for new strings in other languages. #3363 2020-05-16 16:35:23 +02:00
James Cole
b20aeca849 Auto-generated translation files from crowdin #3363 2020-05-16 16:33:57 +02:00
James Cole
793918f2f3 Add new strings to global translation files. #3363 2020-05-16 16:30:17 +02:00
James Cole
5d410e577e Merge pull request #3365 from sephrat/master
Fix #3363
2020-05-16 14:27:39 +00:00
James Cole
9ec786ec3a Merge branch 'develop' into master 2020-05-16 14:27:31 +00:00
Florian Dupret
e532b4d4fc Fix #3363 2020-05-16 15:01:19 +02:00
James Cole
58585d03c6 Fix rounding thing. 2020-05-16 13:09:37 +02:00
James Cole
a4f66b3d86 Date before and after triggers 2020-05-16 12:55:54 +02:00
James Cole
c847621874 First "date is" trigger for #3049 2020-05-16 12:11:06 +02:00
James Cole
86f14885eb Added a rule action that will delete the transactions it matches. 2020-05-16 11:21:26 +02:00
James Cole
173e196bc8 Some experimental fixes for #3011 2020-05-16 10:45:40 +02:00
James Cole
7505db871f Update packages. 2020-05-16 06:59:51 +02:00
James Cole
946dde8957 Add ability to store recurring telemetry. Not enabled. 2020-05-16 06:59:41 +02:00
James Cole
9a52cfbfbe Add some debug info 2020-05-16 06:59:15 +02:00
James Cole
b248bd6d0c Remove code. 2020-05-15 19:59:23 +02:00
James Cole
3fff9ad0a2 Updated translations. 2020-05-15 19:31:19 +02:00
James Cole
a695a1bba2 Fix #3355 2020-05-12 20:40:28 +02:00
James Cole
91e384aae8 Fix #3350 2020-05-10 20:08:16 +02:00
James Cole
1ac95b6fa7 Move getCash lower, add IBAN as name when no name is submitted. Search will pick up the rest. 2020-05-09 18:03:32 +02:00
James Cole
6757b6211d https://github.com/firefly-iii/firefly-iii/issues/3348 2020-05-09 17:47:25 +02:00
James Cole
4dfb78837e Slightly smarter menu. 2020-05-09 14:51:04 +02:00
James Cole
af50ad3db4 New action 2020-05-09 14:47:47 +02:00
James Cole
01cb94aabc Room for better translation 2020-05-09 14:47:33 +02:00
James Cole
5ffc5060b9 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-05-07 06:44:27 +02:00
James Cole
43d7c956a4 Fix #3344 2020-05-07 06:44:01 +02:00
James Cole
863b07951a Fix #3339 2020-05-05 20:53:56 +02:00
James Cole
2101717edb Can return without split. 2020-05-05 20:32:04 +02:00
James Cole
e7ac1476c5 Merge pull request #3336 from maksimkurb/develop
WIP: Fix #3335 Reconciliation account currency is wrong when base account has non-default currency
2020-05-05 20:30:05 +02:00
Maxim Kurbatov
5d24c1fee1 #3335 Update language files for reconciliation account name 2020-05-05 22:10:11 +04:00
Maxim Kurbatov
53eb863f9d Fix #3335 Reconciliation account currency is wrong when base account has non-default currency 2020-05-05 22:07:42 +04:00
James Cole
3c3ba637b5 Make sure demo user can't upload attachments. 2020-05-05 07:44:33 +02:00
James Cole
be8286b15c Fix some things in recurring transactions. 2020-05-04 10:26:01 +02:00
James Cole
6f6087995d Add info on expired recurring transactions. 2020-05-04 10:12:38 +02:00
James Cole
2ff8a35171 Add debug. 2020-05-04 10:06:13 +02:00
James Cole
7f8ed7abb6 Merge branch 'release/5.2.5' 2020-05-04 08:59:55 +02:00
James Cole
2ff0c37c12 Merge tag '5.2.5' into develop
5.2.5
2020-05-04 08:59:55 +02:00
James Cole
c593936b32 New meta files for upcoming release. 2020-05-04 08:56:51 +02:00
James Cole
c54204ede9 Fix #3330 2020-05-03 19:38:03 +02:00
James Cole
d9132bbee3 Merge pull request #3323 from lguima/feature/page-icons-update
Update the pages and blocks icons
2020-05-02 17:11:27 +02:00
Lucas Guima
c1be98762e Update the Tags icon around the site 2020-05-01 18:55:23 -03:00
Lucas Guima
c2733e2a8f Update the Categories icon around the site 2020-05-01 18:54:08 -03:00
Lucas Guima
722cf9b4fe Update the Reports icon around the site 2020-05-01 17:39:43 -03:00
Lucas Guima
01e31e73e0 Update the Piggy Banks icon around the site 2020-05-01 17:32:35 -03:00
Lucas Guima
dba7d05296 Update the Budgets icon around the site 2020-05-01 17:29:50 -03:00
James Cole
a8709a4a45 update env. 2020-05-01 20:16:34 +02:00
James Cole
49b1435cba Fix cron controller. #3318 2020-05-01 17:51:30 +02:00
James Cole
6a25b41952 Update translations. 2020-05-01 17:50:53 +02:00
James Cole
c561f99de6 Fix #3321 2020-05-01 17:47:56 +02:00
James Cole
9d9053d828 Fix #3314 2020-05-01 06:24:24 +02:00
James Cole
c3c9a2f3c0 Slightly different icon. 2020-04-30 06:27:53 +02:00
James Cole
28465142e9 Menu changelog. 2020-04-30 06:27:10 +02:00
James Cole
5473a618c9 Warn about locale things. 2020-04-30 06:27:01 +02:00
James Cole
ac1a8d8053 Merge pull request #3305 from lguima/feature/menu-reordering
Menu reordering
2020-04-30 06:10:51 +02:00
James Cole
15ae9203b6 Fix #3307 2020-04-29 06:37:02 +02:00
Lucas Guima
9dfc2ae20b Use the translatable string for Tools 2020-04-28 20:59:22 -03:00
Lucas Guima
230de7cbdd Use the translatable string for Classification 2020-04-28 20:59:10 -03:00
Lucas Guima
feaa003a52 Use the translatable string for Others 2020-04-28 20:57:36 -03:00
Lucas Guima
295d01dc16 Use the translatable string for Automation 2020-04-28 20:57:11 -03:00
Lucas Guima
cbf1fde45e Use the translatable string for Accounting 2020-04-28 20:56:19 -03:00
Lucas Guima
6cc47287d3 Use the translatable string for Financial control 2020-04-28 20:55:52 -03:00
Lucas Guima
4bbe728376 Create translatable string for Classification 2020-04-28 20:43:02 -03:00
Lucas Guima
427a90ec85 Create translatable string for Others 2020-04-28 20:32:10 -03:00
Lucas Guima
55ddb26dac Create translatable string for Automation 2020-04-28 20:16:25 -03:00
Lucas Guima
891777f079 Create translatable string for Accounting 2020-04-28 20:14:15 -03:00
Lucas Guima
1655286b67 Create translatable string for Financial control 2020-04-28 20:10:43 -03:00
Lucas Guima
dd81636bf2 Add an icon for each sub-menu item 2020-04-28 19:29:53 -03:00
Lucas Guima
56a43a707d Update the icon of Bills menu item 2020-04-28 19:07:44 -03:00
Lucas Guima
c2f92c6e45 Update the icon of Options menu item 2020-04-28 19:07:11 -03:00
Lucas Guima
61bd2dc840 Revert "Move the menu items Profile and Logout to the user menu in the main header"
This reverts commit f6a675f2e2.
2020-04-28 18:55:49 -03:00
Lucas Guima
f6a675f2e2 Move the menu items Profile and Logout to the user menu in the main header 2020-04-27 22:29:14 -03:00
Lucas Guima
85b43055a7 Put the menu sub-items text inside a span tag 2020-04-27 21:44:23 -03:00
Lucas Guima
e63f7bcc70 Put a space between arguments 2020-04-27 21:41:00 -03:00
Lucas Guima
384dd37430 Update the menu item Logout 2020-04-27 21:37:20 -03:00
Lucas Guima
c6b336171c Update the menu item Options 2020-04-27 21:36:47 -03:00
Lucas Guima
d2f4399a1a Update the menu item Tools (Import and export) 2020-04-27 21:30:12 -03:00
Lucas Guima
02d1bc093c Update the menu item Reports 2020-04-27 21:14:38 -03:00
Lucas Guima
420e493987 Group Categories and Tags under the new menu item Classification 2020-04-27 21:12:23 -03:00
Lucas Guima
0a15479bff Update the menu item Accounts 2020-04-27 20:53:25 -03:00
Lucas Guima
a9b76a3679 Add menu header for Others 2020-04-27 20:44:39 -03:00
Lucas Guima
d1a3cd9044 Move and update the menu item Automation (Money management) 2020-04-27 20:41:40 -03:00
Lucas Guima
81735d59f8 Move and update the menu item Transactions 2020-04-27 19:59:53 -03:00
Lucas Guima
1d8da7f9f0 Add menu header for Accounting 2020-04-27 18:35:52 -03:00
Lucas Guima
c5f0684030 Place the menu item Piggy banks after Bills 2020-04-26 18:11:20 -03:00
Lucas Guima
25867adcb9 Move the menu item Piggy banks 2020-04-26 18:10:22 -03:00
Lucas Guima
d55694cd68 Move the menu item Bills 2020-04-26 18:07:08 -03:00
Lucas Guima
05f069d61e Move the menu item Budgets 2020-04-26 18:00:28 -03:00
Lucas Guima
5f6e7ad138 Add menu header for Financial Control 2020-04-26 17:50:42 -03:00
Lucas Guima
61bc38921e Update Dashboard menu item 2020-04-26 17:48:13 -03:00
Lucas Guima
94c660545d Update indentation 2020-04-26 17:44:07 -03:00
James Cole
4d3907948d Merge tag '5.2.4' into develop
5.2.4
2020-04-26 10:02:43 +02:00
James Cole
e6442dd8af Merge branch 'release/5.2.4' 2020-04-26 10:02:42 +02:00
James Cole
7905e0bd70 Bump to 5.2.4 2020-04-26 10:02:25 +02:00
James Cole
f4b1da352d no message 2020-04-26 07:08:33 +02:00
James Cole
0d33348941 Fix #3251 2020-04-26 06:57:59 +02:00
James Cole
c7c875e95f Fix #3251 2020-04-26 06:54:12 +02:00
James Cole
19d24b3e2a Clean up templates 2020-04-26 06:45:42 +02:00
James Cole
8fed6b6657 Fix #3287 2020-04-22 09:28:20 +02:00
James Cole
b5eafa1910 Merge tag '5.2.3' into develop
5.2.3
2020-04-22 06:33:23 +02:00
James Cole
c15501937f Merge branch 'release/5.2.3' 2020-04-22 06:33:22 +02:00
James Cole
4c743bd5b0 Update meta files for new release. 2020-04-22 06:29:34 +02:00
James Cole
44289cbd95 Fix #3284 2020-04-22 06:09:29 +02:00
James Cole
b2f1642cfe Fix #3281 2020-04-21 08:17:31 +02:00
James Cole
341ef0220c New translations. 2020-04-19 11:07:14 +02:00
James Cole
9df88115bc Update packages. 2020-04-19 11:05:14 +02:00
James Cole
c7273edb5e Updated language strings and meta config. 2020-04-19 06:52:12 +02:00
James Cole
c398aa2b69 Add support for British English and allow the user to set a locale. 2020-04-19 06:51:40 +02:00
James Cole
aa786eaaf3 Clean up language setting. 2020-04-19 06:11:49 +02:00
James Cole
e58a5e12d6 Fix #3270 2020-04-19 06:10:49 +02:00
James Cole
12b3575c5c Fix method reference 2020-04-19 06:09:55 +02:00
James Cole
3ca186dc8f Remove unused method. 2020-04-19 06:09:43 +02:00
James Cole
1535f596f6 Add two new support functions. 2020-04-19 06:07:43 +02:00
James Cole
2cc326caa1 Fix #3272 2020-04-19 06:05:39 +02:00
James Cole
43436ae942 Fix issue with casting. 2020-04-19 06:00:11 +02:00
James Cole
fbfd8475de Fix #3264 2020-04-15 16:17:45 +02:00
James Cole
405752f353 Merge tag '5.2.2' into develop
5.2.2
2020-04-14 21:01:03 +02:00
James Cole
2af98b259a Merge branch 'release/5.2.2' 2020-04-14 21:01:02 +02:00
James Cole
015242a666 Update meta files for new release. 2020-04-14 20:56:30 +02:00
James Cole
54933fda2e Fix #3263 2020-04-14 17:23:58 +02:00
James Cole
852d057a47 Fix #3259 2020-04-13 07:57:46 +02:00
James Cole
1778f0b4f3 Fix storing of virtual balance. 2020-04-13 07:57:32 +02:00
James Cole
6daf083b3f Clean up some code. 2020-04-12 06:24:35 +02:00
James Cole
4a7d9b130a Fix issue with multi-currency in asset accounts. 2020-04-12 06:23:35 +02:00
James Cole
4163efba55 Clean up phpdoc 2020-04-11 06:42:47 +02:00
James Cole
db5847b49b Consistent in minimum password length 2020-04-11 06:42:40 +02:00
James Cole
6829003f5e Change to safer hash methods. 2020-04-11 06:42:21 +02:00
James Cole
047927718e Merge branch 'release/5.2.1' 2020-04-10 21:23:53 +02:00
James Cole
91deb22a3f Merge tag '5.2.1' into develop
5.2.1
2020-04-10 21:23:53 +02:00
James Cole
1629ca0739 Update for some bugs. 2020-04-10 21:20:04 +02:00
James Cole
8b87204f10 User unable to store budgets without auto budget info. 2020-04-10 21:16:46 +02:00
James Cole
f920d90e3d Fix chart problem 2020-04-10 21:16:29 +02:00
James Cole
1cb91282af Merge tag '5.2.0' into develop
5.2.0
2020-04-10 13:51:23 +02:00
James Cole
a6ce294131 Merge branch 'release/5.2.0' 2020-04-10 13:51:22 +02:00
James Cole
34ceb69776 Update last minute files. 2020-04-10 13:50:37 +02:00
James Cole
eed68b5d95 Fix some code quality issues. 2020-04-10 10:47:24 +02:00
James Cole
79374c11ee Fix for #3248 2020-04-10 10:12:12 +02:00
James Cole
404f9df6d3 Bad link to model. 2020-04-10 07:29:15 +02:00
James Cole
4b716e35b9 Prep changelog for new release. 2020-04-10 07:20:45 +02:00
James Cole
166fc7a3e2 Fix trait 2020-04-09 20:33:55 +02:00
James Cole
06afbc7a0a Fix chart 2020-04-09 06:27:43 +02:00
James Cole
49a98de63a Add YNAB 2020-04-09 06:27:29 +02:00
James Cole
5b572c0da2 Expand readme. 2020-04-09 06:27:20 +02:00
James Cole
59014b1a87 Meta files for the next release. 2020-04-08 06:54:16 +02:00
James Cole
4aec1f06e0 Fix issue updating categories. 2020-04-08 06:43:58 +02:00
James Cole
136af9625a Better link for tags. 2020-04-07 18:19:29 +02:00
James Cole
edac26f757 Merge pull request #3236 from SuperSandro2000/patch-1
Add missing date based on releases page
2020-04-05 07:54:01 +02:00
Sandro
ac54dd05bf Add missing date based on releases page 2020-04-05 07:31:30 +02:00
James Cole
7948058364 Fix #3234 2020-04-05 07:14:17 +02:00
James Cole
f13a6f7bf9 New php docs [skip ci] 2020-04-05 07:10:59 +02:00
James Cole
e1a5d143c5 Merge tag '5.2.0-beta.1' into develop
5.2.0-beta.1
2020-04-02 06:54:50 +02:00
James Cole
f98011cd0d Merge branch 'release/5.2.0-beta.1' 2020-04-02 06:54:49 +02:00
James Cole
e7c10dec5c Update meta files for new release. 2020-04-02 06:39:09 +02:00
James Cole
ae2b28fdee Use correct methods. 2020-03-31 07:41:48 +02:00
James Cole
8d3fc18ca6 Use correct methods. 2020-03-31 07:40:20 +02:00
James Cole
61521cf478 Use correct methods. 2020-03-31 07:39:57 +02:00
James Cole
06c5e4df2c Use correct methods. 2020-03-31 07:39:36 +02:00
James Cole
9e4b7f8bb4 Add IBAN to account validator. 2020-03-31 07:04:00 +02:00
James Cole
144bc29eb3 Fix issue with budgets. 2020-03-31 07:03:37 +02:00
James Cole
2c0d8b9cb3 Fix #3122 2020-03-28 16:06:37 +01:00
James Cole
511b1258ba Merge pull request #3212 from rubenverhoef/CSV-ING
ING CSV
2020-03-27 05:22:02 +00:00
Ruben Verhoef
8cfe0af502 New saving acount function, supports account numbers with chars and make it easier to link when account numbers are the same but name are different 2020-03-26 20:51:07 +01:00
James Cole
54e3c7d729 Fix #3211 2020-03-26 19:59:38 +01:00
James Cole
628b493128 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-03-26 19:58:40 +01:00
Ruben Verhoef
8c552b8fa8 Fix functions moveValutadatumDescription and removeNameIngDescription 2020-03-26 19:52:30 +01:00
James Cole
c864d904b0 Fix #3079 2020-03-26 18:00:18 +01:00
James Cole
ecb61676ab Fix #3210 2020-03-26 12:05:15 +01:00
James Cole
ee5a4caaab Some extra code for #1376 2020-03-26 07:10:39 +01:00
James Cole
84bdd47109 update issue templates. 2020-03-25 19:25:50 +01:00
James Cole
5445752588 Update some phpdocs, courtesy of Psalm. 2020-03-25 07:03:23 +01:00
James Cole
bcfbdcf3f0 Clean up models.
Clean up models.
2020-03-25 06:58:39 +01:00
James Cole
7e6cd77203 Clean up models. 2020-03-25 06:58:29 +01:00
James Cole
5e3d00ecde Merge tag '5.2.0-alpha.1' into develop
5.2.0-alpha.1
2020-03-24 07:22:27 +01:00
James Cole
4dea3a5f55 Merge branch 'release/5.2.0-alpha.1' 2020-03-24 07:22:23 +01:00
James Cole
7303d8b899 Meta files for release 5.2.0-alpha.1 2020-03-24 07:13:13 +01:00
James Cole
fa0caa6518 Meta files for release 5.2.0-alpha.1 2020-03-24 07:11:30 +01:00
James Cole
26be90eff1 Meta files for release 5.2.0-alpha.1 2020-03-24 07:11:05 +01:00
James Cole
db3c9fbd28 Can't remove your own admin rights. 2020-03-24 05:57:04 +01:00
James Cole
87b62e2e72 New strings. 2020-03-24 05:53:05 +01:00
James Cole
1e6224f041 Fix #3203 2020-03-23 20:23:38 +01:00
James Cole
d6797b8428 Allow users to hand out admin rights. 2020-03-23 17:54:49 +01:00
James Cole
76c89a8efa Fix #3202 2020-03-23 11:01:00 +01:00
James Cole
1797880488 Code for #3057 2020-03-22 18:27:20 +01:00
James Cole
cdebde5a2b Fixed #3048 2020-03-22 17:28:25 +01:00
James Cole
5ee1f322d0 hide button and checkbox [skip ci] 2020-03-22 08:18:38 +01:00
James Cole
87273e232a hide button and checkbox [skip ci] 2020-03-22 08:18:05 +01:00
James Cole
53b77e6bf9 hide cat and bud [skip ci] 2020-03-22 08:17:02 +01:00
James Cole
b8696bf8b5 hide date [skip ci] 2020-03-22 08:15:52 +01:00
James Cole
8436a86536 Hide icon [skip ci] 2020-03-22 08:14:47 +01:00
James Cole
c598151c68 Hide some fields. 2020-03-22 08:13:39 +01:00
James Cole
53938f3c12 Make table responsive. 2020-03-22 08:10:09 +01:00
James Cole
0813464fe0 Hard stop if feature flag is disabled. 2020-03-22 08:06:36 +01:00
James Cole
4436c9939e Add error message. 2020-03-22 08:04:35 +01:00
James Cole
5e323b958f Update strings and view for telemetry (inactive) 2020-03-22 07:55:57 +01:00
James Cole
367f225f38 Limit to 50. 2020-03-22 06:59:46 +01:00
James Cole
a97d7058ff Telemetry cron job. 2020-03-21 21:32:17 +01:00
James Cole
9d7fb0efe1 Remove slash 2020-03-21 21:13:41 +01:00
James Cole
1e9596bba0 Add URL of (inactive) telemetry endpoint. 2020-03-21 21:08:41 +01:00
James Cole
c6d17e9bd7 Reformat code. 2020-03-21 15:43:41 +01:00
James Cole
f76585dc9b Update (disabled) telemetry settings. 2020-03-21 15:42:37 +01:00
James Cole
cf4f76f211 Fix bar, also multi currency #2977 2020-03-21 15:12:23 +01:00
James Cole
790e29f15e Update the amount, not yet the bar #2977 2020-03-21 14:50:54 +01:00
James Cole
2107406d8b Clean up and simplify 2020-03-21 14:20:40 +01:00
James Cole
b91a21a081 Move more code to trait. 2020-03-21 09:41:04 +01:00
James Cole
170e35aecc Wrong variable name. 2020-03-21 09:35:25 +01:00
James Cole
5701597e20 Some more moved to traits. 2020-03-21 09:01:14 +01:00
James Cole
d16389748f Move code to traits. 2020-03-21 08:54:38 +01:00
James Cole
ee844e970f Move to separate traits. 2020-03-21 08:11:14 +01:00
James Cole
62757812ff Refactor group validation 2020-03-21 06:01:27 +01:00
James Cole
c15b72b6b0 Refactor currency validation 2020-03-21 06:00:36 +01:00
James Cole
11e3834235 Refactor validation method. 2020-03-21 05:56:27 +01:00
James Cole
affc198b03 Cleanup for #2999 2020-03-21 05:47:49 +01:00
James Cole
d5b315e3c8 Experimental chart for #2999 2020-03-21 05:26:39 +01:00
James Cole
eb31ff4ebb Remove comma 2020-03-20 18:23:21 +01:00
James Cole
9ab36d4598 Update composer files. 2020-03-20 18:15:24 +01:00
James Cole
bf06f8eac3 Add telemetry config (inactive) 2020-03-20 18:06:24 +01:00
James Cole
fa9befba11 Remove TODO [skip ci] 2020-03-20 18:06:08 +01:00
James Cole
3b0c061ec7 Model and some basic code for Telemetry (inactive) 2020-03-20 18:05:58 +01:00
James Cole
d021be6a25 Add telemetry (inactive) 2020-03-20 18:05:40 +01:00
James Cole
69ee691497 Fix null pointer. 2020-03-20 17:59:56 +01:00
James Cole
5a7152ceec Clean up config. 2020-03-20 17:31:54 +01:00
James Cole
7b216543fa Update instructions 2020-03-20 17:21:45 +01:00
James Cole
cd3f3fd781 Fix #2985 2020-03-20 15:52:20 +01:00
James Cole
4b0e46af2b Whoops 2020-03-20 15:42:56 +01:00
James Cole
470ab6340c Fix #2985 2020-03-20 08:41:20 +01:00
James Cole
9e54ebe6a9 Fix #2958 2020-03-20 04:42:19 +01:00
James Cole
7eb2451e3d Improved chart for #2938 2020-03-20 04:37:45 +01:00
James Cole
6dba44ba71 Show attachments to tags #2828 2020-03-19 18:51:47 +01:00
James Cole
64683647bd Piggy supports view of attachments #2828 2020-03-19 18:44:45 +01:00
James Cole
1f919b6d0e Attachments for categories #2828 2020-03-19 18:37:57 +01:00
James Cole
417a0d0f83 Show attachments for budgets #2828 2020-03-19 18:28:02 +01:00
James Cole
9b53576fc2 Show attachments for bills #2828 2020-03-19 18:23:34 +01:00
James Cole
2a46756838 Attachments for accounts are visible #2828 2020-03-19 18:20:23 +01:00
James Cole
cdf055065f Remove unused method. 2020-03-19 15:21:44 +01:00
James Cole
2cee008e4a Clean up a little bit. 2020-03-19 15:16:59 +01:00
James Cole
d889e39aad Clean up method. 2020-03-19 14:33:41 +01:00
James Cole
72b9ecf07e Simplify trait. 2020-03-19 14:28:38 +01:00
James Cole
14f4351920 Can upload attachments for all models #2828 2020-03-19 09:14:49 +01:00
James Cole
12e81364a0 Make sure all controllers can store attachment when creating models #2828 2020-03-19 09:01:35 +01:00
James Cole
d489244c00 Add attachment helper to relevant classes #2828 2020-03-19 08:58:55 +01:00
James Cole
aceaf5f891 Add attachment thing to views #2828 2020-03-19 08:56:00 +01:00
James Cole
6129b9d25c Make upload size globally available #2828 2020-03-19 08:43:52 +01:00
James Cole
75afe35e98 API can deal with attachments for more models. #2828 2020-03-19 08:32:42 +01:00
James Cole
3246b7eb9f Allow more models to accept transactions #2828 2020-03-18 21:36:26 +01:00
James Cole
c412ffc195 Short array syntax #3197 2020-03-18 20:58:25 +01:00
James Cole
7c3b5fe714 Merge pull request #3197 from rubenverhoef/CSV-ING
Fix small issue from #3146
2020-03-18 19:57:42 +00:00
James Cole
ae967c027b Merge branch 'develop' into CSV-ING 2020-03-18 19:56:50 +00:00
James Cole
3e74fce885 Simplify method. 2020-03-18 20:55:31 +01:00
James Cole
2c7891bfb2 Merge pull request #3196 from firefly-iii/analysis-3wxmk5
Apply fixes from StyleCI
2020-03-18 19:46:02 +00:00
James Cole
712ba00c9e Apply fixes from StyleCI 2020-03-18 19:45:45 +00:00
James Cole
74683b18f2 Fix bad namespace. 2020-03-18 15:38:28 +01:00
James Cole
d0d129d965 Fix #3193 2020-03-18 15:29:32 +01:00
Ruben Verhoef
87d459c5ff Check if Valutadatum is found in row 8, when not found do nothing! 2020-03-17 19:43:03 +01:00
James Cole
5b591ff744 Whoops 2020-03-17 17:41:59 +01:00
James Cole
63f00cbb7b Remove unused index 2020-03-17 17:41:43 +01:00
James Cole
c90b26c181 Simplify method. 2020-03-17 17:41:06 +01:00
James Cole
c136c60eae Merge pull request #3195 from firefly-iii/analysis-rdjLrQ
Apply fixes from StyleCI
2020-03-17 16:07:00 +00:00
James Cole
ba4c1d95a7 Apply fixes from StyleCI 2020-03-17 16:06:30 +00:00
James Cole
9a25d6a741 Code cleanup that (hopefully) matches style CI 2020-03-17 16:46:00 +01:00
James Cole
91c067ac9f Code cleanup that (hopefully) matches style CI 2020-03-17 15:03:08 +01:00
James Cole
24129ab69c Code cleanup that (hopefully) matches style CI 2020-03-17 15:02:57 +01:00
James Cole
2b6c3fd743 Code cleanup that (hopefully) matches style CI 2020-03-17 15:01:00 +01:00
James Cole
bd2f064eeb Code cleanup that (hopefully) matches style CI 2020-03-17 14:57:04 +01:00
James Cole
b0c9fc0792 Code cleanup that (hopefully) matches style CI 2020-03-17 14:54:25 +01:00
James Cole
e02e747f1b Code cleanup that (hopefully) matches style CI 2020-03-17 14:53:17 +01:00
James Cole
64462812fc Two small method improvements. 2020-03-17 14:46:17 +01:00
James Cole
46382b0d21 Simplify method. 2020-03-16 19:45:23 +01:00
James Cole
a7fffa5868 Make method smaller. 2020-03-16 19:40:48 +01:00
James Cole
4334928fbd Add sort to language. 2020-03-16 06:54:18 +01:00
James Cole
a478d1b544 Add sort to language. 2020-03-16 06:53:10 +01:00
James Cole
08b69dfbf6 Update language strings for Vietnamese. 2020-03-16 06:50:51 +01:00
James Cole
b631adbbf2 Update language strings. 2020-03-16 06:47:06 +01:00
James Cole
fbd88d03c5 Add support for Vietnamese. 2020-03-16 06:46:48 +01:00
James Cole
4982f6f919 Cleanup method 2020-03-15 18:12:36 +01:00
James Cole
6a6bf102b6 Cleanup method. 2020-03-15 18:05:24 +01:00
James Cole
524f85b9c1 Delete import related tests 2020-03-15 15:33:00 +01:00
James Cole
328c960950 Fix API tests 2020-03-15 15:32:09 +01:00
James Cole
208bece7ea Clean up validation 2020-03-15 15:31:59 +01:00
James Cole
16f918a294 Mark all import related code as deprecated 2020-03-15 15:31:51 +01:00
James Cole
9d90beb790 update libraries for better keyboard use. 2020-03-15 15:17:07 +01:00
James Cole
d7e953d38c Clean up complicated method. 2020-03-15 09:54:44 +01:00
James Cole
6967bb003e Do some code cleanup. 2020-03-15 08:16:16 +01:00
James Cole
f63e51fea2 Fix issue with null pointers. 2020-03-15 07:48:02 +01:00
James Cole
33c73701d8 Button to duplicate rule. #2957 2020-03-14 21:01:21 +01:00
James Cole
50b710b4f6 Expand charts. 2020-03-14 20:30:31 +01:00
James Cole
d1325ffbd8 New charts for #2726 2020-03-14 19:12:32 +01:00
James Cole
bfc6a70c9f Fix #3154 2020-03-14 16:56:58 +01:00
James Cole
a00f46faa9 Also create initial budget limit. 2020-03-14 15:18:32 +01:00
James Cole
c475f05652 Updated library. 2020-03-14 10:29:32 +01:00
James Cole
d42b9ee017 Initial changelog. 2020-03-14 10:29:23 +01:00
James Cole
cccaae49a5 Dont forget to enable recurring cron job. 2020-03-14 10:27:43 +01:00
James Cole
1dd3018cb2 Basic cron job for budgeting. 2020-03-14 10:25:12 +01:00
James Cole
7ea32046af Add icon. 2020-03-14 08:03:43 +01:00
James Cole
9bb2f1cfd3 Edit works again 2020-03-14 07:55:00 +01:00
James Cole
fdffed636f Make sure create uses the right fields. 2020-03-14 07:49:11 +01:00
James Cole
bde0732135 Can now update (and remove) auto budget over api 2020-03-14 07:43:49 +01:00
James Cole
d1d11ae717 Can now create auto budget over API 2020-03-14 07:30:55 +01:00
James Cole
309633069c can edit, delete and see in api autobudget 2020-03-14 07:01:31 +01:00
James Cole
2ece754927 Can now store and validate auto budget 2020-03-13 21:35:22 +01:00
James Cole
6f98fc0dff First attempt at form. 2020-03-13 21:15:54 +01:00
James Cole
cd65971f5e Some new strings for new model. 2020-03-13 21:15:37 +01:00
James Cole
81d7b7b6a1 New model and migration. 2020-03-13 21:15:21 +01:00
James Cole
92ba56ae2b Clean up some forms. 2020-03-13 20:56:26 +01:00
James Cole
e1bcfb9ac9 Merge tag '5.1.1' into develop
5.1.1
2020-03-13 19:40:00 +01:00
James Cole
b398924706 Merge branch 'release/5.1.1' 2020-03-13 19:39:59 +01:00
James Cole
d6f46e23c5 update libraries. 2020-03-13 19:36:12 +01:00
James Cole
8b4066a981 Update language strings. 2020-03-13 19:32:58 +01:00
James Cole
f8a695d7e1 update language strings. 2020-03-13 19:32:11 +01:00
James Cole
630b24716d update changelog 2020-03-13 19:25:33 +01:00
James Cole
be41049e72 Remove some debug. 2020-03-13 18:18:07 +01:00
James Cole
b726e7d106 Improved account list for #2768 2020-03-13 18:17:53 +01:00
James Cole
1058bcd31d Add liabilities to home screen #2768 2020-03-13 15:47:26 +01:00
James Cole
8724ba05ca Fix #2672 2020-03-13 12:46:52 +01:00
James Cole
5145707b94 Test facades. 2020-03-13 08:02:38 +01:00
James Cole
3746cb8c71 Some updated translations. 2020-03-13 07:25:27 +01:00
James Cole
624f2d0bfd Update language strings. 2020-03-13 06:39:25 +01:00
James Cole
1c397ad0ad Add revolut import tool. 2020-03-13 06:23:01 +01:00
James Cole
a2c0f0666f Update transaction form 2020-03-13 06:22:50 +01:00
James Cole
72a4e86e2f Throw better exception. 2020-03-12 05:11:19 +01:00
James Cole
5e8d94d16a Better handling of errors. 2020-03-12 05:06:42 +01:00
James Cole
d92b741088 Remove debug 2020-03-11 14:18:20 +01:00
James Cole
2a4107940f Test debug 2020-03-11 14:17:20 +01:00
James Cole
16d5282929 Better count of transactions. 2020-03-11 14:14:51 +01:00
James Cole
f6ecb143fe Catch some more weird exceptions. 2020-03-11 10:39:53 +01:00
James Cole
f375934b41 Prep for a new auto-complete, and enable foreign currency select. 2020-03-11 10:25:38 +01:00
James Cole
9f8bf6d495 A bunch of empty pages as a place-holder for future telemetry efforts. 2020-03-11 08:13:23 +01:00
James Cole
9e9b55da8e Slightly improved help text. 2020-03-11 07:31:37 +01:00
James Cole
c1654f1d04 Fix #3160 2020-03-11 06:50:23 +01:00
James Cole
c526c4ae1a Update language strings. 2020-03-11 06:44:31 +01:00
James Cole
dcf1609c61 Enable Greek again #3176 2020-03-11 06:41:20 +01:00
James Cole
dd84c7f966 Fix #3182 2020-03-11 06:41:02 +01:00
James Cole
bccde86c0c Do some extra validation, fixes #3182 2020-03-11 05:45:37 +01:00
James Cole
2f17c45b3f Update version. 2020-03-10 19:53:56 +01:00
James Cole
b6bab003cd Clean up and optimize fonts. 2020-03-10 19:51:26 +01:00
James Cole
27d7eb4832 Enable file import because 5.1.1 will probably preclude 5.2.0 2020-03-10 19:24:30 +01:00
James Cole
774f7d88c2 Code for #3180 2020-03-10 18:29:27 +01:00
James Cole
086e4d5880 Fix #3177 2020-03-09 18:25:47 +01:00
James Cole
50f4bf568b Auto enable HIBP check 2020-03-09 18:13:20 +01:00
James Cole
c218c70b1f Make modifiers case insensitive. 2020-03-09 18:13:04 +01:00
James Cole
a939a5ba30 Extra code for #3172 2020-03-08 06:20:27 +01:00
James Cole
25be550e6d Disable file import, add links. 2020-03-07 12:47:22 +01:00
James Cole
9331f8985a Fix #3172 2020-03-07 12:09:18 +01:00
James Cole
41e6c8f73e Fix #3173 2020-03-06 18:23:08 +01:00
James Cole
a29f8d5849 Push minimum password length to 16 characters. 2020-03-06 18:22:44 +01:00
James Cole
9817c0807a Add ability to disable running of rules on transactions. 2020-03-06 09:41:27 +01:00
James Cole
4818baee39 Merge tag '5.1.0' into develop
5.1.0
2020-03-06 05:27:28 +01:00
James Cole
379916ee08 Merge branch 'release/5.1.0' 2020-03-06 05:27:27 +01:00
James Cole
60dbd51259 New meta files and translations. 2020-03-06 05:25:36 +01:00
James Cole
0927b0c8ae Accept strings like a good boy. 2020-03-03 19:36:03 +01:00
James Cole
40cc510057 Fix bad location storage. 2020-02-29 14:08:11 +01:00
James Cole
d580bf8f43 Fix untranslatable strings #3159 2020-02-29 13:58:34 +01:00
James Cole
4434ea40ee Add info about timezones. 2020-02-29 13:58:17 +01:00
James Cole
2ba6ffccbc Catch null pointers 2020-02-28 18:56:27 +01:00
James Cole
ec335ae88c Fix possible null pointer. 2020-02-28 18:53:20 +01:00
James Cole
542c64154c Fix for #3154 2020-02-27 17:35:21 +01:00
James Cole
e4fa437f78 Update libraries. 2020-02-26 20:29:04 +01:00
James Cole
61f3f995ad Update changelog, version and strings. 2020-02-26 20:28:54 +01:00
James Cole
8182cf1efa New texts. 2020-02-26 19:50:36 +01:00
James Cole
10d578503c Merge pull request #3146 from rubenverhoef/ING-CSV
Better CSV import for ING (NL)
2020-02-25 19:21:02 +00:00
Ruben Verhoef
75ee331f36 Move "Valutadatum" to own column
The new column has no name right now, need to fix this
2020-02-23 18:46:17 +01:00
Ruben Verhoef
a32c484fd5 fix typo row -> column 2020-02-23 18:45:56 +01:00
Ruben Verhoef
62d74e05f2 Fix saving accounts copy of account number to row 1 and name to row 3 2020-02-23 18:45:36 +01:00
Ruben Verhoef
23ec5cbaa7 Remove "Omschrijving" but not it's value, only the word. 2020-02-23 18:39:39 +01:00
Ruben Verhoef
21fcb6f853 Correctly remove the "Naam" and it's value 2020-02-23 18:38:21 +01:00
Ruben Verhoef
9b0a890531 Add also "Divers" transaction type 2020-02-23 18:37:41 +01:00
James Cole
af503597e6 Fix #3145 2020-02-23 14:01:08 +01:00
James Cole
e0c99fa80c Fix #3145 2020-02-23 13:15:48 +01:00
James Cole
a486d65893 Fix #3145 2020-02-23 12:42:28 +01:00
James Cole
08a6e22556 Fix redirect, courtesy of @SuperSandro2000 2020-02-23 11:11:38 +01:00
James Cole
2d5c4c8101 Merge tag '5.1.0-beta.1' into develop
5.1.0-beta.1
2020-02-23 07:47:40 +01:00
James Cole
4b7460c1cf Merge branch 'release/5.1.0-beta.1' 2020-02-23 07:47:37 +01:00
James Cole
8c8a2a1596 Fix query for attachment icon. 2020-02-23 07:38:23 +01:00
James Cole
ee7731b1a1 Render new JS 2020-02-23 07:09:51 +01:00
James Cole
36e4462957 Update some language strings. 2020-02-23 07:09:09 +01:00
James Cole
e71a4a5595 update version 2020-02-23 07:05:45 +01:00
James Cole
287aa76d8d update composer 2020-02-23 07:05:36 +01:00
James Cole
a9738fc2a9 Update changelog. 2020-02-23 07:05:30 +01:00
James Cole
bc485363ca Restore attachment icon (not yet in all views). Fixes #3142 2020-02-23 06:59:41 +01:00
James Cole
f53e9d91c0 Fix #3143 2020-02-23 06:37:37 +01:00
James Cole
99fd90ee49 Add installation ID 2020-02-23 06:37:04 +01:00
James Cole
fb77210f2c Add installation ID 2020-02-23 06:36:58 +01:00
James Cole
6c163ebef3 Add debug information. 2020-02-22 11:05:16 +01:00
James Cole
1d8f34275a Flash success message. 2020-02-22 06:28:18 +01:00
James Cole
1fcc2f6b39 Updated a lot of language strings. 2020-02-22 06:21:56 +01:00
James Cole
2eaa31163c Fix link #3140 2020-02-21 20:58:20 +01:00
James Cole
3de4441bcd Trigger cache to fix #3141 2020-02-21 20:47:10 +01:00
James Cole
cbc43b9dc1 Merge pull request #3137 from DanYoSon/trans-format-fix
add 2 <th> to fix header row border, fix alignment on action btn
2020-02-21 05:05:10 +00:00
Daniel Idzerda
d018c57b17 add 2 <th> to fix header row border, fix alignment on action btn 2020-02-20 20:21:03 -05:00
James Cole
a5d0658241 Fix #3135 2020-02-19 20:13:09 +01:00
James Cole
ce29beaf55 Fix bad role names #3129 2020-02-19 20:06:41 +01:00
James Cole
b11bcc1fbe Trigger cache, fixes #3127 2020-02-19 19:55:35 +01:00
James Cole
ab0e77a2e8 New and optimised Vue code, courtesy of @GaryQ 2020-02-19 17:13:01 +01:00
James Cole
80f0637c77 Fix #3130 2020-02-19 07:17:58 +01:00
James Cole
a280319a0b Merge pull request #3131 from cpmsmith/patch-1
Fix search modifiers claiming the whole query
2020-02-18 04:19:51 +00:00
Calum Smith
eb3a55d6e0 Fix search modifiers claiming the whole query
The regex was only restricting to characters without the Unicode property Other, which is most characters, including spaces.
2020-02-17 20:35:15 -05:00
James Cole
64a6661ea4 Update email address. 2020-02-16 14:00:57 +01:00
James Cole
7f46cf805c Update email address. 2020-02-16 13:59:55 +01:00
James Cole
d0d5dea5ce Update email address. 2020-02-16 13:59:41 +01:00
James Cole
018ca29184 Update email address. 2020-02-16 13:58:48 +01:00
James Cole
4b4f78b9eb Update email address. 2020-02-16 13:58:33 +01:00
James Cole
f084e742c9 Update email address. 2020-02-16 13:58:22 +01:00
James Cole
ab4de3fdd6 Update email address. 2020-02-16 13:57:18 +01:00
James Cole
9f7d5b8e88 Update email address. 2020-02-16 13:57:05 +01:00
James Cole
4958f6e4a6 Update email address. 2020-02-16 13:56:52 +01:00
James Cole
b3e3a17add Update email address. 2020-02-16 13:56:35 +01:00
James Cole
0b25fdd043 Update email address. 2020-02-16 13:56:25 +01:00
James Cole
cfc48ccc26 Update email address. 2020-02-16 13:55:59 +01:00
James Cole
3810085ea6 Update email address. 2020-02-16 13:55:52 +01:00
James Cole
0088886915 Update email address. 2020-02-16 13:55:32 +01:00
James Cole
c427404e5d Merge tag '5.1.0-alpha.1' into develop
5.1.0-alpha.1
2020-02-16 06:57:54 +01:00
James Cole
e8bf53ad11 Merge branch 'release/5.1.0-alpha.1' 2020-02-16 06:57:52 +01:00
James Cole
5f7f4328c1 Final files for the 5.1.0-alpha.1 release. 2020-02-16 06:53:52 +01:00
James Cole
1f1829e3b5 Fix a rare issue where ID's are missing. Probably the root cause is something else. 2020-02-15 06:56:39 +01:00
James Cole
8079fab472 Final file update before alpha release. 2020-02-14 13:54:26 +01:00
James Cole
19a428bf2d Fix null pointers. 2020-02-14 13:14:06 +01:00
James Cole
39cdbc461e Fix #3114 2020-02-14 08:43:57 +01:00
James Cole
ccc80dd437 Commit untranslated sentences. 2020-02-14 08:43:23 +01:00
James Cole
f1539c4cba Fix budget limit redirect for #3111 2020-02-14 08:13:12 +01:00
James Cole
796188603b Remove HTML from string. 2020-02-14 08:09:05 +01:00
James Cole
b7210e296f Update JS + language strings. 2020-02-14 08:08:51 +01:00
James Cole
6df03e2537 Updated and new strings. 2020-02-14 08:07:45 +01:00
James Cole
7843e781da Fix #3073 2020-02-14 07:49:29 +01:00
James Cole
bf2d1c223b Throw error for invalid transactions. 2020-02-14 05:46:34 +01:00
James Cole
400c0ccaca Add checks to fix #3119 2020-02-14 05:40:46 +01:00
James Cole
db05839b87 Add checks to fix #3119 2020-02-14 05:39:21 +01:00
James Cole
50d4774907 Merge tag '5.0.5' into develop
5.0.5

# Conflicts:
#	changelog.md
2020-02-13 20:16:17 +01:00
James Cole
5361fbb76f Merge branch 'hotfix/5.0.5' 2020-02-13 20:15:46 +01:00
James Cole
a389cbe521 Fix the issue. 2020-02-13 20:15:36 +01:00
James Cole
08b85cfa1a update version 2020-02-13 20:15:29 +01:00
James Cole
7e354b9c30 Add info to changelog. 2020-02-13 20:15:21 +01:00
James Cole
4cdc2ade01 update libraries and config. 2020-02-13 20:13:17 +01:00
James Cole
dee6c0e1e4 New string for #3118 2020-02-13 20:11:10 +01:00
James Cole
72491250b7 Add more details to 500 page if user has debug disabled. 2020-02-13 20:10:54 +01:00
James Cole
88e2d8cd55 Fix 500 page. 2020-02-13 20:10:09 +01:00
James Cole
fd04a38359 Fix some button issues. 2020-02-13 20:09:59 +01:00
James Cole
529cb3d387 Fix #3118 2020-02-13 20:09:27 +01:00
James Cole
8d806e6a1d Fix issues related to #3111 2020-02-11 05:34:36 +01:00
James Cole
2a38c9b4ef Fix a rare null pointer 2020-02-10 19:15:35 +01:00
James Cole
2e3e18d836 Merge pull request #3104 from GeoffreyFrogeye/fix_attach_dialog
Fixed Transaction page attachment broken due to #3097
2020-02-09 15:27:33 +00:00
Geoffrey “Frogeye” Preud'homme
156c51798d Fixed Transaction attachment broken due to #3097 2020-02-09 15:36:20 +01:00
James Cole
8fb72fe697 Add todo, uncomment cache line. Expand count 2020-02-09 10:06:38 +01:00
James Cole
ccb1f56573 Various JS changes. 2020-02-09 09:32:33 +01:00
James Cole
c8d2053500 Append changelog. 2020-02-09 09:22:38 +01:00
James Cole
4b5b47a078 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-02-09 09:21:27 +01:00
James Cole
930695b188 Add line 2020-02-09 09:21:20 +01:00
James Cole
d51e5798ef Merge pull request #3100 from Agraphie/master
Move redis comment to different line
2020-02-08 13:40:08 +00:00
Agraphie
edaa2c168a Move redis comment to different line
The comment in the variable caused redis to use `"0" #always use quotes` as redis db index instead of just "0"
2020-02-08 13:55:31 +01:00
James Cole
4dc24939ba Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-02-08 12:59:56 +01:00
James Cole
4cd642b8da Fix #3099 2020-02-08 12:59:43 +01:00
James Cole
b77b3f0c21 Merge pull request #3098 from GeoffreyFrogeye/link_type_id
API: Add link_type_id when reading TransactionLink
2020-02-08 11:54:27 +00:00
James Cole
0acc2c5727 Merge pull request #3097 from GeoffreyFrogeye/att_unif
API: Unified attachment_* and model_* for Attachments
2020-02-08 11:54:01 +00:00
Geoffrey “Frogeye” Preud'homme
5aae8b7743 API: Add link_type_id when reading TransactionLink 2020-02-08 12:38:15 +01:00
Geoffrey “Frogeye” Preud'homme
e81ce3317c API: Unified attachment_* and model_* for Attachments 2020-02-08 12:29:23 +01:00
James Cole
cebc0d7568 Add a debug view for transactions. 2020-02-08 06:42:07 +01:00
James Cole
d5cfc12bf3 Clone button. 2020-02-07 20:52:13 +01:00
James Cole
ac931698d3 Code for #3052 2020-02-07 20:51:25 +01:00
James Cole
0c13ac2e93 Fix some old debug code. 2020-02-07 20:50:46 +01:00
James Cole
685107e950 Add DNS to debug. 2020-02-07 18:27:49 +01:00
James Cole
ae57be74e0 Add port to DSN 2020-02-07 18:26:47 +01:00
James Cole
58c0a69737 Fix #3083 2020-02-07 11:16:52 +01:00
James Cole
ab73322c58 Update email addresses. 2020-02-07 11:16:38 +01:00
James Cole
c2e7e00cdd Demo user can trigger error. 2020-02-06 22:01:59 +01:00
James Cole
554a702c0a A special commit for @SuperSandro2000 😉 2020-02-06 21:54:47 +01:00
James Cole
2a3775968c Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-02-06 21:48:44 +01:00
James Cole
3cb01a9b50 Update groups.twig 2020-02-06 15:05:29 +01:00
James Cole
e54a011e0c More validation for #3080 2020-02-05 20:37:23 +01:00
James Cole
fc81833b50 Update email address 2020-02-05 05:53:12 +01:00
James Cole
067246be79 Check if object is countable, fix #3080 2020-02-04 19:20:34 +01:00
James Cole
11997f0f97 Fix #3082 2020-02-04 17:39:38 +01:00
James Cole
635ef0de77 Fix #3075 2020-02-03 20:00:02 +01:00
James Cole
7f3522339c Simplify update check. 2020-02-02 10:39:37 +01:00
James Cole
f99f166623 Merge tag '5.0.4' into develop
5.0.4

# Conflicts:
#	changelog.md
#	config/firefly.php
2020-02-01 16:17:24 +01:00
James Cole
3864855967 Merge branch 'hotfix/5.0.4' 2020-02-01 16:16:35 +01:00
James Cole
0266c364e0 Changelog for 5.0.4 2020-02-01 16:16:25 +01:00
James Cole
1b411815b7 Fix issue where MySQL was considered the default if left unset. 2020-02-01 16:14:21 +01:00
James Cole
fb574cb173 Expand changelog. 2020-02-01 15:54:36 +01:00
James Cole
cf4adae604 Refactor category chart code. 2020-02-01 15:54:26 +01:00
James Cole
3f6719dc70 Add Lando to readme. 2020-02-01 15:44:03 +01:00
James Cole
7cdfbc48a9 Fix #3070 2020-02-01 06:32:28 +01:00
James Cole
28b7bd4d71 Improve box for #3071 2020-02-01 06:19:12 +01:00
James Cole
d056f0d221 Allows the user to set the default language for new and unauthenticated visitors. 2020-01-31 07:39:24 +01:00
James Cole
3771cc3b75 Update email address 2020-01-31 07:32:04 +01:00
James Cole
c7f25c5486 Middleware to generate unique ID for Firefly III installation. 2020-01-31 07:24:41 +01:00
James Cole
b697b71e59 Some updates to the tag overview for #3066 and #3067 2020-01-30 18:56:08 +01:00
James Cole
a6fab50c20 Fix #3064 2020-01-30 18:35:00 +01:00
James Cole
43232c208f Merge tag '5.0.3' into develop
5.0.3

# Conflicts:
#	config/firefly.php
2020-01-30 04:49:28 +01:00
James Cole
e9ab11051f Merge branch 'hotfix/5.0.3' 2020-01-30 04:47:57 +01:00
James Cole
a4874e10b8 Update changelog and set version. 2020-01-30 04:47:40 +01:00
James Cole
1c502667b1 Merge tag '5.0.2' into develop
5.0.2
2020-01-30 04:44:24 +01:00
James Cole
b3cdc08a1b Merge branch 'hotfix/5.0.2' 2020-01-30 04:44:22 +01:00
James Cole
60ca1fc4fd Expand environment variable script. 2020-01-30 04:44:10 +01:00
James Cole
b627fcc754 Fix issue with DB creation. 2020-01-30 04:43:54 +01:00
James Cole
d28bf1f8a4 Update email address 2020-01-28 08:46:01 +01:00
James Cole
091cd05527 Update email address 2020-01-28 08:45:38 +01:00
James Cole
08b9cfa221 Update email address 2020-01-28 08:45:28 +01:00
James Cole
42f585f630 Update email address 2020-01-28 08:44:57 +01:00
James Cole
67fb906855 Expand accounts for #2999 2020-01-27 19:53:05 +01:00
James Cole
6655d2e3d0 Add startofday 2020-01-27 19:37:22 +01:00
James Cole
3711cbd9d7 Fix name of language. 2020-01-27 19:37:14 +01:00
James Cole
17c8be37f5 Update language configuration. 2020-01-27 19:33:58 +01:00
James Cole
90b3bce361 Fix #3042 2020-01-26 07:36:11 +01:00
James Cole
51aca7f415 Second try for #3050 2020-01-26 07:15:47 +01:00
James Cole
a381dc1cfe It's the little things. Fixed #3050 2020-01-25 23:29:26 +01:00
James Cole
bf07859718 Various CSS fixes. 2020-01-25 06:40:41 +01:00
James Cole
996fc4dc7c Code for #2575 2020-01-25 06:32:15 +01:00
James Cole
f598c39c6e Add debug info for #3051 2020-01-25 06:17:17 +01:00
James Cole
f4fd9e5a15 Update email address 2020-01-25 06:08:56 +01:00
James Cole
3adc43938e Make 'stack' log to 'stdout' AND 'daily' to satisfy both Docker and self-hosted users. 2020-01-24 20:40:23 +01:00
James Cole
3f7891f4e8 Fix #3045 2020-01-24 06:02:18 +01:00
James Cole
68d53a2066 Merge tag '5.0.1' into develop
5.0.1
2020-01-24 05:39:29 +01:00
James Cole
6fa4666336 Merge branch 'release/5.0.1' 2020-01-24 05:39:27 +01:00
James Cole
2b9467cd69 Update language strings. 2020-01-24 05:22:40 +01:00
James Cole
a06b23deba New version. 2020-01-24 05:22:15 +01:00
James Cole
9a83e48570 Updated changelog. 2020-01-24 05:22:07 +01:00
James Cole
16a6ee577d Fix #3047 2020-01-24 04:59:08 +01:00
James Cole
69b30f4220 Update composer.lock 2020-01-23 20:35:19 +01:00
James Cole
797c539c20 Update copyright thingie. 2020-01-23 20:35:02 +01:00
James Cole
f3f53cc38a Clean readme. 2020-01-23 20:04:58 +01:00
James Cole
003c0d1191 Subkey uploaded. 2020-01-23 20:04:21 +01:00
James Cole
f14d3e24ea Final attempt. 2020-01-23 20:01:06 +01:00
James Cole
03be992062 Attempt two to sign. 2020-01-23 20:00:25 +01:00
James Cole
c86faaa165 Experimental commit from new email address 2020-01-23 19:56:38 +01:00
James Cole
68c71cb2f9 Update email address in the readme and a selection of code. 2020-01-23 19:44:52 +01:00
James Cole
ad2994a47c Add copyright template. 2020-01-23 19:38:39 +01:00
James Cole
1e4b4c66fc Update readme.md 2020-01-22 20:09:58 +01:00
James Cole
28c9069441 Merge pull request #3041 from JC5/develop
Develop
2020-01-22 17:31:50 +01:00
James Cole
200e0054ba Fix <P> tag in readme. 2020-01-22 17:30:39 +01:00
James Cole
ad3280c7ef Merge pull request #1 from firefly-iii/develop
Develop
2020-01-22 17:29:46 +01:00
James Cole
04824c9c8c Add screenshots from other devices. 2020-01-22 11:39:37 +01:00
James Cole
a8df0c292c Merge pull request #3039 from tomershvueli/install-on-cloudron
Add link to install Firefly III on Cloudron in Get Started
2020-01-22 05:41:29 +01:00
Tomer Shvueli
fcb57a911b Update readme.md 2020-01-21 16:58:59 -05:00
Tomer Shvueli
cd756ffee5 Update readme.md 2020-01-21 16:58:35 -05:00
Tomer Shvueli
db6533b3de Update readme.md 2020-01-21 16:58:14 -05:00
Tomer Shvueli
c78455ce6c Merge branch 'develop' into install-on-cloudron 2020-01-21 16:57:41 -05:00
Tomer S
6a7c7e1e26 Add link to install Firefly III on Cloudron in Get Started 2020-01-21 16:55:02 -05:00
James Cole
882d78afd3 Merge pull request #3038 from JC5/develop
Write new readme.
2020-01-21 20:55:32 +01:00
James Cole
00ed8a17f4 Write new readme. 2020-01-21 20:54:51 +01:00
James Cole
fc7c2c298e Merge pull request #3037 from JC5/develop
Add missing function that resulted in 404's.
2020-01-21 18:04:06 +01:00
James Cole
7b204c0c2d Add missing function that resulted in 404's. 2020-01-21 18:02:49 +01:00
James Cole
afcd6cffda Merge pull request #3036 from JC5/develop
Fixes #2998
2020-01-21 17:59:20 +01:00
James Cole
4f86aaf198 Fixes 2998 2020-01-21 17:58:31 +01:00
James Cole
e055f1720e Merge pull request #3035 from JC5/develop
Fix #3026
2020-01-21 17:49:04 +01:00
James Cole
fd24fe35a6 See what style CI will do. 2020-01-21 17:45:39 +01:00
James Cole
d27b3fafe9 Fix issue with ISO week numbers. 2020-01-21 17:44:35 +01:00
James Cole
5a9a35dab8 Merge pull request #3031 from JC5/develop
Develop
2020-01-20 20:54:21 +01:00
James Cole
a4c0ee7350 Code to fix issue with missing button information. 2020-01-20 20:52:23 +01:00
James Cole
c8e4bc00c5 Try to fix an annoying bug in budget overview in default report. 2020-01-20 20:21:40 +01:00
James Cole
47e1d9371c Merge pull request #3030 from JC5/develop
Fix issue 3027
2020-01-20 19:55:37 +01:00
James Cole
9ae1f460b2 Fix issue https://github.com/firefly-iii/firefly-iii/issues/3027 by filtering the transaction types included in the report. 2020-01-20 19:48:40 +01:00
James Cole
d49efca791 Merge pull request #3018 from JC5/develop
Fix #3016
2020-01-19 18:11:21 +01:00
James Cole
154ac8b73c Enable cache again. 2020-01-19 18:09:34 +01:00
James Cole
9b420c461f Fix for https://github.com/firefly-iii/firefly-iii/issues/3016 2020-01-19 18:07:54 +01:00
James Cole
f6e5a399cf Merge tag '5.0.0' into develop
5.0.0
2020-01-18 06:10:18 +01:00
James Cole
8bc6ca0ec0 Merge branch 'release/5.0.0' 2020-01-18 06:10:17 +01:00
James Cole
63d8068ba6 Update some code for the new release. 2020-01-18 06:09:52 +01:00
James Cole
11160adf08 Update composer.lock 2020-01-17 20:50:56 +01:00
James Cole
924899f763 Update translations, fix version. 2020-01-17 20:44:54 +01:00
James Cole
458bdc5fd4 Update changelog. 2020-01-17 04:40:44 +01:00
James Cole
1c458704d6 Small composer update. 2020-01-17 04:33:12 +01:00
James Cole
ff44dbaea0 Update analytics code. 2020-01-17 04:30:44 +01:00
James Cole
3852dbeacc Update composer.lock 2020-01-13 16:55:56 +01:00
James Cole
94bb3f43ed #2993 2020-01-13 16:55:41 +01:00
James Cole
534f4de520 Fix an issue where users were unable to create revenue / expense account combinations with the same name. #2987 2020-01-11 17:31:32 +01:00
James Cole
8c36a371be Remove https. 2020-01-11 09:58:35 +01:00
James Cole
2416fd6773 Remove experimental simple nonce. 2020-01-11 06:24:53 +01:00
James Cole
77fa3af87e Use a very simple nonce to see if Edge stops complaining. 2020-01-11 06:15:08 +01:00
James Cole
5da8b2ec9e Some CSP tuning. 2020-01-11 06:14:10 +01:00
James Cole
c55bfc0b8c Improve config of CSP headers. 2020-01-11 05:28:20 +01:00
James Cole
97dffaa8a9 Update readme. 2020-01-11 05:10:24 +01:00
James Cole
8857e3553d Fix for #2980 2020-01-10 17:12:38 +01:00
James Cole
925f63c8e1 Experimental switch of parameters and different urls 2020-01-09 20:43:32 +01:00
James Cole
987730b36b Config for locking old issues. 2020-01-09 20:40:30 +01:00
James Cole
4752dea460 Fix the same typo's in Firefly III's example env file. https://github.com/firefly-iii/docker/pull/1 Courtesy of @techash 2020-01-09 20:09:22 +01:00
James Cole
d57f764fb8 Routine for #2983 2020-01-09 20:04:42 +01:00
James Cole
2d0a57e7e4 More debug and some thinking comments 2020-01-09 19:59:53 +01:00
James Cole
f78729fc8a Add lots of debug. 2020-01-09 19:52:47 +01:00
James Cole
7362a36a98 Add logs. 2020-01-09 19:45:13 +01:00
James Cole
cf067d0bd2 Some extra debugging. 2020-01-09 19:42:28 +01:00
James Cole
2efe5b07e2 #2981 whoops 2020-01-09 19:29:43 +01:00
James Cole
42de629646 Fix #2981 2020-01-09 19:28:23 +01:00
James Cole
220230e981 Fix #2983 2020-01-09 19:26:45 +01:00
James Cole
7f002eb6a9 Be backwards compatible. 2020-01-09 17:04:10 +01:00
James Cole
8c6f8460a2 Be backwards compatible. 2020-01-09 17:03:59 +01:00
James Cole
7f0ac79c5c Merge tag '5.0.0-beta.1' into develop
5.0.0-beta.1
2020-01-09 06:39:13 +01:00
James Cole
4ff2c19fa9 Merge branch 'release/5.0.0-beta.1' 2020-01-09 06:39:12 +01:00
James Cole
cfeaeb7877 Update changelog. 2020-01-09 06:38:38 +01:00
James Cole
298371f680 Update libraries. 2020-01-09 06:33:10 +01:00
James Cole
c1aba726de New strings. 2020-01-09 06:29:54 +01:00
James Cole
8d92b4f3a0 Update language strings 2020-01-09 06:29:16 +01:00
James Cole
0ac973f2b7 Go to beta.1 2020-01-09 06:10:54 +01:00
James Cole
5cfa9bcc30 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-01-09 06:10:31 +01:00
James Cole
5737fefd63 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2020-01-08 18:14:15 +01:00
James Cole
8c611901b8 Fix #2976 2020-01-08 18:13:42 +01:00
James Cole
bb1483f196 Update custom template. 2020-01-08 08:06:42 +01:00
James Cole
a2a980e3de Fix #2966 2020-01-08 06:05:00 +01:00
James Cole
2485f74302 Fix #2975 2020-01-08 05:48:45 +01:00
James Cole
6019638388 Fix old todo item 2020-01-07 17:18:56 +01:00
James Cole
39d61feede Update some tests. 2020-01-05 19:29:28 +01:00
James Cole
465947dddf Updated language string. 2020-01-05 08:13:24 +01:00
James Cole
d116609389 Fix #2956 2020-01-05 08:04:55 +01:00
James Cole
e2bb5c7bfb Expand nonce. 2020-01-04 11:18:33 +01:00
James Cole
ff3f2c1c9c Code for #2920 2020-01-04 11:16:14 +01:00
James Cole
d83d8d3f97 Code for #2920 2020-01-04 11:00:44 +01:00
James Cole
cb575f3200 Update JS packages. Remove debug bar. 2020-01-04 07:43:44 +01:00
James Cole
041357c2ff First steps for #2920 2020-01-04 07:24:43 +01:00
James Cole
40c6ca9d35 Update changelog. 2020-01-04 06:55:23 +01:00
James Cole
be565dd2e5 Fix #2950 2020-01-04 06:18:36 +01:00
James Cole
2fb28669ca Ignore dev file. 2020-01-03 11:30:41 +01:00
James Cole
ce44edcf63 Fix #2945 2020-01-03 11:30:21 +01:00
James Cole
5b9e0319c7 Fix link in composer 2020-01-03 11:29:56 +01:00
James Cole
b2808d6a0c Fix root copyright notices, after a tip from @GaryQ [skip ci] 2020-01-03 06:27:46 +01:00
James Cole
b1848e274f Fix #2941 2020-01-02 19:41:14 +01:00
James Cole
c55ef9c77b Fix location store for tag. 2020-01-02 19:25:42 +01:00
James Cole
e1577a4a76 Make sure update and edit work for location, API or not. 2020-01-02 19:12:40 +01:00
James Cole
f7d6a4c6f9 Fix some charts. 2020-01-02 08:34:34 +01:00
James Cole
cacc58ee0c Merge tag '5.0.0-alpha.2' into develop
5.0.0-alpha.2
2020-01-01 20:04:13 +01:00
James Cole
7bfca96eae Merge branch 'release/5.0.0-alpha.2' 2020-01-01 20:04:11 +01:00
James Cole
00f32314f6 final files for new alpha. 2020-01-01 20:03:38 +01:00
James Cole
c78c667157 Reformat if-statement. 2020-01-01 19:55:02 +01:00
James Cole
fca5d9d55b Update composer file 2020-01-01 19:21:47 +01:00
James Cole
9825f304b5 Remove debug info from login file. 2020-01-01 18:51:59 +01:00
James Cole
a1125278f7 Update libraries. 2020-01-01 16:21:19 +01:00
James Cole
830f6eb785 Remove long/lat from tag info in group collector. 2020-01-01 16:21:07 +01:00
James Cole
3ca18369a0 Better icon for password security help. 2020-01-01 15:38:54 +01:00
James Cole
58498b71f1 Update some translations. 2020-01-01 15:38:47 +01:00
James Cole
18442a3caa Make sure login form shows errors again. 2020-01-01 15:34:38 +01:00
James Cole
48a1ad3381 Updated methods to make budget charts multi-currency 2020-01-01 14:28:03 +01:00
James Cole
ca260387a2 Make sure location data in request is processed in a unified way. 2020-01-01 14:27:43 +01:00
James Cole
414e8d7153 Refactor data method. 2020-01-01 14:27:08 +01:00
James Cole
35996f24be Make budget chart multi-currency 2020-01-01 14:26:49 +01:00
James Cole
05bf8121dc Fix #2937 2020-01-01 14:13:35 +01:00
James Cole
cc09a15dcf Possible fix for #2936 2020-01-01 13:56:54 +01:00
James Cole
c193284471 Move Location validation rules to single method. 2019-12-31 14:01:53 +01:00
James Cole
96aa42b513 Better text for export 2019-12-31 10:08:15 +01:00
James Cole
51aa48f084 Give importer deprecation warning. 2019-12-31 06:36:30 +01:00
James Cole
f13b912a43 Clean up changelog, remove reference to Sandstorm. [skip ci] 2019-12-31 06:21:44 +01:00
James Cole
2c9bc10e51 Fix #2934 2019-12-31 06:17:32 +01:00
James Cole
a331b2d661 Same but for tags. 2019-12-30 21:04:22 +01:00
James Cole
e1186b48ec Fix account name validator and make sure the location CRUD works in the API for accounts. 2019-12-30 20:44:52 +01:00
James Cole
0ae52198e7 Add location to Account transformer. 2019-12-30 17:49:29 +01:00
James Cole
becab15ab8 Make sure that accounts and tags both can handle locations. 2019-12-30 17:43:04 +01:00
James Cole
7e5d0d455a Expand suppport for new location model in tags. 2019-12-30 15:24:52 +01:00
James Cole
35649bea5c Fix for #2930 2019-12-30 15:24:02 +01:00
James Cole
56700ef984 Add balance #2933 2019-12-30 14:41:16 +01:00
James Cole
29e2c32474 New upgrade command for location table. 2019-12-30 12:13:45 +01:00
James Cole
54b049e106 Can edit and set location for accounts. 2019-12-30 12:12:08 +01:00
James Cole
71f2cacdbd Remove unused v2 resources. 2019-12-30 11:35:58 +01:00
James Cole
ecb9141921 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2019-12-30 11:35:30 +01:00
James Cole
c0e991e096 Merge pull request #2932 from pascalj/deprecated-array-access
Change a newly-deprecated array access
2019-12-30 10:34:28 +00:00
Pascal Jungblut
e5fff53221 Change a newly-deprecated array access
PHP allowed array accesses with curly braces but deprecated the feature
[1] with 7.4. With this change the CSV import will work with 7.4 without
any errors or warnings. The change does not affect other versions.

[1] https://wiki.php.net/rfc/deprecate_curly_braces_array_access
2019-12-30 11:21:25 +01:00
James Cole
11ed40b30f Update changelog. 2019-12-30 06:32:51 +01:00
James Cole
93c5c6fd6d Remove Kubernetes files and move them to: https://github.com/firefly-iii/kubernetes 2019-12-30 06:32:44 +01:00
James Cole
26f5e5e518 Update version and readme 2019-12-29 16:12:57 +01:00
James Cole
d96f4bfe4a Update readme and remove docker ignore file. [skip ci] 2019-12-29 16:03:43 +01:00
James Cole
9f7fe5c6c5 Fix link in support script. 2019-12-29 15:58:03 +01:00
James Cole
503e443cfa Remove Sandstorm code and move to: https://github.com/firefly-iii/sandstorm 2019-12-29 15:30:55 +01:00
James Cole
32095bf509 Remove V2 layout and references to it. 2019-12-29 15:22:08 +01:00
James Cole
d8c2186ac9 Remove Docker from code. Moved to: https://github.com/firefly-iii/docker 2019-12-29 15:14:27 +01:00
James Cole
021d421c6f Add location to account. 2019-12-28 19:49:33 +01:00
James Cole
950b706e7c Add model for Location and expand Account table. 2019-12-28 19:27:50 +01:00
James Cole
58c6ec8a8c Option to mass delete tags #2064 2019-12-28 09:59:41 +01:00
James Cole
156e2e79c7 Update deprecated Twig code. 2019-12-28 09:44:56 +01:00
James Cole
48a0eafa0c Refer to new command in scripts. #2691 2019-12-28 06:58:49 +01:00
James Cole
785f96fc75 New command for #2691 2019-12-28 06:57:15 +01:00
James Cole
d61fa52041 Varioux fixes. 2019-12-28 06:43:53 +01:00
James Cole
47eb39b10d Fix #2924 2019-12-28 06:38:23 +01:00
James Cole
0d48556994 Format code. 2019-12-27 21:38:23 +01:00
James Cole
39cb600cc3 Enable export. 2019-12-27 21:38:17 +01:00
James Cole
71ca4f9516 Error if you select nothing 2019-12-27 21:38:09 +01:00
James Cole
5dd5351b0a Code to export stuff. #2667 2019-12-27 21:31:25 +01:00
James Cole
63fa6aa6c0 Update cron 2019-12-27 11:05:27 +01:00
James Cole
50ad7f6c9e New flag icons 2019-12-27 11:05:21 +01:00
James Cole
c06b9d8045 Basic export function for #2667 2019-12-27 10:59:31 +01:00
James Cole
77647a8597 Fix #2893 2019-12-27 10:11:48 +01:00
James Cole
975b78fc7b Actually respect the user's wish not to check for updates #2919 2019-12-27 08:07:07 +01:00
James Cole
017fa5a917 Merge tag '5.0.0-alpha.1' into develop
5.0.0-alpha.1
2019-12-27 07:15:09 +01:00
James Cole
fb9ac50828 Merge branch 'release/5.0.0-alpha.1' 2019-12-27 07:15:08 +01:00
James Cole
206ae5a3f3 Update composer. 2019-12-27 07:14:23 +01:00
James Cole
1120fef4d6 New translations. 2019-12-27 07:14:15 +01:00
James Cole
8bcb4432c7 Parse changelog. 2019-12-27 06:52:13 +01:00
James Cole
df01db1a51 Update changelog for next release 2019-12-27 06:51:54 +01:00
James Cole
72bf04fe54 Version update for 5.0.0 2019-12-27 06:24:41 +01:00
James Cole
d5416bad7c Final tests for #2723 2019-12-26 11:37:49 +01:00
James Cole
952c9aad23 More tests for #2723 2019-12-26 11:29:54 +01:00
James Cole
1b1d510bc0 Forgot to include method. 2019-12-26 11:22:10 +01:00
James Cole
fc8400cdf9 Fix and expand tests for #2723 2019-12-26 11:06:38 +01:00
James Cole
c23f16739c Add some debug info. 2019-12-26 11:05:58 +01:00
James Cole
ecdefab086 Update to version 5.0.0 2019-12-22 07:51:29 +01:00
James Cole
a416b682e0 Fix some tests 2019-12-22 07:50:40 +01:00
James Cole
dfca5b8722 No check if no accounts submitted. 2019-12-22 07:50:21 +01:00
James Cole
4111973a06 Add some logging 2019-12-22 07:50:10 +01:00
James Cole
af063191ab Remove SFTP config 2019-12-22 07:50:02 +01:00
James Cole
1a37d3735b Update changelog a bit 2019-12-22 07:49:28 +01:00
James Cole
01c3236fed Remove SFTP config 2019-12-22 07:49:06 +01:00
James Cole
dcd6a8d79f Remove import tests 2019-12-22 07:45:30 +01:00
James Cole
a4d3dba662 Fix #2912 2019-12-22 06:23:13 +01:00
James Cole
2a110185a1 All rules for #2723, untested. 2019-12-21 06:37:41 +01:00
James Cole
be2794406c First code for #2723 2019-12-20 21:01:27 +01:00
James Cole
b4af70421d Fix #2702 2019-12-20 20:21:31 +01:00
James Cole
7431e18e4b Fix #2776 2019-12-20 17:28:49 +01:00
James Cole
cc936e68f2 Update translations. 2019-12-20 16:42:23 +01:00
James Cole
18ed19c9d9 Fix #2907 2019-12-20 11:57:57 +01:00
James Cole
83dd170dcb Update libraries. 2019-12-20 08:25:46 +01:00
James Cole
adb32ceed8 Fix #2580 2019-12-20 07:15:40 +01:00
James Cole
91172611d4 Merge tag '4.8.3-alpha.1' into develop
4.8.3-alpha.1
2019-12-20 06:15:26 +01:00
James Cole
e2a30b3cc1 Merge branch 'release/4.8.3-alpha.1' 2019-12-20 06:15:25 +01:00
James Cole
689850c55c Update version, add changelog. 2019-12-20 06:15:00 +01:00
James Cole
6ad2021739 Fix #2901 2019-12-20 05:53:13 +01:00
James Cole
e96e96e6c9 Update composer. 2019-12-20 05:44:48 +01:00
James Cole
126dd5176e Share disclaimer in footer 2019-12-20 05:44:39 +01:00
James Cole
4abedb58aa Share disclaimer in footer 2019-12-20 05:44:33 +01:00
James Cole
94194d497f Fix #2881 2019-12-20 05:38:42 +01:00
James Cole
d29ec707b4 Add some debug info 2019-12-20 05:38:26 +01:00
James Cole
96e0357328 Fix #2878 again 2019-12-19 07:00:18 +01:00
James Cole
883acc698e Update libraries. 2019-12-17 20:13:42 +01:00
James Cole
0387d7c9a3 Merge pull request #2895 from justyns/js-add-debit
Add Debit to Generic Debit Credit indicator converter
2019-12-16 05:49:46 +01:00
Justyn Shull
c5bed5e042 Add Debit to Generic Debit Credit indicator converter
Example CSV export from Community America, a Credit Union in the US:

``` csv
12/11/19,Five Guys,Sale FIVE GUYS,14.51,Debit,Food & Dining,Fast Food,CC1,,,false
12/11/19,Interest Income,Interest Earned,0.01,Credit,Income,Interest Income,Regular Savings,,Interest Earned,false
```

"Debit" is used instead of negative values in the amount column.
2019-12-15 19:06:44 -06:00
James Cole
b6ec5073e0 Expand entrypoint feedback. 2019-12-08 07:44:57 +01:00
James Cole
969ae4c551 Update labels to see what happens. 2019-12-08 07:21:44 +01:00
James Cole
df649c5871 Some debug vars in logs. 2019-12-08 06:44:56 +01:00
James Cole
450433f12e Messed up DB config. Seems redis is working though. 2019-12-08 06:28:00 +01:00
James Cole
4bab045d6f Echo some feedback 2019-12-08 06:15:58 +01:00
James Cole
31744440e0 Updated redis config. 2019-12-08 06:14:49 +01:00
James Cole
78ccca4f58 Better text and fixed entry point 2019-12-08 05:57:36 +01:00
James Cole
53d630ef91 Expand entry point script and example .env 2019-12-08 05:48:17 +01:00
James Cole
670c4c6dc3 Expand config for redis. 2019-12-07 17:44:33 +01:00
James Cole
1e7de48f59 Fix #2876 2019-12-04 05:59:06 +01:00
James Cole
55175da316 Wait longer for DB 2019-12-03 19:38:49 +01:00
James Cole
916aff425a Clean up changelog 2019-12-03 19:38:40 +01:00
James Cole
6a7a0e2b25 Fix #2878 2019-12-03 19:38:07 +01:00
James Cole
eeb68c1cf4 Fix #2874 2019-12-02 17:32:57 +01:00
James Cole
73d56c41d6 Merge branch 'release/4.8.2' 2019-11-29 07:19:12 +01:00
James Cole
3a775627b5 Merge tag '4.8.2' into develop
4.8.2
2019-11-29 07:19:12 +01:00
James Cole
702acafc59 Updated some templates. 2019-11-28 20:52:14 +01:00
James Cole
11c04cb0d4 Update packages. 2019-11-28 20:33:55 +01:00
James Cole
47a8e28948 Support for SE. 2019-11-28 20:27:00 +01:00
James Cole
c9702fe65c New translations 2019-11-28 20:22:25 +01:00
James Cole
8ce3f8dc60 New version 2019-11-28 20:22:05 +01:00
James Cole
7daedc6c5a New changelog 2019-11-28 20:21:56 +01:00
James Cole
1ff855ce66 Fix owner of all dirs. 2019-11-27 06:14:33 +01:00
James Cole
c3f721aa9f Fix #2847 2019-11-26 06:34:32 +01:00
James Cole
575b355837 Merge branch 'release/4.8.2-beta.2' 2019-11-25 18:44:45 +01:00
James Cole
813bb6a09b Merge tag '4.8.2-beta.2' into develop
4.8.2-beta.2
2019-11-25 18:44:45 +01:00
James Cole
a4b1c9d8c5 New beta version 2019-11-25 18:43:36 +01:00
James Cole
98bd35e767 Update composer file. 2019-11-25 18:41:55 +01:00
James Cole
e485f8ca66 New strings for translation. 2019-11-25 18:41:40 +01:00
James Cole
4551dfe0e5 Merge branch 'release/4.8.2-alpha.6' 2019-11-23 06:21:39 +01:00
James Cole
709411e7b4 Merge tag '4.8.2-alpha.6' into develop
4.8.2-alpha.6
2019-11-23 06:21:39 +01:00
James Cole
420b996870 New alpha release. 2019-11-23 06:21:18 +01:00
James Cole
4304c15ffe Add support for Swedish, disable Greek. 2019-11-23 06:15:25 +01:00
James Cole
36e643e5b8 Fix #2851 2019-11-23 06:14:50 +01:00
James Cole
fcf3691b2b Fix #2852 2019-11-23 05:44:44 +01:00
James Cole
3ec15a3b7b Fix for #2843 2019-11-19 17:39:55 +01:00
James Cole
4ae7501114 Fix #2841 (again) 2019-11-18 20:41:08 +01:00
James Cole
5e348e7a40 Merge tag '4.8.2-alpha.5' into develop
4.8.2-alpha.5
2019-11-18 19:13:45 +01:00
James Cole
24fe611645 Merge branch 'release/4.8.2-alpha.5' 2019-11-18 19:13:44 +01:00
James Cole
402a6fa4c7 Fix #2841 2019-11-18 19:06:08 +01:00
James Cole
308ce15fae Fixes #2835 2019-11-18 17:39:25 +01:00
James Cole
9a639d41b4 Set default values so people know to change them. 2019-11-17 16:25:46 +01:00
James Cole
fc7cb987ff New Kubernetes deployment 2019-11-17 15:17:22 +01:00
James Cole
ba5ac35330 New scripts for Firefly III in Kubernetes 2019-11-17 15:09:31 +01:00
James Cole
e2e8ae5b28 Some command fixes. 2019-11-17 13:34:33 +01:00
James Cole
4ad0e120bc New version. 2019-11-17 13:22:57 +01:00
James Cole
cd2e74a476 Some experimental commands for DB creation. 2019-11-17 13:18:35 +01:00
James Cole
07623335f7 Fix #2832 2019-11-17 11:34:53 +01:00
James Cole
6b2b2aa1e1 Merge branch 'release/4.8.2-beta.1' 2019-11-17 07:02:36 +01:00
James Cole
414c4a742d Merge tag '4.8.2-beta.1' into develop
4.8.2-beta.1
2019-11-17 07:02:36 +01:00
James Cole
55e2f31531 Update version. 2019-11-17 05:03:20 +01:00
James Cole
99c9a0fec5 Small update in deploy script. 2019-11-17 04:41:20 +01:00
James Cole
075c06fb86 Merge branch 'release/4.8.2-alpha.4' 2019-11-16 07:50:43 +01:00
James Cole
9293674131 Merge tag '4.8.2-alpha.4' into develop
4.8.2-alpha.4
2019-11-16 07:50:43 +01:00
James Cole
e9172033bb New version. 2019-11-16 07:50:21 +01:00
James Cole
e54dc4c1b4 Also add channel. 2019-11-16 07:37:42 +01:00
James Cole
fcd6b89a43 Add header for current Firefly III version. 2019-11-16 06:59:09 +01:00
James Cole
67db25b2cf New robot config [skip ci] 2019-11-15 16:47:35 +01:00
James Cole
68863abbc7 Fix #2820 2019-11-15 16:37:23 +01:00
James Cole
26a4b6844e Fix #2826 2019-11-14 17:33:04 +01:00
James Cole
292fb3fbc8 Merge branch 'release/4.8.2-alpha.3' 2019-11-13 07:04:55 +01:00
James Cole
501efe507f Merge tag '4.8.2-alpha.3' into develop
4.8.2-alpha.3
2019-11-13 07:04:55 +01:00
James Cole
adc48ce094 Update some translations 2019-11-13 07:04:34 +01:00
James Cole
2a934edf4f Update composer file. 2019-11-13 07:01:47 +01:00
James Cole
4b9d1d23ca First steps for reconciliation edit. 2019-11-13 06:57:35 +01:00
James Cole
8a9e12c2b9 Version update. 2019-11-13 06:57:17 +01:00
James Cole
88f1adf650 Fix for issue with null amounts. 2019-11-11 18:25:35 +01:00
James Cole
8ce156cf93 Extra fix for #2807 2019-11-10 14:53:17 +01:00
James Cole
6843c81114 Merge pull request #2807 from timendum/develop
Fix account endpoint in create-edit.js
2019-11-10 14:50:10 +01:00
James Cole
f82d0dda0a Fixes for #2660 2019-11-10 07:26:49 +01:00
James Cole
d2a8f969d9 Wrong field to do int casting. 2019-11-10 07:26:10 +01:00
James Cole
c79ded2012 Always set latest version after update run. 2019-11-10 07:26:02 +01:00
James Cole
765e4e3c3b Always set latest version after update run. 2019-11-10 07:25:55 +01:00
James Cole
3c25148f3f Language fix for German UTF8 and a new Russian sentence 2019-11-09 20:14:34 +01:00
James Cole
dc0e8528c8 Catch import routines that submit integers. 2019-11-09 16:53:04 +01:00
James Cole
34e7455d67 Fix #2651 2019-11-09 16:50:13 +01:00
James Cole
9332808d7f Fix #2790 2019-11-09 15:30:52 +01:00
James Cole
16a4adcd07 Fix #2812 2019-11-09 15:01:48 +01:00
James Cole
140ccbce3f Fix #2811 2019-11-09 15:00:47 +01:00
James Cole
97c8594dc4 Fix #2796 2019-11-09 08:07:42 +01:00
James Cole
adc4b00f5d Fix #2806 2019-11-09 07:55:59 +01:00
Timendum
c1bdb629a8 Fix account endpoint in create-edit.js 2019-11-07 14:52:06 +01:00
James Cole
d8807e6ab7 Merge branch 'release/4.8.2-alpha.2' 2019-11-07 06:44:43 +01:00
James Cole
e3418b1bd2 Merge tag '4.8.2-alpha.2' into develop
4.8.2-alpha.2
2019-11-07 06:44:43 +01:00
James Cole
a7a76e32d6 New version. 2019-11-07 06:44:23 +01:00
James Cole
1294705809 Some new translations. 2019-11-07 06:43:29 +01:00
James Cole
bb449e1940 Fix alpha builds + version builds. 2019-11-07 06:14:45 +01:00
James Cole
828b9d32aa Fix #2805 2019-11-07 06:10:46 +01:00
James Cole
a67b0f78a4 Merge branch 'master' into develop 2019-11-05 18:09:28 +01:00
James Cole
5177f2bc87 Fix build script. 2019-11-05 18:09:07 +01:00
James Cole
f06e947706 Merge tag '4.8.2-alpha.1' into develop
4.8.2-alpha.1
2019-11-05 17:58:08 +01:00
James Cole
380f59dab2 Merge branch 'release/4.8.2-alpha.1' 2019-11-05 17:58:07 +01:00
James Cole
c558bc3247 Update composer file. 2019-11-05 17:56:43 +01:00
James Cole
25378b3f9a New translations. 2019-11-05 17:55:38 +01:00
James Cole
abf84e94b1 Final changelog details 2019-11-05 17:45:23 +01:00
James Cole
8baf29b835 Trigger a new build + fix a translation. 2019-11-03 13:35:34 +01:00
James Cole
d709a9489d Fix spaces in command. 2019-11-03 11:44:39 +01:00
James Cole
33ce7c0767 Release first alpha version to see how Travis responds. 2019-11-03 11:43:07 +01:00
James Cole
ec54ec22f6 Reconfigure build. 2019-11-03 11:38:21 +01:00
James Cole
706e722c6f Fix environment variables. 2019-11-03 07:20:32 +01:00
James Cole
58ec0c4add Change some environment variables for easier handling. 2019-11-03 07:19:12 +01:00
James Cole
88692f0058 Update metadata for new release. 2019-11-03 07:15:33 +01:00
James Cole
a8af0fa678 Remove "v" markers from translations. 2019-11-03 07:00:18 +01:00
James Cole
0bdd48ffec Add some debug info. 2019-11-02 08:28:49 +01:00
James Cole
766a82a983 Update translations. 2019-11-02 08:20:54 +01:00
James Cole
d749d550ee Error codes in Firefly III API 2019-11-02 08:19:50 +01:00
James Cole
2ea1852a94 Config out. 2019-11-02 07:21:40 +01:00
James Cole
4f44a42655 Add login for manifest. 2019-11-02 07:12:25 +01:00
James Cole
26ed00e7b5 Add correct path. 2019-11-02 07:04:11 +01:00
James Cole
51f25b2dce First triple arch build 2019-11-02 07:01:11 +01:00
James Cole
3fc653687c Fix files. 2019-11-01 06:15:02 +01:00
James Cole
4cd824f3b7 Fix Docker files. 2019-11-01 06:03:08 +01:00
James Cole
a6af263b50 Fix build and manifest. 2019-11-01 06:00:15 +01:00
James Cole
0844278eca Experimental setup with 3 jobs. 2019-11-01 05:57:41 +01:00
James Cole
1b63bfc3db Use central docker script. 2019-11-01 05:56:19 +01:00
James Cole
a4906a2d21 Fix version verify. 2019-11-01 05:51:25 +01:00
James Cole
c4256dd25b Let's see what ARM 64 will do. 2019-10-31 21:14:21 +01:00
James Cole
091ab17fdb Test 2019-10-31 21:11:57 +01:00
James Cole
02ddb95cf2 Second attempt. 2019-10-31 21:10:15 +01:00
James Cole
f2d43d71ad Test script that does nothing. 2019-10-31 21:07:58 +01:00
James Cole
af611b78de Make script executable. 2019-10-31 21:01:47 +01:00
James Cole
724a1b8b08 Script things. 2019-10-31 20:56:36 +01:00
James Cole
34e70c7446 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2019-10-31 20:56:14 +01:00
James Cole
01f869f1b6 Let's see what happens. 2019-10-31 20:54:52 +01:00
James Cole
73a6db8eda Merge pull request #2786 from nicosomb/patch-1
Fixed documentation links
2019-10-31 19:40:24 +00:00
Nicolas Lœuillet
0bbc008848 Fixed documentation links 2019-10-31 15:37:12 +01:00
James Cole
5e61fa785e Fix #2771 2019-10-31 07:45:55 +01:00
James Cole
c131e6ad9b Fix #2780 2019-10-31 07:37:10 +01:00
James Cole
cbc92d89e1 Improve version handling. 2019-10-30 20:02:38 +01:00
James Cole
9a028d5002 Improve error handling in API. 2019-10-30 20:02:21 +01:00
James Cole
bed182cf13 Fix #2783 2019-10-29 18:36:03 +01:00
James Cole
d5afba6137 Fix order account. 2019-10-27 18:12:30 +01:00
James Cole
6b4b69b695 Fix #2774 2019-10-26 17:06:46 +02:00
James Cole
b528fa2e5d Merge tag '4.8.1.8' into develop
4.8.1.8
2019-10-26 16:56:43 +02:00
James Cole
f4b9f81e71 Merge branch 'hotfix/4.8.1.8' 2019-10-26 16:56:42 +02:00
James Cole
ca37d782ed Fix #2773 2019-10-26 16:56:30 +02:00
James Cole
f7c34db39b New translations. 2019-10-26 16:54:26 +02:00
James Cole
0d072b4ed9 Merge pull request #2772 from dguhl/2695-localise-api-errors
Fix issue #2695
2019-10-26 14:33:07 +00:00
Dominic Guhl
13a29a66c8 worked in feedback by JC5 2019-10-26 16:29:04 +02:00
James Cole
cfd9828438 Fix #2773 2019-10-26 16:21:12 +02:00
Dominic Guhl
b4d565400e Issue 2695
Introduces localisation for API errors
2019-10-26 15:07:54 +02:00
James Cole
be0e2bf6a7 Firefly III can now handle "channels" in its releases. 2019-10-26 14:42:51 +02:00
James Cole
64a2f22b13 Merge branch 'release/4.8.1.7' 2019-10-26 08:07:10 +02:00
James Cole
778e0bcbae Merge tag '4.8.1.7' into develop
4.8.1.7
2019-10-26 08:07:10 +02:00
James Cole
92a1f12f6c Version fix in changelog. 2019-10-26 08:02:05 +02:00
James Cole
ea0a440de0 New version. 2019-10-26 07:57:40 +02:00
James Cole
92271ffe66 New translations 2019-10-26 07:54:59 +02:00
James Cole
0499433cea Update composer file. 2019-10-26 07:49:59 +02:00
James Cole
dcdecfbc64 Fixed an issue with creating and editing transactions. 2019-10-26 07:49:51 +02:00
James Cole
8b11afb83f A new endpoint that allows you to search for transfers. 2019-10-26 07:49:36 +02:00
James Cole
6823adc976 Firefly III can automatically stop duplicate transactions from being created. 2019-10-26 07:49:12 +02:00
James Cole
7cfa916c61 Merge branch 'release/4.8.1.6' 2019-10-24 18:38:20 +02:00
James Cole
2cf000a9fd Merge tag '4.8.1.6' into develop
4.8.1.6
2019-10-24 18:38:20 +02:00
James Cole
b7862b7d69 Update readme thing. [skip ci] 2019-10-24 18:32:57 +02:00
James Cole
4a11d65589 Update libraries. 2019-10-24 18:26:43 +02:00
James Cole
67ff88b24c New translations. 2019-10-24 18:24:00 +02:00
James Cole
d963ba0a2e Fix #2758 2019-10-24 18:13:43 +02:00
James Cole
b8c8aabbf4 Empty foreign amount should not be a problem. 2019-10-24 10:14:08 +02:00
James Cole
a39bdc9cb0 Fix routes. 2019-10-24 10:13:52 +02:00
James Cole
18310641aa Update version. 2019-10-22 07:10:14 +02:00
James Cole
8386ab79f6 Fix issue with double question marks in URI 2019-10-22 07:09:40 +02:00
James Cole
ffdeae91d7 Fix issue with double question marks in URI 2019-10-22 07:03:18 +02:00
James Cole
73e3b9fe67 Add debug for #2701 2019-10-22 06:09:34 +02:00
James Cole
6a981fb691 Fix #2758 2019-10-22 05:59:56 +02:00
James Cole
576f2f2530 Fix #2757 2019-10-22 05:58:35 +02:00
James Cole
27668769cb Fix #2756 2019-10-22 05:56:37 +02:00
James Cole
def6ae6167 Merge tag '4.8.1.5' into develop
4.8.1.5
2019-10-21 20:09:56 +02:00
James Cole
9f1fc0c2b8 Merge branch 'release/4.8.1.5' 2019-10-21 20:09:54 +02:00
James Cole
5456a64d9f More readme updates. 2019-10-21 20:08:38 +02:00
James Cole
0e636e1ec1 New readme. 2019-10-21 20:03:14 +02:00
James Cole
bc469e8d52 Update composer (again) 2019-10-21 19:54:37 +02:00
James Cole
4ba650afd7 Update composer file because of a bug in the 2FA package. 2019-10-21 19:08:51 +02:00
James Cole
54b42f0e46 Update changelog and composer file. 2019-10-21 18:51:01 +02:00
James Cole
516f2a1232 Updated translations. 2019-10-21 18:48:04 +02:00
James Cole
4b10cff5c2 Fix meta data for new release. 2019-10-21 18:42:04 +02:00
James Cole
50d3c36b6a Fix #2752 2019-10-21 18:32:13 +02:00
James Cole
3e40a6cf3d Fix #2755 2019-10-21 18:23:07 +02:00
James Cole
004d4a2d22 Fix #2746 2019-10-21 18:22:47 +02:00
James Cole
516ef79130 Fixes for #2753 2019-10-20 16:17:43 +02:00
James Cole
0135ae425f Fix #2754 2019-10-20 16:02:30 +02:00
James Cole
6c8a6e6823 Fix #2734 2019-10-19 19:18:57 +02:00
James Cole
6efe5cfd4d Fix #2694 2019-10-19 19:17:14 +02:00
James Cole
2d720f72bd Fix #2728 2019-10-19 19:00:16 +02:00
James Cole
0708ea875a Always verify keys, should also help with Heroku instances. 2019-10-19 09:37:35 +02:00
James Cole
0d924990c8 iOS compatible fix #2734 2019-10-14 19:45:04 +02:00
James Cole
4d67b4d118 iOS compatible fix #2734 2019-10-14 19:22:54 +02:00
James Cole
d57c5d3a20 Add copy button. Fixes #2734 2019-10-14 19:08:08 +02:00
James Cole
8ee1b08c57 Possible fix for issue reported over email. 2019-10-14 16:34:52 +02:00
James Cole
ee625a9c3f Update language and meta files. 2019-10-13 11:58:40 +02:00
James Cole
3e3729982b Add some debug info 2019-10-13 11:50:40 +02:00
James Cole
49933dae17 Restore some comments for easier debugging 2019-10-13 11:50:28 +02:00
James Cole
05a5782d5d Remove API throttle. 2019-10-13 11:50:17 +02:00
James Cole
4ad601f29d Expand API so you can also submit IBAN, BIC or number for new accounts 2019-10-13 11:50:04 +02:00
James Cole
79debe4941 Issue in experimental search 2019-10-13 11:47:38 +02:00
James Cole
98ca25ebea Fix #2731 2019-10-13 11:45:31 +02:00
James Cole
004f725993 Fix too strict CSP headers #2727 2019-10-12 04:04:03 +02:00
James Cole
9ed32ad227 Merge pull request #2724 from danger89/clean_files_only
Clean-up only
2019-10-12 03:53:27 +02:00
Melroy van den Berg
1ac5c4f670 clean-up only 2019-10-11 16:29:08 +00:00
James Cole
24e7260fe7 Temp fix for #2701 2019-10-10 21:02:56 +02:00
James Cole
5e9e749179 Fix #2716 2019-10-10 20:58:13 +02:00
James Cole
460906fdfe Fix search query. #2713 2019-10-10 20:50:40 +02:00
James Cole
22f63fd951 Remove references to unused Docker variable 2019-10-10 20:36:55 +02:00
James Cole
de19bfe448 Link to base image #2655 2019-10-09 05:46:21 +02:00
James Cole
378bbf20de Fix #2699 2019-10-06 20:09:27 +02:00
James Cole
32ecac3b1f Fix #2698 2019-10-06 07:03:34 +02:00
James Cole
fee0eb68d5 Fix translation things. 2019-10-05 16:43:24 +02:00
James Cole
bb6aa568ba Fix #2540 2019-10-05 13:11:12 +02:00
James Cole
2580927439 Fall back to English if the string does not exist. #2540 2019-10-05 13:05:02 +02:00
James Cole
46afdc5418 Continued attempt to translate form #2540 2019-10-05 12:44:05 +02:00
James Cole
9d82e3cfac Broken, to be fixed. 2019-10-05 11:29:57 +02:00
James Cole
2e265edec6 First attempt to translate form #2540 2019-10-05 11:17:44 +02:00
James Cole
9ef1af176d Restore the correct copyright owners. 2019-10-05 10:10:11 +02:00
James Cole
49de827a49 Merge branch 'release/4.8.1.4' 2019-10-05 06:59:32 +02:00
James Cole
c7d918499d Merge tag '4.8.1.4' into develop
4.8.1.4
2019-10-05 06:59:32 +02:00
James Cole
3ace0d6f84 Update version 2019-10-05 06:58:12 +02:00
James Cole
16cec9a861 Merge branch 'release/4.8.1.3' 2019-10-05 06:55:11 +02:00
James Cole
89d31ca71f Merge tag '4.8.1.3' into develop
4.8.1.3
2019-10-05 06:55:11 +02:00
James Cole
2b10fc51fb Sneak in some last-minute language fixes. 2019-10-05 06:54:42 +02:00
James Cole
6b52df22bd Update changelog and version. 2019-10-05 06:51:00 +02:00
James Cole
65dc8e1c57 Fix #2680 2019-10-05 06:48:57 +02:00
James Cole
6cb60d95bd Merge tag '4.8.1.2' into develop
4.8.1.2
2019-10-05 06:33:27 +02:00
James Cole
4d6ae7e0ec Merge branch 'release/4.8.1.2' 2019-10-05 06:33:24 +02:00
James Cole
cbfd769fdb Update composer file. 2019-10-05 06:32:18 +02:00
James Cole
8b51db646f Update composer file. 2019-10-05 06:26:54 +02:00
James Cole
4880803559 Update changelog and API version 2019-10-05 06:24:05 +02:00
James Cole
97861fd49a Update language strings. 2019-10-05 06:23:46 +02:00
James Cole
0854842285 Update version. 2019-10-05 05:20:07 +02:00
James Cole
9b001f7c15 Fix #2687 2019-10-05 05:18:40 +02:00
James Cole
67f9d23714 Fix #2683 2019-10-05 04:53:58 +02:00
James Cole
e3e9e8e859 Fix #2677 2019-10-03 20:22:35 +02:00
James Cole
5372a126c5 More fixes for #2607 2019-10-03 20:19:29 +02:00
James Cole
5148a8bbb9 Fix #2480 2019-10-02 18:03:58 +02:00
James Cole
db7c5cbf40 Update license in readme. 2019-10-02 18:01:08 +02:00
James Cole
ce85e99d1a Basic search for accounts. 2019-10-02 18:00:01 +02:00
James Cole
78481b8aa9 Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 07:00:58 +02:00
James Cole
28e85fd07a Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 06:45:10 +02:00
James Cole
c341d46e9f Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 06:45:03 +02:00
James Cole
cf4ecc4b09 Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 06:43:38 +02:00
James Cole
04849e8c61 Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 06:38:38 +02:00
James Cole
4a4065a141 Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 06:38:00 +02:00
James Cole
92158e52ef Update copyright of Firefly III to the GNU Affero General Public License as suggested by @nxxxse in #2607. This applies to all code in this commit from this moment onwards. 2019-10-02 06:37:26 +02:00
James Cole
27aa07ad07 Merge pull request #2675 from atomtigerzoo/spelling-en
Fixes some small typos in the english translations
2019-10-01 17:13:36 +02:00
Henning Stein
af534977b3 fixes some small typos in the english translations 2019-10-01 14:43:56 +02:00
James Cole
d089d110fa Add debug for #2662 2019-09-28 04:50:32 +02:00
James Cole
62890d9b7a Add average 2019-09-28 04:47:49 +02:00
James Cole
8a0abc23c3 New feature: option to delete all meta data from your account. 2019-09-27 21:35:21 +02:00
James Cole
7337d73c1d Clean up for #2662 2019-09-27 20:36:52 +02:00
James Cole
21f98be3e7 Fix #2637 2019-09-26 20:57:24 +02:00
James Cole
3ff8aa7509 Fix #2658 2019-09-26 19:16:17 +02:00
James Cole
f370a1b486 Fix #2657 2019-09-26 18:59:37 +02:00
James Cole
9301f2694b Fix for #2647 2019-09-23 20:25:32 +02:00
James Cole
dd87b1472e Fix #2619 2019-09-23 17:13:42 +02:00
James Cole
3c8935c0a8 Fix #2567 2019-09-23 17:11:01 +02:00
James Cole
a1ae85660d Fix #2606 2019-09-23 16:42:21 +02:00
James Cole
f976bc21af Update readme. 2019-09-23 16:33:34 +02:00
James Cole
0eae4329f4 Fix #2584 2019-09-23 16:33:27 +02:00
James Cole
7735402f54 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2019-09-23 16:33:14 +02:00
James Cole
765d8f95b4 Merge pull request #2643 from GeoffreyFrogeye/typo2640
Fixed definition of Request->nullableNlString
2019-09-23 05:07:45 +02:00
Geoffrey “Frogeye” Preud'homme
61796552b1 Fixed definition of Request->nullableNlString
Typo introduced in f8cb5ca21c
2019-09-22 23:28:19 +02:00
James Cole
45bd21ca84 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2019-09-22 22:10:44 +02:00
James Cole
0340ed6f19 Fix #2638 2019-09-22 22:10:39 +02:00
James Cole
28bc684d74 Merge pull request #2639 from GeoffreyFrogeye/accountnl
Additional fix for #2629 with accounts
2019-09-22 22:01:28 +02:00
James Cole
1879bc4fe4 Merge pull request #2640 from GeoffreyFrogeye/apinl
Additional fix for #2629 with API
2019-09-22 22:01:03 +02:00
Geoffrey “Frogeye” Preud'homme
f8cb5ca21c Additional fix for #2629 with API
API object's notes fields now correctly preserve newlines.
2019-09-22 17:36:18 +02:00
Geoffrey “Frogeye” Preud'homme
871185634b Additional fix for #2629 with accounts
Account's notes field now correctly preserve newlines.
2019-09-22 16:49:54 +02:00
James Cole
5214f87003 Switch command place. 2019-09-21 11:06:07 +02:00
James Cole
9ea1a495b8 Code for #2616 2019-09-21 11:03:00 +02:00
James Cole
7067e36421 Remove some text from templates. 2019-09-21 07:33:23 +02:00
James Cole
3aba7e1db7 Fix #2510 2019-09-21 07:33:13 +02:00
James Cole
750b2360c3 Fix #2633 2019-09-21 07:15:32 +02:00
James Cole
5fb6a6ef5f Fix tag thing. 2019-09-20 17:57:35 +02:00
James Cole
d5a10fc875 Fix #2624 2019-09-20 16:43:57 +02:00
James Cole
50ad9fbf94 Fix #2609 2019-09-20 16:33:15 +02:00
James Cole
2cbe1b2835 Fix #2623 2019-09-20 16:20:13 +02:00
James Cole
17c943fcf1 Fix #2626 2019-09-20 16:17:57 +02:00
James Cole
845ae94252 Fix #2626 2019-09-20 16:16:15 +02:00
James Cole
3b66901481 Fix #2627 2019-09-20 06:14:27 +02:00
James Cole
c14d3f40a9 Fix #2628 2019-09-20 06:14:08 +02:00
James Cole
845e67e9be Merge pull request #2613 from klepek/master
Configuragble Mailgun endpoint
2019-09-17 19:19:52 +02:00
Jan Klepek
7d2a86580d add default value for mailgun endpoint 2019-09-17 15:54:53 +02:00
Jan Klepek
12e2306755 add mailgun_endpoint into mailgun config 2019-09-17 15:39:15 +02:00
Jan Klepek
e5c821bcea add MAILGUN_ENDPOINT variable 2019-09-17 15:38:16 +02:00
James Cole
ef85b1180f Fix #2603 2019-09-15 08:48:51 +02:00
James Cole
595a90cb0a Fix #2560 2019-09-15 08:38:17 +02:00
James Cole
412b914f66 Fix #2494 2019-09-15 08:16:43 +02:00
James Cole
2cc7721007 Fix #2572 2019-09-15 08:06:19 +02:00
James Cole
18399a9b05 Fix budget overview for #2593 2019-09-15 06:56:20 +02:00
James Cole
8776d47545 Fix another place where migrations may fail. 2019-09-14 18:17:32 +02:00
James Cole
657baf283d Fix #2598 2019-09-14 18:06:46 +02:00
James Cole
8f683cd6ec Fix #2599 2019-09-14 18:02:24 +02:00
James Cole
2dd3647bc0 Fix #2587 2019-09-14 06:26:25 +02:00
James Cole
f49ef1622e Fix #2589 2019-09-14 06:22:02 +02:00
James Cole
ec43c9999a Fix #2596 2019-09-14 06:14:33 +02:00
James Cole
99686346dc Merge branch 'release/4.8.1.1' 2019-09-13 19:15:48 +02:00
James Cole
dcb57cc229 Merge tag '4.8.1.1' into develop
4.8.1.1
2019-09-13 19:15:48 +02:00
James Cole
07e6d60904 Update changelog and some meta data. 2019-09-13 19:05:10 +02:00
James Cole
cbde7037ab Fix #2597 2019-09-13 17:17:57 +02:00
James Cole
793af1991c Fix #2590 2019-09-13 06:44:57 +02:00
James Cole
88f8dc469b Possible fix for #2592 2019-09-13 05:39:56 +02:00
James Cole
4fd23694c7 Update composer, fix migrations 2019-09-13 05:36:01 +02:00
James Cole
8fd5b45a72 Fix the fake import routine. 2019-09-13 05:30:51 +02:00
James Cole
055673370b Updated meta files. 2019-09-12 07:28:14 +02:00
James Cole
8235138a5d Max amounts 2019-09-12 07:11:20 +02:00
James Cole
26ac57facb Update packages. 2019-09-12 07:06:53 +02:00
James Cole
ead922ce22 Fix #2577 2019-09-12 07:05:25 +02:00
James Cole
88c08188f7 Fix #2573 2019-09-12 06:47:04 +02:00
James Cole
a0780e434e Set some max numbers. 2019-09-09 18:55:23 +02:00
James Cole
5ae91845c1 Fix #2564 2019-09-08 20:21:44 +02:00
James Cole
2de79ea392 Fixes #2563 2019-09-08 20:11:00 +02:00
James Cole
5623bb20ee Update version 2019-09-08 15:30:17 +02:00
James Cole
a2ddd0420a Fix for #2562 2019-09-08 15:28:35 +02:00
James Cole
4e6bc035ed Merge tag '4.8.1' into develop
4.8.1
2019-09-08 08:08:59 +02:00
James Cole
d550a626e9 Merge branch 'release/4.8.1' 2019-09-08 08:08:57 +02:00
James Cole
31dea785f6 Remove newline 2019-09-08 08:07:57 +02:00
James Cole
4eff0b73c7 Changelog [skip ci] 2019-09-08 08:03:28 +02:00
James Cole
dc55d712af Add missing variable. 2019-09-08 08:00:53 +02:00
James Cole
d735694e2a Update composer file. 2019-09-08 07:56:28 +02:00
James Cole
f4c2b8e348 Last minute changes. 2019-09-08 07:55:19 +02:00
James Cole
5ff0ca81b7 #2285 2019-09-07 21:02:34 +02:00
James Cole
5fcb5fdaa5 Fix for #2231 2019-09-07 20:44:02 +02:00
James Cole
03d8543cae New translations [skip ci] 2019-09-07 20:28:21 +02:00
James Cole
fb7a74fb5c Update changelog for upcoming release. [skip ci] 2019-09-07 20:22:10 +02:00
James Cole
b11f9611ff Another fix for #2487 2019-09-07 19:55:50 +02:00
James Cole
cb7a4fedf7 Fix #2553 2019-09-07 19:46:16 +02:00
James Cole
1c68b0902d Fix for #2555 2019-09-07 19:40:44 +02:00
James Cole
0c967cb011 Remove facebook [skip ci] 2019-09-07 19:32:30 +02:00
James Cole
c0fd371430 Fix #2557 2019-09-07 16:19:01 +02:00
James Cole
cb9c59e5e3 Enable clone transaction (after a fashion) 2019-09-07 07:26:31 +02:00
James Cole
8dccfc796a Add missing languages, fixes #2550 2019-09-07 06:30:54 +02:00
James Cole
b0b2bfb361 Remove link to clone function. 2019-09-07 06:23:36 +02:00
James Cole
62b65927ff Update some meta files. 2019-09-07 06:23:26 +02:00
James Cole
50fca4f19e New translations. 2019-09-06 20:26:57 +02:00
James Cole
c6c66b9dcb Introduce Greek. 2019-09-06 20:26:13 +02:00
James Cole
ff3e65baeb Upgrade API version 2019-09-06 17:19:30 +02:00
James Cole
30f454d38a Fix tests 2019-09-06 17:19:21 +02:00
James Cole
e9782a701f This is not a static function 2019-09-06 17:19:03 +02:00
James Cole
1a583c771b Fix issue in multi year reports 2019-09-06 17:18:55 +02:00
James Cole
69af0c3d65 Fix for #2548 2019-09-06 17:18:33 +02:00
James Cole
a6164456e6 Code for #2534 2019-09-06 16:29:52 +02:00
James Cole
377f31b910 Fix for #2547 2019-09-06 15:55:17 +02:00
James Cole
445ecdca17 Update for #2534 2019-09-06 12:01:14 +02:00
James Cole
aa7a35d93d New security policy. 2019-09-06 12:00:42 +02:00
James Cole
eb0d269ce7 Fix #2545 2019-09-06 09:37:00 +02:00
James Cole
77084ba72d More code for #2543 2019-09-06 06:30:01 +02:00
James Cole
07dd44af2d Fix #2543 2019-09-06 06:24:25 +02:00
James Cole
a29e78ed44 Fix #2536 2019-09-06 06:02:22 +02:00
James Cole
5d192ad4c2 Add bill / category and budget info 2019-09-05 19:04:58 +02:00
James Cole
3fb13b870f Fix #2513 2019-09-05 18:58:01 +02:00
James Cole
7cb53f4396 Some extra things for Docker image. 2019-09-05 17:47:25 +02:00
James Cole
2d47ee7e21 Fix null pointer in command 2019-09-05 17:46:18 +02:00
James Cole
95181a0a6a Rebuild JS. 2019-09-05 08:12:33 +02:00
James Cole
f36b369d73 Fix for #2483 2019-09-04 21:06:01 +02:00
James Cole
5623c3c43f Clean up some tests 2019-09-04 21:05:50 +02:00
James Cole
f9f1fa0fcb Clean up API code and fix test code. 2019-09-04 17:39:39 +02:00
James Cole
f52584d46b Remove unused code. 2019-09-04 16:07:44 +02:00
James Cole
bbcb492075 Fix #2539 [skip ci] 2019-09-04 16:02:27 +02:00
James Cole
0f2040f931 Fix some last-minute issues. 2019-09-04 10:27:13 +02:00
James Cole
2cda6eba94 Make sure amounts are always positive. 2019-09-04 10:12:33 +02:00
James Cole
d23656aac9 Code for #2466 2019-09-04 09:45:02 +02:00
James Cole
fff98186b2 Fix #2521 2019-09-04 09:21:31 +02:00
James Cole
5c468e1c49 Fix #2383 2019-09-04 09:20:26 +02:00
James Cole
2bff6b49e6 Fix #2537 2019-09-04 09:10:12 +02:00
James Cole
d107e78641 Code for #2389 2019-09-04 07:51:31 +02:00
James Cole
47de2fec28 Revamp multi-account report. 2019-09-03 22:35:41 +02:00
James Cole
4743230136 Refactor some views for double account report. 2019-09-03 17:30:45 +02:00
James Cole
7fb5c12a29 Updated language strings. 2019-09-03 17:21:45 +02:00
James Cole
ddabf6a246 Fixes #2464 2019-09-03 17:06:30 +02:00
James Cole
a8b521bdd5 Fix #2526 2019-09-03 16:57:03 +02:00
James Cole
e113fea8f0 Fixes #2522 2019-09-03 16:56:46 +02:00
James Cole
b3cbbeecf0 Update version. 2019-09-03 16:56:20 +02:00
James Cole
401086b75f Remove unused code. 2019-09-03 15:43:11 +02:00
James Cole
5a8146aa34 Revamped tag report as well. 2019-09-03 15:37:59 +02:00
James Cole
4872d3e4bc Clean up and add some todo's 2019-09-03 11:55:06 +02:00
James Cole
7cee183f1c Update docker files. 2019-09-03 11:43:54 +02:00
James Cole
8b0903c32e Finish multi-currency budget and account report. 2019-09-03 09:06:12 +02:00
James Cole
6443b7bde4 Make sure info includes earned data 2019-09-02 22:31:07 +02:00
James Cole
e75c15a61b First start making the category report also multi-currency 2019-09-02 21:47:20 +02:00
James Cole
206dae87ba Fix some issues in multi-currency budget reports. 2019-09-02 21:21:29 +02:00
James Cole
771cf73171 Budget report cleaned up and multi-currency. 2019-09-02 20:30:47 +02:00
James Cole
0fd7e4363d Make some parts of the budget repository multi-currency 2019-09-02 16:52:35 +02:00
James Cole
8246d901e7 Fix #2513 2019-09-01 19:17:46 +02:00
James Cole
30fc56a0d7 Fix some bugs in multi-currency reports. 2019-09-01 19:08:10 +02:00
James Cole
01876be152 Fix some bugs in multi-currency reports. 2019-09-01 18:50:10 +02:00
James Cole
a57a7d3bda Fix some bugs in multi-currency reports. 2019-09-01 18:41:57 +02:00
James Cole
5c099008e8 Make report budget charts multi-currency 2019-09-01 16:52:49 +02:00
James Cole
ce06fb73b1 Expand view of report and make multi currency 2019-09-01 15:23:33 +02:00
James Cole
1e9f354a81 Remove unused code. 2019-09-01 14:50:37 +02:00
James Cole
f5b01c7b21 Fix #2526 2019-09-01 14:49:26 +02:00
James Cole
48d3130b36 Fix #2527 2019-09-01 14:42:27 +02:00
James Cole
d247ed5dc5 Final things. 2019-09-01 11:13:03 +02:00
James Cole
4cd52963a6 Allow user to set multi-currency available budget. WIP 2019-09-01 10:48:18 +02:00
James Cole
509276e20b Allow user to set multi-currency available budget. WIP 2019-08-31 21:47:55 +02:00
James Cole
ca777857c2 Allow user to set multi-currency available budget. WIP 2019-08-31 09:35:35 +02:00
James Cole
61b6e266da Catch "no category" entries. 2019-08-30 09:30:06 +02:00
James Cole
717b9d21fd Move method to correct repository. 2019-08-30 09:19:29 +02:00
James Cole
134d1b2746 Move method to correct repository. 2019-08-30 09:13:10 +02:00
James Cole
5973b94677 Move method to correct repository. 2019-08-30 08:19:55 +02:00
James Cole
40441de545 Move method to correct repository. 2019-08-30 08:15:09 +02:00
James Cole
a90eacf686 Move method to correct repository. 2019-08-30 08:12:15 +02:00
James Cole
09bc50dd4d Move method to correct repository. 2019-08-30 08:09:39 +02:00
James Cole
7685e2007f Move method to correct repository. 2019-08-30 08:09:13 +02:00
James Cole
4a3e1a9604 Move method to correct repository. 2019-08-30 08:03:13 +02:00
James Cole
9fad13c788 Move method to correct repository. 2019-08-30 08:02:11 +02:00
James Cole
97d87b0657 Move method to correct repository. 2019-08-30 08:00:52 +02:00
James Cole
1da4597f94 Move method to correct repository. 2019-08-30 07:54:09 +02:00
James Cole
e525960320 Move method to correct repository. 2019-08-30 07:49:08 +02:00
James Cole
4cdbea2737 Move method to correct repository. 2019-08-30 07:45:48 +02:00
James Cole
6a06ab35c9 Fix #2516 2019-08-30 07:28:48 +02:00
James Cole
6d3b8e7def Fix #2518 2019-08-30 07:17:02 +02:00
James Cole
a6b1fcb609 Refactor references to budget repository. 2019-08-29 21:42:55 +02:00
James Cole
48f0aa842e Start refactoring budget repositories. 2019-08-29 21:33:12 +02:00
James Cole
9d8625df3b Fix some pointers in test code [skip ci] 2019-08-29 21:32:50 +02:00
James Cole
19feefda2d Improve test coverage. 2019-08-29 17:53:25 +02:00
James Cole
91b6b86202 Fix #2512 2019-08-29 08:55:23 +02:00
James Cole
f4eca2d4ae Test new category code. 2019-08-28 17:01:48 +02:00
James Cole
5fb7635100 Remove double lines from code. 2019-08-28 16:28:14 +02:00
James Cole
fa706d27d8 Refactor category repositories. 2019-08-28 12:28:23 +02:00
James Cole
e11af70f99 Retire some old code. 2019-08-27 14:45:14 +02:00
James Cole
0daed6529d Refactor methods in category repositories. 2019-08-27 12:11:46 +02:00
James Cole
e5269bb312 Refactor and split category repository. 2019-08-27 10:52:07 +02:00
James Cole
7eb9086a28 Make budget tables multi-currency 2019-08-27 10:25:23 +02:00
James Cole
33d0b8ca22 Fix #2501 2019-08-27 07:51:34 +02:00
James Cole
7720519076 Fix for #2500 2019-08-27 07:28:39 +02:00
James Cole
57961de214 Fix for #2499 2019-08-27 07:26:32 +02:00
James Cole
d1eab98281 Fix #2498 2019-08-27 07:20:46 +02:00
James Cole
e37abeb36d Fix #2493 2019-08-27 07:17:22 +02:00
James Cole
49fc6fbd38 Fix #2492 2019-08-27 07:10:51 +02:00
James Cole
467a04ad78 Fix #2490 2019-08-27 07:01:09 +02:00
James Cole
7ef1098ab4 Fix #2488 2019-08-27 06:57:30 +02:00
James Cole
d050c0269a Fix #2487 2019-08-27 06:55:12 +02:00
James Cole
9e4f6abf5d Fix #2485 2019-08-27 06:52:54 +02:00
James Cole
c41ae3a9bf Fix #2484 2019-08-27 06:45:35 +02:00
James Cole
4ff8b3b556 Make sure user interface works for new recurring transactions. 2019-08-27 06:36:16 +02:00
James Cole
ce5fcbbda2 Remove bill references. 2019-08-27 06:12:08 +02:00
James Cole
e308b0f617 Make sure tags work, make sure update is refreshed. 2019-08-27 06:08:30 +02:00
James Cole
e209766ad0 Can also show and update notes. 2019-08-27 05:57:58 +02:00
James Cole
f2c2d4e126 Special string for skip field. 2019-08-27 05:57:28 +02:00
James Cole
96caf3491e Copy method for validation. 2019-08-27 05:57:09 +02:00
James Cole
a67bbaa1eb No date requirements for new recurrence. 2019-08-27 05:55:46 +02:00
James Cole
2b40b60d01 Push empty object {} and recurrence doesn't change. #2483 2019-08-26 19:09:55 +02:00
James Cole
f9dc58c3a8 Post new recurrence meta (piggy, tags) works. #2483 2019-08-26 18:44:04 +02:00
James Cole
c2a57a457b New upgrade command for recurring transactions #2483 2019-08-26 18:38:23 +02:00
James Cole
ac64bac558 Error about not submitting a repetition is given under "repetitions". #2483 2019-08-26 18:15:44 +02:00
James Cole
f884880ab8 Error about not submitting a transaction is given under "transactions". #2483 2019-08-26 18:15:21 +02:00
James Cole
5e04237a2c Experiment for #2489 2019-08-26 17:38:26 +02:00
James Cole
339ccbc5f8 Put meta data in correct array, make sure edit screen works. #2483 2019-08-26 08:59:43 +02:00
James Cole
1f3c621bea Make sure version is OK. Will trigger the commands again but no matter. 2019-08-26 07:13:48 +02:00
James Cole
a49e20c2aa New command to migrate recurrence meta data. 2019-08-26 07:12:46 +02:00
James Cole
8978904fdd Edit index to match transformer. 2019-08-26 07:12:32 +02:00
James Cole
5e0d9bddba Forgot to remove a line. 2019-08-26 07:12:20 +02:00
James Cole
96222fdcea Make the chunks larger. 2019-08-26 07:12:01 +02:00
James Cole
05bee57932 Second fix for #2480 2019-08-25 16:36:26 +02:00
James Cole
1e00d7cb16 Merge category and budget info with the transaction array #2483 2019-08-25 16:27:17 +02:00
James Cole
6bc5794dfd Rename recurrence_repetitions and nr_of_repetitions. 2019-08-25 16:15:02 +02:00
James Cole
1f9fddaa32 Drop transaction_type_id, rename transaction_type #2483 2019-08-25 16:13:47 +02:00
James Cole
5d68fab374 Fix #2480 2019-08-25 16:04:49 +02:00
James Cole
8680254503 Can now leave out actions and triggers.
If added though, all data must be present. #2477
2019-08-25 07:55:21 +02:00
James Cole
c0909aebba Rule controller can handle empty submission. #2477
The rule repository can't handle this (yet).
2019-08-25 07:48:46 +02:00
James Cole
e16adca336 Consistency for #2477 2019-08-25 07:40:14 +02:00
James Cole
aa1b9fa5a5 Rules will no longer list the "user-action" trigger
Rules will have a "moment" field that says either "update-journal" or "store-journal".
2019-08-25 07:35:26 +02:00
James Cole
af2f085aa7 Disable the encryption of uploads, in line with other efforts not to encrypt local data. 2019-08-25 07:25:01 +02:00
James Cole
6b86a35ffb Fix for broken bills. 2019-08-24 13:23:36 +02:00
James Cole
7c5e10de33 And now also make sure that old meta data isn't changed. 2019-08-24 08:22:46 +02:00
James Cole
d836c8217d No longer have to submit mandatory fields to account end point. Just submit the field you wish to update, the rest will be untouched. 2019-08-24 07:56:08 +02:00
James Cole
e5e3797d9c Better sum for bill view. 2019-08-23 21:54:47 +02:00
James Cole
4b45c0d0a9 Possible fix for #2439 in develop 2019-08-23 19:37:53 +02:00
James Cole
afcf5f76ef Fix #2470 2019-08-23 19:27:55 +02:00
James Cole
5ecb7b0c07 Fix #2470 2019-08-23 19:25:26 +02:00
James Cole
a86e956dbb Force PHP 7.3, break anything before PHP 7.3 2019-08-23 18:55:14 +02:00
James Cole
731ef7b13c Merge pull request #2471 from hamuz/patch-1
Add date attribute to the list row
2019-08-23 15:34:19 +02:00
HamuZ HamuZ
2c0ad7047d Add date attribute to the list row
Used to be there previously (at least at 4.7.8). Used in my automation.
Similar to other views: https://github.com/firefly-iii/firefly-iii/search?q=data-date&unscoped_q=data-date
2019-08-23 16:32:42 +03:00
James Cole
682ad4c5aa Merge tag '4.8.0.3' into develop
4.8.0.3
2019-08-23 14:25:19 +02:00
James Cole
f090a9534f Merge branch 'release/4.8.0.3' 2019-08-23 14:25:17 +02:00
James Cole
ad289bc8cd Updated composer file. 2019-08-23 14:11:26 +02:00
James Cole
6f5b6e536d Updated version. 2019-08-23 14:11:18 +02:00
James Cole
c810bad97c New translations. 2019-08-23 14:11:10 +02:00
James Cole
a172c51495 Update changelog. 2019-08-23 13:54:51 +02:00
James Cole
633c776ebf Fix for #2438 2019-08-23 13:53:05 +02:00
James Cole
19bd295c71 Version update. 2019-08-23 13:52:36 +02:00
James Cole
3b39fb93e7 Fix tag overview. 2019-08-23 13:09:38 +02:00
James Cole
e3a338db0e Fix some view issues reported in #2436 2019-08-23 13:06:00 +02:00
James Cole
02df24bbc9 Possible fix for #2437 2019-08-23 09:41:31 +02:00
James Cole
4f6ba1e706 Re-order two columns #2437 2019-08-23 06:42:49 +02:00
James Cole
a1f57a0949 Fix #2467 2019-08-23 06:40:48 +02:00
James Cole
3d444eb833 Fix #2465 and #2463 2019-08-23 06:10:03 +02:00
James Cole
57b2a8d459 Add a note 2019-08-23 06:03:40 +02:00
James Cole
8a06507003 Fix #2459 2019-08-22 19:14:26 +02:00
James Cole
04d7137dff More code for #2457 2019-08-22 19:10:57 +02:00
James Cole
a2be71499f Add autocomplete #2457 2019-08-22 19:07:01 +02:00
James Cole
effba42ac2 Typo fix in budget helper and add debug info. #2451 2019-08-22 18:07:42 +02:00
James Cole
aea8603ca1 Typo fix in budget helper and add debug info. #2451 2019-08-22 18:07:33 +02:00
James Cole
fdb2abdf92 Some notes for future releases. #2443 2019-08-22 18:04:26 +02:00
James Cole
4b1d66bcf6 Merge pull request #2444 from GeoffreyFrogeye/availablebudgets
Fix wrong indexes in BudgetRepository
2019-08-22 18:03:34 +02:00
James Cole
248e393405 Merge pull request #2442 from GeoffreyFrogeye/currencycharlimit
Fix consistency in symbol character limit
2019-08-22 17:58:12 +02:00
James Cole
967ea6a181 Another fix for #2440 2019-08-22 17:56:48 +02:00
James Cole
a11f876c49 Fix return type #2440 2019-08-22 17:09:08 +02:00
James Cole
2a4051fe92 Fix for #2439 2019-08-22 17:06:43 +02:00
James Cole
10737d10a5 Merge pull request #2458 from jlauwers/patch-1
typo in readme
2019-08-22 04:43:42 +02:00
James Cole
6f75e0df3c Fix for #2451 2019-08-21 18:07:15 +02:00
James Cole
24a2238134 Fix #2456 2019-08-21 18:01:57 +02:00
James Cole
c7931f2b72 Fix for #2460 2019-08-21 17:27:59 +02:00
Jonathan
852584b6a8 typo in readme 2019-08-21 08:39:21 +02:00
James Cole
21a9e981a2 Fix for #2446 2019-08-21 05:15:47 +02:00
James Cole
ecc37b2ed3 Some undocumented changes for #2445 and #2447 2019-08-21 04:59:35 +02:00
James Cole
c0935e192d Fix #2448 2019-08-21 04:46:17 +02:00
James Cole
92a2404b61 Fix for invoice date #2449 2019-08-21 04:45:00 +02:00
James Cole
d9a2bd3e5f Update composer file with new command. 2019-08-21 04:37:27 +02:00
James Cole
22f110df8d Round the search time and make sure the count is shown #2453 2019-08-21 04:37:17 +02:00
James Cole
c76337926b Fix general docker file. 2019-08-21 04:18:37 +02:00
Geoffrey “Frogeye” Preud'homme
bf57dec07c Fix wrong indexes in BudgetRepository
Closes #2443
2019-08-18 17:58:42 +02:00
Geoffrey “Frogeye” Preud'homme
10d760a614 Fix consistency in symbol character limit
Closes #2441
2019-08-18 17:16:10 +02:00
James Cole
7b813065da Remove log debug things. 2019-08-18 13:01:47 +02:00
James Cole
c218a12af7 New command to make sure opening balance currency information is correct. 2019-08-18 13:01:38 +02:00
James Cole
98ae0efb16 SQL issue in piggy banks 2019-08-18 11:19:25 +02:00
James Cole
98cff18efa Fix email message for new transactions 2019-08-18 11:16:33 +02:00
James Cole
a7b2fbbf10 Budget box is back. 2019-08-18 09:07:08 +02:00
James Cole
ccc12171d6 Make sure all account meta data is deleted properly. 2019-08-18 09:00:15 +02:00
James Cole
525f69cf63 Inform user on currency disabling and where a currency may still be used. #2432 2019-08-18 08:46:36 +02:00
James Cole
4d2c5c1b58 Build both images using base image. 2019-08-18 08:10:30 +02:00
James Cole
450d07580e Push build from other base image. 2019-08-18 07:16:30 +02:00
James Cole
246100f2b7 Debug info for #2437 2019-08-17 21:02:02 +02:00
James Cole
9974e0229d Merge tag '4.8.0.2' into develop
4.8.0.2
2019-08-17 12:38:06 +02:00
James Cole
ad44f99dbf Merge branch 'release/4.8.0.2' 2019-08-17 12:38:04 +02:00
James Cole
12a64fefc8 Fix test. 2019-08-17 12:31:55 +02:00
James Cole
2ee8cbbae4 Update change logs and files for new version. 2019-08-17 12:27:15 +02:00
James Cole
34c19b145c Updated strings. 2019-08-17 12:24:16 +02:00
James Cole
c5e047ea02 Update copyright 2019-08-17 12:13:02 +02:00
James Cole
fc78c32fca Add newline to files 2019-08-17 12:09:03 +02:00
James Cole
b53cbbe469 Fix test coverage. 2019-08-17 12:08:09 +02:00
James Cole
1d4434698e Fix some tests. 2019-08-17 11:32:05 +02:00
James Cole
6d1bfd3956 Code cleanup 2019-08-17 10:54:16 +02:00
James Cole
1974d5f1e3 Code cleanup 2019-08-17 10:48:28 +02:00
James Cole
c235e42d6c Bill report URL must be set. 2019-08-17 10:48:09 +02:00
James Cole
342985d52a Code cleanup 2019-08-17 10:47:51 +02:00
James Cole
c2296c3ad5 Code cleanup 2019-08-17 10:47:29 +02:00
James Cole
23479790fe Code cleanup 2019-08-17 10:47:10 +02:00
James Cole
44823c6fec Code cleanup 2019-08-17 10:46:55 +02:00
James Cole
acfdf7dc90 Code cleanup 2019-08-17 10:46:40 +02:00
James Cole
6038a68ba9 Code cleanup 2019-08-17 10:46:32 +02:00
James Cole
79cf61b653 Fix #2434 2019-08-17 08:29:35 +02:00
James Cole
b97d3d3627 And fix sorting. 2019-08-17 08:04:41 +02:00
James Cole
7f887e294a Fix some charts. 2019-08-17 08:00:27 +02:00
James Cole
6f78735bc5 Fix some report issues. 2019-08-17 07:47:39 +02:00
James Cole
3e242aaca6 Clean up login controller. 2019-08-17 06:35:45 +02:00
James Cole
0796e422d4 Cleanup showLoginForm() 2019-08-17 06:24:49 +02:00
James Cole
fbd7c9ae07 Remove logout method (is the same) 2019-08-17 06:23:12 +02:00
James Cole
5cfb1b63dc Remove inspection warnings. 2019-08-17 06:22:42 +02:00
James Cole
f09d0e87e4 Remove inspection, add TODO's, make code a bit simpler. 2019-08-16 21:38:35 +02:00
James Cole
820358af73 Remove unused code. 2019-08-16 21:23:20 +02:00
James Cole
5a2998c80e Simplify bill overview. 2019-08-16 21:21:38 +02:00
James Cole
a32df0066e Fix form inconsistencies. 2019-08-16 19:08:20 +02:00
James Cole
02db333d46 Update for balance box in report. 2019-08-16 17:54:38 +02:00
James Cole
070f46c755 Budget box is multi-currency. 2019-08-16 08:27:08 +02:00
James Cole
b4a732bf77 Namespace errors, spotted by @davids3 #2392 2019-08-16 07:24:04 +02:00
James Cole
d8eb59736e Improve report boxes one by one #2428 2019-08-16 06:21:10 +02:00
James Cole
41c15b0cf8 Forgot auth in API 2019-08-16 06:20:16 +02:00
James Cole
fdf99400bc Some TODO's for the future. 2019-08-16 06:20:07 +02:00
James Cole
1ba45afeab Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2019-08-16 05:22:24 +02:00
James Cole
1819ece55d Merge pull request #2429 from GeoffreyFrogeye/emd_date
Fix typo in BudgetRepository (emd_date)
2019-08-16 05:15:50 +02:00
James Cole
78335210db Cleanup API middleware. 2019-08-16 05:08:56 +02:00
Geoffrey “Frogeye” Preud'homme
ca23bb6272 Fix typo in BudgetRepository (emd_date) 2019-08-15 23:23:06 +02:00
James Cole
eed84e18bb Fix #2423 2019-08-14 20:25:38 +02:00
James Cole
12641f96b1 Fix #2422 2019-08-14 20:23:11 +02:00
James Cole
1b97c4d58f Fix date for recurring transactions #2407 2019-08-14 20:06:16 +02:00
James Cole
ee3a2ef41c Fix report issues. 2019-08-14 19:51:46 +02:00
James Cole
084ceb0c4e Report fixes for #2418 2019-08-14 19:06:05 +02:00
James Cole
2497c4ee5c Fix #2426 2019-08-14 17:54:15 +02:00
James Cole
757a118f87 Change comment [skip ci] 2019-08-14 06:16:44 +02:00
James Cole
97908932e6 Fix #2393 2019-08-13 19:01:30 +02:00
James Cole
4c73ad8306 Fix #2402 2019-08-13 18:50:18 +02:00
James Cole
10a2078661 Fix #2404 2019-08-13 18:45:44 +02:00
James Cole
3fb09136cf Fix #2410 2019-08-13 18:38:15 +02:00
James Cole
843cced454 Fix #2405 2019-08-13 16:45:04 +02:00
James Cole
71a501868f Fix docker build back to original script. 2019-08-13 16:26:27 +02:00
James Cole
0a0ad8200a Fix #2414 2019-08-13 16:24:36 +02:00
James Cole
a9baf54b12 Fix #2416 2019-08-13 16:02:28 +02:00
James Cole
ed565136fc Fix #2415 2019-08-13 16:00:35 +02:00
James Cole
4719b87314 Try the ARM thing with my own version of the script. 2019-08-12 19:53:54 +02:00
James Cole
24b30af018 Install extension. 2019-08-12 19:31:42 +02:00
James Cole
e9f4695355 Fix ARM script. 2019-08-12 18:44:57 +02:00
James Cole
5b969fa014 Fix LDAP in ARM 2019-08-12 18:34:32 +02:00
James Cole
499e713683 Remove unused methods. 2019-08-12 18:24:33 +02:00
James Cole
5eadb51b78 Some refactoring. 2019-08-12 18:19:13 +02:00
James Cole
713a962005 Log errors instead of giving exceptions 2019-08-12 18:19:06 +02:00
James Cole
d96e77a3ec Use new methods from category repository 2019-08-12 18:18:51 +02:00
James Cole
bc68c367c8 Refactor earnedInperiod and spentInPeriod 2019-08-12 18:18:26 +02:00
James Cole
33e241d39a Remove initial balance accounts from auto-complete. 2019-08-12 18:17:43 +02:00
James Cole
e67812bf64 Method is no longer used. 2019-08-12 18:17:15 +02:00
James Cole
1090ce6597 Remove sum, make multi-currency 2019-08-12 18:16:28 +02:00
James Cole
e358f19548 Make method static 2019-08-12 18:16:12 +02:00
James Cole
eac406d62d Merge tag '4.8.0.1' into develop
4.8.0.1
2019-08-12 18:12:03 +02:00
James Cole
142a488ab3 Merge branch 'release/4.8.0.1' 2019-08-12 18:12:02 +02:00
James Cole
893c83e086 Fix tests. 2019-08-12 17:36:37 +02:00
James Cole
76dad84ba6 Updated translations. 2019-08-12 17:12:11 +02:00
James Cole
6e78d4efa7 Update version. 2019-08-12 17:11:05 +02:00
James Cole
66ffbf9e47 Rename version so Ctrl-F doesn't pick them up 2019-08-12 17:10:58 +02:00
James Cole
c499899988 Update version and changelog. 2019-08-12 17:10:33 +02:00
James Cole
77ea246fc3 New files for future release. 2019-08-12 16:59:23 +02:00
James Cole
80f9896f2a Remove unused lines. 2019-08-12 16:58:45 +02:00
James Cole
90c60e55f7 Fix #2401 2019-08-12 16:54:48 +02:00
James Cole
b085ee3437 Fix #2395 2019-08-11 19:14:13 +02:00
James Cole
3b3f24fe56 Fix #2399 2019-08-11 18:58:30 +02:00
James Cole
1d2c834b2c Code for #2397 2019-08-11 17:32:00 +02:00
James Cole
cc243f9fb7 Remove unused methods. 2019-08-11 07:29:13 +02:00
James Cole
788bde5562 Fix some tag related issues. 2019-08-11 07:29:05 +02:00
James Cole
f67a9547cc Box is now positive. 2019-08-11 07:26:06 +02:00
James Cole
8545d73119 Fix tests 2019-08-11 07:25:59 +02:00
James Cole
c4964cf603 Merge pull request #2382 from mfix22/patch-1
Fix ranger.yml config
2019-08-11 07:25:30 +02:00
James Cole
903b4e520c New Docker files. 2019-08-10 17:21:58 +02:00
James Cole
c0033ae56b Code cleanup in AccountForm. 2019-08-10 17:11:57 +02:00
James Cole
3daddd690f Fix all views. 2019-08-10 16:50:37 +02:00
James Cole
0d9bae6ec2 Fix the references for AccountForm. 2019-08-10 16:36:15 +02:00
James Cole
6e2978231b Refactor the expandedform methods. First commit to see how Scrutinizer likes this. This commit will break most views. 2019-08-10 15:09:44 +02:00
James Cole
0097c66522 Refactor journal repositories. 2019-08-10 14:41:08 +02:00
James Cole
93f1854be0 Refactor journal repository and fix tests. 2019-08-10 13:42:33 +02:00
James Cole
b7f3c53688 Fix #2388 2019-08-10 11:17:23 +02:00
James Cole
94b8bb8f66 Cleanup journal repository 2019-08-10 08:42:46 +02:00
James Cole
edb038c822 Update composer file. 2019-08-10 08:42:14 +02:00
James Cole
b6a9204c4f See what happens in the build now. 2019-08-10 07:19:37 +02:00
James Cole
1d1b335cac Fix #2384 2019-08-10 07:18:18 +02:00
James Cole
0516065f5a Cleanup todo's [skip ci] 2019-08-10 07:05:19 +02:00
James Cole
606f33ceeb Add disclaimer for Firefly III analytics code. 2019-08-10 07:05:07 +02:00
James Cole
cb1db06a7c Remove unnecessary loops. 2019-08-10 07:04:54 +02:00
James Cole
7b0ccdbdb4 Split request 2019-08-10 07:04:31 +02:00
James Cole
55cf9fa9d0 Update link in readme. 2019-08-10 06:16:58 +02:00
James Cole
b3156e9798 New command for php config in ARM image. 2019-08-10 06:16:50 +02:00
Michael Fix
8e51b3edef Fix ranger.yml config 2019-08-09 13:40:11 -07:00
James Cole
6f8b1f3b9d Fix link in readme [skip ci] 2019-08-09 21:06:59 +02:00
James Cole
3b81b7a904 Merge tag '4.8.0' into develop
4.8.0
2019-08-09 21:03:15 +02:00
James Cole
81cc138700 Merge branch 'release/4.8.0' 2019-08-09 21:03:12 +02:00
James Cole
5b908b77f3 Final changelog things. Also triggers a build. 2019-08-09 21:02:46 +02:00
James Cole
a248544641 Some more last-minute fixes. 2019-08-09 20:33:57 +02:00
James Cole
b09504d0f7 Fix broken duplication test routine. 2019-08-09 18:35:34 +02:00
James Cole
1e3d85439e Last minute fixes in test code and UI 2019-08-09 18:06:43 +02:00
James Cole
392317b01f Meta data fixes. 2019-08-09 18:06:16 +02:00
James Cole
9d73fb8193 Update donation link [skip ci] 2019-08-09 06:14:51 +02:00
James Cole
64427ef004 New icons [skip ci] 2019-08-09 06:13:40 +02:00
James Cole
fd2f4e1459 Fix test coverage. 2019-08-09 05:58:52 +02:00
James Cole
dcbc2ca0c3 Update JS dependencies. 2019-08-09 05:46:50 +02:00
James Cole
55a5838b3c Small update to readme [skip ci] 2019-08-08 18:09:07 +02:00
James Cole
d7a3fcf26d Update changelog and readme. 2019-08-08 18:00:44 +02:00
James Cole
c8c8fce55f Update language stuff 2019-08-08 17:52:46 +02:00
James Cole
c32f3254c5 Make sure 2FA works as expected. 2019-08-08 17:52:37 +02:00
James Cole
3dff8dfaf8 Warning if you change your language. 2019-08-08 17:08:36 +02:00
James Cole
53c7c6685b New language! 2019-08-08 17:05:13 +02:00
James Cole
564f00561e New language! 2019-08-08 17:04:17 +02:00
James Cole
c27db00550 Updated strings. 2019-08-08 17:04:06 +02:00
James Cole
717d1a3612 Getting close enough for inclusion. 2019-08-08 17:03:19 +02:00
James Cole
9bd238b45f Switch some fields. 2019-08-07 18:52:42 +02:00
James Cole
d81128d8c6 Fix help for transaction thing. 2019-08-07 18:51:35 +02:00
James Cole
bdf76cf9b2 Reference .env file. 2019-08-06 19:24:25 +02:00
James Cole
aabf8ce8cc Fix redirect in link controller. 2019-08-06 19:23:18 +02:00
James Cole
8bcf8095a9 Switch around text [skip ci] 2019-08-06 05:42:15 +02:00
James Cole
efc6b0e45a Add a todo [skip ci] 2019-08-06 05:39:05 +02:00
James Cole
00d785d891 New middleware that should make sure the new forms redirect as well. 2019-08-05 19:45:20 +02:00
James Cole
e37100ae97 Sync between command line and FF 2019-08-05 17:07:19 +02:00
James Cole
a077d58e9c Update libraries, add some views. 2019-08-04 19:54:31 +02:00
James Cole
cc56a981cd Fix problem with type of transaction. 2019-08-04 17:26:00 +02:00
James Cole
2147caf3ef Fix tests 2019-08-04 11:12:24 +02:00
James Cole
62b5cf04ad Refactor tests and code to handle new 2FA methods. 2019-08-04 10:27:37 +02:00
James Cole
d3be043aa7 Some experimental docker changes. 2019-08-04 08:01:13 +02:00
James Cole
933f02d1d9 Extra upgrade text. 2019-08-04 07:43:01 +02:00
James Cole
02c92318fb One command to upgrade, not 27 2019-08-04 07:41:32 +02:00
James Cole
a328d393d3 Clear cache 2019-08-04 07:29:31 +02:00
James Cole
a06868b0c3 Add element for cash account. 2019-08-04 07:29:25 +02:00
James Cole
d38766e5db Firefly III can generate new backup codes. 2019-08-04 07:21:11 +02:00
James Cole
e41211bed7 Can use backup codes to login. 2019-08-04 07:10:18 +02:00
James Cole
0b6c3efe8d Can now disable MFA 2019-08-04 07:10:05 +02:00
James Cole
616d921bef Can disable MFA 2019-08-04 07:09:51 +02:00
James Cole
ea52a52022 New MFA submit routine with history. 2019-08-04 07:00:47 +02:00
James Cole
cc76be1aad Enable the creation of a MFA token in users auth app, and store the MFA secret in profile. 2019-08-03 20:09:09 +02:00
James Cole
2554840714 Index can now handle new MFA method. 2019-08-03 19:57:24 +02:00
James Cole
e1e351aad7 Add new MFA middleware 2019-08-03 19:54:30 +02:00
James Cole
e9de7bbf15 Disable the MFA middleware. 2019-08-03 19:53:30 +02:00
James Cole
2bf3bdb3de Basic MFA view 2019-08-03 19:49:38 +02:00
James Cole
0a2bc99630 Republish configuration file, and edit it. 2019-08-03 19:49:32 +02:00
James Cole
7f1bd19e45 remove "twoFactorAuthEnabled" from preferences. Kill switches for all code that references them (easier for refactor) 2019-08-03 19:46:12 +02:00
James Cole
f8d2292fa8 Upgrade libraries. 2019-08-03 19:35:20 +02:00
James Cole
b0bd35503f Add MFA code in prep of new MFA routine 2019-08-03 19:19:55 +02:00
James Cole
0b8427f881 Add some TODO's, refactor some code. 2019-08-03 19:17:59 +02:00
James Cole
cf121fea50 Improve test coverage. 2019-08-03 14:45:37 +02:00
James Cole
75c2529d3e Improve test coverage. 2019-08-03 10:50:43 +02:00
James Cole
b8b59b13a7 Allow bread crumb for bills. 2019-08-03 08:33:05 +02:00
James Cole
12c1fa2367 Add new search keywords 2019-08-03 08:32:55 +02:00
James Cole
febaab62f7 Various fixes. Sorry, lazy day. 2019-08-03 06:27:56 +02:00
James Cole
43dbad4e4c Merge tag '4.7.17.6' into develop
4.7.17.6

# Conflicts:
#	.travis.yml
#	app/Http/Controllers/Import/JobConfigurationController.php
#	app/Http/Controllers/Transaction/SingleController.php
#	config/firefly.php
2019-08-03 05:11:58 +02:00
James Cole
2089ee14e9 Merge branch 'hotfix/4.7.17.6' 2019-08-03 05:10:21 +02:00
James Cole
ec8e1d5a7a Version update 2019-08-03 05:10:06 +02:00
James Cole
2d7494f8cd Fix similar XSS issues. 2019-08-03 05:08:35 +02:00
James Cole
8717f469b1 Fix #2370 2019-08-03 05:08:20 +02:00
James Cole
40dd2e0f7f Improve test coverage. 2019-08-03 04:46:47 +02:00
James Cole
00dee03709 Update version again. 2019-08-02 21:21:38 +02:00
James Cole
ca9f8b56f7 Merge tag '4.7.17.5' into develop
4.7.17.5

# Conflicts:
#	resources/views/v1/transactions/convert.twig
2019-08-02 20:59:57 +02:00
James Cole
ece0c99dbb Merge branch 'hotfix/4.7.17.5' 2019-08-02 20:59:23 +02:00
James Cole
b217acfe26 New version + correct credits. 2019-08-02 20:59:06 +02:00
James Cole
15d4d185bb Fix #2363 2019-08-02 20:57:36 +02:00
James Cole
3435cb937c Merge tag '4.7.17.4' into develop
4.7.17.4

# Conflicts:
#	config/firefly.php
#	resources/views/v1/transactions/convert.twig
2019-08-02 17:10:55 +02:00
James Cole
c9f4cf4f34 Merge branch 'hotfix/4.7.17.4' 2019-08-02 17:08:34 +02:00
James Cole
1b3d3de969 Update version. 2019-08-02 17:08:24 +02:00
James Cole
e80d616ef4 Fix #2367 2019-08-02 17:05:54 +02:00
James Cole
2ddf48f15c Fix #2366 2019-08-02 16:46:45 +02:00
James Cole
692b256f3f Fix #2365 2019-08-02 16:44:48 +02:00
James Cole
3ad4e04e2a Fix #2364 2019-08-02 16:43:36 +02:00
James Cole
427de0594d Fix #2363 2019-08-02 16:42:16 +02:00
James Cole
6ac08de71d First steps for reconciliation fix. 2019-08-02 16:31:36 +02:00
James Cole
494f783a2b Fix #2333 2019-08-02 08:28:51 +02:00
James Cole
59801b8bc1 Fix #2332 2019-08-02 05:49:20 +02:00
James Cole
3dbde59787 Fix #2331 2019-08-02 05:44:51 +02:00
James Cole
ac903b88ba Fix search 2019-08-02 05:32:30 +02:00
James Cole
fc70afa3ea Improve test coverage. 2019-08-02 05:25:24 +02:00
James Cole
4bd8e1b11e Fix #2328 2019-08-02 05:24:51 +02:00
James Cole
04bf92d946 Fix #2188 2019-08-01 21:07:40 +02:00
James Cole
eb2ee0c683 Extend cases for #2179 2019-08-01 17:19:32 +02:00
James Cole
324e0e7e30 Fix #2361 2019-08-01 17:17:26 +02:00
James Cole
81dce5d7c7 Fix #2179 2019-08-01 06:22:07 +02:00
James Cole
b049ca27f1 Improve test coverage. 2019-08-01 06:21:44 +02:00
James Cole
9b574ce7ad Improve test coverage. 2019-07-31 16:53:09 +02:00
James Cole
5524941c90 Update rule handling and views. 2019-07-27 15:01:13 +02:00
James Cole
67c0ef6ec6 Improve test coverage. 2019-07-27 13:54:06 +02:00
James Cole
d94d34ca63 Expand test coverage. 2019-07-26 17:48:24 +02:00
James Cole
6ff4a0b45c Improve test coverage. 2019-07-25 14:19:49 +02:00
James Cole
ee95606ec0 Improve test coverage. 2019-07-24 19:02:41 +02:00
James Cole
226e2f7185 Improve test coverage. 2019-07-23 17:33:23 +02:00
James Cole
1e7e0facf1 Improve test coverage. 2019-07-22 19:23:14 +02:00
James Cole
b7a4b0fdfd Refactored a lot of tests. 2019-07-21 17:15:06 +02:00
James Cole
5242c0368b Fixes #2153 2019-07-21 06:02:02 +02:00
James Cole
8f9ba21f4d Fix test coverage. 2019-07-20 22:32:40 +02:00
James Cole
58d370a893 Fix #1860 2019-07-20 22:32:32 +02:00
James Cole
3b8e95fcca Fix #1652 2019-07-20 16:48:35 +02:00
James Cole
889b7e9a18 Improve mass controller and test controllers. 2019-07-20 16:02:50 +02:00
James Cole
6d34cfb940 Implemented new link thing. 2019-07-20 06:47:34 +02:00
James Cole
63832b31f8 Improve test coverage 2019-07-20 06:22:37 +02:00
James Cole
4de537ce76 New code for edit transaction, and some tests. 2019-07-19 16:08:42 +02:00
James Cole
a42992efb0 Merge tag '4.7.17.3' into develop
4.7.17.3

# Conflicts:
#	changelog.md
#	config/firefly.php
2019-07-16 19:24:07 +02:00
James Cole
7d482aa24c Merge branch 'hotfix/4.7.17.3' 2019-07-16 19:22:58 +02:00
James Cole
a9f34e9dd1 Update version. 2019-07-16 19:22:45 +02:00
James Cole
f795cb07e1 Fixes #2339 2019-07-16 19:22:35 +02:00
James Cole
17a66b3056 Fixes #2337 2019-07-16 19:22:14 +02:00
James Cole
531161db09 Fixes #2338 2019-07-16 19:21:58 +02:00
James Cole
2772a1bb3b Now supports file uploads 2019-07-15 21:00:35 +02:00
James Cole
0263e2b720 Remove unused extension. 2019-07-15 19:27:03 +02:00
James Cole
5d81de6117 Merge tag '4.7.17.2' into develop
4.7.17.2

# Conflicts:
#	app/Support/Twig/Extension/Transaction.php
#	changelog.md
#	config/firefly.php
2019-07-15 19:14:06 +02:00
James Cole
a70b7cc7b9 Merge branch 'hotfix/4.7.17.2' 2019-07-15 19:12:34 +02:00
James Cole
def307010c Fix #2335, attempt 2. 2019-07-15 19:12:20 +02:00
James Cole
806ea2edbd Merge tag '4.7.17.1' into develop
4.7.17.1

# Conflicts:
#	changelog.md
#	config/firefly.php
2019-07-15 16:51:50 +02:00
James Cole
45b8c36272 Merge branch 'hotfix/4.7.17.1' 2019-07-15 16:50:36 +02:00
James Cole
45ddb64186 Fix #2335 2019-07-15 16:50:18 +02:00
James Cole
24efe9a096 Attempt to fix uploads. 2019-07-13 20:58:00 +02:00
James Cole
2210b8054d Fix Google Ana;ytics. 2019-07-13 20:57:29 +02:00
James Cole
3eb695f2ad Fix test for convert controller. 2019-07-13 20:57:06 +02:00
James Cole
7fd3f77c3e Make sure the convert controller works again. 2019-07-05 19:43:16 +02:00
James Cole
3c5c14ff5a Refactored the bulk edit controller. 2019-07-04 17:31:47 +02:00
James Cole
54623061d8 Make sure the date is passed on when running the cron job. 2019-07-02 06:11:06 +02:00
James Cole
5bbe1eab7c Expand test coverage and improve transaction management code. 2019-07-01 20:22:35 +02:00
James Cole
94acb50a6f Update meta files. 2019-07-01 20:21:54 +02:00
James Cole
6197c77303 Improve recurrences 2019-06-29 19:47:40 +02:00
James Cole
947b83cbd1 Improve test coverage. 2019-06-29 19:47:31 +02:00
James Cole
003d07504f Improve test coverage. 2019-06-29 08:14:28 +02:00
James Cole
cf904eb677 Big bunch of code to improve test coverage. 2019-06-25 19:24:01 +02:00
James Cole
6d68020cf4 Merge pull request #2318 from SanderKleykens/feature/ingbelgium
CSV file fix for ING Belgium
2019-06-24 08:07:28 +02:00
Sander Kleykens
9e9e5bd6dd CSV file fix for ING Belgium
Parse the description and opposing account information (IBAN and name) from ING Belgium CSV files.
2019-06-23 22:24:52 +02:00
James Cole
43d753e5bd Improve test coverage and efficiency for accounts and budgets. 2019-06-23 11:13:36 +02:00
James Cole
8f25562923 Refactor fiscal helper in tests. 2019-06-23 10:40:46 +02:00
James Cole
29158acfff New language string. 2019-06-23 10:39:59 +02:00
James Cole
c98d2187a0 Removed unused test file. 2019-06-23 10:38:54 +02:00
James Cole
b3349f1f9d New test suite 2019-06-23 05:53:10 +02:00
James Cole
9f50c5db3d Finalise account tests 2019-06-23 05:53:01 +02:00
James Cole
311659ba0d Move command around. 2019-06-23 05:52:33 +02:00
James Cole
956ec23d3c Remove unnecessary slash from in_array() 2019-06-22 13:09:25 +02:00
James Cole
940a730827 Fix reconciliation. 2019-06-22 13:09:11 +02:00
James Cole
2710a30a7c Warn about expensive code in test environment. 2019-06-22 10:25:57 +02:00
James Cole
0f70cc5780 Improve account CRUD and tests. 2019-06-22 10:25:34 +02:00
James Cole
150818e673 Do composer update for new commands. 2019-06-22 10:24:26 +02:00
James Cole
317fea6cb9 Remove unused collector. 2019-06-22 10:24:16 +02:00
James Cole
abf70a235a Debug the account-create controller. 2019-06-22 05:51:32 +02:00
James Cole
74a3d155b0 Rename some fields in account overviews. 2019-06-21 19:10:24 +02:00
James Cole
c72cc2482a New command in all lists. 2019-06-21 19:10:14 +02:00
James Cole
2d3d7f7720 Some generic code refactoring. 2019-06-21 19:10:02 +02:00
James Cole
fb1af395f9 New command and test 2019-06-21 19:07:11 +02:00
James Cole
f3123802a9 Composer update. 2019-06-21 19:06:56 +02:00
James Cole
b2628a290b make sure rules fire for events. 2019-06-21 19:06:50 +02:00
James Cole
47c2d0eaf1 Expand unit tests 2019-06-21 19:05:36 +02:00
James Cole
e80cde86d6 Remove dead code. 2019-06-21 19:05:28 +02:00
James Cole
72c0d7a874 Improve test coverage and quality 2019-06-16 13:16:46 +02:00
James Cole
1ce1a84c9e Sync some translations. 2019-06-16 13:16:26 +02:00
James Cole
3a34037f30 Sync some translations. 2019-06-16 13:16:18 +02:00
James Cole
bc33d1b67d Renamed various fields from their old camel casing to new ones. 2019-06-16 13:16:04 +02:00
James Cole
23d7abd55f Cleanup expected and unexpected bugs in the factories. 2019-06-16 13:15:32 +02:00
James Cole
4a1e56671b New PHPUnit config 2019-06-16 13:15:06 +02:00
James Cole
5d1cfc661f Optimise test code. 2019-06-13 18:07:49 +02:00
James Cole
162c8af6ca Update some meta files. 2019-06-13 18:07:38 +02:00
James Cole
b46f641b62 New funding doc for GitHub 2019-06-13 18:03:33 +02:00
James Cole
6964424bdc Finish command tests 2019-06-13 15:48:35 +02:00
James Cole
6bcb2ec144 Expand test coverage 2019-06-13 07:17:31 +02:00
James Cole
aacd218056 Improve test coverage. 2019-06-13 06:39:05 +02:00
James Cole
6fdfa722dd Remove having clause for #2306 2019-06-12 05:39:02 +02:00
James Cole
5f768a0525 Fix budget limit test, and a bug in the other currencies corrector. 2019-06-11 21:21:50 +02:00
James Cole
b632405a11 Fix for #2306 2019-06-11 21:04:17 +02:00
James Cole
9e2a2bca0a Remove references to old command + remove old command. 2019-06-11 20:10:59 +02:00
James Cole
6675749349 Split and simplify command. 2019-06-11 20:09:13 +02:00
James Cole
2ab9d2e6ee Improve test coverage. 2019-06-10 20:14:00 +02:00
James Cole
8efb73694d Full API coverage. 2019-06-09 15:28:54 +02:00
James Cole
d95544d588 Improve code coverage for rules. 2019-06-09 10:27:23 +02:00
James Cole
c02ab6f6d8 Fix route calls [skip ci] 2019-06-09 10:27:11 +02:00
James Cole
2b76b4a2b2 Re-implement transaction and transaction link tests. 2019-06-09 09:58:55 +02:00
James Cole
851c4d2907 Clean up code [skip ci] 2019-06-09 09:41:23 +02:00
James Cole
42bd5d05b5 Renaming methods must also be included in api.php 2019-06-09 09:40:21 +02:00
James Cole
9d0a5c97c2 Implement rule group and rule tests 2019-06-09 09:40:08 +02:00
James Cole
a1929b0521 Suppress PHPMD messages and make sure to use route() [skip ci] 2019-06-09 09:39:56 +02:00
James Cole
57cfd7e3bc Add separate request classes for rule groups and triggers. 2019-06-09 09:39:23 +02:00
James Cole
55345fa931 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2019-06-09 08:26:29 +02:00
James Cole
3c2dfc52bc API updates. 2019-06-09 08:26:23 +02:00
James Cole
73e32efd79 Merge pull request #2303 from JurajMlich/master
Correct ratesapi URL
2019-06-09 08:25:50 +02:00
Juraj Mlich
ced12ca83f Correct ratesapi URL 2019-06-08 16:04:37 +02:00
James Cole
85f9c256a1 Refactor some code for recurrences. 2019-06-08 06:19:21 +02:00
James Cole
7c2c24d330 Rename env variables. 2019-06-08 06:18:55 +02:00
James Cole
3681bf258b Composer update 2019-06-08 06:18:43 +02:00
James Cole
8b5551fc26 Replace \get_class with get_class 2019-06-07 18:20:15 +02:00
James Cole
779650f63d Deprecate the export function. 2019-06-07 18:19:24 +02:00
James Cole
9c5df6ab6e Clean up some code. 2019-06-07 18:13:54 +02:00
James Cole
fba3cb6d90 Remove unnecessary backslash 2019-06-07 17:58:11 +02:00
James Cole
e4a9abc315 Clean up repositories and cron code. 2019-06-07 17:57:46 +02:00
James Cole
a845cb9af9 Removed some todo's. 2019-06-05 19:38:28 +02:00
James Cole
9b7835c9ed Various API updates. 2019-06-04 20:42:11 +02:00
James Cole
6a6d67f2b4 Split group update now works. 2019-06-02 16:33:25 +02:00
James Cole
f46834e203 Remove some serious duplicates. 2019-06-02 06:39:54 +02:00
James Cole
2a2f29533d Some improvements, also edit screen. 2019-06-01 20:38:18 +02:00
James Cole
0a6e20eae4 Remove last references 2019-05-31 13:36:13 +02:00
James Cole
e15c35de64 Migrated all code to group collector. 2019-05-31 13:35:33 +02:00
James Cole
eb6329e556 Various code cleanup as suggested by PHPStorm. 2019-05-30 12:39:06 +02:00
James Cole
8b7e87ae57 Big refactor to remove the deprecated transaction collector. 2019-05-30 12:31:19 +02:00
James Cole
10a6ff9bf8 make sure reports work as expected. 2019-05-30 06:23:25 +02:00
James Cole
bdf48227bb Merge branch 'v480' into develop
# Conflicts:
#	public/v1/js/app.js
2019-05-29 22:03:43 +02:00
James Cole
ad32c30f82 Changes for the merge with 4.8.0. 2019-05-29 22:03:07 +02:00
James Cole
9e235ac5c8 Final fix before we merge back into develop and wreck havoc on everybody. 2019-05-29 22:02:15 +02:00
James Cole
bff156aad4 Add copyright things. 2019-05-29 21:56:39 +02:00
James Cole
7e2159d12c Removed a lot of references to the old collector. 2019-05-29 21:52:08 +02:00
James Cole
280b2efee6 New translations 2019-05-29 18:30:52 +02:00
James Cole
d13317095f Replace transaction collector. 2019-05-29 18:28:28 +02:00
James Cole
627ef09f11 Can store and submit transactions. 2019-05-25 10:04:56 +02:00
James Cole
3ec7336d5c Add some stuff for edge cases. 2019-05-25 09:17:46 +02:00
James Cole
47e0f6ed89 Bug catching in form. 2019-05-24 05:47:26 +02:00
James Cole
8f1928c933 Error reporting in new form. 2019-05-24 05:29:04 +02:00
James Cole
695244c928 Bug fix in budget search 2019-05-24 05:28:41 +02:00
James Cole
6e9128d894 Catch errors, prep to render them. 2019-05-17 06:52:16 +02:00
James Cole
9a53f17fff Fix for #2270 2019-05-16 19:37:32 +02:00
James Cole
91183a91b6 Will make submit form possible. 2019-05-12 19:21:14 +02:00
James Cole
7aef52870f Make sure all custom fields are included in form. 2019-05-12 13:46:20 +02:00
James Cole
5d09d7e923 Add custom component for date. 2019-05-12 07:40:24 +02:00
James Cole
fd28589395 Fix model and add debug info. 2019-05-11 05:32:09 +02:00
James Cole
c0029af929 Update composer lock file. 2019-05-09 20:05:52 +02:00
James Cole
43a17d8676 Lots of new code and first submission thing. 2019-05-08 19:57:07 +02:00
James Cole
4c8f26f25e Remove encryption parameter 2019-05-05 16:16:03 +02:00
James Cole
9015a5e0c1 Updated lock files. 2019-05-05 08:09:43 +02:00
James Cole
8676764513 Remove various sort routines. 2019-05-04 20:58:43 +02:00
James Cole
d5c5fa4fad Lots of new code for new transaction screen. 2019-05-04 20:58:11 +02:00
James Cole
912fe99981 New code for overview. Temp submit. 2019-04-19 07:00:19 +02:00
James Cole
4d3af1dcde Basic list, no functionalities. 2019-04-18 20:05:40 +02:00
James Cole
66c55b7bbe Improve tests, models and views. 2019-04-16 16:20:46 +02:00
James Cole
5ac39dbdef Clean up tests, test only the important things. 2019-04-12 04:53:18 +02:00
James Cole
6f063a134f Reset some code. 2019-04-11 06:06:25 +02:00
James Cole
966186cccd Disable all tests that may need some work in 4.8.0 2019-04-10 19:03:33 +02:00
James Cole
784d990e20 Remove slash from method call. 2019-04-09 20:05:20 +02:00
James Cole
80896b7181 Some code optimisations. 2019-04-09 15:42:25 +02:00
James Cole
97726c3822 Disable all kinds of tests until upgrades are complete. 2019-04-09 15:32:48 +02:00
James Cole
63070bffc3 Merge branch 'develop' into v480
* develop:
  Fix #2204
  CSV file fix for Belfius
2019-04-09 07:51:11 +02:00
James Cole
b3e48ede70 Fix #2204 2019-04-08 20:40:12 +02:00
James Cole
13afd4582f First attempt at displaying a group. 2019-04-08 20:31:31 +02:00
James Cole
4eb8b1a7da Merge pull request #2209 from SanderKleykens/feature/belfius
CSV file fix for Belfius
2019-04-08 11:39:39 +02:00
Sander Kleykens
251e9f9ba1 CSV file fix for Belfius
Correct the description for outgoing recurring transactions in Belfius CSV files
2019-04-06 20:47:35 +02:00
James Cole
c7bf167f81 New stale config. 2019-04-06 11:50:16 +02:00
James Cole
c07ca12574 Merge branch 'develop' into v480
* develop:
  docs: Fix minor typo
  docs: Fix minor typo
  Experimental Ranger config.
2019-04-06 11:09:58 +02:00
James Cole
bc735e3a59 Update scripts. 2019-04-06 11:09:14 +02:00
James Cole
47fdf4b1a2 Validate account info 2019-04-06 11:08:46 +02:00
James Cole
c519b4d0df Is now capable of updating transactions over the API. 2019-04-06 08:10:50 +02:00
James Cole
846fb57520 Merge pull request #2206 from eddybrando/patch-1
docs: Fix minor typo
2019-03-31 15:16:17 +02:00
Eddybrando Vásquez
88001f4bc4 docs: Fix minor typo
Use proper verb tense
2019-03-31 14:46:18 +02:00
James Cole
b692cccdfb User can submit new journal through API. 2019-03-31 13:36:49 +02:00
James Cole
50a071119b Merge pull request #2205 from eddybrando/patch-1
docs: Fix minor typo
2019-03-30 21:54:24 +01:00
Eddybrando Vásquez
66d275a90d docs: Fix minor typo
Replace "you're" with "your".
2019-03-30 21:46:07 +01:00
James Cole
c07ef3658b Refactor installer. 2019-03-30 11:03:39 +01:00
James Cole
636eeffaed Experimental Ranger config. 2019-03-30 07:39:16 +01:00
James Cole
5b1fb5354e Update API and transaction components. 2019-03-30 07:09:52 +01:00
James Cole
484ed6a585 Introduce group collector to API 2019-03-25 15:14:09 +01:00
James Cole
11e537810a Merge branch 'develop' into v480
* develop:
  Update Docker files slightly (yes I am a nitpicker).
  - Fixed copying Dockerfile.amd64 to Dockerfile.arm in the 2nd last commit
  entrypoint.sh: Wait for DB to start up
  Misc Optimizations: Changes on Dockerfile*

# Conflicts:
#	.deploy/docker/entrypoint.sh
2019-03-24 14:56:08 +01:00
James Cole
cc67445f35 Update Docker files slightly (yes I am a nitpicker). 2019-03-24 14:54:46 +01:00
James Cole
c4ceb9d2cd Merge pull request #2192 from hulloanson/docker-wait-db
Docker's entrypoint.sh: wait for DB before running DB-dependent artisan commands
2019-03-24 14:53:10 +01:00
James Cole
bc43ea2c25 Update version etc. 2019-03-24 14:52:45 +01:00
James Cole
c946a4040f First working version of the group collector. 2019-03-24 14:48:12 +01:00
hulloanson
f5c415f079 - Fixed copying Dockerfile.amd64 to Dockerfile.arm in the 2nd last commit 2019-03-24 18:21:04 +08:00
hulloanson
638f361479 entrypoint.sh: Wait for DB to start up
- Added wait-for-it.sh

- use wait-for-it.sh to wait for pgsql / mysql DB before running
`artisan` commands
2019-03-24 18:00:25 +08:00
hulloanson
ff23898c83 Misc Optimizations: Changes on Dockerfile*
- Moved lenghty docker-php-ext-install before adding contents of
FIREFLY_PATH to reduce build time after minor changes in FIREFLY_PATH
2019-03-24 17:59:17 +08:00
James Cole
d94b23b15d Build a new collector and first view online. 2019-03-24 09:23:36 +01:00
James Cole
fb304de75e Final commands. 2019-03-24 09:23:10 +01:00
James Cole
5f76b563dc Update composer stuff. 2019-03-24 09:23:00 +01:00
James Cole
ce30375341 Refactor upgrade and verify commands. 2019-03-23 18:58:06 +01:00
James Cole
1b0be2a47e Refactor upgrade and verify commands. 2019-03-23 08:10:59 +01:00
James Cole
a89be86ca4 Merge branch 'develop' into v480
* develop:
  Update config for Romanian.
  German string
  Romanian strings.
  Fix #2166
2019-03-22 18:29:52 +01:00
James Cole
f84655e339 Update config for Romanian. 2019-03-22 18:29:34 +01:00
James Cole
a0cead6548 German string 2019-03-22 18:27:05 +01:00
James Cole
4dbc5f1413 Romanian strings. 2019-03-22 18:26:46 +01:00
James Cole
943620c035 Fix #2166 2019-03-22 06:56:01 +01:00
James Cole
a1268ffd39 Command updates. 2019-03-20 18:47:51 +01:00
James Cole
fcd98b4d33 Revamp upgrade commands. 2019-03-20 18:31:00 +01:00
James Cole
e411d7a825 Improve upgrade command structure. 2019-03-18 16:53:05 +01:00
James Cole
3545d894fd Improve factories and tests. 2019-03-18 16:52:49 +01:00
James Cole
200a4b18a8 First full implementation of new storage routine. 2019-03-17 17:05:16 +01:00
James Cole
6bd2b4f288 Merge branch 'develop' into v480
* develop: (21 commits)
  Update lock file
  Update change logs and config files.
  Enable norsk, update version of DB
  Various language string updates.
  Norwegian strings.
  Improve installer middleware for Sandstorm.
  Fix some issues with importer #2166
  Other delete thing.
  More debug things.
  Extra debug info for #2159 and some kernel changes.
  Extra debug info for #2159
  Fix #2173
  Rename class and add copyright statement @wrouesnel #2167
  Fix LDAP auth configuration paths.
  Fix some cache issues and a version bump.
  Updated file list.
  Updated list.
  New file list.
  Update composer file.
  Small fix in changelog.
  ...
2019-03-17 12:34:36 +01:00
James Cole
c4d57af936 Merge tag '4.7.17' into develop
4.7.17
2019-03-17 09:40:14 +01:00
James Cole
76aa8acf0f Merge branch 'release/4.7.17' 2019-03-17 09:40:13 +01:00
James Cole
220add3eda Update lock file 2019-03-17 09:17:55 +01:00
James Cole
541280ee91 Update change logs and config files. 2019-03-17 09:17:07 +01:00
James Cole
01219c951c Enable norsk, update version of DB 2019-03-17 09:14:52 +01:00
James Cole
69fa60cd21 Various language string updates. 2019-03-17 09:14:33 +01:00
James Cole
a11d2df6bb Norwegian strings. 2019-03-17 09:13:23 +01:00
James Cole
07d39a23a8 Improve installer middleware for Sandstorm. 2019-03-17 09:06:45 +01:00
James Cole
ca67d98676 Fix some issues with importer #2166 2019-03-17 08:18:42 +01:00
James Cole
7b60d210ee Other delete thing. 2019-03-17 07:31:12 +01:00
James Cole
78d955ebf6 More debug things. 2019-03-17 07:20:11 +01:00
James Cole
f6f21e02ac Extra debug info for #2159 and some kernel changes. 2019-03-16 21:54:25 +01:00
James Cole
e2ebd01719 Extra debug info for #2159 2019-03-16 20:07:26 +01:00
James Cole
b8ac7c9d89 Fix #2173 2019-03-16 19:39:39 +01:00
James Cole
037d9b7017 Rename class and add copyright statement @wrouesnel #2167 2019-03-16 19:02:13 +01:00
James Cole
6462d2b87a Merge pull request #2167 from wrouesnel/bugfix/ldapauth
Fix LDAP auth configuration paths.
2019-03-16 18:58:21 +01:00
Will Rouesnel
cb4ff35adb Fix LDAP auth configuration paths.
This commit fixes parameters broken in the latest version of `adldap2`.

Specifically:

* `adldap` auth parameters have changed in the latest version.
  * "usernames" has become `identities` and `discover` has changed to
    `discover_users_by`, `auth` has changed to `bind_users_by`
* Add the missing objectguid field to the users table for adldap2.
  * This is added as a nullable (optional) field at the moment to support
    tracking LDAP users as adldap2 wants to.
2019-03-12 09:12:54 +11:00
James Cole
d063f32c1c Fix some cache issues and a version bump. 2019-03-08 17:57:42 +01:00
James Cole
244d8eecab Updated file list. 2019-03-08 07:09:45 +01:00
James Cole
b66f6d7e2e Updated list. 2019-03-08 07:07:43 +01:00
James Cole
aa3a88f537 New file list. 2019-03-08 06:48:04 +01:00
James Cole
e5476e6e7a Merge tag '4.7.16' into develop
4.7.16
2019-03-08 06:22:05 +01:00
James Cole
4d976312e8 Merge branch 'release/4.7.16' 2019-03-08 06:22:04 +01:00
James Cole
2ef5d3d4c6 Update composer file. 2019-03-08 06:11:22 +01:00
James Cole
eb3a89555d Small fix in changelog. 2019-03-08 06:11:13 +01:00
James Cole
0a80b7fca7 New translations. 2019-03-08 06:11:05 +01:00
James Cole
431cf08401 Various improvements. 2019-03-08 05:47:51 +01:00
James Cole
e6d7c0ddbd Merge branch 'develop' into v480
* develop:
  Fix test for PHPUnit8
  Update version and changelog.
  Fix issue with bill display
  Update language strings.
2019-03-06 13:43:11 +01:00
James Cole
f682981c1e Fix test for PHPUnit8 2019-03-05 20:11:37 +01:00
James Cole
4aac969ae4 Update version and changelog. 2019-03-05 17:52:44 +01:00
James Cole
00651adf5e Fix issue with bill display 2019-03-05 17:52:34 +01:00
James Cole
ed94e71168 Update language strings. 2019-03-05 17:52:26 +01:00
James Cole
e4fb223f77 Code for 4.8.0 2019-03-05 17:26:49 +01:00
James Cole
6e12f434ad Fix issue #2144 2019-03-05 16:55:03 +01:00
James Cole
b8c4ec1449 Add old string under new key. 2019-03-03 08:17:19 +01:00
James Cole
4ca60ca92a Code for upgrade of various libraries. 2019-03-02 21:18:26 +01:00
James Cole
48219c9af3 Update libraries. 2019-03-02 20:14:45 +01:00
James Cole
9887b9809d Merge branch 'master' into develop
* master:
  Bump version for travis build.
2019-03-02 17:36:44 +01:00
James Cole
a13ad5b417 Bump version for travis build. 2019-03-02 17:36:08 +01:00
James Cole
3f28fd689f Merge tag '4.7.15' into develop
4.7.15
2019-03-02 17:17:22 +01:00
James Cole
959025545e Merge branch 'release/4.7.15' 2019-03-02 17:17:21 +01:00
James Cole
1978463e59 Update language strings for new release. 2019-03-02 15:55:26 +01:00
James Cole
e85ac07c49 Update meta files for new release. 2019-03-02 15:55:01 +01:00
James Cole
b7f0a6fff4 Update migrations so you can always roll back. 2019-03-02 15:54:24 +01:00
James Cole
3a57e09447 Fix for #2128 2019-03-02 14:33:46 +01:00
James Cole
87d5cabe52 Search improvements. 2019-03-02 14:12:09 +01:00
James Cole
af07522f16 Fix for #2135 2019-03-02 10:42:43 +01:00
James Cole
1b8d4e4c63 Make sure bills show attachment notes 2019-03-02 09:18:41 +01:00
James Cole
9f3c114d57 Add JSON decrypt for #2125 2019-03-02 09:18:26 +01:00
James Cole
c51c1b8098 Some basic date tests 2019-03-02 08:05:15 +01:00
James Cole
143fe2a71f Fix #2125 2019-03-01 17:56:52 +01:00
James Cole
3379b723cf Last attempt I hope for #2125 2019-02-28 19:56:41 +01:00
James Cole
39321b320e Improve search speed. 2019-02-27 19:08:09 +01:00
James Cole
fe738fd321 Another fix for #2125 2019-02-27 18:55:56 +01:00
James Cole
95720673d2 Merge pull request #2130 from lastlink/patch-1
add missing rollback for 477 migration
2019-02-26 18:33:20 +01:00
lastlink
963be4a4fa add missing rollback for 477 migration 2019-02-26 00:16:05 -05:00
James Cole
61db419485 Fixes #2125 2019-02-25 20:57:29 +01:00
James Cole
cb17b09b24 Merge pull request #2120 from lastlink/fix/pwaApple
missing meta tag for ios
2019-02-25 07:23:50 +01:00
Mr. Funk
0f1236a597 missing meta tag for ios 2019-02-24 15:12:58 -05:00
James Cole
ac26427a63 Merge branch 'master' into develop
* master:
  Don't change ARM PHP settings.
2019-02-24 10:56:28 +01:00
James Cole
491903778a Don't change ARM PHP settings. 2019-02-24 10:56:08 +01:00
James Cole
405c3e110a Merge tag '4.7.14' into develop
4.7.14
2019-02-24 07:28:00 +01:00
James Cole
5464bfac19 Merge branch 'release/4.7.14' 2019-02-24 07:28:00 +01:00
James Cole
ad31cc1c1f Fixes #2119 and bump version. 2019-02-24 07:27:24 +01:00
James Cole
3aa79fb1e4 Merge tag '4.7.13' into develop
4.7.13
2019-02-23 21:27:05 +01:00
James Cole
e3de03e50d Merge branch 'release/4.7.13' 2019-02-23 21:27:04 +01:00
James Cole
d8b4af34e0 Update files for release 4.7.13 2019-02-23 14:32:24 +01:00
James Cole
222d8e071a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
* 'develop' of github.com:firefly-iii/firefly-iii:
  New check for journals with 0.00 amount.
2019-02-23 12:36:17 +01:00
James Cole
36c2f27d59 New check for journals with 0.00 amount. 2019-02-23 07:47:41 +01:00
James Cole
5d43faab96 Refactor script locations to clear up root directory. 2019-02-20 07:04:24 +01:00
James Cole
07048cb5fb Fix #2100 2019-02-19 20:19:30 +01:00
James Cole
38c79c3dc4 Upgrade fix for Softaculous. 2019-02-19 19:59:02 +01:00
James Cole
7610d9e0db Update Dockerfiles to increase PHP execution time. 2019-02-19 07:10:13 +01:00
James Cole
e4f3d0a0ea Some new strings. 2019-02-18 19:47:48 +01:00
James Cole
fdf147d9c6 Merge branch 'hotfix/4.7.12.1' 2019-02-16 23:01:29 +01:00
James Cole
f7e418f517 Merge tag '4.7.12.1' into develop
4.7.12.1
2019-02-16 23:01:29 +01:00
James Cole
738f6ed232 Fix #2093 2019-02-16 23:01:14 +01:00
James Cole
12217d9850 Merge tag '4.7.12' into develop
4.7.12
2019-02-16 19:35:01 +01:00
James Cole
87c8b3d7c6 Merge branch 'release/4.7.12' 2019-02-16 19:35:00 +01:00
James Cole
fd571abbb0 Slight change in build script. 2019-02-16 19:33:33 +01:00
James Cole
64ae56757e Updated meta files. 2019-02-16 19:22:16 +01:00
James Cole
7d75f00696 New translations. 2019-02-16 19:22:05 +01:00
James Cole
451c86e431 Final touches for #2085 2019-02-16 19:04:36 +01:00
James Cole
c8c71da903 Extra debug log. #2061 2019-02-16 14:27:54 +01:00
James Cole
423f3a9296 Fix build script. 2019-02-16 14:02:04 +01:00
James Cole
7658b7d9a6 Apply fix for #2070 2019-02-16 11:45:08 +01:00
James Cole
0d0906c5e2 Fix for #2070 2019-02-16 11:43:05 +01:00
James Cole
e0aa7f3ff5 Various code cleanup. 2019-02-16 08:05:48 +01:00
James Cole
59fdf5b77a Updates to the login procedure [skip ci] 2019-02-16 07:20:25 +01:00
James Cole
e28cfade8d Push and build stuff. 2019-02-15 17:15:42 +01:00
James Cole
19710c3eab Update LDAP config for #2085 2019-02-15 07:39:12 +01:00
James Cole
0782354160 Updated LDAP code #2085 2019-02-15 07:22:51 +01:00
James Cole
22bc6d507e Fix issue with upgrade. 2019-02-13 17:54:46 +01:00
James Cole
bf3c74e65f Add required PHP extensions to composer.json. 2019-02-13 17:54:36 +01:00
James Cole
71fb9d8fa5 Code cleaning stuff. 2019-02-13 17:38:41 +01:00
James Cole
9a461fc7b7 Fix for #2082 2019-02-13 17:34:03 +01:00
James Cole
e0d87aa11e First part of a large code cleanup commit. 2019-02-12 21:49:28 +01:00
James Cole
b273af341c Update version. 2019-02-12 21:01:19 +01:00
James Cole
2117fc2a5a Add thing to apply rules to fints #2081 2019-02-12 21:01:12 +01:00
James Cole
58e55dc789 Document things better. 2019-02-12 21:00:53 +01:00
James Cole
ac9b8b8c30 Build and push. 2019-02-12 17:33:34 +01:00
James Cole
4dcc66238e Make directory as well. 2019-02-12 17:31:30 +01:00
James Cole
90c0aa6360 Add touch command. 2019-02-12 17:29:45 +01:00
James Cole
1594335487 Experiment with manifest code. 2019-02-12 17:27:56 +01:00
James Cole
2517674849 Expand experimental things. 2019-02-12 17:21:52 +01:00
James Cole
c00bc2a1f3 Update build script. 2019-02-11 19:01:14 +01:00
James Cole
f999be81c2 Fix upgrade problem in Softaculous. 2019-02-11 17:22:46 +01:00
James Cole
e2530c5486 Refresh journal after a rule is applied, #2070 2019-02-11 17:09:52 +01:00
James Cole
7526f13ca9 Update build script. 2019-02-11 17:07:34 +01:00
James Cole
ed08d299de Fix for #2017 2019-02-11 17:07:07 +01:00
James Cole
b6ea2f1c64 Updated file list for sandstorm 2019-02-10 15:22:18 +01:00
James Cole
9ee14374bb Updated sandstorm file list. 2019-02-10 15:14:52 +01:00
James Cole
925401682b Merge tag '4.7.11' into develop
4.7.11
2019-02-10 14:53:58 +01:00
James Cole
53c71bb7a2 Merge branch 'release/4.7.11' 2019-02-10 14:53:57 +01:00
James Cole
3c036ae021 Fix issue with time stamps. 2019-02-10 14:53:24 +01:00
James Cole
bf89d9956d Update language strings. 2019-02-10 14:33:15 +01:00
James Cole
71104f375c Fix tests 2019-02-10 14:33:03 +01:00
James Cole
4c94820cf4 Update meta files. 2019-02-10 14:32:34 +01:00
James Cole
8998c9a672 Extra code for #1975 2019-02-10 10:54:30 +01:00
James Cole
ccf60f4cdc Back to classic build. 2019-02-10 08:07:25 +01:00
James Cole
c5af1d363c Add audit trail messages to several controllers. 2019-02-10 08:03:09 +01:00
James Cole
c6e3b54705 Make update code slightly more robust. 2019-02-10 07:59:11 +01:00
James Cole
4f274a290e Generic debug info. 2019-02-09 20:44:31 +01:00
James Cole
1774bcbabe Add copyright statements and newlines. 2019-02-09 10:36:59 +01:00
James Cole
492c11784b Update with manifest commands. 2019-02-09 06:40:55 +01:00
James Cole
21ddbd220a Include lib for arm 2019-02-08 17:40:29 +01:00
James Cole
e4a95e55ed Remove copy argument. 2019-02-08 17:34:46 +01:00
James Cole
3a0eb5a428 Do actual build 2019-02-08 17:31:32 +01:00
James Cole
e55fd968cf Rename file 2019-02-08 17:31:25 +01:00
James Cole
d41be08b48 Rename file 2019-02-08 17:30:42 +01:00
James Cole
a18272513d Fix YML 2019-02-08 17:28:04 +01:00
James Cole
e88061199c Trigger a new build. 2019-02-08 17:17:19 +01:00
James Cole
d0d7c437f2 Different build flow. 2019-02-08 17:15:54 +01:00
James Cole
a1ac1a4a29 Remove empty header from changelog [skip ci] 2019-02-08 17:01:49 +01:00
James Cole
41d22876c4 Update changelog and version. 2019-02-08 17:00:46 +01:00
James Cole
e1bb0298cb Fix category use date. 2019-02-08 16:56:07 +01:00
James Cole
1ec2772255 Fix #2052 2019-02-08 16:51:29 +01:00
James Cole
40d77d82cd Bunq import can now handle timestamps. 2019-02-08 16:45:42 +01:00
James Cole
311d51464d Add support for #2006 2019-02-08 07:14:45 +01:00
James Cole
d63c9c9aea Add audit logging. 2019-02-08 07:13:59 +01:00
James Cole
f1e83f240e Build with a new distribution. 2019-02-08 03:21:34 +01:00
James Cole
b0f847959f Merge pull request #2058 from skuzzle/develop
Remove console.log statement
2019-02-05 15:22:12 +01:00
Simon Taddiken
d3d4439b03 Remove console.log statement 2019-02-05 15:02:36 +01:00
James Cole
0e1da3f797 Fix webbased upgrade routine. 2019-02-04 20:35:46 +01:00
James Cole
def95df49e Fix link in changelog [skip ci] 2019-02-03 20:20:24 +01:00
James Cole
73c8c6de37 Disable manifest push [skip ci] 2019-02-03 20:19:59 +01:00
James Cole
25b2b43a38 Fix for #2049 2019-02-03 18:25:58 +01:00
James Cole
1fc2c998de Merge pull request #2048 from nescafe2002/patch-1
Fix delete-account confirmation
2019-02-03 14:52:40 +01:00
Joris
b7a577cc4c Fix delete-account confirmation 2019-02-03 14:44:32 +01:00
James Cole
2cdedd9c29 Merge tag '4.7.10' into develop
4.7.10
2019-02-03 10:10:41 +01:00
James Cole
cf47daa2a0 Merge branch 'release/4.7.10' 2019-02-03 10:10:39 +01:00
James Cole
926e2db1d6 Update meta files for new release. 2019-02-03 10:09:04 +01:00
James Cole
d092034ec5 Updated translations [skip ci] 2019-02-03 09:21:37 +01:00
James Cole
d13b9a0cc3 Mention amd specifically. 2019-02-03 09:05:40 +01:00
James Cole
bbbaf6c868 Small textual changes [skip ci] 2019-02-03 07:51:34 +01:00
James Cole
833add99a0 Reverse build order, add manifest creation. 2019-02-03 07:00:50 +01:00
James Cole
b54e7f0d46 Remove platform argument. 2019-02-03 06:33:18 +01:00
James Cole
a90981481f Edit in build command. 2019-02-02 19:26:02 +01:00
James Cole
edff3d7fb0 Remove target platform reference 2019-02-02 19:24:53 +01:00
James Cole
88d65b4784 Switch args around. 2019-02-02 19:22:03 +01:00
James Cole
6db869de23 Get docker version 2019-02-02 19:16:19 +01:00
James Cole
c645cb18e5 Check experimental flag. 2019-02-02 19:13:10 +01:00
James Cole
298132298b Enable experimental things. 2019-02-02 19:10:46 +01:00
James Cole
400b50a1f0 Enable experimental features. 2019-02-02 19:05:11 +01:00
James Cole
5b597e9b1f Set the platform to ARM. 2019-02-02 18:58:49 +01:00
James Cole
e55de9c1d5 No manifest commands. 2019-02-02 18:07:03 +01:00
James Cole
33ccf7c707 Improve build scripts. 2019-02-02 17:59:18 +01:00
James Cole
6b94210de5 Include adm64 build and manifest stuff. 2019-02-02 17:20:15 +01:00
James Cole
745624f044 Make script executable. 2019-02-02 17:10:47 +01:00
James Cole
68956eabf2 Refer to ARM script. 2019-02-02 17:08:46 +01:00
James Cole
87591f6868 Also expand dockerfile. 2019-02-02 16:10:55 +01:00
James Cole
cc238a639e Expand some commands. 2019-02-02 16:08:15 +01:00
James Cole
de6758a972 Update docker file and entrypoint. 2019-02-02 15:56:36 +01:00
James Cole
49647eedae Fix command again. 2019-02-02 15:49:06 +01:00
James Cole
f24e35236f Fix command. 2019-02-02 15:46:37 +01:00
James Cole
6f200a423e Correct command. 2019-02-02 15:33:33 +01:00
James Cole
ef57c0601a Let's see what happens when we build using another base. 2019-02-02 15:30:23 +01:00
James Cole
9632e99bd3 Fix #2043 2019-02-02 14:33:24 +01:00
James Cole
93e18ea195 Remove unused values from charts. 2019-02-02 12:34:58 +01:00
James Cole
f39676eedd Fix for #2041 2019-02-02 12:28:37 +01:00
James Cole
1d73ff7c13 Fix test coverage. [skip ci] 2019-02-02 09:53:19 +01:00
James Cole
384e64d94d Update docs [skip ci] 2019-02-02 07:04:08 +01:00
James Cole
96bb880d1b #2034 2019-02-02 07:00:09 +01:00
James Cole
cf307a00e1 Code for #2037 2019-02-02 06:10:52 +01:00
James Cole
5a97bcb123 Update docker decrypt location. 2019-01-31 21:00:41 +01:00
James Cole
50f7620d7a See what happens when we try ARM. 2019-01-31 20:40:03 +01:00
James Cole
78ec3ebe59 Remove test routine, push image to test repository. 2019-01-31 20:23:09 +01:00
James Cole
96f0faa546 Change Travis build. 2019-01-31 20:09:30 +01:00
James Cole
4307bf3b83 Remove Firefly III's ability to encrypt data in the database. 2019-01-31 19:56:09 +01:00
James Cole
d56bd85328 New changelog. [skip ci] 2019-01-28 20:26:37 +01:00
James Cole
9f2f258ad9 Added new language, Chinese Traditional. 2019-01-28 20:10:52 +01:00
James Cole
894b48df8e Introduce new model for future remodeling of split transactions. 2019-01-28 20:00:40 +01:00
James Cole
195fba5931 New translations. 2019-01-28 19:37:15 +01:00
James Cole
0556516524 Summarise import options. 2019-01-28 19:36:30 +01:00
James Cole
5cad4e9d82 Fix #1989 2019-01-28 19:36:17 +01:00
James Cole
8607fd4997 Fix #2033 2019-01-28 18:21:22 +01:00
James Cole
d905849b71 Experimental fix for #2031 2019-01-27 21:23:18 +01:00
James Cole
968505ac0e Route can be null. 2019-01-27 18:24:11 +01:00
James Cole
e482b079df Cleanup help file. 2019-01-27 18:23:47 +01:00
James Cole
13cddd8f12 Fix bill test 2019-01-27 18:11:10 +01:00
James Cole
20b458f35d Ignore form action when doing oAuth2. 2019-01-27 17:15:40 +01:00
James Cole
cec8210d8b Fix #2009 2019-01-27 17:09:39 +01:00
James Cole
e6ff895eff Fix #2001 2019-01-27 17:02:45 +01:00
James Cole
74ff17da7e Fix #1990 2019-01-27 16:43:43 +01:00
James Cole
7e1d430003 Fix #1967 2019-01-27 16:42:28 +01:00
James Cole
eeff2895aa Fix #1923 2019-01-27 16:36:08 +01:00
James Cole
f6d88521dd Fix test coverage. 2019-01-27 12:30:52 +01:00
James Cole
c3e6e4f034 Simplify budget repository 2019-01-27 11:05:22 +01:00
James Cole
6c09330e74 Simplify recurring repository. 2019-01-27 11:00:28 +01:00
James Cole
b100c02779 Expand income and expense info without a category. 2019-01-27 10:51:34 +01:00
James Cole
ef6f00fcf5 Make sure "no category" is added to API as well. 2019-01-27 10:51:14 +01:00
James Cole
ad9405887a Remove cash again. 2019-01-27 10:51:00 +01:00
James Cole
01e45de605 Include cash accounts in income and expense charts. 2019-01-27 07:57:10 +01:00
James Cole
aebefe8bcf Fix currency mapper test 2019-01-27 07:48:57 +01:00
James Cole
5e41641d7c Simplify account transformer 2019-01-27 07:48:49 +01:00
James Cole
0f3b3a07d1 Remove debug code. 2019-01-27 07:48:37 +01:00
James Cole
156d2fbaa4 Simplify autocomplete controller 2019-01-27 07:48:29 +01:00
James Cole
4866b9dabb Fix old category chart 2019-01-27 07:48:17 +01:00
James Cole
62ce9660b4 Simplify rule group controller 2019-01-27 07:47:37 +01:00
James Cole
873c2ce10d New routes for new API endpoints. 2019-01-26 20:19:06 +01:00
James Cole
2c2410e710 Category overview chart in API and support methods. 2019-01-26 20:18:42 +01:00
James Cole
624eb0f958 Add new revenue and expense overview chart endpoint to API 2019-01-26 20:10:48 +01:00
James Cole
770e44d1bd Add new tag-cloud API endpoint. 2019-01-26 20:10:35 +01:00
James Cole
7144798377 Add new chart API endpoints. 2019-01-26 12:11:45 +01:00
James Cole
606ff3ed00 Fix problem with rule trigger tester. 2019-01-26 12:11:37 +01:00
James Cole
ca731adce7 Add account name to piggy bank transformer API. 2019-01-26 12:11:23 +01:00
James Cole
ca71f3008c Fix a bug where the importer was unable to create new currencies. 2019-01-26 12:11:10 +01:00
James Cole
7c56c14fa0 Add fallback for empty front page account preferences thing. 2019-01-26 12:10:53 +01:00
James Cole
e3433aa95b Add pie chart for available budget API 2019-01-26 12:10:35 +01:00
James Cole
0df00556db Make sure chart end point returns machine readable dates. 2019-01-26 12:10:21 +01:00
James Cole
a55dd97d51 Add ability to return single preference to the API 2019-01-26 12:10:02 +01:00
James Cole
b52959d41a Add limit parameter to capabilities of API 2019-01-26 12:09:46 +01:00
James Cole
163b0a2105 Add limit parameter to /budgets/x/transactions API endpoint. 2019-01-26 12:09:32 +01:00
James Cole
d33c89a8ee Add start and end data to the available_budget list endpoint API 2019-01-26 12:09:16 +01:00
James Cole
d0d73c5e3e Add limit parameter to account/x/transactions API end point. 2019-01-26 12:08:41 +01:00
James Cole
799331b945 New API endpoints. 2019-01-18 05:38:23 +01:00
James Cole
43073fa1fc Translation updates. 2019-01-12 10:32:59 +01:00
James Cole
7f91ff4b0c Fix #1996 2019-01-11 16:57:40 +01:00
James Cole
ba778d4c60 Update some issue templates. 2019-01-08 17:05:42 +01:00
James Cole
cddb3d82dd Expand changelog. 2019-01-07 18:23:04 +01:00
James Cole
a221f02393 Fix #1983 2019-01-07 18:19:48 +01:00
James Cole
fa4959fc6a Fix #1979 2019-01-07 18:07:59 +01:00
James Cole
bbd68e78c1 Fix #1975 2019-01-07 18:05:43 +01:00
James Cole
3c20938e0f Merge pull request #1977 from BastiaanN/docker-cache
Added memcached support and zend opcache
2019-01-07 15:35:28 +01:00
Bastiaan Nijkamp
94745cb3d5 Added memcached support and zend opcache 2019-01-07 12:14:10 +01:00
James Cole
602b328914 Add tokenizer to composer.lock [skip ci] 2019-01-06 16:55:06 +01:00
James Cole
27802c930f Remove trial code, restore repository. Should not have committed this. Oh well. Let's continue this in a branch like I'm supposed to. 2019-01-06 16:23:37 +01:00
James Cole
3b4622a9ac Add API config. 2019-01-06 16:01:01 +01:00
James Cole
18fb2e91b1 Remove not working command. 2019-01-06 16:00:36 +01:00
James Cole
214cd9c262 Require tokenizer. 2019-01-06 16:00:23 +01:00
James Cole
337c289a74 This combination of JS things works. 2019-01-06 13:37:25 +01:00
James Cole
0d560ec442 Fix for #1968 2019-01-04 17:10:16 +01:00
James Cole
a4d4bf3006 Remove not working parameters, add more debug 2019-01-04 17:03:34 +01:00
James Cole
40028c8be7 These are all the files from the Tabler react repos, made to work with laravel and webpack. 2019-01-04 17:03:16 +01:00
James Cole
961e7e92b3 Some new files for JS rendering of new layout. 2019-01-04 16:37:24 +01:00
James Cole
d3576c4151 Update composer file. 2019-01-04 16:15:13 +01:00
James Cole
1d51a0f396 Update some v2 views. 2019-01-03 19:02:47 +01:00
James Cole
f62b7e4ae9 Update test component. 2019-01-03 19:02:31 +01:00
James Cole
62135bc1cb Updated changelog. 2019-01-03 19:02:18 +01:00
James Cole
b245facdfe Small fixes. 2019-01-03 19:01:32 +01:00
James Cole
577f024310 Make code default for React things. 2019-01-03 19:01:15 +01:00
James Cole
1c2206cb9f Fix issue with recurring transactions and piggy banks. 2019-01-03 18:57:34 +01:00
James Cole
16ba65c424 Merge pull request #1963 from BoGnY/fix/csp-directive
Fixed missing CSP directive and value
2019-01-03 16:13:33 +01:00
Luca Bognolo
59cfaa20ab Fixed wrong CSP value
Signed-off-by: Luca Bognolo <git@bogny.eu>
2019-01-03 16:04:48 +01:00
Luca Bognolo
ab0471c78e Fixed missing CSP directive and value
Signed-off-by: Luca Bognolo <git@bogny.eu>
2019-01-03 00:21:21 +01:00
James Cole
464642250b Fix #1955. 2019-01-01 19:32:37 +01:00
James Cole
d7bf9e234c Fix test coverage. 2019-01-01 18:03:24 +01:00
James Cole
bf257574f9 Update PR template [skip ci] 2019-01-01 17:56:38 +01:00
James Cole
92e42199b5 Wrote the changelog so I don't have to do it later [skip ci] 2019-01-01 17:50:44 +01:00
James Cole
99b0b24a89 Enable currencies if not enabled yet. #1952 2019-01-01 17:17:38 +01:00
James Cole
d86383eba8 Set correct copyright notice @BoGnY #1947 2019-01-01 16:49:41 +01:00
James Cole
4fc12f232a Merge pull request #1951 from BoGnY/feature/cer-provider
Implemented multiple Currency Exchange Rates sites engine
2019-01-01 16:47:01 +01:00
Luca Bognolo
729483102e Implemented multiple Currency Exchange Rates sites engine
Signed-off-by: Luca Bognolo <git@bogny.eu>
2019-01-01 16:32:22 +01:00
James Cole
7ac00935d5 Update old assets. 2019-01-01 15:44:55 +01:00
James Cole
639be5b104 Add newlines to views. 2019-01-01 15:43:03 +01:00
James Cole
17359c5e42 Various experiments with JS and React and what-not. 2019-01-01 15:41:54 +01:00
James Cole
7aa5eee3aa Better fix for date. 2019-01-01 15:29:24 +01:00
James Cole
98d6a7f32e Update some meta files [skip ci] 2019-01-01 14:11:57 +01:00
James Cole
0475b68817 Merge pull request #1948 from BoGnY/feature/croatian-kuna
Add Croatian kuna to currency seeder
2019-01-01 13:15:01 +01:00
Luca Bognolo
2a89d49ba7 Add Croatian kuna to currency seeder
Signed-off-by: Luca Bognolo <git@bogny.eu>
2018-12-31 17:53:13 +01:00
James Cole
aeab5f0333 Fix to make sure that the index respects the fiscal year. 2018-12-31 13:44:24 +01:00
James Cole
f80de95bb0 Refactor code to traits. 2018-12-31 08:11:57 +01:00
James Cole
e7bcc01fe8 Refactor code to traits. 2018-12-31 07:58:13 +01:00
James Cole
9fcbce241e Will speed up Docker start. 2018-12-31 07:57:33 +01:00
James Cole
78a71fb7c6 Add copyright [skip ci] 2018-12-31 07:57:21 +01:00
James Cole
3e25d66902 Add newlines and copyright notices. 2018-12-31 07:48:23 +01:00
James Cole
005e4ba4d1 Improve entrypoint script so Docker will build better. 2018-12-30 15:46:09 +01:00
James Cole
0f83582fed Fix #1944 2018-12-30 15:44:33 +01:00
James Cole
d736ffec8e Fix #1945 2018-12-30 15:31:07 +01:00
James Cole
27d6091e45 Make sure favicon links are relative. #1942 2018-12-30 14:51:50 +01:00
James Cole
290405b987 Some meta improvements [skip ci] 2018-12-30 06:19:40 +01:00
James Cole
7fa2fed147 Fix for #1938 2018-12-30 06:19:16 +01:00
James Cole
fd233510ee Fix https://github.com/firefly-iii/firefly-iii/issues/1933 / https://github.com/Adldap2/Adldap2/issues/629 2018-12-30 06:10:46 +01:00
James Cole
354be8dc88 Fix for #1927 2018-12-29 21:57:24 +01:00
James Cole
9750bcba76 Another fix for https://github.com/firefly-iii/firefly-iii/issues/1939 2018-12-29 21:53:34 +01:00
James Cole
15d08ca17b Fix for https://github.com/firefly-iii/firefly-iii/issues/1939 2018-12-29 21:51:20 +01:00
James Cole
1bc72fa49f Flatten command, different entrypoint command. 2018-12-27 15:21:37 +01:00
James Cole
68061fd292 Rename some translations. 2018-12-27 06:05:01 +01:00
James Cole
2b77e9d96d Update Docker files. 2018-12-27 06:04:49 +01:00
James Cole
5c48d2d56a Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Fix fullcalendar.mi.js links
2018-12-27 05:24:38 +01:00
James Cole
11a0734009 Merge pull request #1929 from a1ex4/develop
Fix fullcalendar.min.js links
2018-12-27 05:05:16 +01:00
a1ex4
2ccbfe45f2 Fix fullcalendar.mi.js links 2018-12-26 18:43:50 +01:00
James Cole
3793b08d90 Build new packages for Sandstorm. 2018-12-23 19:21:54 +01:00
James Cole
06b63209b1 Show debug info in sandstorm. 2018-12-23 19:21:40 +01:00
James Cole
02e318b3e6 New file list. 2018-12-23 19:21:18 +01:00
James Cole
3b78b26039 Merge tag '4.7.9' into develop
4.7.9
2018-12-23 18:24:34 +01:00
James Cole
f57fc06347 Merge branch 'release/4.7.9' 2018-12-23 18:24:28 +01:00
James Cole
32a14ab8e0 Update composer file. 2018-12-23 18:19:30 +01:00
James Cole
5fafe6e4f4 Update changelog and version references. 2018-12-23 18:19:19 +01:00
James Cole
ee907aba34 New language strings 2018-12-23 18:18:53 +01:00
James Cole
2ae9a6f020 Remove curl build, since bunq seems to work fine without it.
Can I tag people in commit messages? @OGKevin
2018-12-23 10:57:46 +01:00
James Cole
479841a609 Updated favicons. [skip ci] 2018-12-23 07:50:55 +01:00
James Cole
10da45edce Add some JS and CSS resources. 2018-12-23 07:35:15 +01:00
James Cole
36c4a30fe3 Fix currency ID index error. 2018-12-23 07:34:51 +01:00
James Cole
d4542cc3fc Fix currency ID index error. 2018-12-23 07:34:23 +01:00
James Cole
dea02e374f Fix currency ID index error. 2018-12-23 07:34:00 +01:00
James Cole
91deac706c Some new code for the new layout. 2018-12-23 07:21:47 +01:00
James Cole
17e85ca2cf Update docker files. 2018-12-22 06:45:07 +01:00
James Cole
91593335ef Available budget end point also gives info on spent info #1884 2018-12-22 06:40:25 +01:00
James Cole
d27176c0b3 Fix #1828 2018-12-22 06:21:06 +01:00
James Cole
070e1e81ae Fix #1859 2018-12-22 06:07:57 +01:00
James Cole
2c7d94e5e9 Update tests and code. 2018-12-21 16:38:10 +01:00
James Cole
a5520d45e7 Store booleans correctly. 2018-12-21 15:42:57 +01:00
James Cole
922c8703f5 Fix for #1890 2018-12-21 15:42:40 +01:00
James Cole
75cc024e28 Expand account types to fix https://github.com/firefly-iii/api-docs-generator/issues/2 2018-12-21 15:26:48 +01:00
James Cole
75c6da7730 Fix #1909 2018-12-21 10:55:34 +01:00
James Cole
35c8b2fce8 Fix #1901 2018-12-21 10:17:38 +01:00
James Cole
4f5d8f830e Various fixes and checks. 2018-12-21 10:11:18 +01:00
James Cole
78cb6da21a Fix for #1898 2018-12-21 10:11:01 +01:00
James Cole
a7e1a51476 Make sure rules work. 2018-12-21 09:01:21 +01:00
James Cole
a8ff77addd Various improvements to Docker files. 2018-12-21 07:36:53 +01:00
James Cole
3c9c46d574 Expand tests 2018-12-21 07:36:40 +01:00
James Cole
8ede404b8a Refer to correct field name. 2018-12-21 06:51:21 +01:00
James Cole
a7585e3040 Fix for #1985 2018-12-21 06:51:00 +01:00
James Cole
cd47b45fce Add some debug info to bunq and update the composer file [skip ci] 2018-12-20 23:06:47 +01:00
James Cole
b6c23b8eb3 Fix #1893 2018-12-20 22:32:33 +01:00
James Cole
297e12f6e4 New language strings. 2018-12-20 22:23:22 +01:00
James Cole
29b02fcac2 Fix issue with spaces in tag report. 2018-12-20 22:19:07 +01:00
James Cole
0c2218762c Update entry point script. 2018-12-20 22:13:16 +01:00
James Cole
27bc03fc20 Cover all transformers. 2018-12-20 22:03:34 +01:00
James Cole
84b3195e9b Improve transformer coverage. 2018-12-20 20:50:05 +01:00
James Cole
6f54f41946 Add new tests for transformers. 2018-12-20 05:46:05 +01:00
James Cole
c1ae0ab57d Update some tests. 2018-12-19 19:23:52 +01:00
James Cole
446ff81335 Make sure transformers match API definition. 2018-12-19 19:02:16 +01:00
James Cole
03b4a50317 Improve transformers and tests 2018-12-19 06:06:01 +01:00
James Cole
06c3362332 New language strings. 2018-12-18 20:08:38 +01:00
James Cole
5f059d02ad Add a profile warning for access tokens [skip ci] 2018-12-18 20:00:04 +01:00
James Cole
3e71a103a2 Improve test coverage. 2018-12-18 19:57:23 +01:00
James Cole
e46561347d Some rule fixes. 2018-12-18 07:08:46 +01:00
James Cole
a3f33ae888 Go from get to post. 2018-12-18 07:08:35 +01:00
James Cole
f71359e73d Improve test coverage. 2018-12-18 07:08:23 +01:00
James Cole
a0b475d8ef Improve test coverage. 2018-12-18 07:07:51 +01:00
James Cole
f3a597cd12 Improve test coverage. 2018-12-18 06:57:42 +01:00
James Cole
29f2ee93d1 Improve test coverage. 2018-12-18 06:49:26 +01:00
James Cole
454b3ebd97 Improve tests. 2018-12-17 07:09:44 +01:00
James Cole
89942ee49c Improve test coverage for API. 2018-12-16 13:55:19 +01:00
James Cole
746bd2ce92 Do not email about OAuth exceptions. 2018-12-16 13:15:09 +01:00
James Cole
747602a9cb Make a new abstract class for transformers. 2018-12-15 22:03:42 +01:00
James Cole
8ce43a3fe1 Make sure transformers can be mocked. 2018-12-15 22:03:05 +01:00
James Cole
1284f9cecc Refactored API code surrounding accounts to make transformers mockable. 2018-12-15 07:59:49 +01:00
James Cole
c54541b839 Learned that I should not refer to env vars directly so I removed all references. 2018-12-15 07:59:02 +01:00
James Cole
4bd94e5450 Update request data to match API definition. 2018-12-14 18:33:07 +01:00
James Cole
2a30293905 Improve test coverage. 2018-12-12 20:30:25 +01:00
James Cole
159fffef2e Improve test coverage. 2018-12-10 21:45:44 +01:00
James Cole
5313652d7a New translations. 2018-12-09 20:56:04 +01:00
James Cole
ae4612f134 Fix test coverage. 2018-12-09 20:54:11 +01:00
James Cole
97f6e68164 Complete accounts and bills end point. 2018-12-09 13:09:43 +01:00
James Cole
108d43f967 Budgets and budget limits end point. 2018-12-09 08:45:53 +01:00
James Cole
b0e1c85c55 Expand API for categories. 2018-12-09 06:58:03 +01:00
James Cole
82e4055fa6 Expand currency endpoint. 2018-12-09 06:51:53 +01:00
James Cole
2a68ce6c90 Expand config API endpoint. 2018-12-09 06:39:56 +01:00
James Cole
05b0425929 Expand API and routes. 2018-12-08 21:26:20 +01:00
James Cole
3b15415a1b Build import job API endpoint. 2018-12-08 08:22:53 +01:00
James Cole
00fb809ab9 Remove include parameter. 2018-12-08 08:22:34 +01:00
James Cole
494aa15567 Refactored and extended link types. 2018-12-08 07:57:29 +01:00
James Cole
07450f9f23 Update preferences API. 2018-12-07 20:39:36 +01:00
James Cole
f0de469053 Expand API for recurring transactions. 2018-12-07 20:20:54 +01:00
James Cole
8e4092e7d7 Code and routes for rules. 2018-12-07 16:03:05 +01:00
James Cole
9a2e5c36a1 Finish up rule groups API 2018-12-07 15:36:04 +01:00
James Cole
b782316cc0 Update rule group API 2018-12-07 07:49:16 +01:00
James Cole
3e84f9664f Update API for tags. 2018-12-07 07:41:12 +01:00
James Cole
01e789f5ce New translations. 2018-12-05 19:24:42 +01:00
James Cole
b2381f4657 Add tag endpoint. 2018-12-05 19:12:38 +01:00
James Cole
64a3e46cbe New endpoints for transactions. 2018-12-04 19:36:54 +01:00
James Cole
c0d6d0e28e Update API to match new end points. 2018-12-03 15:57:15 +01:00
James Cole
c13d0da9fa Mark new version 2018-12-03 07:18:36 +01:00
James Cole
050334a648 Various API updates. 2018-12-03 07:18:05 +01:00
James Cole
0256337855 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Fix typo
2018-12-03 07:17:19 +01:00
James Cole
bb073e4b6e Merge pull request #1891 from emansih/develop
Fix typo
2018-12-02 16:03:06 +01:00
Daniel Quah
40341ac14e Fix typo 2018-12-02 22:14:51 +08:00
James Cole
4420df6e5d New views for password reset, login and other user forms. 2018-11-25 11:31:02 +01:00
James Cole
99cc7a9a60 Upgrade datepicker. 2018-11-25 07:07:44 +01:00
James Cole
7ec1b985d0 Fix #1835 2018-11-25 07:04:35 +01:00
James Cole
9f19d26a23 Working test code. 2018-11-25 06:37:26 +01:00
James Cole
e766614630 Title for login page. 2018-11-25 06:37:14 +01:00
James Cole
ad49553b9c New favicons. 2018-11-25 06:37:03 +01:00
James Cole
1b3b39d2ea Add option to disable the X-Frame header 2018-11-24 07:24:32 +01:00
James Cole
cb68505204 Merge branch 'layout-v2' into develop
* layout-v2:
  First version of login page.
  Make FA and Google Font local
  Basic views.
  All assets for tabler layout.
2018-11-24 07:15:32 +01:00
James Cole
a574dca0cc Make sure pref is always filled in. 2018-11-23 10:39:33 +01:00
James Cole
c3fa1612d6 Fix for #1811 2018-11-23 08:40:08 +01:00
James Cole
7a8f6d8660 Update composer libs. 2018-11-23 08:32:23 +01:00
James Cole
9dda801fae Some new strings. 2018-11-23 08:32:11 +01:00
James Cole
344742c493 Improve bunq import for #1857 2018-11-23 08:31:58 +01:00
James Cole
886d05d436 Fix for #1622 and a special debug view. 2018-11-23 08:31:00 +01:00
James Cole
baac2ad921 Add Swedish to config file [skip ci] 2018-11-21 06:25:56 +01:00
James Cole
c3337c9bac Fix #1878 2018-11-21 06:21:57 +01:00
James Cole
6a6ca22bf0 Merge branch 'develop' into layout-v2
* develop:
  Fix date #1877
  Fix for #1877
  Auth routes now have names.
  First step towards a debug view for transactions.
  Username for FinTS import is not mandatory.
2018-11-21 06:20:23 +01:00
James Cole
f873f5488f Fix date #1877 2018-11-21 06:13:30 +01:00
James Cole
e18f843a57 Fix for #1877 2018-11-21 06:08:14 +01:00
James Cole
56a92505bd Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Username for FinTS import is not mandatory.
2018-11-21 05:55:37 +01:00
James Cole
a8bc7dd7c1 Auth routes now have names. 2018-11-21 05:55:11 +01:00
James Cole
94614550fc First step towards a debug view for transactions. 2018-11-21 05:54:57 +01:00
James Cole
b2052615e3 First version of login page. 2018-11-21 05:52:57 +01:00
James Cole
f51b9217f5 Make FA and Google Font local 2018-11-21 05:52:34 +01:00
James Cole
d892a87d1d Merge pull request #1876 from bnw/develop
Username for FinTS import is not mandatory.
2018-11-19 10:52:51 +01:00
Ben
b7182f9462 Username for FinTS import is not mandatory. 2018-11-18 22:36:05 +01:00
James Cole
79518753ad Basic views. 2018-11-17 08:30:11 +01:00
James Cole
01634ed5e9 All assets for tabler layout. 2018-11-17 08:29:52 +01:00
James Cole
f7abf8a02d Support multiple layouts. 2018-11-17 08:28:04 +01:00
James Cole
3f7f1a50e7 Fix #1864 2018-11-16 19:23:06 +01:00
James Cole
a5a770e750 Fix for #1766 2018-11-16 15:26:37 +01:00
James Cole
9cd10f58ed Expand API with fields: liability_type, liability_amount, liability_start_date, interest, interest_period. Improve IBAN field. #1866 2018-11-14 19:41:36 +01:00
James Cole
5011531066 Small chart improvements for #1865 2018-11-12 19:31:00 +01:00
James Cole
d1c7a9767a Remove reference to temp_amount 2018-11-12 19:17:17 +01:00
James Cole
d78e11170b Fix string. 2018-11-11 20:09:50 +01:00
James Cole
74f8dceb38 Fix #1865 2018-11-11 20:09:35 +01:00
James Cole
1fbf91c768 Fix tests and improve string. 2018-11-11 08:34:38 +01:00
James Cole
edf764aaf4 Will now warn about non-existent attachments. 2018-11-11 07:03:36 +01:00
James Cole
7380c5096e Fix test coverage. 2018-11-10 15:15:29 +01:00
James Cole
45699f13fc Update composer files. 2018-11-10 10:50:41 +01:00
James Cole
1fd8c9adc2 Fix image link 2018-11-10 10:50:20 +01:00
James Cole
5cc840e390 Verify routine will check currency usage. 2018-11-10 10:50:12 +01:00
James Cole
e491dda229 Currencies can now be enabled and disabled. 2018-11-10 10:04:46 +01:00
James Cole
daa8aa5c9d Fix for #1858 2018-11-09 19:00:24 +01:00
James Cole
0561554726 Bigger sleep cycle, but improve page count to compensate. 2018-11-06 16:51:51 +01:00
James Cole
34abc6490c Fix issue with transaction journal factory. 2018-11-06 05:50:36 +01:00
James Cole
66f309f5ed Clean up debug views. 2018-11-02 21:17:07 +01:00
James Cole
2283f3e786 Fix #1840 2018-11-02 21:16:47 +01:00
James Cole
d261c793ae Add extra cache path. 2018-11-02 20:40:35 +01:00
James Cole
31448a3add Move all layout files to a "v1" directory. 2018-11-02 19:59:29 +01:00
James Cole
d85ccb6ab2 Try to catch a null pointer. 2018-11-02 05:59:22 +01:00
James Cole
bd0be97137 Merge pull request #1848 from kriegalex/feature/swiss-franc
Add swiss franc to currency seeder
2018-11-01 16:06:18 +01:00
Marco Lourenço
81d70a57ca Add swiss franc to currency seeder 2018-11-01 15:15:49 +01:00
James Cole
b17f2f5d1f Improve logging #1607 2018-10-31 16:33:03 +01:00
James Cole
53ed5b2975 Improved logging for bunq routine. #1607 2018-10-31 16:25:21 +01:00
James Cole
5626fee282 Merge tag '4.7.8' into develop
4.7.8
2018-10-28 19:44:37 +01:00
James Cole
cb9aefc489 Merge branch 'release/4.7.8' 2018-10-28 19:44:34 +01:00
James Cole
a9c83beb4f Updated translations. 2018-10-28 19:25:53 +01:00
James Cole
4a64a1bd46 Update meta files for new release. 2018-10-28 19:19:39 +01:00
James Cole
4152179f10 Fix #1830 2018-10-28 19:17:33 +01:00
James Cole
400219a9fc Add iban to mouse over #1715 2018-10-28 16:15:52 +01:00
James Cole
933105a721 Fix #1825 2018-10-28 15:51:11 +01:00
James Cole
bb39781848 Some extra debugging and a fix for #1825 2018-10-28 13:53:00 +01:00
James Cole
f90b7bed5e Remove double exclamation mark. 2018-10-28 13:52:22 +01:00
James Cole
80bf94c009 Updated language strings. 2018-10-28 13:17:15 +01:00
James Cole
f46904c644 Merge pull request #1826 from dennisenderink/bugfix/translate-start-balance-on-opening-asset-account
Bugfix/translate start balance on opening asset account
2018-10-28 13:11:31 +01:00
Dennis Enderink
057619b157 Cast to string because trans() could return array 2018-10-27 23:26:04 +02:00
Dennis Enderink
fd505b77b2 Fixed alignment of some language files 2018-10-27 23:23:54 +02:00
Dennis Enderink
81a23b5b22 Added translation for initial balance account name on creation 2018-10-27 23:20:54 +02:00
James Cole
c0ab0b5af5 Fix tests for current feature set. 2018-10-27 05:39:11 +02:00
James Cole
970cc91938 Fix for #1825 2018-10-27 05:10:49 +02:00
James Cole
749d373c95 New translations [skip ci] 2018-10-26 14:49:19 +02:00
James Cole
3a427dd0f4 Refactor temporary account storage and fix a bug in the bunq import. #1607 2018-10-25 20:03:48 +02:00
James Cole
e1402d5d8a Fix for #1812 2018-10-23 18:56:37 +02:00
James Cole
864a6883d4 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2018-10-23 18:54:31 +02:00
James Cole
9b58c28be8 Fix #1807 2018-10-23 18:53:38 +02:00
James Cole
69fe6ecb7d Merge pull request #1813 from hamuz/develop
Fix remote backing storage
2018-10-23 18:52:48 +02:00
HamuZ HamuZ
321676c97f fix wrong local disk for export, and prefer local to remote 2018-10-23 18:44:12 +03:00
HamuZ HamuZ
d2e1493530 fixate flysystem-fallback-adapter in 0.1.2 (without buggy PR accepted) 2018-10-23 18:36:45 +03:00
James Cole
1c8375d0c2 Fix #1807 2018-10-22 19:00:37 +02:00
James Cole
e164e22e13 Yoda style if statement. 2018-10-21 11:08:54 +02:00
James Cole
c1c4c96918 Keep DB at version 10. 2018-10-21 11:08:45 +02:00
James Cole
742e03944d Small textual changes for #1159 2018-10-21 11:08:36 +02:00
James Cole
60f2c19d9d Clean up env files. 2018-10-21 11:07:19 +02:00
James Cole
21a8d9a109 Merge pull request #1797 from bnw/develop
Parse description from FinTSTransaction
2018-10-21 10:47:34 +02:00
Ben
9abedf3160 Refactored pardsing of description for FinTS import.
Added some tests.
2018-10-20 15:50:53 +02:00
Ben
4e48961c2b Parse description from FinTSTransaction 2018-10-20 14:53:47 +02:00
James Cole
78cd1629de Fix for #1805 2018-10-20 09:16:35 +02:00
James Cole
dd0cc2d173 Updated Docker files and double check the login provider. 2018-10-19 09:51:58 +02:00
James Cole
8f00d2b616 Merge pull request #1800 from hamuz/develop
bills: match attachment route with the icon
2018-10-17 18:14:11 +02:00
HamuZ HamuZ
c26d98b308 bills: match attachment route with icon 2018-10-17 19:07:09 +03:00
James Cole
913774850b Merge pull request #1799 from hamuz/develop
Add links to transaction from dates in bill, closes #1771
2018-10-17 17:47:17 +02:00
HamuZ HamuZ
43c9737e6e Add links to transaction from dates in bill 2018-10-17 18:17:16 +03:00
James Cole
67cd3b6f81 Force InnoDB for MySQL. 2018-10-17 15:50:43 +02:00
James Cole
d0d2189d55 Users can now reorder budgets #1108 2018-10-17 15:18:09 +02:00
James Cole
b12773bc99 Fix for #1784 2018-10-17 06:06:36 +02:00
James Cole
da5a1fe264 Fix for #1785 2018-10-17 06:05:19 +02:00
James Cole
ea48c23535 Fix for #1790 2018-10-17 05:31:51 +02:00
James Cole
8cd0d5e1ef Fix for #1798 2018-10-17 05:04:26 +02:00
James Cole
9b46e62eb6 match api end point with config changes. 2018-10-16 21:42:08 +02:00
James Cole
1653152dad Fix for #1792 2018-10-15 19:37:18 +02:00
James Cole
db7e3d725e Fix for #1781 2018-10-14 17:38:26 +02:00
James Cole
329b34f7d1 Fix for #1760 2018-10-14 16:54:11 +02:00
James Cole
d624f20107 Fixes for #1747 2018-10-14 16:40:12 +02:00
James Cole
20bebeb7de Fix in file system configuration [skip ci] 2018-10-14 16:27:26 +02:00
James Cole
4e9456b33b Make SFTP primary. 2018-10-14 14:49:03 +02:00
James Cole
26c03552c6 Fix for #1159 2018-10-14 14:38:13 +02:00
James Cole
ac6c3496d4 Fix LDAP in Dockerfile. 2018-10-14 11:42:49 +02:00
James Cole
2f1760f358 Sync up config files #1787 2018-10-14 09:05:02 +02:00
James Cole
53db8912d6 Some mild refactoring for #1787 2018-10-14 08:53:00 +02:00
James Cole
91ef21a665 Merge pull request #1787 from hamuz/develop
allow sftp host as backing storage using env
2018-10-14 08:41:40 +02:00
James Cole
5b1153ab65 Considerations on new line. 2018-10-14 08:40:10 +02:00
James Cole
5196bb9281 Remove code climate configuration. 2018-10-14 08:38:11 +02:00
James Cole
8fd6f8177f Update readme. 2018-10-14 08:38:03 +02:00
HamuZ HamuZ
7b68716a3d allow sftp host as backing storage using env 2018-10-14 07:09:00 +03:00
James Cole
d8ecc63e66 Fix Spectre test. 2018-10-13 22:15:06 +02:00
James Cole
2575f61828 Remove test script from root of Firefly III. 2018-10-13 21:45:23 +02:00
James Cole
c6370ebe48 Fix tests for login providers when dealing with LDAP. 2018-10-13 21:45:12 +02:00
James Cole
3bc38570a2 Code for #1071 2018-10-13 21:32:20 +02:00
James Cole
0d36d43eda Initial code for LDAP authentication. 2018-10-13 15:06:56 +02:00
James Cole
a5a012738e Code for #1733 2018-10-13 13:19:41 +02:00
James Cole
7cce6504e3 Merge pull request #1782 from hamuz/develop
fix local references in upload/export disk. first step for #1727.
2018-10-13 09:03:42 +02:00
HamuZ HamuZ
f696353e2c fix local references in upload/export disk. first step for #1727. 2018-10-13 09:56:26 +03:00
James Cole
cf11dfe73b Remove cache for #1778 2018-10-12 07:57:26 +02:00
James Cole
940323c0b7 Small fix in auto complete controller. 2018-10-12 07:39:05 +02:00
James Cole
9f768396c2 Code for #1698 2018-10-10 06:09:25 +02:00
James Cole
160e57bfde Merge pull request #1775 from BoGnY/develop
Fixed locales lang error on Heroku build platform
2018-10-10 06:06:02 +02:00
Luca Bognolo
429bec66f2 Fixed locales lang error on Heroku build platform
Starting from heroku 16 stack the language packs are not included by default: https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-locale

Signed-off-by: Luca Bognolo <git@bogny.eu>
2018-10-09 17:38:23 +02:00
James Cole
7f9b5e1e5e Small updates for Sandstorm release. 2018-10-08 19:54:37 +02:00
James Cole
8088c28235 Solve a problem with inline displaying of file attachments. 2018-10-07 18:41:02 +02:00
James Cole
2ec310da18 Make sure user ID is an integer #1774 2018-10-07 15:55:44 +02:00
James Cole
d8addc3175 Tag controller tests. 2018-10-07 10:46:11 +02:00
James Cole
7887655077 Fix spelling error 2018-10-07 09:46:32 +02:00
James Cole
209c42b316 Re-enable cache on various charts. 2018-10-07 09:46:15 +02:00
James Cole
011d8a2b9a Make stuff scale better #1040 2018-10-07 09:45:50 +02:00
James Cole
6f70791239 Refactoring of code for #1159 2018-10-05 17:54:51 +02:00
James Cole
7ac439fd0e Merge pull request #1770 from bnw/develop
Added a first version of an import via FinTS
2018-10-05 17:34:41 +02:00
Ben
0cda098b4f Don't use deprecated method accountRepository->find 2018-10-05 16:32:29 +02:00
Ben
aaff40c4ad Construct FinTS via service container so it can be mocked 2018-10-05 16:30:05 +02:00
Ben
306e1081e3 Bugfix: array_filter preserves keys, so $filteredAccounts[0] might not exist 2018-10-05 16:19:48 +02:00
James Cole
a1e2dac658 Another fix for #1583 2018-10-04 20:55:04 +02:00
James Cole
07382d5c6d Merge pull request #1765 from mconway/develop
Update PiggyBankRequest.php
2018-10-04 20:08:57 +02:00
James Cole
56fdb57d24 Fix for #1583 2018-10-04 20:06:12 +02:00
Mike Conway
336a9a97f9 Update PiggyBankRequest.php
Fix inconsistencies between repository and request variables
2018-10-03 19:37:16 -07:00
Ben
88083c5b38 Added 'original-source'-field to imported transactions 2018-10-03 14:13:46 +02:00
Ben
7e590fb6b3 Use arbitrary precision math 2018-10-03 14:10:53 +02:00
Ben
4bb4ffbac4 Use Carbon instead of DateTime 2018-10-03 14:05:07 +02:00
Ben
7de3c7f80a Code style 2018-10-03 14:02:06 +02:00
Ben
84d0e44a08 Strict comparison 2018-10-03 13:59:48 +02:00
Ben
d7ca7e4cd8 MessageBag needs messages as array 2018-10-03 13:58:57 +02:00
Ben
3ba41d712f Added import and type hinting 2018-10-03 13:57:17 +02:00
Ben
ce917298ed Store password encrypted 2018-10-03 13:56:53 +02:00
Ben
91e0e33a04 Remove debug 2018-10-03 13:47:38 +02:00
Ben
c32e9fabd9 Bugfix 2018-10-03 13:46:18 +02:00
Ben
dc73db2a07 Added FinTS import 2018-10-03 13:38:09 +02:00
James Cole
89cc01ce44 Merge pull request #1753 from hamuz/patch-4
fix typo in PrependDescription [skip ci]
2018-10-01 07:25:38 +02:00
HamuZ HamuZ
efa3eb1981 fix typo in PrependDescription [skip ci] 2018-10-01 08:21:03 +03:00
James Cole
50ab1fa3f0 Test improvement for import routine. 2018-09-30 20:14:17 +02:00
James Cole
e50641e969 Fix #1751 2018-09-30 19:11:49 +02:00
James Cole
d4c763df84 Fix #1751 2018-09-30 18:41:10 +02:00
James Cole
c0669c158a Update badge to read php 7.2 2018-09-30 12:00:08 +02:00
James Cole
e33bbc6f16 Expand test coverage. 2018-09-30 11:57:51 +02:00
James Cole
ea5ab54c3a Merge pull request #1746 from ms32035/logging_fix
Fix incorrect logging message
2018-09-30 07:54:35 +02:00
Marcin Szymanski
3c18ea1e14 Fix incorrect logging message 2018-09-30 01:07:12 +01:00
James Cole
25ba86b5d8 Merge tag '4.7.7' into develop
4.7.7
2018-09-29 12:27:05 +02:00
James Cole
ecdf59ee3e Merge branch 'release/4.7.7' 2018-09-29 12:27:03 +02:00
James Cole
cc1f3bba7e Updated language strings 2018-09-29 11:45:28 +02:00
James Cole
b501c47187 Move tags lower [skip ci] 2018-09-28 18:39:26 +02:00
James Cole
791b028dc4 Fix issue where an array is passed instead of a string. 2018-09-28 07:46:23 +02:00
James Cole
ab5b7f7893 Reinstate notes for bills. 2018-09-27 17:46:28 +02:00
James Cole
4b1aa29269 Fix Sandstorm. 2018-09-27 17:28:23 +02:00
James Cole
de34538d96 Update docker file for php 7.2 2018-09-27 16:35:24 +02:00
James Cole
53eb93fc4d New meta files for the upcoming release. 2018-09-27 16:33:08 +02:00
James Cole
a3841855e4 Fix for #1737 2018-09-27 13:54:59 +02:00
James Cole
b1e742c26c Fix tests. 2018-09-27 13:11:31 +02:00
James Cole
2c2814c998 Align notes with object, not separate. 2018-09-27 07:43:30 +02:00
James Cole
214c7a6f3e Improve test results. 2018-09-27 06:26:03 +02:00
James Cole
6c4f967c39 Fix for #1728 2018-09-27 05:57:06 +02:00
James Cole
e0152d3df4 Fix #1716 2018-09-26 20:47:57 +02:00
James Cole
989ffc2f07 Fix #1729 2018-09-26 20:44:43 +02:00
James Cole
f87a4c1e7c Fix for #1731 2018-09-26 20:42:07 +02:00
James Cole
fea5510700 Add some test code. 2018-09-26 20:35:27 +02:00
James Cole
aa1ae18dbb Fix validation #1720 2018-09-26 20:35:01 +02:00
James Cole
b5efd38ded New OFX parser reference. 2018-09-26 20:34:45 +02:00
James Cole
2a457c40db Fix for #1723 2018-09-26 20:34:24 +02:00
James Cole
e38b64547f Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2018-09-26 20:32:38 +02:00
James Cole
bafa96b9c0 Fix for #1719 2018-09-26 20:21:25 +02:00
James Cole
d49a13b091 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  remove first slash in mass transaction changes
- Fix user event handler test
- Fix 404 view
2018-09-23 07:39:31 +02:00
James Cole
0bd818956f Fix auto complete for tags and others. Adds search. 2018-09-23 07:39:04 +02:00
James Cole
c119b9cc7b Merge pull request #1712 from hamuz/patch-4
remove first slash in mass transaction changes
2018-09-23 07:17:38 +02:00
HamuZ HamuZ
958c7e7939 remove first slash in mass transaction changes
maybe bug when Firefly installed in directory
2018-09-23 08:01:55 +03:00
James Cole
254a46b54c Move new currency so it doesn't break previous ID's. 2018-09-23 06:57:50 +02:00
James Cole
6ed31dc4c9 PHP 7.2 specific code. 2018-09-23 06:57:37 +02:00
James Cole
fe8f5573d2 Clean up request class. 2018-09-23 06:57:27 +02:00
James Cole
51dfb8ebf1 Auto complete now supports search. 2018-09-23 06:57:00 +02:00
James Cole
8fd64791d6 Strip newlines and tabs from description. 2018-09-23 06:53:15 +02:00
James Cole
82e7202ad2 Merge pull request #1710 from hamuz/patch-3
Add ILS currency
2018-09-23 06:46:59 +02:00
HamuZ HamuZ
1f70782f7e Add ILS 2018-09-22 22:46:28 +03:00
James Cole
eefb1c4a47 Fix for #1709 2018-09-22 20:01:38 +02:00
James Cole
069015c9b1 Merge pull request #1708 from mathieupost/patch-1
Fix bunq import "Undefined index: apply_rules"
2018-09-22 14:01:10 +02:00
James Cole
c1583d19fb Push Travis to 7.2 2018-09-22 13:58:58 +02:00
Mathieu Post
0556433ce4 Fix bunq import "Undefined index: apply_rules"
When using the bunq import and unchecking "apply rules" gave an error. Same as https://github.com/firefly-iii/firefly-iii/issues/1538
2018-09-22 13:57:36 +02:00
James Cole
ec072cee23 Add debug info to currency screen. 2018-09-22 07:09:41 +02:00
James Cole
e29e6c147c Upgrade Firefly III to PHP 7.2 and Laravel 5.7 2018-09-19 16:50:16 +02:00
James Cole
972721b183 Fix tests. 2018-09-18 18:47:42 +02:00
James Cole
9bf43ce80d Merge pull request #1701 from hertzg/fix-composer-php-path-issue
Make sure PHP executable is being resolved by composer
2018-09-18 18:36:31 +02:00
George Hertz
5941b5c07e composer: Make sure PHP executable is being resolved by composer 2018-09-18 18:18:09 +02:00
James Cole
3d91a186d5 Remove credit card liability type from system. 2018-09-18 18:17:55 +02:00
James Cole
744d45fb04 Modernise the typeahead stuff to squash some bugs. 2018-09-17 17:41:34 +02:00
James Cole
f76fdedd25 Set time out to zero. #1607 2018-09-17 16:50:46 +02:00
James Cole
93ca07d812 Fix auto complete (#1519) for editing reconciliations. 2018-09-17 09:36:31 +02:00
James Cole
d69042daee Code for #1519 2018-09-17 09:22:47 +02:00
James Cole
d9f515900c Expand code coverage. 2018-09-15 13:44:36 +02:00
James Cole
57b4a5be08 Code and tests for #1450 2018-09-15 13:43:57 +02:00
James Cole
fa347f5f75 Typo fix for #1695 2018-09-14 17:44:29 +02:00
James Cole
35e3404ced Merge pull request #1694 from hamuz/patch-2
Add expected behavior to bug report template
2018-09-14 17:36:35 +02:00
HamuZ HamuZ
f7344ec6c9 Add expected behavior to bug report template
Helps to understand how the bug violates what the user expect to happen in normal scenario.
2018-09-14 17:53:40 +03:00
James Cole
63a1e560ee Fix #1691 2018-09-14 11:39:40 +02:00
James Cole
98463f8258 Fix #1690 2018-09-14 11:14:20 +02:00
James Cole
2c95bfa701 Extra tools [skip ci] 2018-09-13 20:55:59 +02:00
James Cole
2de3a2c98e Fix alignment of auto-complete #1685 2018-09-13 20:48:02 +02:00
James Cole
314c0c9e3f Fix #1685 2018-09-13 20:45:16 +02:00
James Cole
4377627332 Some extra logging + a fix for #1683 2018-09-13 20:23:17 +02:00
James Cole
71d3f452ed Fix #1682 2018-09-13 20:12:19 +02:00
James Cole
e117222dc2 Fix for #1679 2018-09-13 20:01:41 +02:00
James Cole
6286daa881 Fix for #1675 2018-09-12 17:47:31 +02:00
James Cole
0b3b9af623 Fix test for fixed chart category controller 2018-09-12 12:57:14 +02:00
James Cole
1492f5611e Add forgotten entries to the change log. 2018-09-12 12:56:40 +02:00
James Cole
efeffaa49f Refactor period blocks. 2018-09-10 20:24:19 +02:00
James Cole
d77112955d Fix secure headers for new Google tag. 2018-09-10 20:23:43 +02:00
James Cole
9a34bb7e7a Small test fixes. 2018-09-10 20:22:02 +02:00
James Cole
b30445a5f3 Update Google Analytics tracking code. 2018-09-10 20:21:39 +02:00
James Cole
0bf5c6ee3d Fix for #1667 2018-09-10 17:57:20 +02:00
James Cole
155480b335 Code for #1671 2018-09-10 16:18:35 +02:00
James Cole
34202dea1d Some attempts to fix #1673 2018-09-09 21:23:04 +02:00
James Cole
38d58f0354 Fix #1670 2018-09-09 20:40:26 +02:00
James Cole
d4b82a33c5 After pulling the code from @hamuz I realised the test was disabled. So I enabled it again. I had to change two test results. One was a 0 value not being negative, the other was due to the 12 decimal cut off (Firefly III configuration). 2018-09-09 17:11:07 +02:00
James Cole
06f3463dbc Merge pull request #1672 from hamuz/develop
Implementation of negated amount column type
2018-09-09 17:02:57 +02:00
HamuZ HamuZ
9df2d86ac2 Add support for negated amount. Closes #1660 and #1650. 2018-09-09 13:35:21 +03:00
HamuZ HamuZ
c83d93971f Merge pull request #4 from firefly-iii/develop
Get last commits
2018-09-09 13:25:06 +03:00
James Cole
7e3ba3c27f Fix JSON encode #1668 2018-09-09 11:18:05 +02:00
James Cole
c7043dffc2 Extra code for #1668 2018-09-09 07:57:15 +02:00
James Cole
d2c1e30979 Fixes for #1670 2018-09-09 07:48:17 +02:00
James Cole
d5679c372f Temp fix for #1668. 2018-09-08 15:12:36 +02:00
James Cole
b33f8b70d4 Improve code coverage. 2018-09-07 20:12:22 +02:00
James Cole
d5773ab5d0 Make reports slightly more multi currency. 2018-09-06 19:47:29 +02:00
James Cole
1903292202 Fix reference in change log [skip ci] 2018-09-06 19:46:28 +02:00
James Cole
c3a9415208 Fine tune test content. 2018-09-06 13:56:18 +02:00
James Cole
9ece209c72 Add two new ranges #954 2018-09-06 13:05:15 +02:00
James Cole
03956af88a Warn when classes are used in testing environment; this means tests aren't efficient. 2018-09-06 12:29:32 +02:00
James Cole
013c8707ac Fix for #907 2018-09-06 12:28:15 +02:00
James Cole
32ed9c59ea Code for #896 2018-09-06 10:14:12 +02:00
James Cole
4ef663669c Unset transaction source so the duplicate detector keeps working. 2018-09-06 07:40:56 +02:00
James Cole
b855c54e81 Clean up some old code. 2018-09-06 07:38:51 +02:00
James Cole
8b65c8b909 Add Robot font because why not. 2018-09-06 07:38:41 +02:00
James Cole
28e7440726 Add budget limit currency ID. 2018-09-06 07:38:26 +02:00
James Cole
7bca2298a0 Fix tests for new transaction source routine. 2018-09-06 07:37:44 +02:00
James Cole
b1cc17d96e Make sure each source of transactions stores where it's from. 2018-09-05 19:45:59 +02:00
James Cole
2afbef63aa Rename font file and make font heavier for #1658 2018-09-05 07:54:53 +02:00
James Cole
f0d2caec67 Update file list for Sandstorm build [skip ci] 2018-09-04 20:09:51 +02:00
James Cole
ac2a317fd2 Merge tag '4.7.6.2' into develop
4.7.6.2
2018-09-04 19:49:46 +02:00
James Cole
bc4ac303e2 Merge branch 'release/4.7.6.2' 2018-09-04 19:49:45 +02:00
James Cole
0e9fbecbe4 Forgot the credit card type [skip ci] 2018-09-04 19:32:50 +02:00
James Cole
226b3cfdd8 Update meta files and language files for new release. 2018-09-04 19:07:02 +02:00
James Cole
d43fa3790d Update tests so repositories are not called. Saves on DB calls, speeds up tests. 2018-09-04 16:47:01 +02:00
James Cole
ca04113aa7 Less logging for tests means less strain on travis et al. 2018-09-04 09:52:51 +02:00
James Cole
817c157db4 Disable languages that drop under 75% coverage. 2018-09-04 09:52:35 +02:00
James Cole
07edbe758a Update tests so repositories are not called. Saves on DB calls, speeds up tests. 2018-09-04 09:52:19 +02:00
James Cole
46ba0a5a5a Mock more repositories in tests. 2018-09-03 18:52:46 +02:00
James Cole
480b636c7e Fix Docker build 2018-09-03 14:51:15 +02:00
James Cole
20340dff7b Fix CSS of OAuth authorise view. 2018-09-03 14:50:57 +02:00
James Cole
cfbabb500f Merge tag '4.7.6.1' into develop
4.7.6.1
2018-09-03 10:26:38 +02:00
2743 changed files with 224729 additions and 127930 deletions

View File

@@ -1,12 +0,0 @@
---
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/

View File

@@ -1,21 +0,0 @@
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/firefly-iii/public
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/firefly-iii/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

View File

@@ -1,221 +0,0 @@
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.
# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
# together by including all remaining configuration files when starting up the
# web server.
#
# * ports.conf is always included from the main configuration file. It is
# supposed to determine listening ports for incoming connections which can be
# customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
# directories contain particular configuration snippets which manage modules,
# global configuration fragments, or virtual host configurations,
# respectively.
#
# They are activated by symlinking available configuration files from their
# respective *-available/ counterparts. These should be managed by using our
# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
# their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
# the default configuration, apache2 needs to be started/stopped with
# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
# work with the default configuration.
# Global configuration
#
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"
#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
Mutex file:${APACHE_LOCK_DIR} default
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log
#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.
# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

View File

@@ -1,11 +0,0 @@
[program:cron]
command=/usr/sbin/cron -f -L 15
user=root
autostart=true
autorestart=true
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
startsecs=10
startretries=3

View File

@@ -1,6 +0,0 @@
FF_APP_ENV=local
FF_APP_KEY=S0m3R@nd0mString0f32Ch@rsEx@ct1y
FF_DB_HOST=
FF_DB_NAME=
FF_DB_USER=
FF_DB_PASSWORD=

View File

@@ -1,29 +0,0 @@
#!/bin/bash
# make sure the correct directories exists (suggested by @chrif):
mkdir -p $FIREFLY_PATH/storage/app
mkdir -p $FIREFLY_PATH/storage/app/public
mkdir -p $FIREFLY_PATH/storage/build
mkdir -p $FIREFLY_PATH/storage/database
mkdir -p $FIREFLY_PATH/storage/debugbar
mkdir -p $FIREFLY_PATH/storage/export
mkdir -p $FIREFLY_PATH/storage/framework/cache
mkdir -p $FIREFLY_PATH/storage/framework/sessions
mkdir -p $FIREFLY_PATH/storage/framework/testing
mkdir -p $FIREFLY_PATH/storage/framework/views
mkdir -p $FIREFLY_PATH/storage/logs
mkdir -p $FIREFLY_PATH/storage/upload
# make sure we own the volumes:
chown -R www-data:www-data -R $FIREFLY_PATH/storage
chmod -R 775 $FIREFLY_PATH/storage
# remove any lingering files that may break upgrades:
rm -f $FIREFLY_PATH/storage/logs/laravel.log
cat .env.docker | envsubst > .env
composer dump-autoload
php artisan package:discover
php artisan firefly:instructions install
exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf --nodaemon

View File

@@ -1,6 +0,0 @@
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

View File

@@ -1,30 +0,0 @@
# supervisor config file
# Adapted from the config file distributed with the supervisor package on Debian
# Jessie
# Enable supervisord in non-daemon mode. Disable the logfile as we receive
# log messages via stdout/err. Set up the child process log directory in case
# the user doesn't set logging to stdout/err.
[supervisord]
nodaemon = true
logfile = NONE
pidfile = /var/run/supervisord.pid
childlogdir = /var/log/supervisor
loglevel=debug
# Enable supervisorctl via RPC interface over Unix socket
[unix_http_server]
file = /var/run/supervisor.sock
chmod = 0700
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl = unix:///var/run/supervisor.sock
# Include conf files for child processes
# Debian/Ubuntu packages use /etc/supervisor/conf.d
[include]
files = /etc/supervisor/conf.d/*.conf

View File

@@ -1,26 +0,0 @@
server {
listen 80 default_server;
server_name _ *.vm docker;
root "/app/public";
index index.php;
include /opt/docker/etc/nginx/vhost.common.d/*.conf;
}
##############
# SSL
##############
server {
listen 443 default_server;
server_name _ *.vm docker;
root "/app/public";
index index.php;
include /opt/docker/etc/nginx/vhost.common.d/*.conf;
include /opt/docker/etc/nginx/vhost.ssl.conf;
}

View File

@@ -42,13 +42,31 @@ DB_CONNECTION=pgsql
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# You can configure another file storage backend if you cannot use the local storage option.
# To set this up, fill in the following variables. The upload path is used to store uploaded
# files and the export path is to store exported data (before download).
SFTP_HOST=
SFTP_PORT=
SFTP_UPLOAD_PATH=
SFTP_EXPORT_PATH=
# SFTP uses either the username/password combination or the private key to authenticate.
SFTP_USERNAME=
SFTP_PASSWORD=
SFTP_PRIV_KEY=
# Cookie settings. Should not be necessary to change these.
COOKIE_PATH="/"
COOKIE_DOMAIN=
@@ -74,24 +92,79 @@ SPARKPOST_SECRET=
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
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
# Firefly III currently supports two provider for live Currency Exchange Rates:
# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one.
# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates,
# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key.
CER_PROVIDER=fixer
# If you have select "fixer" as default currency exchange rates,
# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited
# the free API up to the point where you might as well offer nothing.
FIXER_API_KEY=
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
ANALYTICS_ID=
TRACKER_SITE_ID=
TRACKER_URL=
# 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
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent
# LDAP connection configuration
# OpenLDAP, FreeIPA or ActiveDirectory
ADLDAP_CONNECTION_SCHEME=OpenLDAP
ADLDAP_AUTO_CONNECT=true
# LDAP connection settings
ADLDAP_CONTROLLERS=
ADLDAP_PORT=389
ADLDAP_TIMEOUT=5
ADLDAP_BASEDN=""
ADLDAP_FOLLOW_REFFERALS=false
ADLDAP_USE_SSL=false
ADLDAP_USE_TLS=false
ADLDAP_ADMIN_USERNAME=
ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false
ADLDAP_DISCOVER_FIELD=distinguishedname
ADLDAP_AUTH_FIELD=distinguishedname
# Will allow SSO if your server provides an AUTH_USER field.
WINDOWS_SSO_DISCOVER=samaccountname
WINDOWS_SSO_KEY=AUTH_USER
# field to sync as local username.
ADLDAP_SYNC_FIELD=userprincipalname
# You can disable the X-Frame-Options header if it interfears with tools like
# Organizr. This is at your own risk.
DISABLE_FRAME_HEADER=false
# Leave the following configuration vars as is.
# Unless you like to tinker and know what you're doing.
APP_NAME=FireflyIII
ADLDAP_CONNECTION=default
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
@@ -104,9 +177,7 @@ PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=true
BUNQ_USE_SANDBOX=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=
FFIII_LAYOUT=v1

19
.deploy/heroku/.locales Normal file
View File

@@ -0,0 +1,19 @@
en_US
cs_CZ
es_ES
de_DE
fr_FR
it_IT
nb_NO
nl_NL
pl_PL
pt_BR
ro_RO
ru_RU
hu_HU
el_GR
sv_SE
zh-hans_CN
zh-hant_CN
fi_FI
vi_VN

View File

@@ -1,82 +0,0 @@
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

View File

@@ -1,49 +0,0 @@
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

View File

@@ -1,3 +0,0 @@
# Ignore composer specific files and vendor folder
composer.phar
vendor

View File

@@ -1,112 +0,0 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=${FF_APP_ENV}
# 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}
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=${TZ}
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=${APP_URL}
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
TRUSTED_PROXIES=${TRUSTED_PROXIES}
# The log channel defines where your log entries go to.
# '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', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=stdout
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=${APP_LOG_LEVEL}
# 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=${FF_DB_CONNECTION}
DB_HOST=${FF_DB_HOST}
DB_PORT=${FF_DB_PORT}
DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER}
DB_PASSWORD=${FF_DB_PASSWORD}
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# Cookie settings. Should not be necessary to change these.
COOKIE_PATH="/"
COOKIE_DOMAIN=
COOKIE_SECURE=false
# If you want Firefly III to mail you, update these settings
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
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}
# Other mail drivers:
MAILGUN_DOMAIN=${MAILGUN_DOMAIN}
MAILGUN_SECRET=${MAILGUN_SECRET}
MANDRILL_SECRET=${MANDRILL_SECRET}
SPARKPOST_SECRET=${SPARKPOST_SECRET}
# 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_PASSWORD=null
REDIS_PORT=6379
CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
PUSHER_KEY=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=true
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=

View File

@@ -5,30 +5,48 @@ APP_ENV=local
# Set to true if you want to see debug information in error screens.
APP_DEBUG=false
# This should be your email address
# This should be your email address.
# If you use Docker or similar, you can set this variable from a file by using SITE_OWNER_FILE
SITE_OWNER=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
# The encryption key for your sessions. Keep this very secure.
# If you generate a new one existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it.
# If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE
APP_KEY=SomeRandomStringOf32CharsExactly
#
# Firefly III will launch using this language (for new users and unauthenticated visitors)
# For a list of available languages: https://github.com/firefly-iii/firefly-iii/tree/master/resources/lang
#
# If text is still in English, remember that not everything may have been translated.
DEFAULT_LANGUAGE=en_US
# The locale defines how numbers are formatted.
# by default this value is the same as whatever the language is.
DEFAULT_LOCALE=equal
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
# For a list of supported time zones, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=Europe/Amsterdam
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=http://localhost
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
# Set it to ** and reverse proxies work just fine.
TRUSTED_PROXIES=
# The log channel defines where your log entries go to.
# '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', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=daily
# A rotating log option is 'daily', creates 5 files that (surprise) rotate.
# Default setting 'stack' will log to 'daily' and to 'stdout' at the same time.
# - Docker + versions <= 4.8.1.8 and before: use "stdout"
# - Docker + versions > 4.8.1.8 : use "docker_out"
# - Docker + versions >= 5.1.1 : use "stack"
# - For everything else (als not Docker) : use 'stack'
LOG_CHANNEL=stack
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
@@ -37,25 +55,48 @@ LOG_CHANNEL=daily
APP_LOG_LEVEL=notice
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
# For other database types, please see the FAQ: https://docs.firefly-iii.org/support/faq
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
# Use "mysql" for MySQL and MariaDB. Use "sqlite" for SQLite.
DB_CONNECTION=pgsql
DB_HOST=fireflyiiidb
DB_PORT=5432
DB_DATABASE=firefly
DB_USERNAME=firefly
DB_PASSWORD=secret_firefly_password
# PostgreSQL supports SSL. You can configure it here.
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# If you set either of these to 'redis', you might want to update these settings too
# If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or
# REDIS_PORT_FILE to set the value from a file instead of from an environment variable
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
# always use quotes and make sure redis db "0" and "1" exists. Otherwise change accordingly.
REDIS_DB="0"
REDIS_CACHE_DB="1"
# Cookie settings. Should not be necessary to change these.
# If you use Docker or similar, you can set COOKIE_DOMAIN_FILE to set
# the value from a file instead of from an environment variable
COOKIE_PATH="/"
COOKIE_DOMAIN=
COOKIE_SECURE=false
# If you want Firefly III to mail you, update these settings
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
# For instructions, see: https://docs.firefly-iii.org/advanced-installation/email
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
@@ -65,38 +106,159 @@ MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
# Other mail drivers:
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
MAILGUN_DOMAIN=
MAILGUN_SECRET=
# If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
MAILGUN_ENDPOINT=api.mailgun.net
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE
MANDRILL_SECRET=
SPARKPOST_SECRET=
# Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
MAPBOX_API_KEY=
# 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 map will default to this location:
MAP_DEFAULT_LAT=51.983333
MAP_DEFAULT_LONG=5.916667
MAP_DEFAULT_ZOOM=6
# Firefly III currently supports two provider for live Currency Exchange Rates:
# "fixer", and "ratesapi".
# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates,
# built compatible with Fixer.IO, based on data published by European Central Bank, and doesn't require API key.
CER_PROVIDER=ratesapi
# If you have select "fixer" as default currency exchange rates,
# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited
# the free API up to the point where you might as well offer nothing.
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
FIXER_API_KEY=
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
ANALYTICS_ID=
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://docs.firefly-iii.org/advanced-installation/authentication
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
LOGIN_PROVIDER=eloquent
# 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
# LDAP connection configuration
# OpenLDAP, FreeIPA or ActiveDirectory
# # If you use Docker or similar, you can set this variable from a file by appending it with _FILE
ADLDAP_CONNECTION_SCHEME=OpenLDAP
ADLDAP_AUTO_CONNECT=true
# LDAP connection settings
# You can set the following variables from a file by appending them with _FILE:
# ADLDAP_CONTROLLERS, ADLDAP_PORT, ADLDAP_BASEDN
ADLDAP_CONTROLLERS=
ADLDAP_PORT=389
ADLDAP_TIMEOUT=5
ADLDAP_BASEDN=""
ADLDAP_FOLLOW_REFFERALS=false
ADLDAP_USE_SSL=false
ADLDAP_USE_TLS=false
# You can set the following variables from a file by appending them with _FILE:
ADLDAP_ADMIN_USERNAME=
ADLDAP_ADMIN_PASSWORD=
# You can set the following variables from a file by appending them with _FILE:
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false
ADLDAP_DISCOVER_FIELD=distinguishedname
ADLDAP_AUTH_FIELD=distinguishedname
# Will allow SSO if your server provides an AUTH_USER field.
# You can set the following variables from a file by appending them with _FILE:
WINDOWS_SSO_ENABLED=false
WINDOWS_SSO_DISCOVER=samaccountname
WINDOWS_SSO_KEY=AUTH_USER
# field to sync as local username.
# You can set the following variable from a file by appending it with _FILE:
ADLDAP_SYNC_FIELD=userprincipalname
# You can disable the X-Frame-Options header if it interferes with tools like
# Organizr. This is at your own risk. Applications running in frames run the risk
# of leaking information to their parent frame.
DISABLE_FRAME_HEADER=false
# You can disable the Content Security Policy header when you're using an ancient browser
# or any version of Microsoft Edge / Internet Explorer (which amounts to the same thing really)
# This leaves you with the risk of not being able to stop XSS bugs should they ever surface.
# This is at your own risk.
DISABLE_CSP_HEADER=false
# If you wish to track your own behavior over Firefly III, set valid analytics tracker information here.
# Nobody uses this except for me on the demo site. But hey, feel free to use this if you want to.
# Do not prepend the TRACKER_URL with http:// or https://
# The only tracker supported is Matomo.
# You can set the following variables from a file by appending them with _FILE:
TRACKER_SITE_ID=
TRACKER_URL=
#
# Firefly III could (in the future) collect telemetry on how you use Firefly III.
# In order to allow this, change the following variable to true:
SEND_TELEMETRY=false
# You can fine tune the start-up of a Docker container by editing these environment variables.
# Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data.
# However if you know what you're doing you can significantly speed up container start times.
# Set each value to true to enable, or false to disable.
# Check if the SQLite database exists. Can be skipped if you're not using SQLite.
# Won't significantly speed up things.
DKR_CHECK_SQLITE=true
# Run database creation and migration commands. Disable this only if you're 100% sure the DB exists
# and is up to date.
DKR_RUN_MIGRATION=true
# Run database upgrade commands. Disable this only when you're 100% sure your DB is up-to-date
# with the latest fixes (outside of migrations!)
DKR_RUN_UPGRADE=true
# Verify database integrity. Includes all data checks and verifications.
# Disabling this makes Firefly III assume your DB is intact.
DKR_RUN_VERIFY=true
# Run database reporting commands. When disabled, Firefly III won't go over your data to report current state.
# Disabling this should have no impact on data integrity or safety but it won't warn you of possible issues.
DKR_RUN_REPORT=true
# Generate OAuth2 keys.
# When disabled, Firefly III won't attempt to generate OAuth2 Passport keys. This won't be an issue, IFF (if and only if)
# you had previously generated keys already and they're stored in your database for restoration.
DKR_RUN_PASSPORT_INSTALL=true
# Leave the following configuration vars as is.
# Unless you like to tinker and know what you're doing.
APP_NAME=FireflyIII
ADLDAP_CONNECTION=default
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
PUSHER_KEY=
@@ -104,9 +266,20 @@ PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
USE_ENCRYPTION=false
IS_SANDSTORM=false
IS_DOCKER=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=
#
# If you have trouble configuring your Firefly III installation, DON'T BOTHER setting this variable.
# It won't work. It doesn't do ANYTHING. Don't believe the lies you read online. I'm not joking.
# This configuration value WILL NOT HELP.
#
# This variable is ONLY used in some of the emails Firefly III sends around. Nowhere else.
# So when configuring anything WEB related this variable doesn't do anything. Nothing
#
# If you're stuck I understand you get desperate but look SOMEWHERE ELSE.
#
APP_URL=http://localhost

View File

@@ -1,112 +0,0 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=local
# Set to true if you want to see debug information in error screens.
APP_DEBUG=false
# 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
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=UTC
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=http://localhost
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
TRUSTED_PROXIES=
# The log channel defines where your log entries go to.
# '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', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=stdout
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=debug
# 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_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=firefly
DB_USERNAME=firefly
DB_PASSWORD=firefly
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# Cookie settings. Should not be necessary to change these.
COOKIE_PATH="/"
COOKIE_DOMAIN=
COOKIE_SECURE=false
# If you want Firefly III to mail you, update these settings
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_FROM=changeme@example.com
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
# Other mail drivers:
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MANDRILL_SECRET=
SPARKPOST_SECRET=
# Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
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=
# 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_PASSWORD=null
REDIS_PORT=6379
CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
PUSHER_KEY=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=true
IS_HEROKU=false
BUNQ_USE_SANDBOX=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=

View File

@@ -1,112 +0,0 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=testing
# Set to true if you want to see debug information in error screens.
APP_DEBUG=true
# 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
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=Europe/Amsterdam
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=http://localhost
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
TRUSTED_PROXIES=
# The log channel defines where your log entries go to.
# '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', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=dailytest
# 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
# 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
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# Cookie settings. Should not be necessary to change these.
COOKIE_PATH="/"
COOKIE_DOMAIN=
COOKIE_SECURE=false
# If you want Firefly III to mail you, update these settings
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_FROM=changeme@example.com
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
# Other mail drivers:
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MANDRILL_SECRET=
SPARKPOST_SECRET=
# 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=
# 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_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=true
MAILGUN_DOMAIN=
MAILGUN_SECRET=

View File

@@ -5,18 +5,21 @@ about: Create a report to help Firefly III improve
---
**Bug description**
I am running Firefly III version x.x.x
I am running Firefly III version x.x.x, and my problem is:
(please give a clear and concise description of what the bug is)
<!-- Replace the version and describe your problem or your issue may be closed. -->
**Steps to reproduce**
What do you need to do to trigger this bug?
<!-- What do you need to do to trigger this bug? -->
**Extra info**
Please add extra info here, such as OS, browser, and the output from the /debug page of your Firefly III installation (click the version at the bottom).
<!-- Please add extra info here, such as OS, browser, and the output from the /debug page of your Firefly III installation (click the version at the bottom). -->
**Bonus points**
Earn bonus points by:
<!-- Before you submit, verify the following please: -->
- Post a stacktrace from your log files
- Add a screenshot
- I searched and nobody reported this bug before
- I have added a stack trace from my log files <!-- (see https://bit.ly/FF3-get-debug-info) -->
- I have added a screenshot.
- I was able to replicate it on the demo site https://demo.firefly-iii.org/
<!-- - I donated money (this is a joke ;)-->

View File

@@ -4,24 +4,20 @@ about: Ask away!
---
I am running Firefly III version x.x.x
I am running Firefly III version x.x.x.
**Description**
**Steps to reproduce**
(if relevant of course)
<!-- (if relevant of course) -->
**Extra info**
Please add extra info here, such as OS, browser, and the output from the `/debug`-page of your Firefly III installation (click the version at the bottom).
<!-- Please add extra info here, such as OS, browser, and the output from the `/debug`-page of your Firefly III installation (click the version at the bottom). -->
**Bonus points**
Earn bonus points by:
- Add a screenshot
- Replicate the problem on the demo site https://demo.firefly-iii.org/
<!-- Complete the following checklist for bonus points -->
- I have read the FAQ at https://bit.ly/FF3-FAQ
- I added a screenshot
- I added log files <!-- (see https://bit.ly/FF3-get-debug-info) -->
- I was able to replicate the issue on the demo site.
<!-- - I donated money (this is a joke :wink:)-->

View File

@@ -5,17 +5,27 @@ about: Suggest an idea or feature for Firefly III
---
**Description**
<!--
Please describe your feature request:
- I would like Firefly III to do X.
- What if you would add feature Y?
- Firefly III doesn't do Z.
- I would like Firefly III to do ABC.
- What if you would add feature XYZ?
- Firefly III doesn't do DEF.
-->
**Solution**
Describe what your feature would add to Firefly III.
<!-- Describe what your feature would add to Firefly III. -->
**What are alternatives?**
Please describe what alternatives currently exist.
<!-- Please describe what alternatives currently exist. -->
**Additional context**
Add any other context or screenshots about the feature request here.
<!-- Add any other context or screenshots about the feature request here. -->
**Bonus points**
<!-- Earn bonus points by:
- Make a drawing
- Donate money (just kidding ;)
-->

View File

@@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at thegrumpydictator@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at james@firefly-iii.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

View File

@@ -4,7 +4,7 @@
## Feature requests
I am always interested in expanding Firefly III's many features. Just open a ticket or [drop me a line](mailto:thegrumpydictator@gmail.com).
I am always interested in expanding Firefly III's many features. Just open a ticket or [drop me a line](mailto:james@firefly-iii.org).
## Pull requests

5
.github/funding.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
# These are supported funding model platforms
github: jc5
patreon: JC5
custom: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA

35
.github/lock.yml vendored Normal file
View File

@@ -0,0 +1,35 @@
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 90
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels: []
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: false
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: true
# Limit to only `issues` or `pulls`
# only: issues
# Optionally, specify configuration settings just for `issues` or `pulls`
# issues:
# exemptLabels:
# - help-wanted
# lockLabel: outdated
# pulls:
# daysUntilLock: 30
# Repository to extend settings from
# _extends: repo

View File

@@ -1,4 +1,13 @@
Fixes # (if relevant)
<!--
Before you create a new PR, please consider the following two considerations.
1) Pull request for the MASTER branch will be closed.
2) We cannot accept pull requests to add new currencies.
Thanks.
-->
Fixes issue # (if relevant)
Changes in this pull request:

12
.github/security.md vendored Normal file
View File

@@ -0,0 +1,12 @@
# Security Policy
## Supported Versions
Only the latest version of Firefly III is supported. If you're not running the latest version of Firefly III, please upgrade at your earliest convenience.
## Reporting a Vulnerability
If you find something that compromises the security of Firefly III, you should [send me a message](mailto:james@firefly-iii.org) as soon as possible. These issues will be fixed immediately. You can also open an issue, but if you feel the issue is sensitive, please drop me a message instead.
You can use my [GPG key](https://keybase.io/jc5) for extra security. My [GitHub commits](https://github.com/firefly-iii/firefly-iii/commits/master) are almost always signed with this key.

5
.github/stale.yml vendored
View File

@@ -1,7 +1,7 @@
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 14
daysUntilStale: 7
# Number of days of inactivity before a stale Issue or Pull Request is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
@@ -13,6 +13,7 @@ exemptLabels:
- enhancement
- feature
- bug
- announcement
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: false
@@ -53,4 +54,4 @@ limitPerRun: 30
# issues:
# exemptLabels:
# - confirmed
# - confirmed

3
.github/support.md vendored
View File

@@ -8,4 +8,5 @@ First of all: thank you for reporting a bug instead of ditching the tool altoget
## Installation problems
Please take the time to read the [installation guide FAQ](https://firefly-iii.org/installation-guide-faq/) and make sure you search through closed issues for the problems other people have had. Your problem may be among them! If not, open an issue and I will help where I can.
Please take the time to read the [documentation](https://docs.firefly-iii.org/) and make sure you search through closed issues for the problems other people
have had. Your problem may be among them! If not, open an issue and I will help where I can.

2
.gitignore vendored
View File

@@ -1,4 +1,5 @@
/node_modules
/frontend/node_modules
/public/hot
/public/storage
/storage/*.key
@@ -12,3 +13,4 @@ yarn-error.log
public/google*.html
report.html
composer.phar
app.js.map

View File

@@ -1,5 +0,0 @@
# vagrant-spk creates shell scripts, which must end in \n, even on a \r\n system.
*.sh text eol=lf

View File

@@ -1,5 +0,0 @@
# This file stores a list of sub-paths of .sandstorm/ that should be ignored by git.
.vagrant

110
.sandstorm/Vagrantfile vendored
View File

@@ -1,110 +0,0 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Guess at a reasonable name for the VM based on the folder vagrant-spk is
# run from. The timestamp is there to avoid conflicts if you have multiple
# folders with the same name.
VM_NAME = File.basename(File.dirname(File.dirname(__FILE__))) + "_sandstorm_#{Time.now.utc.to_i}"
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
# ugly hack to prevent hashicorp's bitrot. See https://github.com/hashicorp/vagrant/issues/9442
# this setting is required for pre-2.0 vagrant, but causes an error as of 2.0.3,
# remove entirely when confident nobody uses vagrant 1.x for anything.
unless Vagrant::DEFAULT_SERVER_URL.frozen?
Vagrant::DEFAULT_SERVER_URL.replace('https://vagrantcloud.com')
end
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Base on the Sandstorm snapshots of the official Debian 8 (jessie) box.
config.vm.box = "debian/contrib-jessie64"
if Vagrant.has_plugin?("vagrant-vbguest") then
# vagrant-vbguest is a Vagrant plugin that upgrades
# the version of VirtualBox Guest Additions within each
# guest. If you have the vagrant-vbguest plugin, then it
# needs to know how to compile kernel modules, etc., and so
# we give it this hint about operating system type.
config.vm.guest = "debian"
end
# We forward port 6080, the Sandstorm web port, so that developers can
# visit their sandstorm app from their browser as local.sandstorm.io:6080
# (aka 127.0.0.1:6080).
config.vm.network :forwarded_port, guest: 6080, host: 6080
# Use a shell script to "provision" the box. This installs Sandstorm using
# the bundled installer.
config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/global-setup.sh", keep_color: true
# Then, do stack-specific and app-specific setup.
config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/setup.sh", keep_color: true
# Shared folders are configured per-provider since vboxsf can't handle >4096 open files,
# NFS requires privilege escalation every time you bring a VM up,
# and 9p is only available on libvirt.
# Calculate the number of CPUs and the amount of RAM the system has,
# in a platform-dependent way; further logic below.
cpus = nil
total_kB_ram = nil
host = RbConfig::CONFIG['host_os']
if host =~ /darwin/
cpus = `sysctl -n hw.ncpu`.to_i
total_kB_ram = `sysctl -n hw.memsize`.to_i / 1024
elsif host =~ /linux/
cpus = `nproc`.to_i
total_kB_ram = `grep MemTotal /proc/meminfo | awk '{print $2}'`.to_i
elsif host =~ /mingw/
# powershell may not be available on Windows XP and Vista, so wrap this in a rescue block
begin
cpus = `powershell -Command "(Get-WmiObject Win32_Processor -Property NumberOfLogicalProcessors | Select-Object -Property NumberOfLogicalProcessors | Measure-Object NumberOfLogicalProcessors -Sum).Sum"`.to_i
total_kB_ram = `powershell -Command "Get-CimInstance -class cim_physicalmemory | % $_.Capacity}"`.to_i / 1024
rescue
end
end
# Use the same number of CPUs within Vagrant as the system, with 1
# as a default.
#
# Use at least 512MB of RAM, and if the system has more than 2GB of
# RAM, use 1/4 of the system RAM. This seems a reasonable compromise
# between having the Vagrant guest operating system not run out of
# RAM entirely (which it basically would if we went much lower than
# 512MB) and also allowing it to use up a healthily large amount of
# RAM so it can run faster on systems that can afford it.
if cpus.nil? or cpus.zero?
cpus = 1
end
if total_kB_ram.nil? or total_kB_ram < 2048000
assign_ram_mb = 512
else
assign_ram_mb = (total_kB_ram / 1024 / 4)
end
# Actually apply these CPU/memory values to the providers.
config.vm.provider :virtualbox do |vb, override|
vb.cpus = cpus
vb.memory = assign_ram_mb
vb.name = VM_NAME
vb.customize ["modifyvm", :id, "--nictype1", "Am79C973"]
# /opt/app and /host-dot-sandstorm are used by vagrant-spk
override.vm.synced_folder "..", "/opt/app"
override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm"
# /vagrant is not used by vagrant-spk; we need this line so it gets disabled; if we removed the
# line, vagrant would automatically insert a synced folder in /vagrant, which is not what we want.
override.vm.synced_folder "..", "/vagrant", disabled: true
end
config.vm.provider :libvirt do |libvirt, override|
libvirt.cpus = cpus
libvirt.memory = assign_ram_mb
libvirt.default_prefix = VM_NAME
# /opt/app and /host-dot-sandstorm are used by vagrant-spk
override.vm.synced_folder "..", "/opt/app", type: "9p", accessmode: "passthrough"
override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm", type: "9p", accessmode: "passthrough"
# /vagrant is not used by vagrant-spk; we need this line so it gets disabled; if we removed the
# line, vagrant would automatically insert a synced folder in /vagrant, which is not what we want.
override.vm.synced_folder "..", "/vagrant", type: "9p", accessmode: "passthrough", disabled: true
end
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -1,20 +0,0 @@
#!/bin/bash
# Checks if there's a composer.json, and if so, installs/runs composer.
# This script only runs once, when the app connects to sandstorm.
set -euo pipefail
echo "In build.sh"
cd /opt/app
cp .env.sandstorm .env
if [ -f /opt/app/composer.json ] ; then
if [ ! -f composer.phar ] ; then
curl -sS https://getcomposer.org/installer | php
fi
php composer.phar install --no-dev --no-suggest
fi
# link storage folder
rm -rf /opt/app/storage
ln -s /var/storage /opt/app

View File

@@ -1,343 +0,0 @@
# 4.7.6.1
- An issue where I switched variables from the Docker `.env` file to the normal `.env` file and vice versa -- breaking both.
- [Issue 1649](https://github.com/firefly-iii/firefly-iii/issues/1649) 2FA QR code would not show up due to very strict security policy headers
- Docker build gave a cURL error whenever it runs PHP commands.
# 4.7.6
- [Issue 145](https://github.com/firefly-iii/firefly-iii/issues/145) You can now download transactions from YNAB.
- [Issue 306](https://github.com/firefly-iii/firefly-iii/issues/306) You can now add liabilities to Firefly III.
- [Issue 740](https://github.com/firefly-iii/firefly-iii/issues/740) Various charts are now currency aware.
- [Issue 833](https://github.com/firefly-iii/firefly-iii/issues/833) Bills can use non-default currencies.
- [Issue 1578](https://github.com/firefly-iii/firefly-iii/issues/1578) Firefly III will notify you if the cron job hasn't fired.
- [Issue 1623](https://github.com/firefly-iii/firefly-iii/issues/1623) New transactions will link back from the success message.
- [Issue 1624](https://github.com/firefly-iii/firefly-iii/issues/1624) transactions will link to the object.
- You can call the cron job over the web now (see docs).
- You don't need to call the cron job every minute any more.
- Various charts are now red/green to signify income and expenses.
- Option to add or remove accounts from the net worth calculations.
- This will be the last release on PHP 7.1. Future versions will require PHP 7.2.
- [Issue 1460](https://github.com/firefly-iii/firefly-iii/issues/1460) Downloading transactions from bunq should go more smoothly.
- [Issue 1464](https://github.com/firefly-iii/firefly-iii/issues/1464) Fixed the docker file to work on Raspberry Pi's.
- [Issue 1540](https://github.com/firefly-iii/firefly-iii/issues/1540) The Docker file now has a working cron job for recurring transactions.
- [Issue 1564](https://github.com/firefly-iii/firefly-iii/issues/1564) Fix double transfers when importing from bunq.
- [Issue 1575](https://github.com/firefly-iii/firefly-iii/issues/1575) Some views would give a XSRF token warning
- [Issue 1576](https://github.com/firefly-iii/firefly-iii/issues/1576) Fix assigning budgets
- [Issue 1580](https://github.com/firefly-iii/firefly-iii/issues/1580) Missing string for translation
- [Issue 1581](https://github.com/firefly-iii/firefly-iii/issues/1581) Expand help text
- [Issue 1584](https://github.com/firefly-iii/firefly-iii/issues/1584) Link to administration is back.
- [Issue 1586](https://github.com/firefly-iii/firefly-iii/issues/1586) Date fields in import were mislabeled.
- [Issue 1593](https://github.com/firefly-iii/firefly-iii/issues/1593) Link types are translatable.
- [Issue 1594](https://github.com/firefly-iii/firefly-iii/issues/1594) Very long breadcrumbs are weird.
- [Issue 1598](https://github.com/firefly-iii/firefly-iii/issues/1598) Fix budget calculations.
- [Issue 1597](https://github.com/firefly-iii/firefly-iii/issues/1597) Piggy banks are always inactive.
- [Issue 1605](https://github.com/firefly-iii/firefly-iii/issues/1605) System will ignore foreign currency setting if user doesn't indicate the amount.
- [Issue 1608](https://github.com/firefly-iii/firefly-iii/issues/1608) Spelling error in command line import.
- [Issue 1609](https://github.com/firefly-iii/firefly-iii/issues/1609) Link to budgets page was absolute.
- [Issue 1615](https://github.com/firefly-iii/firefly-iii/issues/1615) Fix currency bug in transactions.
- [Issue 1616](https://github.com/firefly-iii/firefly-iii/issues/1616) Fix null pointer exception in pie charts.
- [Issue 1617](https://github.com/firefly-iii/firefly-iii/issues/1617) Fix for complex tag names in URL's.
- [Issue 1620](https://github.com/firefly-iii/firefly-iii/issues/1620) Fixed index reference in API.
- [Issue 1639](https://github.com/firefly-iii/firefly-iii/issues/1639) Firefly III trusts the Heroku load balancer, fixing deployment on Heroku.
- [Issue 1642](https://github.com/firefly-iii/firefly-iii/issues/1642) Fix issue with split journals.
- [Issue 1643](https://github.com/firefly-iii/firefly-iii/issues/1643) Fix reconciliation issue.
- Users can no longer give expenses a budget.
- Fix bug in Spectre import.
- Heroku would not make you owner.
- Add `.htaccess` files to all public directories.
- New secure headers will make Firefly III slightly more secure.
# 4.7.5.3
- [Issue 1527](https://github.com/firefly-iii/firefly-iii/issues/1527), fixed views for transactions without a budget.
- [Issue 1553](https://github.com/firefly-iii/firefly-iii/issues/1553), report could not handle transactions before the first one in the system.
- [Issue 1549](https://github.com/firefly-iii/firefly-iii/issues/1549) update a budget will also update any rules that refer to that budget.
- [Issue 1530](https://github.com/firefly-iii/firefly-iii/issues/1530), fix issue with bill chart.
- [Issue 1563](https://github.com/firefly-iii/firefly-iii/issues/1563), fix piggy bank suggested amount
- [Issue 1571](https://github.com/firefly-iii/firefly-iii/issues/1571), fix OAuth in Sandstorm
- [Issue 1568](https://github.com/firefly-iii/firefly-iii/issues/1568), bug in Sandstorm user code.
- [Issue 1569](https://github.com/firefly-iii/firefly-iii/issues/1569), optimized Sandstorm build by [ocdtrekkie](https://github.com/ocdtrekkie)
- Fixed a bug where transfers would be stored inversely when using the CSV import.
- Retired the "Rabobank description"-fix, because it is no longer necessary.
- Fixed a bug where users could not delete budget limits in the API.
- Piggy bank notes are visible again.
# 4.7.5.1
- [Issue 1531](https://github.com/firefly-iii/firefly-iii/issues/1531), the database routine incorrectly reports empty categories.
- [Issue 1532](https://github.com/firefly-iii/firefly-iii/issues/1532), broken dropdown for autosuggest things.
- [Issue 1533](https://github.com/firefly-iii/firefly-iii/issues/1533), fix where the import could not import category names.
- [Issue 1538](https://github.com/firefly-iii/firefly-iii/issues/1538), fix a bug where Spectre would not work when ignoring rules.
- [Issue 1542](https://github.com/firefly-iii/firefly-iii/issues/1542), fix a bug where the importer was incapable of generating new currencies.
- [Issue 1541](https://github.com/firefly-iii/firefly-iii/issues/1541), no longer ignore composer.lock in Docker ignore.
- Bills are stored inactive.
# 4.7.5
- A new feature called "recurring transactions" that will make Firefly III automatically create transactions for you.
- New API end points for attachments, available budgets, budgets, budget limits, categories, configuration, currency exchange rates, journal links, link types, piggy banks, preferences, recurring transactions, rules, rule groups and tags.
- Added support for YunoHost.
- The 2FA secret is visible so you can type it into 2FA apps.
- Bunq and Spectre imports will now ask to apply rules.
- Sandstorm users can now make API keys.
- Various typo's in the English translations. [issue 1493](https://github.com/firefly-iii/firefly-iii/issues/1493)
- Bug where Spectre was never called [issue 1492](https://github.com/firefly-iii/firefly-iii/issues/1492)
- Clear cache after journal is created through API [issue 1483](https://github.com/firefly-iii/firefly-iii/issues/1483)
- Make sure docker directories exist [issue 1500](https://github.com/firefly-iii/firefly-iii/issues/1500)
- Broken link to bill edit [issue 1505](https://github.com/firefly-iii/firefly-iii/issues/1505)
- Several bugs in the editing of split transactions [issue 1509](https://github.com/firefly-iii/firefly-iii/issues/1509)
- Import routine ignored formatting of several date fields [issue 1510](https://github.com/firefly-iii/firefly-iii/issues/1510)
- Piggy bank events now show the correct currency [issue 1446](https://github.com/firefly-iii/firefly-iii/issues/1446)
- Inactive accounts are no longer suggested [issue 1463](https://github.com/firefly-iii/firefly-iii/issues/1463)
- Some income / expense charts are less confusing [issue 1518](https://github.com/firefly-iii/firefly-iii/issues/1518)
- Validation bug in multi-currency create view [issue 1521](https://github.com/firefly-iii/firefly-iii/issues/1521)
# 4.7.4
- [Issue 1409](https://github.com/firefly-iii/firefly-iii/issues/1409), add Indian Rupee and explain that users can do this themselves [issue 1413](https://github.com/firefly-iii/firefly-iii/issues/1413)
- [Issue 1445](https://github.com/firefly-iii/firefly-iii/issues/1445), upgrade Curl in Docker image.
- [Issue 1386](https://github.com/firefly-iii/firefly-iii/issues/1386), quick links to often used pages.
- [Issue 1405](https://github.com/firefly-iii/firefly-iii/issues/1405), show proposed amount to piggy banks.
- [Issue 1416](https://github.com/firefly-iii/firefly-iii/issues/1416), ability to delete lost attachments.
- A completely rewritten import routine that can handle bunq (thanks everybody for testing!), CSV files and Spectre. Please make sure you read about this at http://bit.ly/FF3-new-import
- [Issue 1392](https://github.com/firefly-iii/firefly-iii/issues/1392), explicitly mention rules are inactive (when they are).
- [Issue 1406](https://github.com/firefly-iii/firefly-iii/issues/1406), bill conversion to rules will be smarter about the rules they create.
- [Issue 1369](https://github.com/firefly-iii/firefly-iii/issues/1369), you can now properly order piggy banks again.
- [Issue 1389](https://github.com/firefly-iii/firefly-iii/issues/1389), null-pointer in the import routine.
- [Issue 1400](https://github.com/firefly-iii/firefly-iii/issues/1400), missing translation.
- [Issue 1403](https://github.com/firefly-iii/firefly-iii/issues/1403), bill would always be marked as inactive in edit screen.
- [Issue 1418](https://github.com/firefly-iii/firefly-iii/issues/1418), missing note text on bill page.
- Export routine would break when encountering un-decryptable files.
- [Issue 1425](https://github.com/firefly-iii/firefly-iii/issues/1425), empty fields when edit multiple transactions at once.
- [Issue 1449](https://github.com/firefly-iii/firefly-iii/issues/1449), bad calculations in "budget left to spend" view.
- [Issue 1451](https://github.com/firefly-iii/firefly-iii/issues/1451), same but in another view.
- [Issue 1453](https://github.com/firefly-iii/firefly-iii/issues/1453), same as [issue 1403](https://github.com/firefly-iii/firefly-iii/issues/1403).
- [Issue 1455](https://github.com/firefly-iii/firefly-iii/issues/1455), could add income to a budget.
- [Issue 1442](https://github.com/firefly-iii/firefly-iii/issues/1442), issues with editing a split deposit.
- [Issue 1452](https://github.com/firefly-iii/firefly-iii/issues/1452), date range problems with tags.
- [Issue 1458](https://github.com/firefly-iii/firefly-iii/issues/1458), same for transactions.
- [Issue 1415](https://github.com/firefly-iii/firefly-iii/issues/1415), will email you when OAuth2 keys are generated.
# 4.7.3.2
- Forgot to increase the version number :(.
# 4.7.3.1
- Fixed a critical bug where the rules-engine would fire inadvertently.
# 4.7.3
- Currency added to API
- Firfely III will also generate a cash wallet for new users.
- Can now reset Spectre and bunq settings
- Docker file has a time zone
- Allow database connection to be configured in Docker file
- Can now view and edit attachments in edit-screen
- User can visit hidden `/attachments` page
- [Issue 1356](https://github.com/firefly-iii/firefly-iii/issues/1356): Budgets will show the remaining amount per day
- [Issue 1367](https://github.com/firefly-iii/firefly-iii/issues/1367): Rules now come in strict and non-strict mode.
- Added a security.txt
- More support for trusted proxies
- Improved edit routine for split transactions.
- Upgrade routine can handle `proc_close` being disabled.
- Bills now use rules to match transactions, making it more flexible.
- [Issue 1328](https://github.com/firefly-iii/firefly-iii/issues/1328): piggy banks no have a more useful chart.
- Spectre API upgraded to v4
- Move to MariaDB ([issue 1366](https://github.com/firefly-iii/firefly-iii/issues/1366))
- Piggy banks take currency from parent account ([issue 1334](https://github.com/firefly-iii/firefly-iii/issues/1334))
- [Issue 1341](https://github.com/firefly-iii/firefly-iii/issues/1341): Removed depricated command from dockerfile
- Several issues with docker image ([issue 1320](https://github.com/firefly-iii/firefly-iii/issues/1320), [issue 1382](https://github.com/firefly-iii/firefly-iii/issues/1382)).
- Fix giant tags and division by zero ([issue 1325](https://github.com/firefly-iii/firefly-iii/issues/1325) and others)
- Several issues with bunq import ([issue 1352](https://github.com/firefly-iii/firefly-iii/issues/1352), [issue 1330](https://github.com/firefly-iii/firefly-iii/issues/1330), [issue 1378](https://github.com/firefly-iii/firefly-iii/issues/1378), [issue 1380](https://github.com/firefly-iii/firefly-iii/issues/1380))
- [Issue 1246](https://github.com/firefly-iii/firefly-iii/issues/1246): date picker is internationalised
- [Issue 1327](https://github.com/firefly-iii/firefly-iii/issues/1327): fix formattting issues in piggy banks
- [Issue 1348](https://github.com/firefly-iii/firefly-iii/issues/1348): 500 error in API
- [Issue 1349](https://github.com/firefly-iii/firefly-iii/issues/1349): Errors in import routine
- Several fixes for (multi-currency) reconciliation ([issue 1336](https://github.com/firefly-iii/firefly-iii/issues/1336), [issue 1363](https://github.com/firefly-iii/firefly-iii/issues/1363))
- [Issue 1353](https://github.com/firefly-iii/firefly-iii/issues/1353): return NULL values in range-indicator
- Bug in split transaction edit routine
- Piggy bank percentage was very specific.
- Logging in Slack is easier to config.
- [Issue 1312](https://github.com/firefly-iii/firefly-iii/issues/1312) Import broken for ING accounts
- [Issue 1313](https://github.com/firefly-iii/firefly-iii/issues/1313) Error when creating new asset account
- [Issue 1317](https://github.com/firefly-iii/firefly-iii/issues/1317) Forgot an include :(
- Null pointer exception in transaction overview.
- Installations running in subdirs were incapable of creating OAuth tokens.
- OAuth keys were not created in all cases.
# 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))
- 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
- [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)
- Bulk edit of transactions thanks to [vicmosin](https://github.com/vicmosin) ([issue 1078](https://github.com/firefly-iii/firefly-iii/issues/1078))
- Support for Turkish.
- [Issue 1090](https://github.com/firefly-iii/firefly-iii/issues/1090), suggested by [Findus23](https://github.com/Findus23)
- [Issue 1097](https://github.com/firefly-iii/firefly-iii/issues/1097), suggested by [kelvinhammond](https://github.com/kelvinhammond)
- [Issue 1093](https://github.com/firefly-iii/firefly-iii/issues/1093), suggested by [jinformatique](https://github.com/jinformatique)
- [Issue 1098](https://github.com/firefly-iii/firefly-iii/issues/1098), suggested by [Nik-vr](https://github.com/Nik-vr)
- [Issue 972](https://github.com/firefly-iii/firefly-iii/issues/972), reported by [pjotrvdh](https://github.com/pjotrvdh)
- [Issue 1079](https://github.com/firefly-iii/firefly-iii/issues/1079), reported by [gavu](https://github.com/gavu)
- [Issue 1080](https://github.com/firefly-iii/firefly-iii/issues/1080), reported by [zjean](https://github.com/zjean)
- [Issue 1083](https://github.com/firefly-iii/firefly-iii/issues/1083), reported by [skuzzle](https://github.com/skuzzle)
- [Issue 1085](https://github.com/firefly-iii/firefly-iii/issues/1085), reported by [nicoschreiner](https://github.com/nicoschreiner)
- [Issue 1087](https://github.com/firefly-iii/firefly-iii/issues/1087), reported by [4oo4](https://github.com/4oo4)
- [Issue 1089](https://github.com/firefly-iii/firefly-iii/issues/1089), reported by [robin5210](https://github.com/robin5210)
- [Issue 1092](https://github.com/firefly-iii/firefly-iii/issues/1092), reported by [kelvinhammond](https://github.com/kelvinhammond)
- [Issue 1096](https://github.com/firefly-iii/firefly-iii/issues/1096), reported by [wtercato](https://github.com/wtercato)
# 4.6.12
- Support for Indonesian.
- New report, see [issue 384](https://github.com/firefly-iii/firefly-iii/issues/384)
- [Issue 964](https://github.com/firefly-iii/firefly-iii/issues/964) as suggested by [gavu](https://github.com/gavu)
- Greatly improved Docker support and documentation.
- [Issue 1046](https://github.com/firefly-iii/firefly-iii/issues/1046), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1047](https://github.com/firefly-iii/firefly-iii/issues/1047), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1048](https://github.com/firefly-iii/firefly-iii/issues/1048), as reported by [webence](https://github.com/webence)
- [Issue 1049](https://github.com/firefly-iii/firefly-iii/issues/1049), as reported by [nicoschreiner](https://github.com/nicoschreiner)
- [Issue 1015](https://github.com/firefly-iii/firefly-iii/issues/1015), as reporterd by a user on Tweakers.net
- [Issue 1056](https://github.com/firefly-iii/firefly-iii/issues/1056), as reported by [repercussion](https://github.com/repercussion)
- [Issue 1061](https://github.com/firefly-iii/firefly-iii/issues/1061), as reported by [Meizikyn](https://github.com/Meizikyn)
- [Issue 1045](https://github.com/firefly-iii/firefly-iii/issues/1045), as reported by [gavu](https://github.com/gavu)
- First code for [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040) ([simonsmiley](https://github.com/simonsmiley))
- [Issue 1059](https://github.com/firefly-iii/firefly-iii/issues/1059), as reported by [4oo4](https://github.com/4oo4)
- [Issue 1063](https://github.com/firefly-iii/firefly-iii/issues/1063), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1064](https://github.com/firefly-iii/firefly-iii/issues/1064), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1066](https://github.com/firefly-iii/firefly-iii/issues/1066), reported by [wtercato](https://github.com/wtercato)
# 4.6.1.1
- Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956)
- Import will no longer scan for rules, this has become optional. Originally suggested in [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) by [gavu](https://github.com/gavu)
- [Issue 1033](https://github.com/firefly-iii/firefly-iii/issues/1033), as reported by [Jumanjii](https://github.com/Jumanjii)
- [Issue 1033](https://github.com/firefly-iii/firefly-iii/issues/1034), as reported by [Aquariu](https://github.com/Aquariu)
- Extra admin check for [issue 1039](https://github.com/firefly-iii/firefly-iii/issues/1039), as reported by [ocdtrekkie](https://github.com/ocdtrekkie)
- Missing translations ([issue 1026](https://github.com/firefly-iii/firefly-iii/issues/1026)), as reported by [gavu](https://github.com/gavu) and [zjean](https://github.com/zjean)
- [Issue 1028](https://github.com/firefly-iii/firefly-iii/issues/1028), reported by [zjean](https://github.com/zjean)
- [Issue 1029](https://github.com/firefly-iii/firefly-iii/issues/1029), reported by [zjean](https://github.com/zjean)
- [Issue 1030](https://github.com/firefly-iii/firefly-iii/issues/1030), as reported by [Traxxi](https://github.com/Traxxi)
- [Issue 1036](https://github.com/firefly-iii/firefly-iii/issues/1036), as reported by [webence](https://github.com/webence)
- [Issue 1038](https://github.com/firefly-iii/firefly-iii/issues/1038), as reported by [gavu](https://github.com/gavu)
# 4.6.11
- A debug page at `/debug` for easier debug.
- Strings translatable (see [issue 976](https://github.com/firefly-iii/firefly-iii/issues/976)), thanks to [Findus23](https://github.com/Findus23)
- Even more strings are translatable (and translated), thanks to [pkoziol](https://github.com/pkoziol) (see [issue 979](https://github.com/firefly-iii/firefly-iii/issues/979))
- Reconciliation of accounts ([issue 736](https://github.com/firefly-iii/firefly-iii/issues/736)), as requested by [kristophr](https://github.com/kristophr) and several others
- Extended currency list, as suggested by @emuhendis in [issue 994](https://github.com/firefly-iii/firefly-iii/issues/994)
- [Issue 996](https://github.com/firefly-iii/firefly-iii/issues/996) as suggested by [dp87](https://github.com/dp87)
- Disabled Heroku support until I get it working again.
- [Issue 980](https://github.com/firefly-iii/firefly-iii/issues/980), reported by [Tim-Frensch](https://github.com/Tim-Frensch)
- [Issue 987](https://github.com/firefly-iii/firefly-iii/issues/987), reported by [gavu](https://github.com/gavu)
- [Issue 988](https://github.com/firefly-iii/firefly-iii/issues/988), reported by [gavu](https://github.com/gavu)
- [Issue 992](https://github.com/firefly-iii/firefly-iii/issues/992), reported by [ncicovic](https://github.com/ncicovic)
- [Issue 993](https://github.com/firefly-iii/firefly-iii/issues/993), reported by [gavu](https://github.com/gavu)
- [Issue 997](https://github.com/firefly-iii/firefly-iii/issues/997), reported by [gavu](https://github.com/gavu)
- [Issue 1000](https://github.com/firefly-iii/firefly-iii/issues/1000), reported by [xpfgsyb](https://github.com/xpfgsyb)
- [Issue 1001](https://github.com/firefly-iii/firefly-iii/issues/1001), reported by [gavu](https://github.com/gavu)
- [Issue 1002](https://github.com/firefly-iii/firefly-iii/issues/1002), reported by [ursweiss](https://github.com/ursweiss)
- [Issue 1003](https://github.com/firefly-iii/firefly-iii/issues/1003), reported by [ursweiss](https://github.com/ursweiss)
- [Issue 1004](https://github.com/firefly-iii/firefly-iii/issues/1004), reported by [Aquariu](https://github.com/Aquariu)
- [Issue 1010](https://github.com/firefly-iii/firefly-iii/issues/1010)
- [Issue 1014](https://github.com/firefly-iii/firefly-iii/issues/1014), reported by [ursweiss](https://github.com/ursweiss)
- [Issue 1016](https://github.com/firefly-iii/firefly-iii/issues/1016)
- [Issue 1024](https://github.com/firefly-iii/firefly-iii/issues/1024), reported by [gavu](https://github.com/gavu)
- [Issue 1025](https://github.com/firefly-iii/firefly-iii/issues/1025), reported by [gavu](https://github.com/gavu)
# 4.6.10
- Greatly expanded Docker support thanks to [alazare619](https://github.com/alazare619)
- [Issue 967](https://github.com/firefly-iii/firefly-iii/issues/967), thanks to [Aquariu](https://github.com/Aquariu)
- Improved Sandstorm support.
- [Issue 963](https://github.com/firefly-iii/firefly-iii/issues/963), as reported by [gavu](https://github.com/gavu)
- [Issue 970](https://github.com/firefly-iii/firefly-iii/issues/970), as reported by [gavu](https://github.com/gavu)
- [Issue 971](https://github.com/firefly-iii/firefly-iii/issues/971), as reported by [gavu](https://github.com/gavu)
- Various Sandstorm.io related issues.
# 4.6.9.1
- Updated license
- Updated file list
# 4.6.9
- First version that works!
# 3.4.3
- Initial release on Sandstorm.io

View File

@@ -1,3 +0,0 @@
"Firefly III" is a financial manager. It can help you keep track of expenses, income, budgets and everything in between. It even supports credit cards, shared household accounts and savings accounts! Its pretty fancy. You should use it to save and organise money.
Firefly works on the principle that if you know where youre money is going, you can stop it from going there.

View File

@@ -1,48 +0,0 @@
#!/bin/bash
set -euo pipefail
# Set options for curl. Since we only want to show errors from these curl commands, we also use
# 'cat' to buffer the output; for more information:
# https://github.com/sandstorm-io/vagrant-spk/issues/158
CURL_OPTS="--silent --show-error"
echo localhost > /etc/hostname
hostname localhost
# Install curl that is needed below.
apt-get update
apt-get install -y curl
# The following line copies stderr through stderr to cat without accidentally leaving it in the
# output file. Be careful when changing. See: https://github.com/sandstorm-io/vagrant-spk/pull/159
curl $CURL_OPTS https://install.sandstorm.io/ 2>&1 > /host-dot-sandstorm/caches/install.sh | cat
SANDSTORM_CURRENT_VERSION=$(curl $CURL_OPTS -f "https://install.sandstorm.io/dev?from=0&type=install")
SANDSTORM_PACKAGE="sandstorm-$SANDSTORM_CURRENT_VERSION.tar.xz"
if [[ ! -f /host-dot-sandstorm/caches/$SANDSTORM_PACKAGE ]] ; then
echo -n "Downloading Sandstorm version ${SANDSTORM_CURRENT_VERSION}..."
curl $CURL_OPTS --output "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "https://dl.sandstorm.io/$SANDSTORM_PACKAGE" 2>&1 | cat
mv "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE"
echo "...done."
fi
if [ ! -e /opt/sandstorm/latest/sandstorm ] ; then
echo -n "Installing Sandstorm version ${SANDSTORM_CURRENT_VERSION}..."
bash /host-dot-sandstorm/caches/install.sh -d -e "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" >/dev/null
echo "...done."
fi
modprobe ip_tables
# Make the vagrant user part of the sandstorm group so that commands like
# `spk dev` work.
usermod -a -G 'sandstorm' 'vagrant'
# Bind to all addresses, so the vagrant port-forward works.
sudo sed --in-place='' \
--expression='s/^BIND_IP=.*/BIND_IP=0.0.0.0/' \
/opt/sandstorm/sandstorm.conf
sudo service sandstorm restart
# Enable apt-cacher-ng proxy to make things faster if one appears to be running on the gateway IP
GATEWAY_IP=$(ip route | grep ^default | cut -d ' ' -f 3)
if nc -z "$GATEWAY_IP" 3142 ; then
echo "Acquire::http::Proxy \"http://$GATEWAY_IP:3142\";" > /etc/apt/apt.conf.d/80httpproxy
fi
# Configure apt to retry fetching things that fail to download.
echo "APT::Acquire::Retries \"10\";" > /etc/apt/apt.conf.d/80sandstorm-retry

View File

@@ -1,66 +0,0 @@
#!/bin/bash
# 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
mkdir -p /var/lib/mysql
mkdir -p /var/lib/nginx
mkdir -p /var/lib/php/sessions/
mkdir -p /var/log
mkdir -p /var/log/mysql
mkdir -p /var/log/nginx
# Wipe /var/run, since pidfiles and socket files from previous launches should go away
# TODO someday: I'd prefer a tmpfs for these.
rm -rf /var/run
mkdir -p /var/run
rm -rf /var/tmp
mkdir -p /var/tmp
mkdir -p /var/run/mysqld
# make storage directories
rm -rf /var/storage
mkdir -p /var/storage/app/public
mkdir -p /var/storage/build
mkdir -p /var/storage/database
mkdir -p /var/storage/debugbar
mkdir -p /var/storage/export
mkdir -p /var/storage/framework/cache
mkdir -p /var/storage/framework/sessions
mkdir -p /var/storage/framework/views
mkdir -p /var/storage/logs
mkdir -p /var/storage/upload
# Ensure mysql tables created
HOME=/etc/mysql /usr/bin/mysql_install_db --force
# Spawn mysqld, php
HOME=/etc/mysql /usr/sbin/mysqld &
/usr/sbin/php-fpm7.1 --nodaemonize --fpm-config /etc/php/7.1/fpm/php-fpm.conf &
# Wait until mysql and php have bound their sockets, indicating readiness
while [ ! -e /var/run/mysqld/mysqld.sock ] ; do
echo "waiting for mysql to be available at /var/run/mysqld/mysqld.sock"
sleep .5
done
while [ ! -e /var/run/php7.1-fpm.sock ] ; do
echo "waiting for php7.1-fpm to be available at /var/run/php7.1-fpm.sock"
sleep .5
done
echo "Installing database.."
# Install database for Firefly III
echo "CREATE DATABASE IF NOT EXISTS firefly; GRANT ALL on firefly.* TO 'firefly'@'localhost' IDENTIFIED BY 'firefly';" | mysql -uroot
echo "Done!"
echo "Migrating..."
php /opt/app/artisan migrate --seed --force
echo "Done!"
echo "Clear cache.."
php /opt/app/artisan cache:clear
echo "Done"
# Start nginx.
/usr/sbin/nginx -c /opt/app/.sandstorm/service-config/nginx.conf -g "daemon off;"

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,187 +0,0 @@
@0xb0032512fca90cd9;
using Spk = import "/sandstorm/package.capnp";
# This imports:
# $SANDSTORM_HOME/latest/usr/include/sandstorm/package.capnp
# Check out that file to see the full, documented package definition format.
const pkgdef :Spk.PackageDefinition = (
# The package definition. Note that the spk tool looks specifically for the
# "pkgdef" constant.
id = "uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70",
# Your app ID is actually its public key. The private key was placed in
# your keyring. All updates must be signed with the same key.
manifest = (
appTitle = (defaultText = "Firefly III"),
appVersion = 16,
appMarketingVersion = (defaultText = "4.7.6.1"),
actions = [
# Define your "new document" handlers here.
( nounPhrase = (defaultText = "administration"),
command = .myCommand
# The command to run when starting for the first time. (".myCommand"
# is just a constant defined at the bottom of the file.)
)
],
continueCommand = .myCommand,
# This is the command called to start your app back up after it has been
# shut down for inactivity. Here we're using the same command as for
# starting a new instance, but you could use different commands for each
# case.
metadata = (
icons = (
appGrid = (png = (dpi1x = embed "app-graphics/firefly-iii-128.png")),
grain = (png = (dpi1x = embed "app-graphics/firefly-iii-24.png",
dpi2x = embed "app-graphics/firefly-iii-48.png")),
market = (png = (dpi1x = embed "app-graphics/firefly-iii-150.png"))
),
website = "https://firefly-iii.org/",
codeUrl = "https://github.com/firefly-iii/firefly-iii",
license = (openSource = gpl3),
# The license this package is distributed under. See
# https://docs.sandstorm.io/en/latest/developing/publishing-apps/#license
categories = [productivity],
# A list of categories/genres to which this app belongs, sorted with best fit first.
# See the list of categories at
# https://docs.sandstorm.io/en/latest/developing/publishing-apps/#categories
author = (
contactEmail = "thegrumpydictator@gmail.com",
pgpSignature = embed "pgp-signature",
),
pgpKeyring = embed "pgp-keyring",
description = (defaultText = embed "description.md"),
shortDescription = (defaultText = "Financial management"),
screenshots = [
# Screenshots to use for marketing purposes. Examples below.
# Sizes are given in device-independent pixels, so if you took these
# screenshots on a Retina-style high DPI screen, divide each dimension by two.
(width = 1290, height = 800, png = embed "screenshots/screenshot-1.png"),
(width = 1290, height = 800, png = embed "screenshots/screenshot-2.png"),
(width = 1290, height = 800, png = embed "screenshots/screenshot-3.png"),
],
changeLog = (defaultText = embed "changelog.md"),
),
),
sourceMap = (
# Here we defined where to look for files to copy into your package. The
# `spk dev` command actually figures out what files your app needs
# automatically by running it on a FUSE filesystem. So, the mappings
# here are only to tell it where to find files that the app wants.
searchPath = [
( sourcePath = "." ), # Search this directory first.
( sourcePath = "/", # Then search the system root directory.
hidePaths = [ "home", "proc", "sys",
"etc/passwd", "etc/hosts", "etc/host.conf",
"etc/nsswitch.conf", "etc/resolv.conf" ]
# You probably don't want the app pulling files from these places,
# so we hide them. Note that /dev, /var, and /tmp are implicitly
# hidden because Sandstorm itself provides them.
)
]
),
fileList = "sandstorm-files.list",
# `spk dev` will write a list of all the files your app uses to this file.
# You should review it later, before shipping your app.
alwaysInclude = ["opt/app/app","opt/app/bootstrap","opt/app/config","opt/app/database","opt/app/public","opt/app/resources","opt/app/routes","opt/app/vendor"],
# Fill this list with more names of files or directories that should be
# included in your package, even if not listed in sandstorm-files.list.
# Use this to force-include stuff that you know you need but which may
# not have been detected as a dependency during `spk dev`. If you list
# a directory here, its entire contents will be included recursively.
#bridgeConfig = (
# # Used for integrating permissions and roles into the Sandstorm shell
# # and for sandstorm-http-bridge to pass to your app.
# # Uncomment this block and adjust the permissions and roles to make
# # sense for your app.
# # For more information, see high-level documentation at
# # https://docs.sandstorm.io/en/latest/developing/auth/
# # and advanced details in the "BridgeConfig" section of
# # https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/package.capnp
# viewInfo = (
# # For details on the viewInfo field, consult "ViewInfo" in
# # https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/grain.capnp
#
# permissions = [
# # Permissions which a user may or may not possess. A user's current
# # permissions are passed to the app as a comma-separated list of `name`
# # fields in the X-Sandstorm-Permissions header with each request.
# #
# # IMPORTANT: only ever append to this list! Reordering or removing fields
# # will change behavior and permissions for existing grains! To deprecate a
# # permission, or for more information, see "PermissionDef" in
# # https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/grain.capnp
# (
# name = "editor",
# # Name of the permission, used as an identifier for the permission in cases where string
# # names are preferred. Used in sandstorm-http-bridge's X-Sandstorm-Permissions HTTP header.
#
# title = (defaultText = "editor"),
# # Display name of the permission, e.g. to display in a checklist of permissions
# # that may be assigned when sharing.
#
# description = (defaultText = "grants ability to modify data"),
# # Prose describing what this role means, suitable for a tool tip or similar help text.
# ),
# ],
# roles = [
# # Roles are logical collections of permissions. For instance, your app may have
# # a "viewer" role and an "editor" role
# (
# title = (defaultText = "editor"),
# # Name of the role. Shown in the Sandstorm UI to indicate which users have which roles.
#
# permissions = [true],
# # An array indicating which permissions this role carries.
# # It should be the same length as the permissions array in
# # viewInfo, and the order of the lists must match.
#
# verbPhrase = (defaultText = "can make changes to the document"),
# # Brief explanatory text to show in the sharing UI indicating
# # what a user assigned this role will be able to do with the grain.
#
# description = (defaultText = "editors may view all site data and change settings."),
# # Prose describing what this role means, suitable for a tool tip or similar help text.
# ),
# (
# title = (defaultText = "viewer"),
# permissions = [false],
# verbPhrase = (defaultText = "can view the document"),
# description = (defaultText = "viewers may view what other users have written."),
# ),
# ],
# ),
# #apiPath = "/api",
# # Apps can export an API to the world. The API is to be used primarily by Javascript
# # code and native apps, so it can't serve out regular HTML to browsers. If a request
# # comes in to your app's API, sandstorm-http-bridge will prefix the request's path with
# # this string, if specified.
#),
);
const myCommand :Spk.Manifest.Command = (
# Here we define the command used to start up your server.
argv = ["/sandstorm-http-bridge", "8000", "--", "/bin/bash", "/opt/app/.sandstorm/launcher.sh"],
environ = [
# Note that this defines the *entire* environment seen by your app.
(key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"),
(key = "SANDSTORM", value = "1"),
# Export SANDSTORM=1 into the environment, so that apps running within Sandstorm
# can detect if $SANDSTORM="1" at runtime, switching UI and/or backend to use
# the app's Sandstorm-specific integration code.
]
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -1,89 +0,0 @@
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}

View File

@@ -1,88 +0,0 @@
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
# Basic Settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_names_hash_bucket_size 64;
server_tokens off;
server_name_in_redirect off;
include mime.types;
default_type application/octet-stream;
# Logging
access_log off;
error_log stderr;
# Prevent nginx from adding compression; this interacts badly with Sandstorm
# WebSession due to https://github.com/sandstorm-io/sandstorm/issues/289
gzip off;
# Trust the sandstorm-http-bridge's X-Forwarded-Proto.
map $http_x_forwarded_proto $fe_https {
default "";
https on;
}
server {
listen 8000 default_server;
listen [::]:8000 default_server ipv6only=on;
# Allow arbitrarily large bodies - Sandstorm can handle them, and requests
# are authenticated already, so there's no reason for apps to add additional
# limits by default.
client_max_body_size 0;
server_name localhost;
root /opt/app/public;
location / {
index index.php;
try_files $uri $uri/ /index.php?$query_string;
autoindex on;
sendfile off;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php7.1-fpm.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 900;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $fe_https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;
}
}
}

View File

@@ -1,88 +0,0 @@
#!/bin/bash
# When you change this file, you must take manual action. Read this doc:
# - https://docs.sandstorm.io/en/latest/vagrant-spk/customizing/#setupsh
echo "Now in setup.sh"
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
# install packages so we can install apt-add-repository.
apt-get update
apt-get install -y python-software-properties software-properties-common
# 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/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# it_IT.UTF-8 UTF-8/it_IT.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/# pt_BR.UTF-8 UTF-8/pt_BR.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
# actually add repository
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9C74FEEA2098A6E
add-apt-repository "deb http://packages.dotdeb.org jessie all"
# add another repos
apt-get install -y apt-transport-https lsb-release ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
# install packages.
apt-get update
apt-get install -y nginx php7.1-fpm php7.1-mysql php7.1-gd php7.1-cli php7.1-curl git php7.1-dev php7.1-zip php7.1-intl php7.1-dom php7.1-mbstring php7.1-bcmath mysql-server
service nginx stop
service php7.1-fpm stop
service mysql stop
systemctl disable nginx
systemctl disable php7.1-fpm
systemctl disable mysql
# make php.ini display errors:
sed -i 's/display_errors = Off/display_errors = On/g' /etc/php/7.1/fpm/php.ini
# patch /etc/php/7.1/fpm/pool.d/www.conf to not change uid/gid to www-data
sed --in-place='' \
--expression='s/^listen.owner = www-data/;listen.owner = www-data/' \
--expression='s/^listen.group = www-data/;listen.group = www-data/' \
/etc/php/7.1/fpm/pool.d/www.conf
# patch /etc/php/7.1/fpm/php-fpm.conf to not have a pidfile
sed --in-place='' \
--expression='s/^pid =/;pid =/' \
/etc/php/7.1/fpm/php-fpm.conf
# move sock file to better dir:
sed --in-place='' \
--expression='s/^listen = \/run\/php\/php7.1-fpm.sock/listen = \/var\/run\/php7.1-fpm.sock/' \
/etc/php/7.1/fpm/pool.d/www.conf
# patch /etc/php/7.1/fpm/pool.d/www.conf to no clear environment variables
# so we can pass in SANDSTORM=1 to apps
sed --in-place='' \
--expression='s/^;clear_env = no/clear_env=no/' \
/etc/php/7.1/fpm/pool.d/www.conf
# patch mysql conf to not change uid, and to use /var/tmp over /tmp
# for secure-file-priv see https://github.com/sandstorm-io/vagrant-spk/issues/195
sed --in-place='' \
--expression='s/^user\t\t= mysql/#user\t\t= mysql/' \
--expression='s,^tmpdir\t\t= /tmp,tmpdir\t\t= /var/tmp,' \
--expression='/\[mysqld]/ a\ secure-file-priv = ""\' \
/etc/mysql/my.cnf
# patch mysql conf to use smaller transaction logs to save disk space
cat <<EOF > /etc/mysql/conf.d/sandstorm.cnf
[mysqld]
# Set the transaction log file to the minimum allowed size to save disk space.
# innodb_log_file_size = 1048576
# Set the main data file to grow by 1MB at a time, rather than 8MB at a time.
innodb_autoextend_increment = 1
EOF

View File

@@ -1 +0,0 @@
lemp

View File

@@ -1,29 +0,0 @@
language: php
php:
- 7.1.18
cache:
directories:
- vendor
- $HOME/.composer/cache
install:
- rm composer.lock
- composer update --no-scripts
- cp .env.testing .env
- php artisan clear-compiled
- php artisan env
- wget -q https://github.com/firefly-iii/test-data/raw/master/storage/database.sqlite -O storage/database/database.sqlite
- mkdir -p build/logs
script:
- ./vendor/bin/phpunit -c phpunit.coverage.xml
after_success:
- travis_retry php vendor/bin/php-coveralls -x storage/build/clover-all.xml
# safelist
branches:
only:
- develop
- master

661
COPYING Normal file
View File

@@ -0,0 +1,661 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.

View File

@@ -1,116 +0,0 @@
FROM php:7.1-apache
# If building on a RPi, use --build-arg cores=3 to use all cores when compiling
# to speed up the image build
ARG CORES
ENV CORES ${CORES:-1}
ENV FIREFLY_PATH /var/www/firefly-iii/
ENV CURL_VERSION 7.60.0
ENV OPENSSL_VERSION 1.1.1-pre6
LABEL version="1.0" maintainer="thegrumpydictator@gmail.com"
# install packages
RUN apt-get update -y && \
apt-get install -y --no-install-recommends libcurl4-openssl-dev \
zlib1g-dev \
libjpeg62-turbo-dev \
wget \
libpng-dev \
libicu-dev \
libedit-dev \
libtidy-dev \
libxml2-dev \
unzip \
libsqlite3-dev \
nano \
libpq-dev \
libbz2-dev \
gettext-base \
cron \
rsyslog \
supervisor \
locales && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Install latest curl
RUN cd /tmp && \
wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \
tar -xvf openssl-${OPENSSL_VERSION}.tar.gz && \
cd openssl-${OPENSSL_VERSION} && \
./config && \
make -j${CORES} && \
make install
RUN cd /tmp && \
wget https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz && \
tar -xvf curl-${CURL_VERSION}.tar.gz && \
cd curl-${CURL_VERSION} && \
./configure --with-ssl --host=$(gcc -dumpmachine) && \
make -j${CORES} && \
make install
# Make sure that libcurl is using the newer curl libaries
RUN echo "/usr/local/lib" >> /etc/ld.so.conf.d/00-curl.conf && ldconfig
# Mimic the Debian/Ubuntu config file structure for supervisor
COPY .deploy/docker/supervisord.conf /etc/supervisor/supervisord.conf
RUN mkdir -p /etc/supervisor/conf.d /var/log/supervisor
# Fix the link to curl:
RUN rm -rf /usr/local/lib/libcurl.so.4 && ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 /usr/local/lib/libcurl.so.4
# copy Firefly III supervisor conf file.
COPY ./.deploy/docker/firefly-iii.conf /etc/supervisor/conf.d/firefly-iii.conf
# copy cron job supervisor conf file.
COPY ./.deploy/docker/cronjob.conf /etc/supervisor/conf.d/cronjob.conf
# test crons added via crontab
RUN echo "0 3 * * * /usr/local/bin/php /var/www/firefly-iii/artisan firefly:cron" | crontab -
#RUN (crontab -l ; echo "*/1 * * * * free >> /var/www/firefly-iii/public/cron.html") 2>&1 | crontab -
# Install PHP exentions.
RUN docker-php-ext-install -j$(nproc) gd intl tidy zip bcmath pdo_mysql bz2 pdo_pgsql
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Generate locales supported by Firefly III
RUN echo "en_US.UTF-8 UTF-8\nde_DE.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\n\n" > /etc/locale.gen && locale-gen
# copy Apache config to correct spot.
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
# Enable apache mod rewrite..
RUN a2enmod rewrite
# Enable apache mod ssl..
RUN a2enmod ssl
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Enable default site (Firefly III)
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
# Make sure we own Firefly III directory
RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage
# Copy in Firefly Source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# Run composer
ENV COMPOSER_ALLOW_SUPERUSER 1
RUN composer install --prefer-dist --no-dev --no-scripts --no-suggest
# Expose port 80
EXPOSE 80
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

141
LICENSE
View File

@@ -1,5 +1,5 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@@ -7,17 +7,15 @@
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
@@ -72,7 +60,7 @@ modification follow.
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -51,6 +51,9 @@
"buildpacks": [
{
"url": "heroku/php"
},
{
"url": "https://github.com/heroku/heroku-buildpack-locale"
}
],
"env": {

View File

@@ -2,22 +2,22 @@
/**
* AboutController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -27,14 +27,12 @@ namespace FireflyIII\Api\V1\Controllers;
use DB;
use FireflyIII\Transformers\UserTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use League\Fractal\Manager;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
/**
* Returns basic information about this installation.
*
* @codeCoverageIgnore
* Class AboutController.
*/
class AboutController extends Controller
@@ -51,8 +49,10 @@ class AboutController extends Controller
$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,
@@ -60,22 +60,23 @@ class AboutController extends Controller
'driver' => $currentDriver,
];
return response()->json(['data' => $data], 200)->header('Content-Type', 'application/vnd.api+json');
return response()->json(['data' => $data])->header('Content-Type', 'application/vnd.api+json');
}
/**
* Returns information about the user.
*
* @param Request $request
*
* @return JsonResponse
*/
public function user(Request $request): JsonResponse
public function user(): JsonResponse
{
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item(auth()->user(), new UserTransformer($this->parameters), 'users');
$manager = $this->getManager();
/** @var UserTransformer $transformer */
$transformer = app(UserTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item(auth()->user(), $transformer, 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}

View File

@@ -1,58 +1,62 @@
<?php
/**
* AccountController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\AccountRequest;
use FireflyIII\Api\V1\Requests\AccountStoreRequest;
use FireflyIII\Api\V1\Requests\AccountUpdateRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AccountTransformer;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\PiggyBankTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Manager;
use Illuminate\Support\Collection;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
/**
* Class AccountController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class AccountController extends Controller
{
/** @var CurrencyRepositoryInterface The currency repository */
private $currencyRepository;
use AccountFilter, TransactionFilter;
/** @var AccountRepositoryInterface The account repository */
private $repository;
/**
* AccountController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -65,19 +69,46 @@ class AccountController extends Controller
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->currencyRepository->setUser($user);
return $next($request);
}
);
}
/**
* @param Account $account
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function attachments(Account $account): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAttachments($account);
$count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.accounts.attachments', [$account->id]) . $this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Remove the specified resource from storage.
*
* @param \FireflyIII\Models\Account $account
* @param Account $account
*
* @codeCoverageIgnore
* @return JsonResponse
*/
public function delete(Account $account): JsonResponse
@@ -92,21 +123,18 @@ class AccountController extends Controller
*
* @param Request $request
*
* @codeCoverageIgnore
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// read type from URI
$type = $request->get('type') ?? 'all';
$manager = $this->getManager();
$type = $request->get('type') ?? 'all';
$this->parameters->set('type', $type);
// types to get, page size:
$types = $this->mapTypes($this->parameters->get('type'));
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$types = $this->mapAccountTypes($this->parameters->get('type'));
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of accounts. Count it and split it.
$collection = $this->repository->getAccountsByType($types);
@@ -117,33 +145,70 @@ class AccountController extends Controller
$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');
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($accounts, $transformer, 'accounts');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all piggies.
*
* @param Account $account
*
* @return JsonResponse
* @codeCoverageIgnore
*
*/
public function piggyBanks(Account $account): JsonResponse
{
// create some objects:
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.accounts.piggy_banks', [$account->id]) . $this->buildParams());
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show single instance.
*
* @param Request $request
* @param Account $account
*
* @return \Illuminate\Http\JsonResponse
* @return JsonResponse
*/
public function show(Request $request, Account $account): JsonResponse
public function show(Account $account): JsonResponse
{
$manager = new Manager;
$manager = $this->getManager();
// 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');
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, 'accounts');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -151,24 +216,72 @@ class AccountController extends Controller
/**
* Store a new instance.
*
* @param AccountRequest $request
* @param AccountStoreRequest $request
*
* @return \Illuminate\Http\JsonResponse
* @return JsonResponse
*/
public function store(AccountRequest $request): JsonResponse
public function store(AccountStoreRequest $request): JsonResponse
{
$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'] = null === $currency ? 0 : $currency->id;
}
$data = $request->getAllAccountData();
$account = $this->repository->store($data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, 'accounts');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transaction groups related to the account.
*
* @codeCoverageIgnore
*
* @param Request $request
* @param Account $account
*
* @return JsonResponse
*
*/
public function transactions(Request $request, Account $account): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
// user can overrule page size with limit parameter.
$limit = $this->parameters->get('limit');
if (null !== $limit && $limit > 0) {
$pageSize = $limit;
}
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setUser($admin)->setAccounts(new Collection([$account]))
->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.accounts.transactions', [$account->id]) . $this->buildParams());
$groups = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($groups, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -176,76 +289,23 @@ class AccountController extends Controller
/**
* Update account.
*
* @param AccountRequest $request
* @param Account $account
* @param AccountUpdateRequest $request
* @param Account $account
*
* @return \Illuminate\Http\JsonResponse
* @return JsonResponse
*/
public function update(AccountRequest $request, Account $account): JsonResponse
public function update(AccountUpdateRequest $request, Account $account): JsonResponse
{
$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'] = null === $currency ? 0 : $currency->id;
}
// set correct type:
$data = $request->getUpdateData();
$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));
$manager = $this->getManager();
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, 'accounts');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* All the available types.
*
* @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,],
'liability' => [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD],
'liabilities' => [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD],
'cc' => [AccountType::CREDITCARD],
'creditcard' => [AccountType::CREDITCARD],
'credit_card' => [AccountType::CREDITCARD],
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],
AccountType::MORTGAGE => [AccountType::MORTGAGE],
AccountType::DEBT => [AccountType::DEBT],
AccountType::CREDITCARD => [AccountType::CREDITCARD],
];
$return = $types['all'];
if (isset($types[$type])) {
$return = $types[$type];
}
return $return; // @codeCoverageIgnore
}
}

View File

@@ -1,31 +1,34 @@
<?php
/**
* AttachmentController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\AttachmentRequest;
use FireflyIII\Api\V1\Middleware\ApiDemoUser;
use FireflyIII\Api\V1\Requests\AttachmentStoreRequest;
use FireflyIII\Api\V1\Requests\AttachmentUpdateRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer;
@@ -34,16 +37,15 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response as LaravelResponse;
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 Log;
use function strlen;
/**
* Class AttachmentController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class AttachmentController extends Controller
{
@@ -52,10 +54,13 @@ class AttachmentController extends Controller
/**
* AccountController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(ApiDemoUser::class)->except(['delete', 'download', 'show', 'index']);
$this->middleware(
function ($request, $next) {
/** @var User $user */
@@ -63,6 +68,7 @@ class AttachmentController extends Controller
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
@@ -71,6 +77,8 @@ class AttachmentController extends Controller
/**
* Remove the specified resource from storage.
*
* @codeCoverageIgnore
*
* @param Attachment $attachment
*
* @return JsonResponse
@@ -87,20 +95,27 @@ class AttachmentController extends Controller
*
* @param Attachment $attachment
*
* @codeCoverageIgnore
* @throws FireflyException
* @return LaravelResponse
* @throws FireflyException
*/
public function download(Attachment $attachment): LaravelResponse
{
if (false === $attachment->uploaded) {
throw new FireflyException('No file has been uploaded for this attachment (yet).');
throw new FireflyException('200000: File has not been uploaded (yet).');
}
if (0 === $attachment->size) {
throw new FireflyException('200000: File has not been uploaded (yet).');
}
if ($this->repository->exists($attachment)) {
$content = $this->repository->getContent($attachment);
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
if ('' === $content) {
throw new FireflyException('200002: File is empty (zero bytes).');
}
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
/** @var LaravelResponse $response */
$response = response($content, 200);
$response = response($content);
$response
->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream')
@@ -110,28 +125,25 @@ class AttachmentController extends Controller
->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public')
->header('Content-Length', \strlen($content));
->header('Content-Length', strlen($content));
return $response;
}
throw new FireflyException('Could not find the indicated attachment. The file is no longer there.');
throw new FireflyException('200003: File does not exist.');
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of accounts. Count it and split it.
$collection = $this->repository->get();
@@ -142,9 +154,11 @@ class AttachmentController extends Controller
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.attachments.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($attachments, new AttachmentTransformer($this->parameters), 'attachments');
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -153,22 +167,18 @@ class AttachmentController extends Controller
/**
* Display the specified resource.
*
* @param Request $request
* @param Attachment $attachment
*
* @return JsonResponse
*/
public function show(Request $request, Attachment $attachment): JsonResponse
public function show(Attachment $attachment): JsonResponse
{
$manager = new Manager;
$manager = $this->getManager();
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments');
$resource = new Item($attachment, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -176,19 +186,22 @@ class AttachmentController extends Controller
/**
* Store a newly created resource in storage.
*
* @param AttachmentRequest $request
* @param AttachmentStoreRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(AttachmentRequest $request): JsonResponse
public function store(AttachmentStoreRequest $request): JsonResponse
{
$data = $request->getAll();
$attachment = $this->repository->store($data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments');
$manager = $this->getManager();
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -196,20 +209,22 @@ class AttachmentController extends Controller
/**
* Update the specified resource in storage.
*
* @param AttachmentRequest $request
* @param Attachment $attachment
* @param AttachmentUpdateRequest $request
* @param Attachment $attachment
*
* @return JsonResponse
*/
public function update(AttachmentRequest $request, Attachment $attachment): JsonResponse
public function update(AttachmentUpdateRequest $request, Attachment $attachment): JsonResponse
{
$data = $request->getAll();
$this->repository->update($attachment, $data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments');
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -217,6 +232,8 @@ class AttachmentController extends Controller
/**
* Upload an attachment.
*
* @codeCoverageIgnore
*
* @param Request $request
* @param Attachment $attachment
*
@@ -227,6 +244,11 @@ class AttachmentController extends Controller
/** @var AttachmentHelperInterface $helper */
$helper = app(AttachmentHelperInterface::class);
$body = $request->getContent();
if ('' === $body) {
Log::error('Body of attachment is empty.');
return response()->json([], 422);
}
$helper->saveAttachmentFromApi($attachment, $body);
return response()->json([], 204);

View File

@@ -1,22 +1,22 @@
<?php
/**
* AvailableBudgetController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -24,35 +24,31 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\AvailableBudgetRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Factory\TransactionCurrencyFactory;
use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class AvailableBudgetController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class AvailableBudgetController extends Controller
{
/** @var CurrencyRepositoryInterface The currency repository */
private $currencyRepository;
/** @var BudgetRepositoryInterface The budget repository */
private $repository;
/** @var AvailableBudgetRepositoryInterface */
private $abRepository;
/**
* AccountController constructor.
* AvailableBudgetController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -60,10 +56,9 @@ class AvailableBudgetController extends Controller
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->repository->setUser($user);
$user = auth()->user();
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->abRepository->setUser($user);
return $next($request);
}
@@ -75,11 +70,13 @@ class AvailableBudgetController extends Controller
*
* @param AvailableBudget $availableBudget
*
* @codeCoverageIgnore
*
* @return JsonResponse
*/
public function delete(AvailableBudget $availableBudget): JsonResponse
{
$this->repository->destroyAvailableBudget($availableBudget);
$this->abRepository->destroyAvailableBudget($availableBudget);
return response()->json([], 204);
}
@@ -87,21 +84,21 @@ class AvailableBudgetController extends Controller
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$start = $this->parameters->get('start');
$end = $this->parameters->get('end');
// get list of available budgets. Count it and split it.
$collection = $this->repository->getAvailableBudgets();
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
@@ -109,9 +106,11 @@ class AvailableBudgetController extends Controller
$paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.available_budgets.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($availableBudgets, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -120,23 +119,20 @@ class AvailableBudgetController extends Controller
/**
* Display the specified resource.
*
* @param Request $request
* @param AvailableBudget $availableBudget
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, AvailableBudget $availableBudget): JsonResponse
public function show(AvailableBudget $availableBudget): JsonResponse
{
$manager = $this->getManager();
$manager = new Manager;
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
$resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -147,30 +143,31 @@ class AvailableBudgetController extends Controller
* @param AvailableBudgetRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(AvailableBudgetRequest $request): JsonResponse
{
$data = $request->getAll();
$currency = $this->currencyRepository->findNull($data['currency_id']);
if (null === $currency) {
$currency = $this->currencyRepository->findByCodeNull($data['currency_code']);
}
if (null === $currency) {
throw new FireflyException('Could not find the indicated currency.');
}
$availableBudget = $this->repository->setAvailableBudget($currency, $data['start_date'], $data['end_date'], $data['amount']);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$data = $request->getAll();
/** @var TransactionCurrencyFactory $factory */
$factory = app(TransactionCurrencyFactory::class);
$currency = $factory->find($data['currency_id'], $data['currency_code']);
$resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
if (null === $currency) {
$currency = app('amount')->getDefaultCurrency();
}
$data['currency'] = $currency;
$availableBudget = $this->abRepository->store($data);
$manager = $this->getManager();
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the specified resource in storage.
*
@@ -182,12 +179,30 @@ class AvailableBudgetController extends Controller
public function update(AvailableBudgetRequest $request, AvailableBudget $availableBudget): JsonResponse
{
$data = $request->getAll();
$this->repository->updateAvailableBudget($availableBudget, $data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
/** @var TransactionCurrencyFactory $factory */
$factory = app(TransactionCurrencyFactory::class);
/** @var TransactionCurrency $currency */
$currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null);
if (null === $currency) {
// use default currency:
$currency = app('amount')->getDefaultCurrency();
}
$currency->enabled = true;
$currency->save();
unset($data['currency_code']);
$data['currency_id'] = $currency->id;
$this->abRepository->updateAvailableBudget($availableBudget, $data);
$manager = $this->getManager();
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -2,22 +2,22 @@
/**
* BillController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -26,29 +26,36 @@ namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\BillRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\BillTransformer;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use League\Fractal\Manager;
use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
/**
* Class BillController.
*
*/
class BillController extends Controller
{
use TransactionFilter;
/** @var BillRepositoryInterface The bill repository */
private $repository;
/**
* BillController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -68,11 +75,43 @@ class BillController extends Controller
}
/**
* Remove the specified resource from storage.
* Display a listing of the resource.
*
* @param Bill $bill
* @param Bill $bill
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function attachments(Bill $bill): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAttachments($bill);
$count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.bills.attachments', [$bill->id]) . $this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Remove the specified resource from storage.
*
* @param Bill $bill
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Bill $bill): JsonResponse
{
@@ -84,47 +123,80 @@ class BillController extends Controller
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$paginator = $this->repository->getPaginator($pageSize);
/** @var Collection $bills */
$bills = $paginator->getCollection();
$bills = $this->repository->getBills();
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$count = $bills->count();
$bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($bills, new BillTransformer($this->parameters), 'bills');
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all of them.
*
* @param Bill $bill
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function rules(Bill $bill): JsonResponse
{
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.bills.rules', [$bill->id]) . $this->buildParams());
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show the specified bill.
*
* @param Request $request
* @param Bill $bill
* @param Bill $bill
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Bill $bill): JsonResponse
public function show(Bill $bill): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
$resource = new Item($bill, $transformer, 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -134,25 +206,80 @@ class BillController extends Controller
*
* @param BillRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(BillRequest $request): JsonResponse
{
$bill = $this->repository->store($request->getAll());
if (null !== $bill) {
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$bill = $this->repository->store($request->getAll());
$manager = $this->getManager();
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new bill.'); // @codeCoverageIgnore
$resource = new Item($bill, $transformer, 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions.
*
* @param Request $request
*
* @param Bill $bill
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, Bill $bill): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// include source + destination account name and type.
->setBill($bill)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
// do parameter stuff on new group collector.
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
// get paginator.
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]) . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a bill.
@@ -166,11 +293,13 @@ class BillController extends Controller
{
$data = $request->getAll();
$bill = $this->repository->update($bill, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($bill, $transformer, 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,55 +1,66 @@
<?php
/**
* BudgetController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\BudgetRequest;
use Exception;
use FireflyIII\Api\V1\Requests\BudgetLimitRequest;
use FireflyIII\Api\V1\Requests\BudgetStoreRequest;
use FireflyIII\Api\V1\Requests\BudgetUpdateRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\Transformers\BudgetTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class BudgetController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class BudgetController extends Controller
{
use TransactionFilter;
/** @var BudgetLimitRepositoryInterface */
private $blRepository;
/** @var BudgetRepositoryInterface The budget repository */
private $repository;
/**
* BudgetController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -59,21 +70,82 @@ class BudgetController extends Controller
/** @var User $admin */
$admin = auth()->user();
/** @var BudgetRepositoryInterface repository */
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser($admin);
$this->blRepository->setUser($admin);
return $next($request);
}
);
}
/**
* Display a listing of the resource.
*
* @param Budget $budget
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function budgetLimits(Budget $budget): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$this->parameters->set('budget_id', $budget->id);
$collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
$count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.budget_limits', [$budget->id]) . $this->buildParams());
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param Budget $budget
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function attachments(Budget $budget): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAttachments($budget);
$count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.attachments', [$budget->id]) . $this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Remove the specified resource from storage.
*
* @param Budget $budget
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Budget $budget): JsonResponse
{
@@ -85,18 +157,15 @@ class BudgetController extends Controller
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->getBudgets();
@@ -107,34 +176,33 @@ class BudgetController extends Controller
$paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($budgets, new BudgetTransformer($this->parameters), 'budgets');
/** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgets, $transformer, 'budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a budget.
*
* @param Request $request
* @param Budget $budget
* @param Budget $budget
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Budget $budget): JsonResponse
public function show(Budget $budget): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
/** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets');
$resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -142,44 +210,134 @@ class BudgetController extends Controller
/**
* Store a budget.
*
* @param BudgetRequest $request
* @param BudgetStoreRequest $request
*
* @throws FireflyException
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(BudgetRequest $request): JsonResponse
public function store(BudgetStoreRequest $request): JsonResponse
{
$budget = $this->repository->store($request->getAll());
if (null !== $budget) {
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$budget = $this->repository->store($request->getAll());
$manager = $this->getManager();
$resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets');
/** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new budget.'); // @codeCoverageIgnore
$resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a newly created resource in storage.
*
* @param BudgetLimitRequest $request
* @param Budget $budget
*
* @throws Exception
* @return JsonResponse
*/
public function storeBudgetLimit(BudgetLimitRequest $request, Budget $budget): JsonResponse
{
$data = $request->getAll();
$data['budget'] = $budget;
$budgetLimit = $this->blRepository->storeBudgetLimit($data);
$manager = $this->getManager();
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions.
*
* @param Request $request
*
* @param Budget $budget
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, Budget $budget): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// user can overrule page size with limit parameter.
$limit = $this->parameters->get('limit');
if (null !== $limit && $limit > 0) {
$pageSize = $limit;
}
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on budget.
->setBudget($budget)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]) . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a budget.
*
* @param BudgetRequest $request
* @param Budget $budget
* @param BudgetUpdateRequest $request
* @param Budget $budget
*
* @return JsonResponse
*/
public function update(BudgetRequest $request, Budget $budget): JsonResponse
public function update(BudgetUpdateRequest $request, Budget $budget): JsonResponse
{
$data = $request->getAll();
$budget = $this->repository->update($budget, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets');
/** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,22 +1,22 @@
<?php
/**
* BudgetLimitController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -26,33 +26,38 @@ namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\BudgetLimitRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\BudgetLimit;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
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;
/**
* Class BudgetLimitController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class BudgetLimitController extends Controller
{
use TransactionFilter;
/** @var BudgetLimitRepositoryInterface */
private $blRepository;
/** @var BudgetRepositoryInterface The budget repository */
private $repository;
/**
* AccountController constructor.
* BudgetLimitController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -60,9 +65,11 @@ class BudgetLimitController extends Controller
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->repository->setUser($user);
$this->blRepository->setUser($user);
return $next($request);
}
@@ -75,10 +82,11 @@ class BudgetLimitController extends Controller
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(BudgetLimit $budgetLimit): JsonResponse
{
$this->repository->destroyBudgetLimit($budgetLimit);
$this->blRepository->destroyBudgetLimit($budgetLimit);
return response()->json([], 204);
}
@@ -89,22 +97,22 @@ class BudgetLimitController extends Controller
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
{
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$budgetId = (int)($request->get('budget_id') ?? 0);
$manager = $this->getManager();
$budgetId = (int) ($request->get('budget_id') ?? 0);
$budget = $this->repository->findNull($budgetId);
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$this->parameters->set('budget_id', $budgetId);
$collection = new Collection;
if (null === $budget) {
$collection = $this->repository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
$collection = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
}
if (null !== $budget) {
$collection = $this->repository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
$collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
}
$count = $collection->count();
@@ -112,8 +120,11 @@ class BudgetLimitController extends Controller
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budget_limits.index') . $this->buildParams());
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($budgetLimits, new BudgetLimitTransformer($this->parameters), 'budget_limits');
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -122,22 +133,20 @@ class BudgetLimitController extends Controller
/**
* Display the specified resource.
*
* @param Request $request
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, BudgetLimit $budgetLimit): JsonResponse
public function show(BudgetLimit $budgetLimit): JsonResponse
{
$manager = new Manager;
$manager = $this->getManager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits');
$resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -147,23 +156,79 @@ class BudgetLimitController extends Controller
*
* @param BudgetLimitRequest $request
*
* @return JsonResponse
* @throws FireflyException
*
* @return JsonResponse
*/
public function store(BudgetLimitRequest $request): JsonResponse
{
$data = $request->getAll();
$budget = $this->repository->findNull($data['budget_id']);
if (null === $budget) {
throw new FireflyException('Unknown budget.');
throw new FireflyException('200004: Budget does not exist.'); // @codeCoverageIgnore
}
$data['budget'] = $budget;
$budgetLimit = $this->repository->storeBudgetLimit($data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$budgetLimit = $this->blRepository->storeBudgetLimit($data);
$manager = $this->getManager();
$resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits');
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions.
*
* @param Request $request
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, BudgetLimit $budgetLimit): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on budget.
->setBudget($budgetLimit->budget)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
$collector->setRange($budgetLimit->start_date, $budgetLimit->end_date);
$collector->setTypes($types);
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.budget_limits.transactions', [$budgetLimit->id]) . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -178,18 +243,16 @@ class BudgetLimitController extends Controller
*/
public function update(BudgetLimitRequest $request, BudgetLimit $budgetLimit): JsonResponse
{
$data = $request->getAll();
$budget = $this->repository->findNull($data['budget_id']);
if (null === $budget) {
$budget = $budgetLimit->budget;
}
$data['budget'] = $budget;
$budgetLimit = $this->repository->updateBudgetLimit($budgetLimit, $data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$data = $request->getAll();
$data['budget'] = $budgetLimit->budget;
$budgetLimit = $this->blRepository->updateBudgetLimit($budgetLimit, $data);
$manager = $this->getManager();
$resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits');
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,22 +1,22 @@
<?php
/**
* CategoryController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -25,31 +25,35 @@ namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\CategoryRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\CategoryTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class CategoryController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class CategoryController extends Controller
{
use TransactionFilter;
/** @var CategoryRepositoryInterface The category repository */
private $repository;
/**
* CategoryController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -68,12 +72,42 @@ class CategoryController extends Controller
);
}
/**
* @param Category $category
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function attachments(Category $category): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAttachments($category);
$count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.categories.attachments', [$category->id]) . $this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Remove the specified resource from storage.
*
* @param Category $category
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Category $category): JsonResponse
{
@@ -85,18 +119,15 @@ class CategoryController extends Controller
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->getCategories();
@@ -107,9 +138,12 @@ class CategoryController extends Controller
$paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.categories.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($categories, new CategoryTransformer($this->parameters), 'categories');
/** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($categories, $transformer, 'categories');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -119,22 +153,20 @@ class CategoryController extends Controller
/**
* Show the category.
*
* @param Request $request
* @param Category $category
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Category $category): JsonResponse
public function show(Category $category): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
/** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($category, new CategoryTransformer($this->parameters), 'categories');
$resource = new Item($category, $transformer, 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -144,24 +176,78 @@ class CategoryController extends Controller
*
* @param CategoryRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(CategoryRequest $request): JsonResponse
{
$category = $this->repository->store($request->getAll());
if (null !== $category) {
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($category, new CategoryTransformer($this->parameters), 'categories');
/** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new category.'); // @codeCoverageIgnore
$resource = new Item($category, $transformer, 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions.
*
* @param Request $request
*
* @param Category $category
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, Category $category): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on category.
->setCategory($category)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.categories.transactions', [$category->id]) . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the category.
@@ -175,11 +261,13 @@ class CategoryController extends Controller
{
$data = $request->getAll();
$category = $this->repository->update($category, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($category, new CategoryTransformer($this->parameters), 'categories');
/** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($category, $transformer, 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -0,0 +1,307 @@
<?php
/**
* AccountController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Api\ApiSupport;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
/**
* Class AccountController
*/
class AccountController extends Controller
{
use ApiSupport;
/** @var CurrencyRepositoryInterface */
private $currencyRepository;
/** @var AccountRepositoryInterface */
private $repository;
/**
* AccountController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->currencyRepository->setUser($user);
return $next($request);
}
);
}
/**
* @param DateRequest $request
*
* @return JsonResponse
*/
public function expenseOverview(DateRequest $request): JsonResponse
{
// parameters for chart:
$dates = $request->getAll();
/** @var Carbon $start */
$start = $dates['start'];
/** @var Carbon $end */
$end = $dates['end'];
$start->subDay();
// prep some vars:
$currencies = [];
$chartData = [];
$tempData = [];
// grab all accounts and names
$accounts = $this->repository->getAccountsByType([AccountType::EXPENSE]);
$accountNames = $this->extractNames($accounts);
$startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start);
$endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end);
// loop the end balances. This is an array for each account ($expenses)
foreach ($endBalances as $accountId => $expenses) {
$accountId = (int) $accountId;
// loop each expense entry (each entry can be a different currency).
foreach ($expenses as $currencyId => $endAmount) {
$currencyId = (int) $currencyId;
// see if there is an accompanying start amount.
// grab the difference and find the currency.
$startAmount = $startBalances[$accountId][$currencyId] ?? '0';
$diff = bcsub($endAmount, $startAmount);
$currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId);
if (0 !== bccomp($diff, '0')) {
// store the values in a temporary array.
$tempData[] = [
'name' => $accountNames[$accountId],
'difference' => $diff,
'diff_float' => (float) $diff,
'currency_id' => $currencyId,
];
}
}
}
// sort temp array by amount.
$amounts = array_column($tempData, 'diff_float');
array_multisort($amounts, SORT_DESC, $tempData);
// loop all found currencies and build the data array for the chart.
/**
* @var int $currencyId
* @var TransactionCurrency $currency
*/
foreach ($currencies as $currencyId => $currency) {
$currentSet = [
'label' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'bar', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => $this->expandNames($tempData),
];
$chartData[$currencyId] = $currentSet;
}
// loop temp data and place data in correct array:
foreach ($tempData as $entry) {
$currencyId = $entry['currency_id'];
$name = $entry['name'];
$chartData[$currencyId]['entries'][$name] = round($entry['difference'], $chartData[$currencyId]['currency_decimal_places']);
}
$chartData = array_values($chartData);
return response()->json($chartData);
}
/**
* @param DateRequest $request
*
* @return JsonResponse
*/
public function overview(DateRequest $request): JsonResponse
{
// parameters for chart:
$dates = $request->getAll();
/** @var Carbon $start */
$start = $dates['start'];
/** @var Carbon $end */
$end = $dates['end'];
// user's preferences
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray();
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
$default = app('amount')->getDefaultCurrency();
// @codeCoverageIgnoreStart
if (0 === count($frontPage->data)) {
$frontPage->data = $defaultSet;
$frontPage->save();
}
// @codeCoverageIgnoreEnd
// get accounts:
$accounts = $this->repository->getAccountsById($frontPage->data);
$chartData = [];
/** @var Account $account */
foreach ($accounts as $account) {
$currency = $this->repository->getAccountCurrency($account);
if (null === $currency) {
$currency = $default; // @codeCoverageIgnore
}
$currentSet = [
'label' => $account->name,
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'line', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => [],
];
/** @var Carbon $currentStart */
$currentStart = clone $start;
$range = app('steam')->balanceInRange($account, $start, clone $end);
$previous = round(array_values($range)[0], 12);
while ($currentStart <= $end) {
$format = $currentStart->format('Y-m-d');
$label = $currentStart->format('Y-m-d');
$balance = isset($range[$format]) ? round($range[$format], 12) : $previous;
$previous = $balance;
$currentStart->addDay();
$currentSet['entries'][$label] = $balance;
}
$chartData[] = $currentSet;
}
return response()->json($chartData);
}
/**
* @param DateRequest $request
*
* @return JsonResponse
*/
public function revenueOverview(DateRequest $request): JsonResponse
{
// parameters for chart:
$dates = $request->getAll();
/** @var Carbon $start */
$start = $dates['start'];
/** @var Carbon $end */
$end = $dates['end'];
$start->subDay();
// prep some vars:
$currencies = [];
$chartData = [];
$tempData = [];
// grab all accounts and names
$accounts = $this->repository->getAccountsByType([AccountType::REVENUE]);
$accountNames = $this->extractNames($accounts);
$startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start);
$endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end);
// loop the end balances. This is an array for each account ($expenses)
foreach ($endBalances as $accountId => $expenses) {
$accountId = (int) $accountId;
// loop each expense entry (each entry can be a different currency).
foreach ($expenses as $currencyId => $endAmount) {
$currencyId = (int) $currencyId;
// see if there is an accompanying start amount.
// grab the difference and find the currency.
$startAmount = $startBalances[$accountId][$currencyId] ?? '0';
$diff = bcsub($endAmount, $startAmount);
$currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId);
if (0 !== bccomp($diff, '0')) {
// store the values in a temporary array.
$tempData[] = [
'name' => $accountNames[$accountId],
'difference' => bcmul($diff, '-1'),
// For some reason this line is never covered in code coverage:
'diff_float' => ((float) $diff) * -1, // @codeCoverageIgnore
'currency_id' => $currencyId,
];
}
}
}
// sort temp array by amount.
$amounts = array_column($tempData, 'diff_float');
array_multisort($amounts, SORT_DESC, $tempData);
// loop all found currencies and build the data array for the chart.
/**
* @var int $currencyId
* @var TransactionCurrency $currency
*/
foreach ($currencies as $currencyId => $currency) {
$currentSet = [
'label' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'bar', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => $this->expandNames($tempData),
];
$chartData[$currencyId] = $currentSet;
}
// loop temp data and place data in correct array:
foreach ($tempData as $entry) {
$currencyId = $entry['currency_id'];
$name = $entry['name'];
$chartData[$currencyId]['entries'][$name] = round($entry['difference'], $chartData[$currencyId]['currency_decimal_places']);
}
$chartData = array_values($chartData);
return response()->json($chartData);
}
}

View File

@@ -0,0 +1,118 @@
<?php
/**
* AvailableBudgetController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Collection;
/**
* Class AvailableBudgetController
*/
class AvailableBudgetController extends Controller
{
/** @var OperationsRepositoryInterface */
private $opsRepository;
/** @var BudgetRepositoryInterface */
private $repository;
/**
* AvailableBudgetController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->repository->setUser($user);
$this->opsRepository->setUser($user);
return $next($request);
}
);
}
/**
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/
public function overview(AvailableBudget $availableBudget): JsonResponse
{
$currency = $availableBudget->transactionCurrency;
$budgets = $this->repository->getActiveBudgets();
$budgetInformation = $this->opsRepository->spentInPeriodMc($budgets, new Collection, $availableBudget->start_date, $availableBudget->end_date);
$spent = 0.0;
// get for current currency
foreach ($budgetInformation as $spentInfo) {
if ($spentInfo['currency_id'] === $availableBudget->transaction_currency_id) {
$spent = $spentInfo['amount'];
}
}
$left = bcadd($availableBudget->amount, (string) $spent);
// left less than zero? Set to zero.
if (-1 === bccomp($left, '0')) {
$left = '0';
}
$chartData = [
[
'label' => trans('firefly.spent'),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'pie',
'yAxisID' => 0, // 0, 1, 2
'entries' => [$spent * -1],
],
[
'label' => trans('firefly.left'),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'line', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => [round($left, $currency->decimal_places)],
],
];
return response()->json($chartData);
}
}

View File

@@ -0,0 +1,202 @@
<?php
/**
* CategoryController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart;
use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Repositories\Category\NoCategoryRepositoryInterface;
use FireflyIII\Repositories\Category\OperationsRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
/**
* Class CategoryController
*/
class CategoryController extends Controller
{
/** @var CategoryRepositoryInterface */
private $categoryRepository;
/** @var NoCategoryRepositoryInterface */
private $noCatRepository;
/** @var OperationsRepositoryInterface */
private $opsRepository;
/**
* AccountController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->categoryRepository = app(CategoryRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->noCatRepository = app(NoCategoryRepositoryInterface::class);
$this->categoryRepository->setUser($user);
$this->opsRepository->setUser($user);
$this->noCatRepository->setUser($user);
return $next($request);
}
);
}
/**
* @param DateRequest $request
*
* @return JsonResponse
*
* TODO after 4.8,0, simplify
*/
public function overview(DateRequest $request): JsonResponse
{
// parameters for chart:
$dates = $request->getAll();
/** @var Carbon $start */
$start = $dates['start'];
/** @var Carbon $end */
$end = $dates['end'];
$tempData = [];
$spentWith = $this->opsRepository->listExpenses($start, $end);
$earnedWith = $this->opsRepository->listIncome($start, $end);
$spentWithout = $this->noCatRepository->listExpenses($start, $end);
$earnedWithout = $this->noCatRepository->listIncome($start, $end);
$categories = [];
foreach ([$spentWith, $earnedWith, $spentWithout, $earnedWithout] as $set) {
foreach ($set as $currency) {
foreach ($currency['categories'] as $category) {
$categories[] = $category['name'];
$inKey = sprintf('%d-i', $currency['currency_id']);
$outKey = sprintf('%d-e', $currency['currency_id']);
// make data arrays if not yet present.
$tempData[$inKey] = $tempData[$inKey] ?? [
'currency_id' => $currency['currency_id'],
'label' => (string) trans('firefly.box_earned_in_currency', ['currency' => $currency['currency_name']]),
'currency_code' => $currency['currency_code'],
'currency_symbol' => $currency['currency_symbol'],
'currency_decimal_places' => $currency['currency_decimal_places'],
'type' => 'bar', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => [
// per category:
// "category" => 5,
],
];
$tempData[$outKey] = $tempData[$outKey] ?? [
'currency_id' => $currency['currency_id'],
'label' => (string) trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]),
'currency_code' => $currency['currency_code'],
'currency_symbol' => $currency['currency_symbol'],
'currency_decimal_places' => $currency['currency_decimal_places'],
'type' => 'bar', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => [
// per category:
// "category" => 5,
],
];
foreach ($category['transaction_journals'] as $journal) {
// is it expense or income?
$letter = -1 === bccomp($journal['amount'], '0') ? 'e' : 'i';
$currentKey = sprintf('%d-%s', $currency['currency_id'], $letter);
$name = $category['name'];
$tempData[$currentKey]['entries'][$name] = $tempData[$currentKey]['entries'][$name] ?? '0';
$tempData[$currentKey]['entries'][$name] = bcadd($tempData[$currentKey]['entries'][$name], $journal['amount']);
}
}
}
}
// foreach ([] as $set) {
// foreach ($set as $currency) {
// $inKey = sprintf('%d-i', $currency['currency_id']);
// $outKey = sprintf('%d-e', $currency['currency_id']);
// $categories[] = (string)trans('firefly.no_category');
// // make data arrays if not yet present.
// $tempData[$inKey] = $tempData[$inKey] ?? [
// 'currency_id' => $currency['currency_id'],
// 'label' => (string)trans('firefly.box_earned_in_currency', ['currency' => $currency['currency_name']]),
// 'currency_code' => $currency['currency_code'],
// 'currency_symbol' => $currency['currency_symbol'],
// 'currency_decimal_places' => $currency['currency_decimal_places'],
// 'type' => 'bar', // line, area or bar
// 'yAxisID' => 0, // 0, 1, 2
// 'entries' => [
// // per category:
// // "category" => 5,
// ],
// ];
// $tempData[$outKey] = $tempData[$outKey] ?? [
// 'currency_id' => $currency['currency_id'],
// 'label' => (string)trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]),
// 'currency_code' => $currency['currency_code'],
// 'currency_symbol' => $currency['currency_symbol'],
// 'currency_decimal_places' => $currency['currency_decimal_places'],
// 'type' => 'bar', // line, area or bar
// 'yAxisID' => 0, // 0, 1, 2
// 'entries' => [
// // per category:
// // "category" => 5,
// ],
// ];
// foreach ($currency['transaction_journals'] as $journal) {
// // is it expense or income?
// $letter = -1 === bccomp($journal['amount'], '0') ? 'e' : 'i';
// $currentKey = sprintf('%d-%s', $currency['currency_id'], $letter);
// $name = (string)trans('firefly.no_category');
// $tempData[$currentKey]['entries'][$name] = $tempData[$currentKey]['entries'][$name] ?? '0';
// $tempData[$currentKey]['entries'][$name] = bcadd($tempData[$currentKey]['entries'][$name], $journal['amount']);
// }
// }
// }
// re-sort every spent array and add 0 for missing entries.
foreach ($tempData as $index => $set) {
$oldSet = $set['entries'];
$newSet = [];
foreach ($categories as $category) {
$value = $oldSet[$category] ?? '0';
$value = -1 === bccomp($value, '0') ? bcmul($value, '-1') : $value;
$newSet[$category] = $value;
}
$tempData[$index]['entries'] = $newSet;
}
$chartData = array_values($tempData);
return response()->json($chartData);
}
}

View File

@@ -1,37 +1,39 @@
<?php
/**
* ConfigurationController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\ConfigurationRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Configuration;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class ConfigurationController.
*
* @codeCoverageIgnore
*/
class ConfigurationController extends Controller
{
@@ -41,21 +43,20 @@ class ConfigurationController extends Controller
private $repository;
/**
* BudgetController constructor.
* ConfigurationController constructor.
*
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @noinspection UnusedConstructorDependenciesInspection */
$this->repository = app(UserRepositoryInterface::class);
/** @var User $admin */
$admin = auth()->user();
if (!$this->repository->hasRole($admin, 'owner')) {
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
}
return $next($request);
@@ -72,47 +73,30 @@ class ConfigurationController extends Controller
{
$configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json');
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the configuration.
*
* @param Request $request
* @param ConfigurationRequest $request
* @param string $name
*
* @return JsonResponse
* @throws FireflyException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(Request $request): JsonResponse
public function update(ConfigurationRequest $request, string $name): JsonResponse
{
$name = $request->get('name');
$value = $request->get('value');
$valid = ['is_demo_site', 'permission_update_check', 'single_user_mode'];
if (!\in_array($name, $valid, true)) {
throw new FireflyException('You cannot edit this configuration value.');
}
$configValue = '';
switch ($name) {
case 'is_demo_site':
case 'single_user_mode':
$configValue = 'true' === $value;
break;
case 'permission_update_check':
$configValue = (int)$value >= -1 && (int)$value <= 1 ? (int)$value : -1;
break;
}
app('fireflyconfig')->set($name, $configValue);
$data = $request->getAll();
app('fireflyconfig')->set($name, $data['value']);
$configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json');
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
}
/**
* Get all config values.
*
* @return array
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function getConfigData(): array
{
@@ -124,13 +108,12 @@ class ConfigurationController extends Controller
$lastCheck = app('fireflyconfig')->get('last_update_check');
/** @var Configuration $singleUser */
$singleUser = app('fireflyconfig')->get('single_user_mode');
$data = [
return [
'is_demo_site' => null === $isDemoSite ? null : $isDemoSite->data,
'permission_update_check' => null === $updateCheck ? null : (int)$updateCheck->data,
'last_update_check' => null === $lastCheck ? null : (int)$lastCheck->data,
'permission_update_check' => null === $updateCheck ? null : (int) $updateCheck->data,
'last_update_check' => null === $lastCheck ? null : (int) $lastCheck->data,
'single_user_mode' => null === $singleUser ? null : $singleUser->data,
];
return $data;
}
}

View File

@@ -2,22 +2,22 @@
/**
* Controller.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -30,6 +30,8 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use League\Fractal\Manager;
use League\Fractal\Serializer\JsonApiSerializer;
use Log;
use Symfony\Component\HttpFoundation\ParameterBag;
@@ -37,7 +39,7 @@ use Symfony\Component\HttpFoundation\ParameterBag;
* Class Controller.
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.NumberOfChildren)
*
*/
class Controller extends BaseController
{
@@ -61,7 +63,6 @@ class Controller extends BaseController
*
* @return string
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function buildParams(): string
{
@@ -82,16 +83,28 @@ class Controller extends BaseController
return $return;
}
/**
* @return Manager
*/
protected function getManager(): Manager
{
// create some objects:
$manager = new Manager;
$baseUrl = request()->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
return $manager;
}
/**
* Method to grab all parameters from the URI.
*
* @return ParameterBag
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function getParameters(): ParameterBag
{
$bag = new ParameterBag;
$page = (int)request()->get('page');
$page = (int) request()->get('page');
if (0 === $page) {
$page = 1;
}
@@ -100,11 +113,11 @@ class Controller extends BaseController
// some date fields:
$dates = ['start', 'end', 'date'];
foreach ($dates as $field) {
$date = request()->get($field);
$date = request()->query->get($field);
$obj = null;
if (null !== $date) {
try {
$obj = new Carbon($date);
$obj = Carbon::parse($date);
} catch (InvalidDateException $e) {
// don't care
Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage()));
@@ -113,6 +126,15 @@ class Controller extends BaseController
$bag->set($field, $obj);
}
// integer fields:
$integers = ['limit'];
foreach ($integers as $integer) {
$value = request()->query->get($integer);
if (null !== $value) {
$bag->set($integer, (int) $value);
}
}
return $bag;
}

View File

@@ -1,22 +1,22 @@
<?php
/**
* CurrencyController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -26,27 +26,49 @@ namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\CurrencyRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account;
use FireflyIII\Models\Bill;
use FireflyIII\Models\Recurrence;
use FireflyIII\Models\RecurrenceTransaction;
use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleTrigger;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AccountTransformer;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\Transformers\BillTransformer;
use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\Transformers\CurrencyExchangeRateTransformer;
use FireflyIII\Transformers\CurrencyTransformer;
use FireflyIII\Transformers\RecurrenceTransformer;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class CurrencyController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class CurrencyController extends Controller
{
use AccountFilter, TransactionFilter;
/** @var CurrencyRepositoryInterface The currency repository */
private $repository;
/** @var UserRepositoryInterface The user repository */
@@ -54,6 +76,8 @@ class CurrencyController extends Controller
/**
* CurrencyRepository constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -74,12 +98,213 @@ class CurrencyController extends Controller
}
/**
* Remove the specified resource from storage.
* Display a list of accounts.
*
* @param TransactionCurrency $currency
* @param Request $request
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function accounts(Request $request, TransactionCurrency $currency): JsonResponse
{
$manager = $this->getManager();
// read type from URI
$type = $request->get('type') ?? 'all';
$this->parameters->set('type', $type);
// types to get, page size:
$types = $this->mapAccountTypes($this->parameters->get('type'));
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of accounts. Count it and split it.
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$unfiltered = $accountRepository->getAccountsByType($types);
// filter list on currency preference:
$collection = $unfiltered->filter(
static function (Account $account) use ($currency, $accountRepository) {
$currencyId = (int) $accountRepository->getMetaValue($account, 'currency_id');
return $currencyId === $currency->id;
}
);
$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.currencies.accounts', [$currency->code]) . $this->buildParams());
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($accounts, $transformer, 'accounts');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Display a listing of the resource.
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function availableBudgets(TransactionCurrency $currency): JsonResponse
{
/** @var User $admin */
$admin = auth()->user();
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of available budgets. Count it and split it.
/** @var BudgetRepositoryInterface $repository */
$repository = app(BudgetRepositoryInterface::class);
/** @var AvailableBudgetRepositoryInterface $abRepository */
$abRepository = app(AvailableBudgetRepositoryInterface::class);
$repository->setUser($admin);
$collection = $abRepository->getAvailableBudgetsByCurrency($currency);
$count = $collection->count();
$availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.available_budgets', [$currency->code]) . $this->buildParams());
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all bills
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function bills(TransactionCurrency $currency): JsonResponse
{
$manager = $this->getManager();
/** @var BillRepositoryInterface $repository */
$repository = app(BillRepositoryInterface::class);
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$unfiltered = $repository->getBills();
// filter and paginate list:
$collection = $unfiltered->filter(
static function (Bill $bill) use ($currency) {
return $bill->transaction_currency_id === $currency->id;
}
);
$count = $collection->count();
$bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.bills', [$currency->code]) . $this->buildParams());
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all budget limits
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function budgetLimits(TransactionCurrency $currency): JsonResponse
{
/** @var BudgetLimitRepositoryInterface $blRepository */
$blRepository = app(BudgetLimitRepositoryInterface::class);
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $blRepository->getAllBudgetLimitsByCurrency($currency, $this->parameters->get('start'), $this->parameters->get('end'));
$count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.budget_limits', [$currency->code]) . $this->buildParams());
/** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a list of known exchange rates
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function cer(TransactionCurrency $currency): JsonResponse
{
// create some objects:
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getExchangeRates($currency);
$count = $collection->count();
$exchangeRates = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($exchangeRates, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.cer', [$currency->code]) . $this->buildParams());
/** @var CurrencyExchangeRateTransformer $transformer */
$transformer = app(CurrencyExchangeRateTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($exchangeRates, $transformer, 'currency_exchange_rates');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Remove the specified resource from storage.
*
* @param TransactionCurrency $currency
*
* @throws FireflyException
* @codeCoverageIgnore
* @return JsonResponse
*/
public function delete(TransactionCurrency $currency): JsonResponse
{
@@ -88,27 +313,86 @@ class CurrencyController extends Controller
if (!$this->userRepository->hasRole($admin, 'owner')) {
// access denied:
throw new FireflyException('No access to method, user is not owner.'); // @codeCoverageIgnore
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
}
if (!$this->repository->canDeleteCurrency($currency)) {
throw new FireflyException('No access to method, currency is in use.'); // @codeCoverageIgnore
if ($this->repository->currencyInUse($currency)) {
throw new FireflyException('200006: Currency in use.'); // @codeCoverageIgnore
}
if ($this->repository->isFallbackCurrency($currency)) {
throw new FireflyException('200026: Currency is fallback.'); // @codeCoverageIgnore
}
$this->repository->destroy($currency);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
* Disable a currency.
*
* @param Request $request
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function disable(TransactionCurrency $currency): JsonResponse
{
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->get();
// must be unused.
if ($this->repository->currencyInUse($currency)) {
return response()->json([], 409);
}
$this->repository->disable($currency);
$manager = $this->getManager();
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Enable a currency.
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function enable(TransactionCurrency $currency): JsonResponse
{
$this->repository->enable($currency);
$manager = $this->getManager();
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Display a listing of the resource.
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAll();
$count = $collection->count();
// slice them:
$currencies = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
@@ -116,40 +400,189 @@ class CurrencyController extends Controller
$paginator->setPath(route('api.v1.currencies.index') . $this->buildParams());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
$resource = new FractalCollection($currencies, new CurrencyTransformer($this->parameters), 'currencies');
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($currencies, $transformer, 'currencies');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Make the currency a default currency.
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function makeDefault(TransactionCurrency $currency): JsonResponse
{
$this->repository->enable($currency);
app('preferences')->set('currencyPreference', $currency->code);
app('preferences')->mark();
$manager = $this->getManager();
$this->parameters->set('defaultCurrency', $currency);
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all recurring transactions.
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function recurrences(TransactionCurrency $currency): JsonResponse
{
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
/** @var RecurringRepositoryInterface $repository */
$repository = app(RecurringRepositoryInterface::class);
$unfiltered = $repository->getAll();
// filter selection
$collection = $unfiltered->filter(
static function (Recurrence $recurrence) use ($currency) {
/** @var RecurrenceTransaction $transaction */
foreach ($recurrence->recurrenceTransactions as $transaction) {
if ($transaction->transaction_currency_id === $currency->id || $transaction->foreign_currency_id === $currency->id) {
return $recurrence;
}
}
return null;
}
);
$count = $collection->count();
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.recurrences', [$currency->code]) . $this->buildParams());
/** @var RecurrenceTransformer $transformer */
$transformer = app(RecurrenceTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'recurrences');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all of them.
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function rules(TransactionCurrency $currency): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
/** @var RuleRepositoryInterface $repository */
$repository = app(RuleRepositoryInterface::class);
$unfiltered = $repository->getAll();
$collection = $unfiltered->filter(
static function (Rule $rule) use ($currency) {
/** @var RuleTrigger $trigger */
foreach ($rule->ruleTriggers as $trigger) {
if ('currency_is' === $trigger->trigger_type && $currency->name === $trigger->trigger_value) {
return $rule;
}
}
return null;
}
);
$count = $collection->count();
$rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rules.index') . $this->buildParams());
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a currency.
*
* @param Request $request
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, TransactionCurrency $currency): JsonResponse
public function show(TransactionCurrency $currency): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
$resource = new Item($currency, new CurrencyTransformer($this->parameters), 'currencies');
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a currency.
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function showDefault(): JsonResponse
{
$manager = $this->getManager();
$currency = app('amount')->getDefaultCurrencyByUser(auth()->user());
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -159,32 +592,84 @@ class CurrencyController extends Controller
*
* @param CurrencyRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(CurrencyRequest $request): JsonResponse
{
$currency = $this->repository->store($request->getAll());
if (null !== $currency) {
if (true === $request->boolean('default')) {
app('preferences')->set('currencyPreference', $currency->code);
app('preferences')->mark();
}
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
$resource = new Item($currency, new CurrencyTransformer($this->parameters), 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
if (true === $request->boolean('default')) {
app('preferences')->set('currencyPreference', $currency->code);
app('preferences')->mark();
}
throw new FireflyException('Could not store new currency.'); // @codeCoverageIgnore
$manager = $this->getManager();
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions.
*
* @param Request $request
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, TransactionCurrency $currency): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on currency.
->setCurrency($currency)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.currencies.transactions', [$currency->code]) . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a currency.
@@ -204,14 +689,16 @@ class CurrencyController extends Controller
app('preferences')->mark();
}
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$this->parameters->set('defaultCurrency', $defaultCurrency);
$resource = new Item($currency, new CurrencyTransformer($this->parameters), 'currencies');
/** @var CurrencyTransformer $transformer */
$transformer = app(CurrencyTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($currency, $transformer, 'currencies');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,22 +1,22 @@
<?php
/**
* CurrencyExchangeRateController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -31,12 +31,12 @@ use FireflyIII\Transformers\CurrencyExchangeRateTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use League\Fractal\Manager;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
/**
* Class CurrencyExchangeRateController
*
* @codeCoverageIgnore
*/
class CurrencyExchangeRateController extends Controller
{
@@ -45,6 +45,7 @@ class CurrencyExchangeRateController extends Controller
/**
* CurrencyExchangeRateController constructor.
*
*/
public function __construct()
{
@@ -68,30 +69,28 @@ class CurrencyExchangeRateController extends Controller
*
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$fromCurrency = $this->repository->findByCodeNull($request->get('from') ?? 'EUR');
$toCurrency = $this->repository->findByCodeNull($request->get('to') ?? 'USD');
if (null === $fromCurrency) {
throw new FireflyException('Unknown source currency.');
throw new FireflyException('200007: Unknown source currency');
}
if (null === $toCurrency) {
throw new FireflyException('Unknown destination currency.');
throw new FireflyException('200007: Unknown destination currency');
}
/** @var Carbon $dateObj */
$dateObj = Carbon::createFromFormat('Y-m-d', $request->get('date') ?? date('Y-m-d'));
$this->parameters->set('from', $fromCurrency->code);
$this->parameters->set('to', $toCurrency->code);
$this->parameters->set('date', $dateObj->format('Y-m-d'));
$this->parameters->set('amount', $request->get('amount'));
$rate = $this->repository->getExchangeRate($fromCurrency, $toCurrency, $dateObj);
if (null === $rate) {
@@ -103,8 +102,10 @@ class CurrencyExchangeRateController extends Controller
$service->setUser($admin);
$rate = $service->getRate($fromCurrency, $toCurrency, $dateObj);
}
$resource = new Item($rate, new CurrencyExchangeRateTransformer($this->parameters), 'currency_exchange_rates');
/** @var CurrencyExchangeRateTransformer $transformer */
$transformer = app(CurrencyExchangeRateTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rate, $transformer, 'currency_exchange_rates');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}

View File

@@ -0,0 +1,181 @@
<?php
/**
* ImportController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\ImportJobTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
/**
* Class ImportController
*
* @deprecated
* @codeCoverageIgnore
*/
class ImportController extends Controller
{
use TransactionFilter;
/** @var ImportJobRepositoryInterface Import job repository. */
private $repository;
/**
* ImportController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* @return JsonResponse
* @codeCoverageIgnore
*/
public function listAll(): JsonResponse
{
// create some objects:
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of accounts. Count it and split it.
$collection = $this->repository->get();
$count = $collection->count();
$importJobs = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($importJobs, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.import.list') . $this->buildParams());
/** @var ImportJobTransformer $transformer */
$transformer = app(ImportJobTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($importJobs, $transformer, 'import_jobs');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param ImportJob $importJob
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(ImportJob $importJob): JsonResponse
{
$manager = $this->getManager();
/** @var ImportJobTransformer $transformer */
$transformer = app(ImportJobTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($importJob, $transformer, 'import_jobs');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions
*
* @param Request $request
* @param ImportJob $importJob
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, ImportJob $importJob): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
$tag = $importJob->tag;
$transactions = new Collection();
$paginator = new LengthAwarePaginator($transactions, 0, $pageSize);
$paginator->setPath(route('api.v1.import.transactions', [$importJob->key]) . $this->buildParams());
if (null !== $tag) {
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on tag.
->setTag($tag)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
}
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -1,22 +1,22 @@
<?php
/**
* LinkTypeController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -25,27 +25,28 @@ namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\LinkTypeRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\LinkTypeTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class LinkTypeController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class LinkTypeController extends Controller
{
use TransactionFilter;
/** @var LinkTypeRepositoryInterface The link type repository */
private $repository;
@@ -54,6 +55,8 @@ class LinkTypeController extends Controller
/**
* LinkTypeController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -76,15 +79,16 @@ class LinkTypeController extends Controller
*
* @param LinkType $linkType
*
* @return JsonResponse
* @throws FireflyException
* @codeCoverageIgnore
* @return JsonResponse
*/
public function delete(LinkType $linkType): JsonResponse
{
if (false === $linkType->editable) {
throw new FireflyException(sprintf('You cannot delete this link type (#%d, "%s")', $linkType->id, $linkType->name));
throw new FireflyException('200020: Link type cannot be changed.');
}
$this->repository->destroy($linkType, null);
$this->repository->destroy($linkType);
return response()->json([], 204);
}
@@ -92,16 +96,14 @@ class LinkTypeController extends Controller
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of accounts. Count it and split it.
$collection = $this->repository->get();
@@ -112,9 +114,11 @@ class LinkTypeController extends Controller
$paginator = new LengthAwarePaginator($linkTypes, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.link_types.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($linkTypes, new LinkTypeTransformer($this->parameters), 'link_types');
/** @var LinkTypeTransformer $transformer */
$transformer = app(LinkTypeTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($linkTypes, $transformer, 'link_types');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -124,22 +128,19 @@ class LinkTypeController extends Controller
/**
* List single resource.
*
* @param Request $request
* @param LinkType $linkType
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, LinkType $linkType): JsonResponse
public function show(LinkType $linkType): JsonResponse
{
$manager = new Manager;
$manager = $this->getManager();
/** @var LinkTypeTransformer $transformer */
$transformer = app(LinkTypeTransformer::class);
$transformer->setParameters($this->parameters);
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types');
$resource = new Item($linkType, $transformer, 'link_types');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -150,8 +151,8 @@ class LinkTypeController extends Controller
*
* @param LinkTypeRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(LinkTypeRequest $request): JsonResponse
{
@@ -159,50 +160,111 @@ class LinkTypeController extends Controller
$admin = auth()->user();
if (!$this->userRepository->hasRole($admin, 'owner')) {
throw new FireflyException('You need the "owner"-role to do this.');
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
}
$data = $request->getAll();
// if currency ID is 0, find the currency by the code:
$linkType = $this->repository->store($data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types');
/** @var LinkTypeTransformer $transformer */
$transformer = app(LinkTypeTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($linkType, $transformer, 'link_types');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Delete the resource.
*
* @param Request $request
* @param LinkType $linkType
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, LinkType $linkType): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
// whatever is returned by the query, it must be part of these journals:
$journalIds = $this->repository->getJournalIds($linkType);
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on journal IDs.
->setJournalIds($journalIds)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update object.
*
* @param LinkTypeRequest $request
* @param LinkType $linkType
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function update(LinkTypeRequest $request, LinkType $linkType): JsonResponse
{
if (false === $linkType->editable) {
throw new FireflyException(sprintf('You cannot edit this link type (#%d, "%s")', $linkType->id, $linkType->name));
throw new FireflyException('200020: Link type cannot be changed.');
}
/** @var User $admin */
$admin = auth()->user();
if (!$this->userRepository->hasRole($admin, 'owner')) {
throw new FireflyException('You need the "owner"-role to do this.');
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
}
$data = $request->getAll();
$this->repository->update($linkType, $data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
/** @var LinkTypeTransformer $transformer */
$transformer = app(LinkTypeTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types');
$resource = new Item($linkType, $transformer, 'link_types');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,22 +1,22 @@
<?php
/**
* PiggyBankController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -27,21 +27,19 @@ use FireflyIII\Api\V1\Requests\PiggyBankRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\PiggyBankEventTransformer;
use FireflyIII\Transformers\PiggyBankTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class PiggyBankController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class PiggyBankController extends Controller
{
@@ -51,6 +49,8 @@ class PiggyBankController extends Controller
/**
* PiggyBankController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -75,6 +75,7 @@ class PiggyBankController extends Controller
* @param PiggyBank $piggyBank
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(PiggyBank $piggyBank): JsonResponse
{
@@ -83,21 +84,47 @@ class PiggyBankController extends Controller
return response()->json([], 204);
}
/**
* @param PiggyBank $piggyBank
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function attachments(PiggyBank $piggyBank): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAttachments($piggyBank);
$count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.piggy_banks.attachments', [$piggyBank->id]) . $this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->getPiggyBanks();
@@ -108,9 +135,11 @@ class PiggyBankController extends Controller
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.piggy_banks.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($piggyBanks, new PiggyBankTransformer($this->parameters), 'piggy_banks');
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -120,22 +149,53 @@ class PiggyBankController extends Controller
/**
* List single resource.
*
* @param Request $request
* @param PiggyBank $piggyBank
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, PiggyBank $piggyBank): JsonResponse
public function piggyBankEvents(PiggyBank $piggyBank): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$manager = $this->getManager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$collection = $this->repository->getEvents($piggyBank);
$count = $collection->count();
$events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks');
// make paginator:
$paginator = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.piggy_banks.events', [$piggyBank->id]) . $this->buildParams());
/** @var PiggyBankEventTransformer $transformer */
$transformer = app(PiggyBankEventTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($events, $transformer, 'piggy_bank_events');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
*
* @param PiggyBank $piggyBank
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(PiggyBank $piggyBank): JsonResponse
{
$manager = $this->getManager();
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -146,23 +206,21 @@ class PiggyBankController extends Controller
*
* @param PiggyBankRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(PiggyBankRequest $request): JsonResponse
{
$piggyBank = $this->repository->store($request->getAll());
if (null !== $piggyBank) {
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks');
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new piggy bank.');
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
@@ -175,12 +233,20 @@ class PiggyBankController extends Controller
*/
public function update(PiggyBankRequest $request, PiggyBank $piggyBank): JsonResponse
{
$piggyBank = $this->repository->update($piggyBank, $request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$data = $request->getAll();
$piggyBank = $this->repository->update($piggyBank, $data);
$resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks');
if ('' !== $data['current_amount']) {
$this->repository->setCurrentAmount($piggyBank, $data['current_amount']);
}
$manager = $this->getManager();
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,22 +1,22 @@
<?php
/**
* PreferencesController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* PreferenceController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -24,16 +24,15 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\PreferenceRequest;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Preference;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Transformers\PreferenceTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use League\Fractal\Manager;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
/**
*
@@ -41,22 +40,52 @@ use League\Fractal\Serializer\JsonApiSerializer;
*/
class PreferenceController extends Controller
{
/**
* LinkTypeController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
static function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$repository = app(AccountRepositoryInterface::class);
$repository->setUser($user);
// an important fallback is that the frontPageAccount array gets refilled automatically
// when it turns up empty.
$frontPageAccounts = app('preferences')->getForUser($user, 'frontPageAccounts', [])->data;
if (0 === count($frontPageAccounts)) {
/** @var Collection $accounts */
$accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]);
$accountIds = $accounts->pluck('id')->toArray();
app('preferences')->setForUser($user, 'frontPageAccounts', $accountIds);
}
return $next($request);
}
);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
/** @var User $user */
$user = auth()->user();
$available = [
$user = auth()->user();
$available = [
'language', 'customFiscalYear', 'fiscalYearStart', 'currencyPreference',
'transaction_journal_optional_fields', 'frontPageAccounts', 'viewRange',
'listPageSize, twoFactorAuthEnabled',
'listPageSize',
];
$preferences = new Collection;
foreach ($available as $name) {
$pref = app('preferences')->getForUser($user, $name);
@@ -65,39 +94,36 @@ class PreferenceController extends Controller
}
}
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($preferences, new PreferenceTransformer($this->parameters), 'preferences');
/** @var PreferenceTransformer $transformer */
$transformer = app(PreferenceTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($preferences, $transformer, 'preferences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
* Return a single preference by name.
*
* @param Request $request
* @param Preference $preference
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Preference $preference): JsonResponse
public function show(Preference $preference): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
/** @var PreferenceTransformer $transformer */
$transformer = app(PreferenceTransformer::class);
$transformer->setParameters($this->parameters);
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($preference, new PreferenceTransformer($this->parameters), 'preferences');
$resource = new Item($preference, $transformer, 'preferences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
@@ -107,7 +133,6 @@ class PreferenceController extends Controller
* @param Preference $preference
*
* @return JsonResponse
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(PreferenceRequest $request, Preference $preference): JsonResponse
{
@@ -122,22 +147,20 @@ class PreferenceController extends Controller
$newValue = explode(',', $data['data']);
break;
case 'listPageSize':
$newValue = (int)$data['data'];
$newValue = (int) $data['data'];
break;
case 'customFiscalYear':
case 'twoFactorAuthEnabled':
$newValue = 1 === (int)$data['data'];
$newValue = 1 === (int) $data['data'];
break;
}
$result = app('preferences')->set($preference->name, $newValue);
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
/** @var PreferenceTransformer $transformer */
$transformer = app(PreferenceTransformer::class);
$transformer->setParameters($this->parameters);
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($result, new PreferenceTransformer($this->parameters), 'preferences');
$resource = new Item($result, $transformer, 'preferences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,52 +1,60 @@
<?php
/**
* RecurrenceController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\RecurrenceRequest;
use FireflyIII\Api\V1\Requests\RecurrenceStoreRequest;
use FireflyIII\Api\V1\Requests\RecurrenceUpdateRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Support\Cronjobs\RecurringCronjob;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\RecurrenceTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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 Log;
/**
* Class RecurrenceController
*/
class RecurrenceController extends Controller
{
use TransactionFilter;
/** @var RecurringRepositoryInterface The recurring transaction repository */
private $repository;
/**
* RecurrenceController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -71,6 +79,7 @@ class RecurrenceController extends Controller
* @param Recurrence $recurrence
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Recurrence $recurrence): JsonResponse
{
@@ -82,18 +91,15 @@ class RecurrenceController extends Controller
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->getAll();
@@ -104,9 +110,11 @@ class RecurrenceController extends Controller
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.recurrences.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($piggyBanks, new RecurrenceTransformer($this->parameters), 'recurrences');
/** @var RecurrenceTransformer $transformer */
$transformer = app(RecurrenceTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'recurrences');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -116,22 +124,20 @@ class RecurrenceController extends Controller
/**
* List single resource.
*
* @param Request $request
* @param Recurrence $recurrence
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Recurrence $recurrence): JsonResponse
public function show(Recurrence $recurrence): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
/** @var RecurrenceTransformer $transformer */
$transformer = app(RecurrenceTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($recurrence, new RecurrenceTransformer($this->parameters), 'recurrences');
$resource = new Item($recurrence, $transformer, 'recurrences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -141,38 +147,126 @@ class RecurrenceController extends Controller
/**
* Store new object.
*
* @param RecurrenceRequest $request
* @param RecurrenceStoreRequest $request
*
* @throws FireflyException
* @return JsonResponse
*/
public function store(RecurrenceRequest $request): JsonResponse
public function store(RecurrenceStoreRequest $request): JsonResponse
{
$recurrence = $this->repository->store($request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($recurrence, new RecurrenceTransformer($this->parameters), 'recurrences');
$data = $request->getAll();
$recurrence = $this->repository->store($data);
$manager = $this->getManager();
/** @var RecurrenceTransformer $transformer */
$transformer = app(RecurrenceTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($recurrence, $transformer, 'recurrences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show transactions for this recurrence.
*
* @param Request $request
* @param Recurrence $recurrence
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, Recurrence $recurrence): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
// whatever is returned by the query, it must be part of these journals:
$journalIds = $this->repository->getJournalIds($recurrence);
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on journal IDs.
->setJournalIds($journalIds)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @throws FireflyException
* @codeCoverageIgnore
* @return JsonResponse
*/
public function trigger(): JsonResponse
{
/** @var RecurringCronjob $recurring */
$recurring = app(RecurringCronjob::class);
try {
$result = $recurring->fire();
} catch (FireflyException $e) {
Log::error($e->getMessage());
throw new FireflyException('200022: Error in cron job.');
}
if (false === $result) {
return response()->json([], 204);
}
if (true === $result) {
return response()->json();
}
return response()->json([], 418); // @codeCoverageIgnore
}
/**
* Update single recurrence.
*
* @param RecurrenceRequest $request
* @param Recurrence $recurrence
* @param RecurrenceUpdateRequest $request
* @param Recurrence $recurrence
*
* @return JsonResponse
*/
public function update(RecurrenceRequest $request, Recurrence $recurrence): JsonResponse
public function update(RecurrenceUpdateRequest $request, Recurrence $recurrence): JsonResponse
{
$data = $request->getAll();
$category = $this->repository->update($recurrence, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($category, new RecurrenceTransformer($this->parameters), 'recurrences');
/** @var RecurrenceTransformer $transformer */
$transformer = app(RecurrenceTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($category, $transformer, 'recurrences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -1,52 +1,64 @@
<?php
/**
* RuleController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\RuleRequest;
use FireflyIII\Api\V1\Requests\RuleStoreRequest;
use FireflyIII\Api\V1\Requests\RuleTestRequest;
use FireflyIII\Api\V1\Requests\RuleTriggerRequest;
use FireflyIII\Api\V1\Requests\RuleUpdateRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\TransactionRules\Engine\RuleEngine;
use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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 Log;
/**
* Class RuleController
*
*/
class RuleController extends Controller
{
/** @var AccountRepositoryInterface Account repository */
private $accountRepository;
/** @var RuleRepositoryInterface The rule repository */
private $ruleRepository;
/**
* RuleController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -59,6 +71,9 @@ class RuleController extends Controller
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
$this->accountRepository = app(AccountRepositoryInterface::class);
$this->accountRepository->setUser($user);
return $next($request);
}
);
@@ -70,6 +85,7 @@ class RuleController extends Controller
* @param Rule $rule
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Rule $rule): JsonResponse
{
@@ -81,18 +97,15 @@ class RuleController extends Controller
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->ruleRepository->getAll();
@@ -103,34 +116,75 @@ class RuleController extends Controller
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rules.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($rules, new RuleTransformer($this->parameters), 'rules');
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param Rule $rule
*
* @return JsonResponse
*/
public function moveDown(Rule $rule): JsonResponse
{
$this->ruleRepository->moveDown($rule);
$rule = $this->ruleRepository->find($rule->id);
$manager = $this->getManager();
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rule, $transformer, 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param Rule $rule
*
* @return JsonResponse
*/
public function moveUp(Rule $rule): JsonResponse
{
$this->ruleRepository->moveUp($rule);
$rule = $this->ruleRepository->find($rule->id);
$manager = $this->getManager();
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rule, $transformer, 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
*
* @param Request $request
* @param Rule $rule
* @param Rule $rule
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Rule $rule): JsonResponse
public function show(Rule $rule): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($rule, new RuleTransformer($this->parameters), 'rules');
$resource = new Item($rule, $transformer, 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -139,40 +193,122 @@ class RuleController extends Controller
/**
* Store new object.
*
* @param RuleRequest $request
* @param RuleStoreRequest $request
*
* @return JsonResponse
*/
public function store(RuleRequest $request): JsonResponse
public function store(RuleStoreRequest $request): JsonResponse
{
$rule = $this->ruleRepository->store($request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rule, new RuleTransformer($this->parameters), 'rules');
$resource = new Item($rule, $transformer, 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a rule.
* @param RuleTestRequest $request
* @param Rule $rule
*
* @param RuleRequest $request
* @param Rule $rule
* @throws FireflyException
* @return JsonResponse
*/
public function testRule(RuleTestRequest $request, Rule $rule): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$parameters = $request->getTestParameters();
/** @var Rule $rule */
Log::debug(sprintf('Now testing rule #%d, "%s"', $rule->id, $rule->title));
/** @var TransactionMatcher $matcher */
$matcher = app(TransactionMatcher::class);
// set all parameters:
$matcher->setRule($rule);
$matcher->setStartDate($parameters['start_date']);
$matcher->setEndDate($parameters['end_date']);
$matcher->setSearchLimit($parameters['search_limit']);
$matcher->setTriggeredLimit($parameters['trigger_limit']);
$matcher->setAccounts($parameters['accounts']);
$matchingTransactions = $matcher->findTransactionsByRule();
$count = count($matchingTransactions);
$transactions = array_slice($matchingTransactions, ($parameters['page'] - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($transactions, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rules.test', [$rule->id]) . $this->buildParams());
// resulting list is presented as JSON thing.
$manager = $this->getManager();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($matchingTransactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Execute the given rule group on a set of existing transactions.
*
* @param RuleTriggerRequest $request
* @param Rule $rule
*
* @return JsonResponse
*/
public function update(RuleRequest $request, Rule $rule): JsonResponse
public function triggerRule(RuleTriggerRequest $request, Rule $rule): JsonResponse
{
$rule = $this->ruleRepository->update($rule, $request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
// Get parameters specified by the user
$parameters = $request->getTriggerParameters();
$resource = new Item($rule, new RuleTransformer($this->parameters), 'rules');
/** @var RuleEngine $ruleEngine */
$ruleEngine = app(RuleEngine::class);
$ruleEngine->setUser(auth()->user());
$rules = [$rule->id];
$ruleEngine->setRulesToApply($rules);
$ruleEngine->setTriggerMode(RuleEngine::TRIGGER_STORE);
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setAccounts($parameters['accounts']);
$collector->setRange($parameters['start_date'], $parameters['end_date']);
$journals = $collector->getExtractedJournals();
/** @var array $journal */
foreach ($journals as $journal) {
Log::debug('Start of new journal.');
$ruleEngine->processJournalArray($journal);
Log::debug('Done with all rules for this group + done with journal.');
}
return response()->json([], 204);
}
/**
* Update a rule.
*
* @param RuleUpdateRequest $request
* @param Rule $rule
*
* @return JsonResponse
*/
public function update(RuleUpdateRequest $request, Rule $rule): JsonResponse
{
$data = $request->getAll();
$rule = $this->ruleRepository->update($rule, $data);
$manager = $this->getManager();
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rule, $transformer, 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -1,53 +1,66 @@
<?php
/**
* RuleGroupController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use Exception;
use FireflyIII\Api\V1\Requests\RuleGroupRequest;
use FireflyIII\Api\V1\Requests\RuleGroupTestRequest;
use FireflyIII\Api\V1\Requests\RuleGroupTriggerRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\TransactionRules\Engine\RuleEngine;
use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\RuleGroupTransformer;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Manager;
use Illuminate\Support\Collection;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
use Log;
/**
* Class RuleGroupController
*/
class RuleGroupController extends Controller
{
/** @var AccountRepositoryInterface Account repository */
private $accountRepository;
/** @var RuleGroupRepositoryInterface The rule group repository */
private $ruleGroupRepository;
/**
* RuleGroupController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -60,6 +73,9 @@ class RuleGroupController extends Controller
$this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class);
$this->ruleGroupRepository->setUser($user);
$this->accountRepository = app(AccountRepositoryInterface::class);
$this->accountRepository->setUser($user);
return $next($request);
}
);
@@ -71,6 +87,7 @@ class RuleGroupController extends Controller
* @param RuleGroup $ruleGroup
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(RuleGroup $ruleGroup): JsonResponse
{
@@ -82,18 +99,14 @@ class RuleGroupController extends Controller
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of rule groups. Count it and split it.
$collection = $this->ruleGroupRepository->get();
@@ -104,33 +117,104 @@ class RuleGroupController extends Controller
$paginator = new LengthAwarePaginator($ruleGroups, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rule_groups.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($ruleGroups, new RuleGroupTransformer($this->parameters), 'rule_groups');
/** @var RuleGroupTransformer $transformer */
$transformer = app(RuleGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($ruleGroups, $transformer, 'rule_groups');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
*
* @param Request $request
* @param RuleGroup $ruleGroup
*
* @return JsonResponse
*/
public function show(Request $request, RuleGroup $ruleGroup): JsonResponse
public function moveDown(RuleGroup $ruleGroup): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$this->ruleGroupRepository->moveDown($ruleGroup);
$ruleGroup = $this->ruleGroupRepository->find($ruleGroup->id);
$manager = $this->getManager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
/** @var RuleGroupTransformer $transformer */
$transformer = app(RuleGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups');
$resource = new Item($ruleGroup, $transformer, 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param RuleGroup $ruleGroup
*
* @return JsonResponse
*/
public function moveUp(RuleGroup $ruleGroup): JsonResponse
{
$this->ruleGroupRepository->moveUp($ruleGroup);
$ruleGroup = $this->ruleGroupRepository->find($ruleGroup->id);
$manager = $this->getManager();
/** @var RuleGroupTransformer $transformer */
$transformer = app(RuleGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($ruleGroup, $transformer, 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param RuleGroup $group
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function rules(RuleGroup $group): JsonResponse
{
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->ruleGroupRepository->getRules($group);
$count = $collection->count();
$rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rule_groups.rules', [$group->id]) . $this->buildParams());
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
*
* @param RuleGroup $ruleGroup
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(RuleGroup $ruleGroup): JsonResponse
{
$manager = $this->getManager();
/** @var RuleGroupTransformer $transformer */
$transformer = app(RuleGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($ruleGroup, $transformer, 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -146,16 +230,119 @@ class RuleGroupController extends Controller
public function store(RuleGroupRequest $request): JsonResponse
{
$ruleGroup = $this->ruleGroupRepository->store($request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups');
/** @var RuleGroupTransformer $transformer */
$transformer = app(RuleGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($ruleGroup, $transformer, 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param RuleGroupTestRequest $request
* @param RuleGroup $group
*
* @throws FireflyException
*
* @return JsonResponse
*/
public function testGroup(RuleGroupTestRequest $request, RuleGroup $group): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
Log::debug('Now in testGroup()');
/** @var Collection $rules */
$rules = $this->ruleGroupRepository->getActiveRules($group);
if (0 === $rules->count()) {
throw new FireflyException('200023: No rules in this rule group.');
}
$parameters = $request->getTestParameters();
$matchingTransactions = [];
Log::debug(sprintf('Going to test %d rules', $rules->count()));
/** @var Rule $rule */
foreach ($rules as $rule) {
Log::debug(sprintf('Now testing rule #%d, "%s"', $rule->id, $rule->title));
/** @var TransactionMatcher $matcher */
$matcher = app(TransactionMatcher::class);
// set all parameters:
$matcher->setRule($rule);
$matcher->setStartDate($parameters['start_date']);
$matcher->setEndDate($parameters['end_date']);
$matcher->setSearchLimit($parameters['search_limit']);
$matcher->setTriggeredLimit($parameters['trigger_limit']);
$matcher->setAccounts($parameters['accounts']);
$result = $matcher->findTransactionsByRule();
/** @noinspection AdditionOperationOnArraysInspection */
$matchingTransactions = $result + $matchingTransactions;
}
// make paginator out of results.
$count = count($matchingTransactions);
$transactions = array_slice($matchingTransactions, ($parameters['page'] - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($transactions, $count, $pageSize, $parameters['page']);
$paginator->setPath(route('api.v1.rule_groups.test', [$group->id]) . $this->buildParams());
$manager = $this->getManager();
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($matchingTransactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Execute the given rule group on a set of existing transactions.
*
* @param RuleGroupTriggerRequest $request
* @param RuleGroup $group
*
* @throws Exception
* @return JsonResponse
*/
public function triggerGroup(RuleGroupTriggerRequest $request, RuleGroup $group): JsonResponse
{
$parameters = $request->getTriggerParameters();
/** @var Collection $collection */
$collection = $this->ruleGroupRepository->getActiveRules($group);
$rules = [];
/** @var Rule $item */
foreach ($collection as $item) {
$rules[] = $item->id;
}
// start looping.
/** @var RuleEngine $ruleEngine */
$ruleEngine = app(RuleEngine::class);
$ruleEngine->setUser(auth()->user());
$ruleEngine->setRulesToApply($rules);
$ruleEngine->setTriggerMode(RuleEngine::TRIGGER_STORE);
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setAccounts($parameters['accounts']);
$collector->setRange($parameters['start_date'], $parameters['end_date']);
$journals = $collector->getExtractedJournals();
/** @var array $journal */
foreach ($journals as $journal) {
Log::debug('Start of new journal.');
$ruleEngine->processJournalArray($journal);
Log::debug('Done with all rules for this group + done with journal.');
}
return response()->json([], 204);
}
/**
* Update a rule group.
*
@@ -167,13 +354,14 @@ class RuleGroupController extends Controller
public function update(RuleGroupRequest $request, RuleGroup $ruleGroup): JsonResponse
{
$ruleGroup = $this->ruleGroupRepository->update($ruleGroup, $request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$manager = $this->getManager();
$resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups');
/** @var RuleGroupTransformer $transformer */
$transformer = app(RuleGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($ruleGroup, $transformer, 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,100 @@
<?php
declare(strict_types=1);
/**
* AccountController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Controllers\Search;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Search\AccountSearch;
use FireflyIII\Transformers\AccountTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use Log;
/**
* Class AccountController
*/
class AccountController extends Controller
{
use AccountFilter;
/** @var array */
private $validFields;
public function __construct()
{
parent::__construct();
$this->validFields = [
AccountSearch::SEARCH_ALL,
AccountSearch::SEARCH_ID,
AccountSearch::SEARCH_NAME,
AccountSearch::SEARCH_IBAN,
AccountSearch::SEARCH_NUMBER,
];
}
/**
* @param Request $request
*
* @return JsonResponse|Response
*/
public function search(Request $request)
{
Log::debug('Now in account search()');
$manager = $this->getManager();
$query = $request->get('query');
$field = $request->get('field');
$type = $request->get('type') ?? 'all';
if ('' === $query || !in_array($field, $this->validFields, true)) {
return response(null, 422);
}
$types = $this->mapAccountTypes($type);
Log::debug(sprintf('Going to search for "%s" in types', $query), $types);
/** @var AccountSearch $search */
$search = app(AccountSearch::class);
$search->setUser(auth()->user());
$search->setTypes($types);
$search->setField($field);
$search->setQuery($query);
$accounts = $search->search();
Log::debug(sprintf('Found %d accounts', $accounts->count()));
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters);
$count = $accounts->count();
$perPage = 0 === $count ? 1 : $count;
$paginator = new LengthAwarePaginator($accounts, $count, $perPage, 1);
$resource = new FractalCollection($accounts, $transformer, 'accounts');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,64 @@
<?php
declare(strict_types=1);
/**
* TransactionController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Controllers\Search;
use FireflyIII\Api\V1\Controllers\Controller;
use Illuminate\Http\Request;
/**
* Class TransactionController
*/
class TransactionController extends Controller
{
/** @var string */
public const SEARCH_ALL = 'all';
/** @var string */
public const SEARCH_DESCRIPTION = 'description';
/** @var string */
public const SEARCH_NOTES = 'notes';
/** @var string */
public const SEARCH_ACCOUNTS = 'accounts';
/** @var array */
private $validFields;
public function __construct()
{
parent::__construct();
$this->validFields = [
self::SEARCH_ALL,
self::SEARCH_DESCRIPTION,
self::SEARCH_NOTES,
self::SEARCH_ACCOUNTS,
];
}
/**
* @param Request $request
*
* @return void
*/
public function search(Request $request): void
{
die('the route is present but nobody\'s home.');
}
}

View File

@@ -0,0 +1,113 @@
<?php
declare(strict_types=1);
/**
* TransferController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V1\Controllers\Search;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Search\TransferRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Support\Search\TransferSearch;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
/**
* Class TransferController
*/
class TransferController extends Controller
{
/**
* @param TransferRequest $request
*
* @return JsonResponse|Response
*/
public function search(TransferRequest $request)
{
// configure transfer search to search for a > b
$search = app(TransferSearch::class);
$search->setSource($request->get('source'));
$search->setDestination($request->get('destination'));
$search->setAmount($request->get('amount'));
$search->setDescription($request->get('description'));
$search->setDate($request->get('date'));
$left = $search->search();
// configure transfer search to search for b > a
$search->setSource($request->get('destination'));
$search->setDestination($request->get('source'));
$search->setAmount($request->get('amount'));
$search->setDescription($request->get('description'));
$search->setDate($request->get('date'));
$right = $search->search();
// add parameters to URL:
$this->parameters->set('source', $request->get('source'));
$this->parameters->set('destination', $request->get('destination'));
$this->parameters->set('amount', $request->get('amount'));
$this->parameters->set('description', $request->get('description'));
$this->parameters->set('date', $request->get('date'));
// get all journal ID's.
$total = $left->merge($right)->unique('id')->pluck('id')->toArray();
if (0 === count($total)) {
// forces search to be empty.
$total = [-1];
}
// collector to return results.
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage(1)
->setJournalIds($total);
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.search.transfers') . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,427 @@
<?php
/**
* SummaryController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon;
use Exception;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Helpers\Report\NetWorthInterface;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
/**
* Class SummaryController
*/
class SummaryController extends Controller
{
/** @var AvailableBudgetRepositoryInterface */
private $abRepository;
/** @var AccountRepositoryInterface */
private $accountRepository;
/** @var BillRepositoryInterface */
private $billRepository;
/** @var BudgetRepositoryInterface */
private $budgetRepository;
/** @var CurrencyRepositoryInterface */
private $currencyRepos;
/** @var OperationsRepositoryInterface */
private $opsRepository;
/**
* SummaryController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
$this->billRepository = app(BillRepositoryInterface::class);
$this->budgetRepository = app(BudgetRepositoryInterface::class);
$this->accountRepository = app(AccountRepositoryInterface::class);
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class);
$this->billRepository->setUser($user);
$this->currencyRepos->setUser($user);
$this->budgetRepository->setUser($user);
$this->accountRepository->setUser($user);
$this->abRepository->setUser($user);
$this->opsRepository->setUser($user);
return $next($request);
}
);
}
/**
* @param DateRequest $request
*
* @throws Exception
* @return JsonResponse
*/
public function basic(DateRequest $request): JsonResponse
{
// parameters for boxes:
$dates = $request->getAll();
$start = $dates['start'];
$end = $dates['end'];
$code = $request->get('currency_code');
// balance information:
$balanceData = $this->getBalanceInformation($start, $end);
$billData = $this->getBillInformation($start, $end);
$spentData = $this->getLeftToSpendInfo($start, $end);
$networthData = $this->getNetWorthInfo($start, $end);
$total = array_merge($balanceData, $billData, $spentData, $networthData);
// give new keys
$return = [];
foreach ($total as $entry) {
if (null === $code || (null !== $code && $code === $entry['currency_code'])) {
$return[$entry['key']] = $entry;
}
}
return response()->json($return);
}
/**
* Check if date is outside session range.
*
* @param Carbon $date
*
* @param Carbon $start
* @param Carbon $end
*
* @return bool
*/
protected function notInDateRange(Carbon $date, Carbon $start, Carbon $end): bool // Validate a preference
{
$result = false;
if ($start->greaterThanOrEqualTo($date) && $end->greaterThanOrEqualTo($date)) {
$result = true;
}
// start and end in the past? use $end
if ($start->lessThanOrEqualTo($date) && $end->lessThanOrEqualTo($date)) {
$result = true;
}
return $result;
}
/**
* @param Carbon $start
* @param Carbon $end
*
* @return array
*/
private function getBalanceInformation(Carbon $start, Carbon $end): array
{
// prep some arrays:
$incomes = [];
$expenses = [];
$sums = [];
$return = [];
// collect income of user using the new group collector.
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setRange($start, $end)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes([TransactionType::DEPOSIT]);
$set = $collector->getExtractedJournals();
/** @var array $transactionJournal */
foreach ($set as $transactionJournal) {
$currencyId = (int) $transactionJournal['currency_id'];
$incomes[$currencyId] = $incomes[$currencyId] ?? '0';
$incomes[$currencyId] = bcadd($incomes[$currencyId], bcmul($transactionJournal['amount'], '-1'));
$sums[$currencyId] = $sums[$currencyId] ?? '0';
$sums[$currencyId] = bcadd($sums[$currencyId], bcmul($transactionJournal['amount'], '-1'));
}
// collect expenses of user using the new group collector.
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setRange($start, $end)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes([TransactionType::WITHDRAWAL]);
$set = $collector->getExtractedJournals();
/** @var array $transactionJournal */
foreach ($set as $transactionJournal) {
$currencyId = (int) $transactionJournal['currency_id'];
$expenses[$currencyId] = $expenses[$currencyId] ?? '0';
$expenses[$currencyId] = bcadd($expenses[$currencyId], $transactionJournal['amount']);
$sums[$currencyId] = $sums[$currencyId] ?? '0';
$sums[$currencyId] = bcadd($sums[$currencyId], $transactionJournal['amount']);
}
// format amounts:
$keys = array_keys($sums);
foreach ($keys as $currencyId) {
$currency = $this->currencyRepos->findNull($currencyId);
if (null === $currency) {
continue;
}
// create objects for big array.
$return[] = [
'key' => sprintf('balance-in-%s', $currency->code),
'title' => trans('firefly.box_balance_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round($sums[$currencyId] ?? 0, $currency->decimal_places),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'value_parsed' => app('amount')->formatAnything($currency, $sums[$currencyId] ?? '0', false),
'local_icon' => 'balance-scale',
'sub_title' => app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false) .
' + ' . app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false),
];
$return[] = [
'key' => sprintf('spent-in-%s', $currency->code),
'title' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round($expenses[$currencyId] ?? 0, $currency->decimal_places),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'value_parsed' => app('amount')->formatAnything($currency, $expenses[$currencyId] ?? '0', false),
'local_icon' => 'balance-scale',
'sub_title' => '',
];
$return[] = [
'key' => sprintf('earned-in-%s', $currency->code),
'title' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round($incomes[$currencyId] ?? 0, $currency->decimal_places),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'value_parsed' => app('amount')->formatAnything($currency, $incomes[$currencyId] ?? '0', false),
'local_icon' => 'balance-scale',
'sub_title' => '',
];
}
return $return;
}
/**
* @param Carbon $start
* @param Carbon $end
*
* @return array
*/
private function getBillInformation(Carbon $start, Carbon $end): array
{
/*
* Since both this method and the chart use the exact same data, we can suffice
* with calling the one method in the bill repository that will get this amount.
*/
$paidAmount = $this->billRepository->getBillsPaidInRangePerCurrency($start, $end);
$unpaidAmount = $this->billRepository->getBillsUnpaidInRangePerCurrency($start, $end);
$return = [];
foreach ($paidAmount as $currencyId => $amount) {
$amount = bcmul($amount, '-1');
$currency = $this->currencyRepos->findNull((int) $currencyId);
if (null === $currency) {
continue;
}
$return[] = [
'key' => sprintf('bills-paid-in-%s', $currency->code),
'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round($amount, $currency->decimal_places),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'value_parsed' => app('amount')->formatAnything($currency, $amount, false),
'local_icon' => 'check',
'sub_title' => '',
];
}
foreach ($unpaidAmount as $currencyId => $amount) {
$amount = bcmul($amount, '-1');
$currency = $this->currencyRepos->findNull((int) $currencyId);
if (null === $currency) {
continue;
}
$return[] = [
'key' => sprintf('bills-unpaid-in-%s', $currency->code),
'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round($amount, $currency->decimal_places),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'value_parsed' => app('amount')->formatAnything($currency, $amount, false),
'local_icon' => 'calendar-o',
'sub_title' => '',
];
}
return $return;
}
/**
* @param Carbon $start
* @param Carbon $end
*
* @throws Exception
* @return array
*/
private function getLeftToSpendInfo(Carbon $start, Carbon $end): array
{
$return = [];
$today = new Carbon;
$available = $this->abRepository->getAvailableBudgetWithCurrency($start, $end);
$budgets = $this->budgetRepository->getActiveBudgets();
$spent = $this->opsRepository->sumExpenses($start, $end, null, $budgets);
foreach ($spent as $row) {
// either an amount was budgeted or 0 is available.
$amount = $available[$row['currency_id']] ?? '0';
$spentInCurrency = $row['sum'];
$leftToSpend = bcadd($amount, $spentInCurrency);
$days = $today->diffInDays($end) + 1;
$perDay = '0';
if (0 !== $days && bccomp($leftToSpend, '0') > -1) {
$perDay = bcdiv($leftToSpend, (string) $days);
}
$return[] = [
'key' => sprintf('left-to-spend-in-%s', $row['currency_code']),
'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $row['currency_symbol']]),
'monetary_value' => round($leftToSpend, $row['currency_decimal_places']),
'currency_id' => $row['currency_id'],
'currency_code' => $row['currency_code'],
'currency_symbol' => $row['currency_symbol'],
'currency_decimal_places' => $row['currency_decimal_places'],
'value_parsed' => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false),
'local_icon' => 'money',
'sub_title' => (string) trans(
'firefly.box_spend_per_day',
['amount' => app('amount')->formatFlat(
$row['currency_symbol'],
$row['currency_decimal_places'],
$perDay,
false
)]
),
];
}
return $return;
}
/**
* @param Carbon $start
* @param Carbon $end
*
* @return array
*/
private function getNetWorthInfo(Carbon $start, Carbon $end): array
{
/** @var User $user */
$user = auth()->user();
$date = Carbon::now()->startOfDay();
// start and end in the future? use $end
if ($this->notInDateRange($date, $start, $end)) {
/** @var Carbon $date */
$date = session('end', Carbon::now()->endOfMonth());
}
/** @var NetWorthInterface $netWorthHelper */
$netWorthHelper = app(NetWorthInterface::class);
$netWorthHelper->setUser($user);
$allAccounts = $this->accountRepository->getActiveAccountsByType([AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE]);
// filter list on preference of being included.
$filtered = $allAccounts->filter(
function (Account $account) {
$includeNetWorth = $this->accountRepository->getMetaValue($account, 'include_net_worth');
return null === $includeNetWorth ? true : '1' === $includeNetWorth;
}
);
$netWorthSet = $netWorthHelper->getNetWorthByCurrency($filtered, $date);
$return = [];
foreach ($netWorthSet as $data) {
/** @var TransactionCurrency $currency */
$currency = $data['currency'];
$amount = round($data['balance'], $currency->decimal_places);
if (0.0 === $amount) {
continue;
}
// return stuff
$return[] = [
'key' => sprintf('net-worth-in-%s', $currency->code),
'title' => trans('firefly.box_net_worth_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => $amount,
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'value_parsed' => app('amount')->formatAnything($currency, $data['balance'], false),
'local_icon' => 'line-chart',
'sub_title' => '',
];
}
return $return;
}
}

View File

@@ -0,0 +1,339 @@
<?php
/**
* TagController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Api\V1\Requests\TagStoreRequest;
use FireflyIII\Api\V1\Requests\TagUpdateRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\TagTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
/**
* Class TagController
*/
class TagController extends Controller
{
use TransactionFilter;
/** @var TagRepositoryInterface The tag repository */
private $repository;
/**
* TagController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(TagRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* @param DateRequest $request
*
* @return JsonResponse
*/
public function cloud(DateRequest $request): JsonResponse
{
// parameters for boxes:
$dates = $request->getAll();
$start = $dates['start'];
$end = $dates['end'];
// get all tags:
$tags = $this->repository->get();
$cloud = $this->getTagCloud($tags, $start, $end);
return response()->json($cloud);
}
/**
* Delete the resource.
*
* @param Tag $tag
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Tag $tag): JsonResponse
{
$this->repository->destroy($tag);
return response()->json([], 204);
}
/**
* List all of them.
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(): JsonResponse
{
$manager = $this->getManager();
// types to get, page size:
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
$collection = $this->repository->get();
$count = $collection->count();
$rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.tags.index') . $this->buildParams());
/** @var TagTransformer $transformer */
$transformer = app(TagTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'tags');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param Tag $tag
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function attachments(Tag $tag): JsonResponse
{
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->getAttachments($tag);
$count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.tags.attachments', [$tag->id]) . $this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
*
* @param Tag $tag
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Tag $tag): JsonResponse
{
$manager = $this->getManager();
/** @var TagTransformer $transformer */
$transformer = app(TagTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($tag, $transformer, 'tags');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param TagStoreRequest $request
*
* @return JsonResponse
*/
public function store(TagStoreRequest $request): JsonResponse
{
$rule = $this->repository->store($request->getAll());
$manager = $this->getManager();
/** @var TagTransformer $transformer */
$transformer = app(TagTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rule, $transformer, 'tags');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions.
*
* @param Request $request
* @param Tag $tag
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, Tag $tag): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on tag.
->setTag($tag)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a rule.
*
* @param TagUpdateRequest $request
* @param Tag $tag
*
* @return JsonResponse
*/
public function update(TagUpdateRequest $request, Tag $tag): JsonResponse
{
$rule = $this->repository->update($tag, $request->getAll());
$manager = $this->getManager();
/** @var TagTransformer $transformer */
$transformer = app(TagTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($rule, $transformer, 'tags');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param array $cloud
* @param float $min
* @param float $max
*
* @return array
*/
private function analyseTagCloud(array $cloud, float $min, float $max): array
{
foreach (array_keys($cloud['tags']) as $index) {
$cloud['tags'][$index]['relative'] = round($cloud['tags'][$index]['size'] / $max, 4);
}
$cloud['min'] = $min;
$cloud['max'] = $max;
return $cloud;
}
/**
* @param Collection $tags
* @param Carbon $start
* @param Carbon $end
*
* @return array
*/
private function getTagCloud(Collection $tags, Carbon $start, Carbon $end): array
{
$min = null;
$max = 0;
$cloud = [
'tags' => [],
];
/** @var Tag $tag */
foreach ($tags as $tag) {
$earned = (float) $this->repository->earnedInPeriod($tag, $start, $end);
$spent = (float) $this->repository->spentInPeriod($tag, $start, $end);
$size = ($spent * -1) + $earned;
$min = $min ?? $size;
if ($size > 0) {
$max = $size > $max ? $size : $max;
$cloud['tags'][] = [
'tag' => $tag->tag,
'id' => $tag->id,
'size' => $size,
];
}
}
$cloud = $this->analyseTagCloud($cloud, $min, $max);
return $cloud;
}
}

View File

@@ -2,59 +2,72 @@
/**
* TransactionController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\TransactionRequest;
use FireflyIII\Api\V1\Requests\TransactionStoreRequest;
use FireflyIII\Api\V1\Requests\TransactionUpdateRequest;
use FireflyIII\Events\StoredTransactionGroup;
use FireflyIII\Events\UpdatedTransactionGroup;
use FireflyIII\Exceptions\DuplicateTransactionException;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
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\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\TransactionTransformer;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\PiggyBankEventTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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 League\Fractal\Resource\Item;
use Log;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class TransactionController
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class TransactionController extends Controller
{
use TransactionFilter;
/** @var TransactionGroupRepositoryInterface Group repository. */
private $groupRepository;
/** @var JournalAPIRepositoryInterface Journal API repos */
private $journalAPIRepository;
/** @var JournalRepositoryInterface The journal repository */
private $repository;
/**
* TransactionController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -64,9 +77,12 @@ class TransactionController extends Controller
/** @var User $admin */
$admin = auth()->user();
/** @var JournalRepositoryInterface repository */
$this->repository = app(JournalRepositoryInterface::class);
$this->repository = app(JournalRepositoryInterface::class);
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
$this->journalAPIRepository = app(JournalAPIRepositoryInterface::class);
$this->repository->setUser($admin);
$this->groupRepository->setUser($admin);
$this->journalAPIRepository->setUser($admin);
return $next($request);
}
@@ -74,16 +90,54 @@ class TransactionController extends Controller
}
/**
* Remove the specified resource from storage.
*
* @param \FireflyIII\Models\Transaction $transaction
* @param TransactionGroup $transactionGroup
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(Transaction $transaction): JsonResponse
public function attachments(TransactionGroup $transactionGroup): JsonResponse
{
$journal = $transaction->transactionJournal;
$this->repository->destroy($journal);
$manager = $this->getManager();
$attachments = new Collection;
foreach ($transactionGroup->transactionJournals as $transactionJournal) {
$attachments = $this->journalAPIRepository->getAttachments($transactionJournal)->merge($attachments);
}
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Remove the specified resource from storage.
*
* @param TransactionGroup $transactionGroup
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(TransactionGroup $transactionGroup): JsonResponse
{
$this->repository->destroyGroup($transactionGroup);
return response()->json([], 204);
}
/**
* Remove the specified resource from storage.
*
* @param TransactionJournal $transactionJournal
*
* @codeCoverageIgnore
* @return JsonResponse
*/
public function deleteJournal(TransactionJournal $transactionJournal): JsonResponse
{
$this->repository->destroyJournal($transactionJournal);
return response()->json([], 204);
}
@@ -94,130 +148,191 @@ class TransactionController extends Controller
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
{
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTypes($this->parameters->get('type'));
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
/** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class);
$collector->setUser($admin);
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
$collector->setAllAssetAccounts();
if (\in_array(TransactionType::TRANSFER, $types, true)) {
$collector->removeFilter(InternalTransferFilter::class);
}
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && 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->getPaginatedTransactions();
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a single transaction.
*
* @param Request $request
* @param Transaction $transaction
* @param string $include
* @param TransactionGroup $transactionGroup
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, Transaction $transaction, string $include = null): JsonResponse
public function piggyBankEvents(TransactionGroup $transactionGroup): JsonResponse
{
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $include ?? '';
$include = $request->get('include') ?? $include;
$manager->parseIncludes($include);
// collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::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);
$manager = $this->getManager();
$events = new Collection;
foreach ($transactionGroup->transactionJournals as $transactionJournal) {
$events = $this->journalAPIRepository->getPiggyBankEvents($transactionJournal)->merge($events);
}
$transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
/** @var PiggyBankEventTransformer $transformer */
$transformer = app(PiggyBankEventTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($events, $transformer, 'piggy_bank_events');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a single transaction.
*
* @param TransactionGroup $transactionGroup
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(TransactionGroup $transactionGroup): JsonResponse
{
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on transaction group.
->setTransactionGroup($transactionGroup)
// all info needed for the API:
->withAPIInformation();
$selectedGroup = $collector->getGroups()->first();
if (null === $selectedGroup) {
throw new NotFoundHttpException();
}
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($selectedGroup, $transformer, 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a single transaction, by transaction journal.
*
* @param TransactionJournal $transactionJournal
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function showByJournal(TransactionJournal $transactionJournal): JsonResponse
{
return $this->show($transactionJournal->transactionGroup);
}
/**
* Store a new transaction.
*
* @param TransactionRequest $request
*
* @param JournalRepositoryInterface $repository
* @param TransactionStoreRequest $request
*
* @throws FireflyException
* @return JsonResponse
*/
public function store(TransactionRequest $request, JournalRepositoryInterface $repository): JsonResponse
public function store(TransactionStoreRequest $request): JsonResponse
{
Log::debug('Now in API TransactionController::store()');
$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));
Log::channel('audit')
->info('Store new transaction over API.', $data);
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
try {
$transactionGroup = $this->groupRepository->store($data);
} catch (DuplicateTransactionException $e) {
Log::warning('Caught a duplicate transaction. Return error message.');
// return bad validation message.
// TODO use Laravel's internal validation thing to do this.
$response = [
'message' => 'The given data was invalid.',
'errors' => [
'transactions.0.description' => [$e->getMessage()],
],
];
// collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
$collector->setJournals(new Collection([$journal]));
return response()->json($response, 422);
} catch (FireflyException $e) {
Log::warning('Caught an exception. Return error message.');
Log::error($e->getMessage());
// return bad validation message.
// TODO use Laravel's internal validation thing to do this.
$response = [
'message' => 'The given data was invalid.',
'errors' => [
'transactions.0.description' => [sprintf('Internal exception: %s', $e->getMessage())],
],
];
// 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);
return response()->json($response, 422);
}
app('preferences')->mark();
event(new StoredTransactionGroup($transactionGroup, $data['apply_rules'] ?? true));
$transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on transaction group.
->setTransactionGroup($transactionGroup)
// all info needed for the API:
->withAPIInformation();
$selectedGroup = $collector->getGroups()->first();
if (null === $selectedGroup) {
throw new FireflyException('Cannot find transaction. Possibly, a rule deleted this transaction after its creation.');
}
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($selectedGroup, $transformer, 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -226,82 +341,42 @@ class TransactionController extends Controller
/**
* Update a transaction.
*
* @param TransactionRequest $request
* @param JournalRepositoryInterface $repository
* @param Transaction $transaction
* @param TransactionUpdateRequest $request
* @param TransactionGroup $transactionGroup
*
* @return JsonResponse
*/
public function update(TransactionRequest $request, JournalRepositoryInterface $repository, Transaction $transaction): JsonResponse
public function update(TransactionUpdateRequest $request, TransactionGroup $transactionGroup): JsonResponse
{
$data = $request->getAll();
$data['user'] = auth()->user()->id;
$journal = $repository->update($transaction->transactionJournal, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
Log::debug('Now in update routine.');
$data = $request->getAll();
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
$manager = $this->getManager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
app('preferences')->mark();
event(new UpdatedTransactionGroup($transactionGroup, $data['apply_rules'] ?? true));
// needs a lot of extra data to match the journal collector. Or just expand that one.
// collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
$collector->setJournals(new Collection([$journal]));
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on transaction group.
->setTransactionGroup($transactionGroup)
// all info needed for the API:
->withAPIInformation();
// add filter to remove transactions:
$transactionType = $journal->transactionType->type;
if ($transactionType === TransactionType::WITHDRAWAL) {
$collector->addFilter(PositiveAmountFilter::class);
$selectedGroup = $collector->getGroups()->first();
if (null === $selectedGroup) {
throw new NotFoundHttpException(); // @codeCoverageIgnore
}
if (!($transactionType === TransactionType::WITHDRAWAL)) {
$collector->addFilter(NegativeAmountFilter::class);
}
$transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($selectedGroup, $transformer, 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* All the types you can request.
*
* @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,],
];
$return = $types['default'];
if (isset($types[$type])) {
$return = $types[$type];
}
return $return;
}
}

View File

@@ -1,58 +1,59 @@
<?php
/**
* JournalLinkController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* TransactionLinkController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\JournalLinkRequest;
use FireflyIII\Api\V1\Requests\TransactionLinkRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Transformers\JournalLinkTransformer;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\TransactionLinkTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class JournalLinkController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* Class TransactionLinkController
*/
class JournalLinkController extends Controller
class TransactionLinkController extends Controller
{
use TransactionFilter;
/** @var JournalRepositoryInterface The journal repository */
private $journalRepository;
/** @var LinkTypeRepositoryInterface The link type repository */
private $repository;
/**
* JournalLinkController constructor.
* TransactionLinkController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -79,6 +80,7 @@ class JournalLinkController extends Controller
* @param TransactionJournalLink $link
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function delete(TransactionJournalLink $link): JsonResponse
{
@@ -92,34 +94,34 @@ class JournalLinkController extends Controller
*
* @param Request $request
*
* @return JsonResponse]
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager = $this->getManager();
// read type from URI
$name = $request->get('name') ?? null;
$name = $request->get('name');
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$linkType = $this->repository->findByName($name);
// get list of accounts. Count it and split it.
// get list of transaction links. Count it and split it.
$collection = $this->repository->getJournalLinks($linkType);
$count = $collection->count();
$journalLinks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($journalLinks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.journal_links.index') . $this->buildParams());
$paginator->setPath(route('api.v1.transaction_links.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($journalLinks, new JournalLinkTransformer($this->parameters), 'journal_links');
/** @var TransactionLinkTransformer $transformer */
$transformer = app(TransactionLinkTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($journalLinks, $transformer, 'transaction_links');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -129,22 +131,20 @@ class JournalLinkController extends Controller
/**
* List single resource.
*
* @param Request $request
* @param TransactionJournalLink $journalLink
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, TransactionJournalLink $journalLink): JsonResponse
public function show(TransactionJournalLink $journalLink): JsonResponse
{
$manager = new Manager;
$manager = $this->getManager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
/** @var TransactionLinkTransformer $transformer */
$transformer = app(TransactionLinkTransformer::class);
$transformer->setParameters($this->parameters);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
$resource = new Item($journalLink, $transformer, 'transaction_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -153,62 +153,59 @@ class JournalLinkController extends Controller
/**
* Store new object.
*
* @param JournalLinkRequest $request
* @param TransactionLinkRequest $request
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function store(JournalLinkRequest $request): JsonResponse
public function store(TransactionLinkRequest $request): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
$data = $request->getAll();
$inward = $this->journalRepository->findNull($data['inward_id'] ?? 0);
$outward = $this->journalRepository->findNull($data['outward_id'] ?? 0);
if (null === $inward || null === $outward) {
throw new FireflyException('Source or destination is NULL.');
throw new FireflyException('200024: Source or destination does not exist.');
}
$data['direction'] = 'inward';
$journalLink = $this->repository->storeLink($data, $inward, $outward);
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
/** @var TransactionLinkTransformer $transformer */
$transformer = app(TransactionLinkTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($journalLink, $transformer, 'transaction_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update object.
*
* @param JournalLinkRequest $request
* @param TransactionLinkRequest $request
* @param TransactionJournalLink $journalLink
*
* @return JsonResponse
* @throws FireflyException
* @return JsonResponse
*/
public function update(JournalLinkRequest $request, TransactionJournalLink $journalLink): JsonResponse
public function update(TransactionLinkRequest $request, TransactionJournalLink $journalLink): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$manager = $this->getManager();
$data = $request->getAll();
$data['inward'] = $this->journalRepository->findNull($data['inward_id'] ?? 0);
$data['outward'] = $this->journalRepository->findNull($data['outward_id'] ?? 0);
if (null === $data['inward'] || null === $data['outward']) {
throw new FireflyException('Source or destination is NULL.');
throw new FireflyException('200024: Source or destination does not exist.');
}
$data['direction'] = 'inward';
$journalLink = $this->repository->updateLink($journalLink, $data);
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
/** @var TransactionLinkTransformer $transformer */
$transformer = app(TransactionLinkTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($journalLink, $transformer, 'transaction_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -2,47 +2,44 @@
/**
* UserController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\UserRequest;
use FireflyIII\Api\V1\Requests\UserStoreRequest;
use FireflyIII\Api\V1\Requests\UserUpdateRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Transformers\UserTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
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;
/**
* Class UserController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class UserController extends Controller
{
@@ -52,6 +49,8 @@ class UserController extends Controller
/**
* UserController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
@@ -69,39 +68,35 @@ class UserController extends Controller
/**
* Remove the specified resource from storage.
*
* @param \FireflyIII\User $user
* @param User $user
*
* @return JsonResponse
* @throws FireflyException
* @codeCoverageIgnore
* @return JsonResponse
*/
public function delete(User $user): JsonResponse
{
/** @var User $admin */
$admin = auth()->user();
if ($this->repository->hasRole($admin, 'owner')) {
if ($admin->id !== $user->id && $this->repository->hasRole($admin, 'owner')) {
$this->repository->destroy($user);
return response()->json([], 204);
}
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
throw new FireflyException('200025: No access to function.'); // @codeCoverageIgnore
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function index(Request $request): JsonResponse
public function index(): JsonResponse
{
// user preferences
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// make manager
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$manager = $this->getManager();
// build collection
$collection = $this->repository->all();
@@ -113,7 +108,11 @@ class UserController extends Controller
$paginator->setPath(route('api.v1.users.index') . $this->buildParams());
// make resource
$resource = new FractalCollection($users, new UserTransformer($this->parameters), 'users');
/** @var UserTransformer $transformer */
$transformer = app(UserTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($users, $transformer, 'users');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -122,24 +121,21 @@ class UserController extends Controller
/**
* Show a single user.
*
* @param Request $request
* @param User $user
* @param User $user
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(Request $request, User $user): JsonResponse
public function show(User $user): JsonResponse
{
// 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);
$manager = $this->getManager();
// make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
/** @var UserTransformer $transformer */
$transformer = app(UserTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($user, $transformer, 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -147,26 +143,23 @@ class UserController extends Controller
/**
* Store a new user.
*
* @param UserRequest $request
* @param UserStoreRequest $request
*
* @return JsonResponse
*/
public function store(UserRequest $request): JsonResponse
public function store(UserStoreRequest $request): JsonResponse
{
$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);
$data = $request->getAll();
$user = $this->repository->store($data);
$manager = $this->getManager();
// make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
/** @var UserTransformer $transformer */
$transformer = app(UserTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($user, $transformer, 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
@@ -174,27 +167,22 @@ class UserController extends Controller
/**
* Update a user.
*
* @param UserRequest $request
* @param User $user
* @param UserUpdateRequest $request
* @param User $user
*
* @return JsonResponse
*/
public function update(UserRequest $request, User $user): JsonResponse
public function update(UserUpdateRequest $request, User $user): JsonResponse
{
$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);
$data = $request->getAll();
$user = $this->repository->update($user, $data);
$manager = $this->getManager();
// make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
/** @var UserTransformer $transformer */
$transformer = app(UserTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($user, $transformer, 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');

View File

@@ -0,0 +1,61 @@
<?php
/**
* ApiDemoUser.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Middleware;
use Closure;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\Request;
/**
* Class ApiDemoUser.
*/
class ApiDemoUser
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
*
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
/** @var User $user */
$user = $request->user();
if (null === $user) {
return $next($request);
}
/** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class);
if ($repository->hasRole($user, 'demo')) {
return response('', 403);
}
return $next($request);
}
}

View File

@@ -1,136 +0,0 @@
<?php
/**
* 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
/**
* Class AccountRequest
*/
class AccountRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
$data = [
'name' => $this->string('name'),
'active' => $this->boolean('active'),
'include_net_worth' => $this->boolean('include_net_worth'),
'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'),
'interest' => $this->string('interest'),
'interest_period' => $this->string('interest_period'),
];
// new fields for liabilities
// 'liability_type' => $this->string('liability_type'),
// 'liability_start_date' => $this->date('liability_start_date'),
//];
if ('liability' === $data['accountType']) {
$data['openingBalance'] = bcmul($this->string('liability_amount'), '-1');
$data['openingBalanceDate'] = $this->date('liability_start_date');
$data['accountType'] = $this->string('liability_type');
$data['account_type_id'] = null;
}
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @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',
'include_net_worth' => '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',
// required fields for liabilities:
'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage,credit card',
'liability_amount' => 'required_if:type,liability|min:0|numeric',
'liability_start_date' => 'required_if:type,liability|date',
'interest' => 'required_if:type,liability|between:0,100|numeric',
'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly',
];
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;
}
}

View File

@@ -0,0 +1,133 @@
<?php
/**
* AccountStoreRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Models\Location;
use FireflyIII\Rules\IsBoolean;
/**
* Class AccountStoreRequest
*
* @codeCoverageIgnore
*/
class AccountStoreRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* @return array
*/
public function getAllAccountData(): array
{
$active = true;
$includeNetWorth = true;
if (null !== $this->get('active')) {
$active = $this->boolean('active');
}
if (null !== $this->get('include_net_worth')) {
$includeNetWorth = $this->boolean('include_net_worth');
}
$data = [
'name' => $this->string('name'),
'active' => $active,
'include_net_worth' => $includeNetWorth,
'account_type' => $this->string('type'),
'account_type_id' => null,
'currency_id' => $this->integer('currency_id'),
'currency_code' => $this->string('currency_code'),
'virtual_balance' => $this->string('virtual_balance'),
'iban' => $this->string('iban'),
'BIC' => $this->string('bic'),
'account_number' => $this->string('account_number'),
'account_role' => $this->string('account_role'),
'opening_balance' => $this->string('opening_balance'),
'opening_balance_date' => $this->date('opening_balance_date'),
'cc_type' => $this->string('credit_card_type'),
'cc_Monthly_payment_date' => $this->string('monthly_payment_date'),
'notes' => $this->nlString('notes'),
'interest' => $this->string('interest'),
'interest_period' => $this->string('interest_period'),
];
// append Location information.
$data = $this->appendLocationData($data, null);
if ('liability' === $data['account_type']) {
$data['opening_balance'] = bcmul($this->string('liability_amount'), '-1');
$data['opening_balance_date'] = $this->date('liability_start_date');
$data['account_type'] = $this->string('liability_type');
$data['account_type_id'] = null;
}
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @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',
'type' => 'required|' . sprintf('in:%s', $types),
'iban' => 'iban|nullable',
'bic' => 'bic|nullable',
'account_number' => 'between:1,255|nullable|uniqueAccountNumberForUser',
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
'virtual_balance' => 'numeric|nullable',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'active' => [new IsBoolean],
'include_net_worth' => [new IsBoolean],
'account_role' => sprintf('in:%s|required_if:type,asset', $accountRoles),
'credit_card_type' => sprintf('in:%s|required_if:account_role,ccAsset', $ccPaymentTypes),
'monthly_payment_date' => 'date' . '|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage',
'liability_amount' => 'required_if:type,liability|min:0|numeric',
'liability_start_date' => 'required_if:type,liability|date',
'interest' => 'required_if:type,liability|between:0,100|numeric',
'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly',
'notes' => 'min:0|max:65536',
];
$rules = Location::requestRules($rules);
return $rules;
}
}

View File

@@ -0,0 +1,135 @@
<?php
/**
* AccountUpdateRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Models\Location;
use FireflyIII\Rules\IsBoolean;
/**
* Class AccountUpdateRequest
*
* @codeCoverageIgnore
*/
class AccountUpdateRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* @return array
*/
public function getUpdateData(): array
{
$active = null;
$includeNetWorth = null;
if (null !== $this->get('active')) {
$active = $this->boolean('active');
}
if (null !== $this->get('include_net_worth')) {
$includeNetWorth = $this->boolean('include_net_worth');
}
$data = [
'name' => $this->nullableString('name'),
'active' => $active,
'include_net_worth' => $includeNetWorth,
'account_type' => $this->nullableString('type'),
'account_type_id' => null,
'currency_id' => $this->nullableInteger('currency_id'),
'currency_code' => $this->nullableString('currency_code'),
'virtual_balance' => $this->nullableString('virtual_balance'),
'iban' => $this->nullableString('iban'),
'BIC' => $this->nullableString('bic'),
'account_number' => $this->nullableString('account_number'),
'account_role' => $this->nullableString('account_role'),
'opening_balance' => $this->nullableString('opening_balance'),
'opening_balance_date' => $this->date('opening_balance_date'),
'cc_type' => $this->nullableString('credit_card_type'),
'cc_Monthly_payment_date' => $this->nullableString('monthly_payment_date'),
'notes' => $this->nullableNlString('notes'),
'interest' => $this->nullableString('interest'),
'interest_period' => $this->nullableString('interest_period'),
];
$data = $this->appendLocationData($data, null);
if ('liability' === $data['account_type']) {
$data['opening_balance'] = bcmul($this->nullableString('liability_amount'), '-1');
$data['opening_balance_date'] = $this->date('liability_start_date');
$data['account_type'] = $this->nullableString('liability_type');
$data['account_type_id'] = null;
}
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$account = $this->route()->parameter('account');
$accountRoles = implode(',', config('firefly.accountRoles'));
$types = implode(',', array_keys(config('firefly.subTitlesByIdentifier')));
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
$rules = [
'name' => sprintf('min:1|uniqueAccountForUser:%d', $account->id),
'type' => sprintf('in:%s', $types),
'iban' => 'iban|nullable',
'bic' => 'bic|nullable',
'account_number' => sprintf('between:1,255|nullable|uniqueAccountNumberForUser:%d', $account->id),
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
'virtual_balance' => 'numeric|nullable',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'active' => [new IsBoolean],
'include_net_worth' => [new IsBoolean],
'account_role' => sprintf('in:%s|required_if:type,asset', $accountRoles),
'credit_card_type' => sprintf('in:%s|required_if:account_role,ccAsset', $ccPaymentTypes),
'monthly_payment_date' => 'date' . '|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull',
'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage',
'liability_amount' => 'required_if:type,liability|min:0|numeric',
'liability_start_date' => 'required_if:type,liability|date',
'interest' => 'required_if:type,liability|between:0,100|numeric',
'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly',
'notes' => 'min:0|max:65536',
];
$rules = Location::requestRules($rules);
return $rules;
}
}

View File

@@ -1,97 +0,0 @@
<?php
/**
* AttachmentRequest.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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Models\Bill;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Rules\IsValidAttachmentModel;
/**
* Class AttachmentRequest
*/
class AttachmentRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
return [
'filename' => $this->string('filename'),
'title' => $this->string('title'),
'notes' => $this->string('notes'),
'model' => $this->string('model'),
'model_id' => $this->integer('model_id'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$models = implode(
',', [
Bill::class,
ImportJob::class,
TransactionJournal::class,
]
);
$model = $this->string('model');
$rules = [
'filename' => 'required|between:1,255',
'title' => 'between:1,255',
'notes' => 'between:1,65000',
'model' => sprintf('required|in:%s', $models),
'model_id' => ['required', 'numeric', new IsValidAttachmentModel($model)],
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
unset($rules['model'], $rules['model_id']);
$rules['filename'] = 'between:1,255';
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* AttachmentStoreRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\IsValidAttachmentModel;
/**
* Class AttachmentStoreRequest
*
* @codeCoverageIgnore
*/
class AttachmentStoreRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
return [
'filename' => $this->string('filename'),
'title' => $this->string('title'),
'notes' => $this->nlString('notes'),
'model' => $this->string('attachable_type'),
'model_id' => $this->integer('attachable_id'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$models = config('firefly.valid_attachment_models');
$models = array_map(
static function (string $className) {
return str_replace('FireflyIII\\Models\\', '', $className);
}, $models
);
$models = implode(',', $models);
$model = $this->string('attachable_type');
return [
'filename' => 'required|between:1,255',
'title' => 'between:1,255',
'notes' => 'between:1,65000',
'attachable_type' => sprintf('required|in:%s', $models),
'attachable_id' => ['required', 'numeric', new IsValidAttachmentModel($model)],
];
}
}

View File

@@ -0,0 +1,73 @@
<?php
/**
* AttachmentUpdateRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
/**
* ClassAttachmentUpdateRequest
*
* @codeCoverageIgnore
*/
class AttachmentUpdateRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
return [
'filename' => $this->string('filename'),
'title' => $this->string('title'),
'notes' => $this->nlString('notes'),
'model' => $this->string('attachable_type'),
'model_id' => $this->integer('attachable_id'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
return [
'filename' => 'between:1,255',
'title' => 'between:1,255',
'notes' => 'between:1,65000',
];
}
}

View File

@@ -1,22 +1,22 @@
<?php
/**
* AvailableBudgetRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -25,6 +25,8 @@ namespace FireflyIII\Api\V1\Requests;
/**
* Class AvailableBudgetRequest
*
* @codeCoverageIgnore
*/
class AvailableBudgetRequest extends Request
{
@@ -50,8 +52,8 @@ class AvailableBudgetRequest extends Request
'currency_id' => $this->integer('currency_id'),
'currency_code' => $this->string('currency_code'),
'amount' => $this->string('amount'),
'start_date' => $this->date('start_date'),
'end_date' => $this->date('end_date'),
'start' => $this->date('start'),
'end' => $this->date('end'),
];
}
@@ -62,15 +64,13 @@ class AvailableBudgetRequest extends Request
*/
public function rules(): array
{
$rules = [
'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',
return [
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'amount' => 'required|numeric|more:0',
'start_date' => 'required|date|before:end_date',
'end_date' => 'required|date|after:start_date',
'start' => 'required|date|before:end',
'end' => 'required|date|after:start',
];
return $rules;
}

View File

@@ -2,32 +2,37 @@
/**
* BillRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\IsBoolean;
use Illuminate\Validation\Validator;
/**
* Class BillRequest
*
* TODO AFTER 4.8,0: split this into two request classes.
*
* @codeCoverageIgnore
*/
class BillRequest extends Request
{
@@ -50,7 +55,12 @@ class BillRequest extends Request
*/
public function getAll(): array
{
$data = [
$active = true;
if (null !== $this->get('active')) {
$active = $this->boolean('active');
}
return [
'name' => $this->string('name'),
'amount_min' => $this->string('amount_min'),
'amount_max' => $this->string('amount_max'),
@@ -59,18 +69,16 @@ class BillRequest extends Request
'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'),
'active' => $active,
'notes' => $this->nlString('notes'),
];
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*
*/
public function rules(): array
{
@@ -78,13 +86,12 @@ class BillRequest extends Request
'name' => 'required|between:1,255|uniqueObjectForUser:bills,name',
'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',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'date' => 'required|date',
'repeat_freq' => 'required|in:weekly,monthly,quarterly,half-year,yearly',
'skip' => 'required|between:0,31',
'automatch' => 'required|boolean',
'active' => 'required|boolean',
'skip' => 'between:0,31',
'active' => [new IsBoolean],
'notes' => 'between:1,65536',
];
switch ($this->method()) {
@@ -103,19 +110,19 @@ class BillRequest extends Request
/**
* Configure the validator instance.
*
* @param Validator $validator
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
static function (Validator $validator) {
$data = $validator->getData();
$min = (float)($data['amount_min'] ?? 0);
$max = (float)($data['amount_max'] ?? 0);
$min = (float) ($data['amount_min'] ?? 0);
$max = (float) ($data['amount_max'] ?? 0);
if ($min > $max) {
$validator->errors()->add('amount_min', (string)trans('validation.amount_min_over_max'));
$validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max'));
}
}
);

View File

@@ -1,31 +1,33 @@
<?php
/**
* BudgetLimitRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III.
* This file is part of Firefly III (https://github.com/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.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* GNU Affero 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/>.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
/**
* Class BudgetLimitRequest
*
* @codeCoverageIgnore
* TODO AFTER 4.8,0: split this into two request classes.
*/
class BudgetLimitRequest extends Request
{
@@ -48,10 +50,12 @@ class BudgetLimitRequest extends Request
public function getAll(): array
{
return [
'budget_id' => $this->integer('budget_id'),
'start_date' => $this->date('start_date'),
'end_date' => $this->date('end_date'),
'amount' => $this->string('amount'),
'budget_id' => $this->integer('budget_id'),
'start' => $this->date('start'),
'end' => $this->date('end'),
'amount' => $this->string('amount'),
'currency_id' => $this->integer('currency_id'),
'currency_code' => $this->string('currency_code'),
];
}
@@ -63,10 +67,12 @@ class BudgetLimitRequest extends Request
public function rules(): array
{
$rules = [
'budget_id' => 'required|exists:budgets,id|belongsToUser:budgets,id',
'start_date' => 'required|before:end_date|date',
'end_date' => 'required|after:start_date|date',
'amount' => 'required|more:0',
'budget_id' => 'required|exists:budgets,id|belongsToUser:budgets,id',
'start' => 'required|before:end|date',
'end' => 'required|after:start|date',
'amount' => 'required|more:0',
'currency_id' => 'numeric|exists:transaction_currencies,id',
'currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
];
switch ($this->method()) {
default:
@@ -76,6 +82,12 @@ class BudgetLimitRequest extends Request
$rules['budget_id'] = 'required|exists:budgets,id|belongsToUser:budgets,id';
break;
}
// if request has a budget already, drop the rule.
$budget = $this->route()->parameter('budget');
if (null !== $budget) {
unset($rules['budget_id']);
}
return $rules;
}

View File

@@ -1,82 +0,0 @@
<?php
/**
* BudgetRequest.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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Models\Budget;
/**
* Class BudgetRequest
*/
class BudgetRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
return [
'name' => $this->string('name'),
'active' => $this->boolean('active'),
'order' => 0,
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'name' => 'required|between:1,100|uniqueObjectForUser:budgets,name',
'active' => 'required|boolean',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
/** @var Budget $budget */
$budget = $this->route()->parameter('budget');
$rules['name'] = sprintf('required|between:1,100|uniqueObjectForUser:budgets,name,%d', $budget->id);
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,106 @@
<?php
/**
* BudgetStoreRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\IsBoolean;
use Illuminate\Validation\Validator;
/**
* Class BudgetStoreRequest
*
* @codeCoverageIgnore
*/
class BudgetStoreRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
$active = true;
if (null !== $this->get('active')) {
$active = $this->boolean('active');
}
return [
'name' => $this->string('name'),
'active' => $active,
'order' => 0,
'auto_budget_type' => $this->string('auto_budget_type'),
'transaction_currency_id' => $this->integer('auto_budget_currency_id'),
'transaction_currency_code' => $this->string('auto_budget_currency_code'),
'auto_budget_amount' => $this->string('auto_budget_amount'),
'auto_budget_period' => $this->string('auto_budget_period'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
return [
'name' => 'required|between:1,100|uniqueObjectForUser:budgets,name',
'active' => [new IsBoolean],
'auto_budget_type' => 'in:reset,rollover,none',
'auto_budget_currency_id' => 'exists:transaction_currencies,id',
'auto_budget_currency_code' => 'exists:transaction_currencies,code',
'auto_budget_amount' => 'min:0|max:1000000000',
'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly',
];
}
/**
* Configure the validator instance with special rules for after the basic validation rules.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
// validate all account info
$this->validateAutoBudgetAmount($validator);
}
);
}
}

Some files were not shown because too many files have changed in this diff Show More