Compare commits

...

2070 Commits

Author SHA1 Message Date
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
James Cole
a4cb2c1cb1 Merge branch 'release/4.7.6.1' 2018-09-03 10:26:36 +02:00
James Cole
bd31b7e943 Update language files [skip ci] 2018-09-03 10:20:51 +02:00
James Cole
b2e7c767df Update meta files to 4.7.6.1 [skip ci] 2018-09-03 10:10:58 +02:00
James Cole
bb9f763729 Repositories will now warn if used in test environment. 2018-09-03 08:41:03 +02:00
James Cole
fb61229bf3 Update the .env files and the Dockerfile. 2018-09-03 08:40:22 +02:00
James Cole
fc30d41ee5 Refer to correct issue [skip ci] 2018-09-03 07:59:32 +02:00
James Cole
7666147f3c Merge pull request #1649 from hamuz/patch-1
2FA QR doesn't show up due to CSP error
2018-09-03 07:57:19 +02:00
HamuZ HamuZ
52f8b24041 2FA QR doesn't show up due to CSP error
Relevant stackoverflow fix:
https://stackoverflow.com/questions/18447970/content-security-policy-data-not-working-for-base64-images-in-chrome-28
2018-09-03 08:19:38 +03:00
James Cole
eaf2667abb Fix test method names. 2018-09-02 20:27:26 +02:00
James Cole
de754ca4e0 Improve test coverage. 2018-09-02 20:13:25 +02:00
James Cole
96dd89fbeb Merge tag '4.7.6' into develop
4.7.6
2018-09-01 21:30:46 +02:00
James Cole
bae40e2cbc Merge branch 'release/4.7.6' 2018-09-01 21:30:44 +02:00
James Cole
6a647dab8b Remove newline from changelog. 2018-09-01 20:57:03 +02:00
James Cole
ebcf5b71d2 Update meta files for new release. 2018-09-01 20:51:22 +02:00
James Cole
02370fb65d Fix final tests 2018-09-01 20:45:05 +02:00
James Cole
1e4f4907e3 Update translations. 2018-09-01 20:44:50 +02:00
James Cole
13f72c73fb Expand test coverage. 2018-08-31 21:12:53 +02:00
James Cole
69b4632ef6 Fix #1642 2018-08-31 21:11:47 +02:00
James Cole
ede8c293fc Fix for #1643 2018-08-31 19:51:18 +02:00
James Cole
0cfe991482 Fix issue where the tester would not respect the strict yes/no setting. 2018-08-31 17:48:54 +02:00
James Cole
6377459e2f Smaller batch for bunq import. #1607 2018-08-31 17:11:48 +02:00
James Cole
33fe6dbfa3 First step in improving test coverage. 2018-08-30 20:58:07 +02:00
James Cole
e158b9b64e Also improve the "forward" routine so it won't go back again #1607 2018-08-30 19:27:27 +02:00
James Cole
dfa9e537b3 Improve the bunq routine so it will keep looping when faced with default PHP time out settings (30 seconds). 2018-08-30 19:12:52 +02:00
James Cole
6d28ece616 Download more, sleep less. #1607 2018-08-29 17:33:36 +02:00
James Cole
59f4ecdaa6 The net worth chart will respect net worth preferences. 2018-08-29 10:57:42 +02:00
James Cole
10d953f336 Update change log. [skip ci] 2018-08-29 08:01:30 +02:00
James Cole
5b771f7def Code for #1607 2018-08-28 21:48:10 +02:00
James Cole
4a8e3ee845 Merge pull request #1639 from hamuz/hamuz-patch-1
Trust Heroku load balancer
2018-08-28 19:43:19 +02:00
HamuZ HamuZ
9a1f559dd2 Merge branch 'develop' into hamuz-patch-1 2018-08-28 20:34:01 +03:00
James Cole
62321a03ca Fix missing combi for transaction types. 2018-08-28 14:23:51 +02:00
James Cole
40ca72c656 Reference to unknown chart. 2018-08-28 14:20:04 +02:00
HamuZ HamuZ
34fcff7a9d Trust Heroku load balancer
Fix insecure warning in browser when deploying to Heroku
2018-08-28 08:18:43 +03:00
James Cole
e1c829f4fa Make some charts multi-currency. 2018-08-28 05:21:23 +02:00
James Cole
46136d94e9 A fix for apparently unknown category names [skip ci] 2018-08-28 04:29:16 +02:00
James Cole
0e2e8d1be5 Fix new category chart tests. 2018-08-27 21:06:46 +02:00
James Cole
1d1aa5dd3a Fix tests for multi currency account charts. 2018-08-27 20:33:52 +02:00
James Cole
0d82589916 Make some charts currency aware for #740 2018-08-27 18:59:30 +02:00
James Cole
4fc13037d2 This makes the expense chart on the frontpage multi-currency. 2018-08-27 08:08:51 +02:00
James Cole
3764499714 Expand API to accept liability accounts. 2018-08-26 21:29:46 +02:00
James Cole
c4bbbc49b4 Update CSS font references 2018-08-26 21:29:30 +02:00
James Cole
503158ab97 New translations [skip ci] 2018-08-26 18:44:22 +02:00
James Cole
8c1d1d1db0 Improved implementation of liability accounts and the option to add or remove accounts from the net-worth calculations. 2018-08-26 18:40:38 +02:00
James Cole
7dc72a2894 Add the ability to make transactions to and from liability accounts. 2018-08-25 22:10:10 +02:00
James Cole
07cfba1b3a Add the ability to make transfers to and from liability accounts. 2018-08-25 21:33:22 +02:00
James Cole
c55b80f467 Update test coverage. 2018-08-25 20:45:42 +02:00
James Cole
2099da7142 Moved word "success out of hyperlink [skip ci] 2018-08-25 17:09:25 +02:00
James Cole
ea125936e7 Fix CSS. [skip ci] 2018-08-25 17:08:29 +02:00
James Cole
5de01628a6 Expand secure headers. 2018-08-25 10:49:52 +02:00
James Cole
2834aca597 Update header readability, add Google as an optional allowed source. 2018-08-25 10:36:27 +02:00
James Cole
88bab888d8 Update CSS and JS libs. 2018-08-25 07:56:10 +02:00
James Cole
dfdbace298 Add secure headers middleware. 2018-08-25 07:55:47 +02:00
James Cole
a9590d2bb6 Add secure headers middleware. 2018-08-25 07:55:32 +02:00
James Cole
29a81eb05e Fix test coverage. 2018-08-24 21:14:17 +02:00
James Cole
20490fcd80 Update JS 2018-08-24 21:14:04 +02:00
James Cole
e775927f60 Add htaccess files to prevent directory indexing. [skip ci] 2018-08-24 21:10:04 +02:00
James Cole
835a421909 Refactor rule processor so it's testable. 2018-08-24 17:57:34 +02:00
James Cole
850a0ae17e Improved code coverage for events and reports. 2018-08-24 16:07:33 +02:00
James Cole
2b54363dd7 Improve test coverage. 2018-08-24 07:18:33 +02:00
James Cole
b174a06b86 Rewrite text in env files. 2018-08-24 07:17:50 +02:00
James Cole
d4096103cb Improve test coverage and fix test code. 2018-08-23 18:33:39 +02:00
James Cole
3f493aceb2 Mark code as untestable or deprecated (or both). 2018-08-23 18:33:07 +02:00
James Cole
05309da76d Small fix for test script. 2018-08-23 18:32:17 +02:00
James Cole
179f720806 Some updated translations [skip ci] 2018-08-23 06:17:26 +02:00
James Cole
7c34144ccd Some basic code for liability accounts. 2018-08-22 21:18:15 +02:00
James Cole
cc234b594d Fix call to cron job, clear cache after running. 2018-08-21 18:20:01 +02:00
James Cole
024cf610a8 Merge pull request #1624 from david-me/clickable-transaction-notifier
Can have link in success message to the transaction it refers to
2018-08-21 15:52:52 +02:00
David Meiseles
a1896a6336 DRYed out 2018-08-20 13:45:30 -04:00
David Meiseles
d30da7bf5d Can have link in success message to the transaction it refers to 2018-08-20 11:36:13 -04:00
James Cole
f8e914416d Give file a newline [skip ci] 2018-08-20 17:31:39 +02:00
James Cole
433da921bb Simplify cronjob call. 2018-08-20 17:29:39 +02:00
James Cole
4876053018 Test a fix for #1620 2018-08-19 19:31:21 +02:00
James Cole
0c3a580b33 Fix issues with italian translation, add new translations [skip ci] 2018-08-18 22:11:31 +02:00
James Cole
7689b7b4b0 Forgot to push this part of the fix for #1615 2018-08-18 20:13:52 +02:00
James Cole
21bff39e31 Fix #1620 2018-08-18 20:13:26 +02:00
James Cole
ba09901228 fix #1615 2018-08-18 20:11:12 +02:00
James Cole
90bf2e58b2 Fixes #1620 2018-08-18 14:12:39 +02:00
James Cole
004807aa32 Update cron file, use supervisor. 2018-08-18 14:08:28 +02:00
James Cole
35bacf2ad0 Update docker file to match postgres. 2018-08-18 05:21:47 +02:00
James Cole
81d17409d4 Fix some things with the update checker. 2018-08-17 21:51:15 +02:00
James Cole
a8080f55f0 Fix docker and entry point. 2018-08-17 21:12:26 +02:00
James Cole
379c540bd8 Update config for logging in Docker. 2018-08-17 20:01:46 +02:00
James Cole
f319005357 Fix tests. 2018-08-17 06:45:57 +02:00
James Cole
df0e2dd2a2 Bump version and warn about PHP 7.2 2018-08-17 06:39:48 +02:00
James Cole
219a0cd612 Fix for #1617 2018-08-17 05:54:29 +02:00
James Cole
3ca3ce0726 Fix #1616 2018-08-16 20:43:11 +02:00
James Cole
566be8dc63 Fix #1564 2018-08-16 16:42:58 +02:00
James Cole
6bd4fa1c0a Remove bad slash from path. 2018-08-15 19:10:00 +02:00
James Cole
c767ee04f4 Merge pull request #1613 from ErikFontanel/develop
fixed missing ENV variables
2018-08-15 17:15:33 +02:00
Erik Gelderblom
a5f89e0967 fixed missing ENV variables 2018-08-15 14:43:49 +02:00
James Cole
7355d14159 Merge pull request #1610 from ErikFontanel/develop
Multi architecture Dockerfile
2018-08-15 06:18:54 +02:00
Erik Gelderblom
efd5ceb405 fixed installation for cURL and cron 2018-08-14 21:21:03 +02:00
James Cole
035dc8ceb4 Fix #1609 2018-08-14 20:08:07 +02:00
James Cole
11be33e942 Fix #1605 2018-08-14 06:40:21 +02:00
James Cole
e125254687 Fix bad method name. 2018-08-14 06:40:04 +02:00
James Cole
a2b997ba20 Fix #1608 2018-08-13 19:09:43 +02:00
James Cole
7327941c77 Alert if cron job isn't running. 2018-08-13 19:07:46 +02:00
James Cole
6c9eb1b699 Update composer lock file. 2018-08-13 19:07:22 +02:00
James Cole
60e262dece Fix bug in Spectre import. 2018-08-13 18:30:47 +02:00
James Cole
9c5463e515 Update to user and cron job. 2018-08-13 18:10:02 +02:00
James Cole
6941176519 Make chart red/green 2018-08-13 18:09:47 +02:00
James Cole
cb2c52cddb New cronjob code. 2018-08-12 14:26:11 +02:00
James Cole
dd95776144 Code for #833 2018-08-12 10:06:20 +02:00
James Cole
b95ca98be9 Add cron job to docker file. 2018-08-12 09:34:03 +02:00
James Cole
67b090b4d8 New translations. 2018-08-12 09:33:56 +02:00
James Cole
54b76a03ce Update views and translations. 2018-08-11 19:22:28 +02:00
James Cole
cd6c727730 Flags for help pages. 2018-08-11 19:22:10 +02:00
James Cole
a35c6e29b6 Rename various methods. 2018-08-11 19:21:58 +02:00
James Cole
95ce72fce7 Expand API options for available budgets and journal links 2018-08-11 18:27:45 +02:00
James Cole
a803dfc7fa Undo recurring job thing. 2018-08-11 18:20:29 +02:00
James Cole
c465d1c059 Example run of recurring thing outside of cron job. 2018-08-11 18:20:10 +02:00
James Cole
9914c0791e Rename journal collector to more fitting transaction collector. 2018-08-11 14:33:47 +02:00
James Cole
96baf5d3c7 Add new transaction collector (as opposed to journal collector). 2018-08-11 14:15:22 +02:00
James Cole
a205367b62 Various refactoring. 2018-08-11 14:15:07 +02:00
James Cole
6218fa90de Move get income / get expense methods to trait. 2018-08-11 14:06:49 +02:00
James Cole
51a770cfdc New experimental Dockerfile #1464 2018-08-11 07:22:17 +02:00
James Cole
16fba15b5c Refactor various methods away from controllers 2018-08-11 06:39:29 +02:00
James Cole
ec2463a3ba Remove view generation and put in trait. 2018-08-10 18:19:51 +02:00
James Cole
b605ede74e Move methods to traits. 2018-08-10 17:05:37 +02:00
James Cole
b1b13d3696 Can no longer set a budget to an expense. 2018-08-09 20:49:30 +02:00
James Cole
51b11e5188 Can no longer set a budget to an expense. 2018-08-09 20:46:47 +02:00
James Cole
eefa84a77b Remove method pointers from tests. 2018-08-09 20:17:15 +02:00
James Cole
5908b4b000 Route fixes and fix tests. 2018-08-09 19:44:36 +02:00
James Cole
2ed433c96d Refactor configuration methods into trait 2018-08-09 17:50:30 +02:00
James Cole
9865800e39 Refactor many request related methods into (complex) trait. 2018-08-09 17:46:14 +02:00
James Cole
4f697e77d5 Redirect user to original account refactor. 2018-08-09 17:34:11 +02:00
James Cole
c957aded98 Redirect user to original account refactor. 2018-08-09 17:32:28 +02:00
James Cole
aa0758cd2b Refactor basic methods to trait 2018-08-09 16:16:27 +02:00
James Cole
0c2093753d Refactor isSplitJournal() 2018-08-09 16:14:47 +02:00
James Cole
136f983353 Move isOpeningBalance() to trait 2018-08-09 16:13:13 +02:00
James Cole
7943164375 Change scope of methods, add some notes. Prep for refactoring. 2018-08-09 16:07:33 +02:00
James Cole
32e58d0a60 Replace "moment" with more accurate start/end dates. 2018-08-08 17:53:40 +02:00
James Cole
bc807965ab Improve navigation for tags and rename route. 2018-08-07 21:00:25 +02:00
James Cole
477788658b Recurring transactions support pagination. 2018-08-07 20:47:05 +02:00
James Cole
723abf44bd Shorten breadcrumbs [skip ci] 2018-08-07 20:38:19 +02:00
James Cole
fd1298d4d2 Refactor method that only counts. 2018-08-07 19:29:53 +02:00
James Cole
42f39536a1 Catch "throwable" 2018-08-07 19:29:40 +02:00
James Cole
6f0ac91bd2 Add missing string. 2018-08-07 19:29:25 +02:00
James Cole
6dea9156ab Fix edit for liabilities. 2018-08-07 19:29:19 +02:00
James Cole
c5051b3e46 Make method nullable. 2018-08-07 19:29:10 +02:00
James Cole
229d033e1a Fix category bread crumb 2018-08-07 19:28:54 +02:00
James Cole
f494ba7065 Rename field to "notes" 2018-08-07 19:28:46 +02:00
James Cole
201bc7db53 Update requests. 2018-08-07 19:24:07 +02:00
James Cole
cd2a251f22 Reinstate description for rule group. 2018-08-07 17:54:37 +02:00
James Cole
ff44ad4994 Fix #1597 2018-08-07 17:50:14 +02:00
James Cole
b496ca6a2c Some fixing up for #1598 2018-08-07 17:34:43 +02:00
James Cole
5908c0ce8c Code cleanup and realign. 2018-08-06 19:14:30 +02:00
James Cole
f7eef25fed New translations. 2018-08-05 20:44:05 +02:00
James Cole
049c93465a Update tests 2018-08-05 20:42:45 +02:00
James Cole
33294dd9f0 Allow editing of liabilities. 2018-08-05 18:59:15 +02:00
James Cole
0a89f4000d Synchronise API and app rule management. 2018-08-05 15:41:13 +02:00
James Cole
422e80530b Refactor rule creation. 2018-08-05 15:34:20 +02:00
James Cole
07a8c69ba8 New translations [skip ci] 2018-08-05 15:33:49 +02:00
James Cole
5449879a7d Fix for #1594 2018-08-05 07:36:33 +02:00
James Cole
8dbc846314 Basic code for tracking liabilities. 2018-08-04 17:30:47 +02:00
James Cole
f0d3ca5d53 Various code cleanup. 2018-08-04 17:30:06 +02:00
James Cole
5af026674f Updated translations. 2018-08-04 14:17:03 +02:00
James Cole
2ebb4778cd Merge pull request #1593 from lucavallerini/transactions-links-translatable
Transactions links are now translatable on admin views
2018-08-04 14:14:33 +02:00
James Cole
bf3c57d26b Remove translations. 2018-08-04 14:14:08 +02:00
Luca Vallerini
cb9c87102f Transactions links are now translatable on admin views 2018-08-04 13:03:54 +02:00
James Cole
c73b003de4 Merge pull request #1591 from claystation/master
BUGFIX: Initial user not set as owner
2018-08-04 12:08:00 +02:00
Clemens Wijnekus
771d448a7b Revert "Added .idea folder to Gitignore for IntelliJ based projects."
This reverts commit dd49926
2018-08-04 10:17:18 +02:00
Clemens Wijnekus
de12db5f05 Fix for setting initial user as Owner 2018-08-04 00:27:28 +02:00
Clemens Wijnekus
dd49926cc2 Added .idea folder to Gitignore for IntelliJ based projects. 2018-08-04 00:08:21 +02:00
James Cole
7a9ab190eb Fixes #1586 2018-08-03 16:55:10 +02:00
James Cole
2290fcde22 First code for liabilities and some tests. 2018-08-03 16:35:55 +02:00
James Cole
ae85876965 Make sure null value is turned into an empty string [skip ci] 2018-08-02 07:17:18 +02:00
James Cole
f07d8e958f Experimental sort routine for list of accounts [skip ci] 2018-08-02 07:14:00 +02:00
James Cole
610af45dee Experimental sort routine for list of accounts [skip ci] 2018-08-02 07:12:06 +02:00
James Cole
138a5bc3fe Add autocomplete field as suggested by Chrome. 2018-08-01 07:35:31 +02:00
James Cole
427e9c5637 Fix #1216 2018-08-01 07:32:53 +02:00
James Cole
e3e8336602 Update some code for Heroku. 2018-08-01 07:24:19 +02:00
James Cole
194073e49a Fix tests. 2018-07-31 20:39:36 +02:00
James Cole
1af45aff73 Fix missing link to admin. 2018-07-31 19:28:56 +02:00
James Cole
56518ea028 First working version of YNAB import #145 2018-07-31 18:19:48 +02:00
James Cole
c1ac2bb156 Expand text and routine for YNAB 2018-07-31 05:49:03 +02:00
James Cole
a004f27361 Updated strings 2018-07-31 05:35:25 +02:00
James Cole
7843c55409 Expand helptext for #1581 2018-07-31 05:30:27 +02:00
James Cole
41da7d9f9a Fix #1580 2018-07-31 05:27:33 +02:00
James Cole
2add644706 First basic import #145 2018-07-30 20:39:19 +02:00
James Cole
dfd9cf0874 New code for YNAB import. 2018-07-29 21:02:03 +02:00
James Cole
7ad09da4e9 Fix #1576 2018-07-29 16:04:22 +02:00
James Cole
8efbeb14d2 First code for YNAB import #145 2018-07-29 07:30:06 +02:00
James Cole
a1005d91df Expand views with CSRF token, to prevent error in console. #1575 2018-07-29 06:53:08 +02:00
James Cole
a681f1ce3c Empty URL warning 2018-07-28 21:03:08 +02:00
James Cole
5a0714ca1a Merge tag '4.7.5.3' into develop
4.7.5.3
2018-07-28 15:39:36 +02:00
James Cole
bd5c790043 Merge branch 'release/4.7.5.3' 2018-07-28 15:39:35 +02:00
James Cole
2ae3cf79e4 Update config files and change logs for hotfix. 2018-07-28 15:20:28 +02:00
James Cole
fb122ba097 Fix for #1572 2018-07-28 15:10:20 +02:00
James Cole
0c104cd86c New file list for Sandstorm. 2018-07-28 14:54:10 +02:00
James Cole
a687f4ad68 Merge tag '4.7.5.2' into develop
4.7.5.2
2018-07-28 13:38:09 +02:00
James Cole
228f42cf04 Merge branch 'release/4.7.5.2' 2018-07-28 13:38:06 +02:00
James Cole
6d4956b574 Updated files for 4.7.5.2 2018-07-28 12:10:25 +02:00
James Cole
0c7b652a70 Last code optimization before release. 2018-07-28 10:45:16 +02:00
James Cole
d35470a79e Found and fixed #1571 2018-07-28 10:03:47 +02:00
James Cole
719d610be3 Fix issue with new crud() method. 2018-07-28 07:26:33 +02:00
James Cole
07ae64693e new language strings and updated code 2018-07-28 06:27:30 +02:00
James Cole
0ccc1271a6 Update tests. 2018-07-27 06:06:29 +02:00
James Cole
26fa2b0b74 Speed up category test. 2018-07-27 06:02:34 +02:00
James Cole
6f64c19c32 Update changelog for next release. 2018-07-27 05:03:50 +02:00
James Cole
e3e0e12fef Various code cleanup. 2018-07-27 05:03:37 +02:00
James Cole
0312ba8ad7 Various bugfixes and code clean up. 2018-07-27 04:46:21 +02:00
James Cole
2ad8e7f343 Fix some errors found in debug logs. 2018-07-27 03:09:35 +02:00
James Cole
d6298d9f05 Add extra logging for common error on demo site [skip ci] 2018-07-26 06:28:49 +02:00
James Cole
89be30c4b9 Catch various errors. 2018-07-26 06:27:52 +02:00
James Cole
6bcfea1de4 Various code cleanup. 2018-07-26 06:10:17 +02:00
James Cole
e8c9554dd6 Remove TODO's, add some suppressors for code quality. 2018-07-25 19:43:02 +02:00
James Cole
02272f7db0 New strings [skip ci] 2018-07-25 16:44:06 +02:00
James Cole
5a73e79475 Update explanation about sha1 [skip ci] 2018-07-25 16:14:24 +02:00
James Cole
7f4ecd40ce Fix issues where data-variable was not initialized properly. 2018-07-25 07:11:04 +02:00
James Cole
7c950c3022 Remove a lot of deprecated code. 2018-07-25 06:45:25 +02:00
James Cole
dbf019135a Simplified tag cloud. 2018-07-25 06:18:20 +02:00
James Cole
e504ee82e5 Submitted debug code. 2018-07-24 21:13:12 +02:00
James Cole
780a15fe4f Remove array calls and fix various bugs. 2018-07-24 21:12:48 +02:00
James Cole
abb249643f Fix bad class reference. 2018-07-24 20:49:25 +02:00
James Cole
086eccaf4a Updates for new Sandstorm package. 2018-07-24 20:30:52 +02:00
James Cole
871033501a Update file list for Sandstorm. 2018-07-24 20:29:39 +02:00
James Cole
ccd727488f Update file list for Sandstorm. 2018-07-24 20:19:41 +02:00
James Cole
aa59d0f082 Merge pull request #1569 from ocdtrekkie/update-sandstorm-build
Update Sandstorm build instructions
2018-07-24 20:16:42 +02:00
Jacob Weisz
5d12f53283 Update Sandstorm build instructions
I've moved this to official Jessie 64-bit. vagrant-spk currently uses Stretch, but that'd likely require more changes and testing on your other build files.
2018-07-24 12:14:35 -05:00
James Cole
59c005875a Fix for #1568 2018-07-24 17:46:34 +02:00
James Cole
06d22e843a Code optimizations. 2018-07-23 21:49:15 +02:00
James Cole
4fa5f4e5a3 Fix some issues that triggered in scrutinizer. 2018-07-22 21:32:58 +02:00
James Cole
67ea825d4a Remove unused methods. 2018-07-22 21:09:57 +02:00
James Cole
a616e06f9d Add newlines to tests. [skip ci] 2018-07-22 20:33:17 +02:00
James Cole
b7752928a4 Give all of these files a newline at the end. 2018-07-22 20:32:02 +02:00
James Cole
ca096852a5 Code optimisations. 2018-07-22 18:50:27 +02:00
James Cole
ea2c48bca5 Fix tests. 2018-07-22 17:06:10 +02:00
James Cole
a722dc4235 Clean up code, remove unused methods. 2018-07-22 16:35:46 +02:00
James Cole
dbbf0ff5e4 Improve code in Jobs. 2018-07-22 15:20:45 +02:00
James Cole
a941519db5 Improve code quality. 2018-07-22 15:08:56 +02:00
James Cole
d4ba014a8a Clean up various code. 2018-07-22 12:52:07 +02:00
James Cole
d193a6aec4 Give commands proper exit codes. 2018-07-22 10:05:06 +02:00
James Cole
1f0fdf3da7 Fix #1563 2018-07-22 09:03:53 +02:00
James Cole
b705240faa Fix #1530 2018-07-22 08:58:58 +02:00
James Cole
662b832274 Fix max amount. 2018-07-22 08:36:30 +02:00
James Cole
aed7e6d289 Fix #1549 2018-07-22 08:27:18 +02:00
James Cole
f7a1201d02 Expand route link for transactions without a budget. 2018-07-22 08:14:42 +02:00
James Cole
4d5bdd25a8 Add phpdocs everywhere. 2018-07-22 08:10:16 +02:00
James Cole
4a90ce35f2 Add php doc [skip ci] 2018-07-21 08:55:32 +02:00
James Cole
02f5eddd14 Update PHP doc everywhere. 2018-07-21 08:06:24 +02:00
James Cole
5ca4f1b181 Remove null pointer. 2018-07-21 06:41:42 +02:00
James Cole
ec7ef3a813 Various fixes for tests and code quality. 2018-07-20 20:53:48 +02:00
James Cole
49ff6febe5 Fix tests. 2018-07-20 16:28:54 +02:00
James Cole
2d66a9212f Various code cleanup 2018-07-20 14:35:09 +02:00
James Cole
44fb307da4 Code cleanup. 2018-07-20 14:34:56 +02:00
James Cole
cfc2181a48 Show note of piggy bank [skip ci] 2018-07-20 12:17:43 +02:00
James Cole
cf4a846312 Show note of piggy bank [skip ci] 2018-07-20 12:16:01 +02:00
James Cole
633b357d7b Clean up two big methods. 2018-07-19 16:57:38 +02:00
James Cole
b96d67a54e Referenced the wrong array. 2018-07-18 07:29:58 +02:00
James Cole
5b83931b01 Clean up recurrence transformer. 2018-07-18 07:28:35 +02:00
James Cole
f22b54de30 Clean up sandstorm tests. 2018-07-18 07:16:46 +02:00
James Cole
a3306bb26f Leaving only the specials. 2018-07-18 07:16:32 +02:00
James Cole
0adacac269 Remove switches, add if-statement. 2018-07-18 06:58:51 +02:00
James Cole
7359ed2ba2 Updated file list for Sandstorm. 2018-07-18 06:35:27 +02:00
James Cole
5a5f4e8161 Small update for Sandstorm release. 2018-07-18 06:30:56 +02:00
James Cole
b886cc1333 Optimize some code. 2018-07-17 22:21:03 +02:00
James Cole
9299efd086 Fix #1553 2018-07-17 16:36:36 +02:00
James Cole
1502aa3b20 Small code cleanup [skip ci] 2018-07-15 19:17:26 +02:00
James Cole
73e32ecdcb Refer to correct repositories. 2018-07-15 15:45:45 +02:00
James Cole
ac8776aea4 Add annotated methods. 2018-07-15 10:00:08 +02:00
James Cole
7b41c5b301 Cast all translations to strings. 2018-07-15 09:38:49 +02:00
James Cole
369839e012 Clean up references to static Facade. 2018-07-15 09:27:38 +02:00
James Cole
8fde16422e See if this is the solution in Scrutinizer as well. 2018-07-14 23:32:03 +02:00
James Cole
f1462dbd3d Small code quality improvements. 2018-07-14 23:22:08 +02:00
James Cole
5dad569d62 Add some method annotators, see if this helps with Scrutinizer issues. 2018-07-14 23:04:05 +02:00
James Cole
c424bb097d Improve category code quality. 2018-07-14 22:48:22 +02:00
James Cole
e4b1760b20 Remove exit clause from test. 2018-07-14 17:33:10 +02:00
James Cole
780e365a78 Possible fix for #1527 2018-07-14 17:23:44 +02:00
James Cole
3d1523a060 Improve randomness in test data to prevent key collisions. 2018-07-14 16:41:07 +02:00
James Cole
ff403dfa2e Improve code quality in budget methods. 2018-07-14 16:40:46 +02:00
James Cole
89834baf01 Refactor references to static facades. Improve budget controller code. 2018-07-14 16:08:34 +02:00
James Cole
b8699422c8 Refactor budget controller. 2018-07-14 15:22:21 +02:00
James Cole
6bc772d640 Add Facade methods for scrutinizer. 2018-07-14 15:21:05 +02:00
James Cole
0712f30a51 Fix bug in API: missing destroy budget limit method. 2018-07-14 15:16:32 +02:00
James Cole
9116796d90 Refactor account code and tests. 2018-07-14 11:45:05 +02:00
James Cole
a95fdb903b Refactor account controller and some associated tests. 2018-07-14 11:16:12 +02:00
James Cole
2ca6421206 Remove Rabobank description fix from available fixes. 2018-07-14 08:34:27 +02:00
James Cole
cd076cc069 Fix a bug where transfers would be stored reversed (ie. source and destination switched). 2018-07-14 08:33:13 +02:00
James Cole
46482bdae1 Merge tag '4.7.5.1' into develop
4.7.5.1
2018-07-14 07:05:34 +02:00
James Cole
5189c897be Merge branch 'release/4.7.5.1' 2018-07-14 07:05:31 +02:00
James Cole
2c7d25d472 Final changelog. 2018-07-14 06:37:55 +02:00
James Cole
0da370c42d Not really a solution for the test, but might work. 2018-07-13 18:45:11 +02:00
James Cole
6f036d9120 Fix test. 2018-07-13 17:02:23 +02:00
James Cole
260bbd79fd Update composer file. 2018-07-13 16:40:00 +02:00
James Cole
37ad6a3a62 Updated translation. 2018-07-13 16:29:10 +02:00
James Cole
aa25007431 Fixes tests 2018-07-13 16:07:30 +02:00
James Cole
8b33ec1339 Fix a transaction currency bug. 2018-07-13 15:56:06 +02:00
James Cole
cede11ecea Delete old code. 2018-07-13 15:52:27 +02:00
James Cole
2b4088c5f7 Some code cleanup. 2018-07-13 15:50:42 +02:00
James Cole
d872484607 Speed up category tests. 2018-07-13 06:52:53 +02:00
James Cole
f3f2160d96 Update files and languages. 2018-07-13 06:39:50 +02:00
James Cole
bcdb849b46 Update for bug fix release. 2018-07-13 06:12:39 +02:00
James Cole
5846431b34 Various code coverage changes and code updates. 2018-07-12 21:32:58 +02:00
James Cole
0217d9396a Bill must be active when stored. 2018-07-10 20:21:34 +02:00
James Cole
c99e233026 Add some debug entries. 2018-07-09 20:42:16 +02:00
James Cole
f670d930f3 Clean up docker file. 2018-07-09 19:43:08 +02:00
James Cole
0237d78f61 Fix some tests. 2018-07-09 19:42:53 +02:00
James Cole
5665f127aa Improve code quality. 2018-07-09 19:24:08 +02:00
James Cole
76386dad7d Fix #1541 2018-07-09 19:23:19 +02:00
James Cole
42072fdda4 Fix #1452 2018-07-09 05:37:30 +02:00
James Cole
fc80f828be Fix #1538 2018-07-08 15:22:52 +02:00
James Cole
d05a1e0260 Specify return types. 2018-07-08 12:28:42 +02:00
James Cole
b315882f58 Various code cleanup. 2018-07-08 12:08:53 +02:00
James Cole
2f2f907ffe Various code optimalisations. 2018-07-08 07:59:58 +02:00
James Cole
10492e3b2f Expand documentation for Helper directory. 2018-07-07 23:14:16 +02:00
James Cole
8e08ff2d39 Fix the transaction factory and associated tests. 2018-07-07 22:28:08 +02:00
James Cole
e78a59a8a8 Code quality update. 2018-07-07 21:17:46 +02:00
James Cole
cbe47a9dcc Code clean up in Handlers. 2018-07-07 07:48:10 +02:00
James Cole
a1056147d8 Improve code quality and add documentation in folder "Generator" 2018-07-07 07:18:49 +02:00
James Cole
8692590600 Improve code quality for Export directory. 2018-07-06 19:06:08 +02:00
James Cole
57345113b5 Improve code quality for Export directory. 2018-07-06 19:05:27 +02:00
James Cole
52f02cb9eb Fix #1533 2018-07-06 18:43:46 +02:00
James Cole
5d4dcd7e4b Small code optimizations in Exceptions. 2018-07-06 07:37:14 +02:00
James Cole
7d1f4d8907 Improve Events code quality. 2018-07-06 07:19:19 +02:00
James Cole
a76241c7ba Code cleanup and documentation improvements. 2018-07-06 07:15:42 +02:00
James Cole
bdc6678341 Fix unit tests. 2018-07-05 21:44:13 +02:00
James Cole
c99b7e927d Code optimalisations. 2018-07-05 21:18:53 +02:00
James Cole
1675a0d442 Fix unit tests. 2018-07-05 20:15:20 +02:00
James Cole
c0d2cd8962 Fix unit tests. 2018-07-05 19:39:17 +02:00
James Cole
146c9fd947 Fix unit tests. 2018-07-05 19:02:22 +02:00
James Cole
666e9897ea Fix unit test. 2018-07-05 18:42:51 +02:00
James Cole
81d70bd811 Clean up API code. 2018-07-05 18:02:02 +02:00
James Cole
f6f8bb7fd1 Clean up API code. 2018-07-05 06:10:35 +02:00
James Cole
7c3aaf7b7c Fix #1531 2018-07-05 05:53:21 +02:00
James Cole
32ea28f783 Fix #1532 2018-07-05 05:44:49 +02:00
James Cole
17f365941b Merge tag '4.7.5' into develop
4.7.5
2018-07-03 20:33:36 +02:00
James Cole
c2216843d8 Merge branch 'release/4.7.5' 2018-07-03 20:33:34 +02:00
James Cole
339fb5099f Fix test. 2018-07-03 20:33:12 +02:00
James Cole
cf56707b02 Add more fake entropy. 2018-07-03 20:10:14 +02:00
James Cole
19f38aa6ed Updated everything for version 4.7.5 2018-07-03 19:57:38 +02:00
James Cole
9f69e112d0 Last minute fixes. 2018-07-03 19:34:13 +02:00
James Cole
8eb4259be0 Last minute test fixes. 2018-07-03 19:04:46 +02:00
James Cole
d3a1f43cbb Some last-minute fixes. 2018-07-03 18:24:43 +02:00
James Cole
18b06ff283 Some last-minute fixes. 2018-07-03 17:48:26 +02:00
James Cole
53addcf99a Add cron job to docker file. 2018-07-03 06:03:38 +02:00
James Cole
0fa4d75a47 Enable profile for Sandstorm users. 2018-07-03 05:56:46 +02:00
James Cole
2ef86c3339 Add description. 2018-07-03 05:52:35 +02:00
James Cole
d48c3a6d2f Fix tests 2018-07-03 05:52:27 +02:00
James Cole
2260ede559 Add transaction list to recurring transaction 2018-07-03 05:32:35 +02:00
James Cole
5690a44c38 Remove a filter. 2018-07-02 20:41:28 +02:00
James Cole
e36a9fda1b Get a list of transactions belonging to the recurrence. 2018-07-02 20:39:45 +02:00
James Cole
10f195d334 Update versions. 2018-07-02 20:18:00 +02:00
James Cole
54afc6ca8c Some last minute updates. 2018-07-02 20:17:50 +02:00
James Cole
2e67bd3b78 New test code. 2018-07-02 20:02:20 +02:00
James Cole
f27eb084c7 Test the currency exchange controller. 2018-07-02 16:06:49 +02:00
James Cole
7629dfd54a Fix issues with #1521 2018-07-02 15:37:56 +02:00
James Cole
f62fd18b72 Update some translations [skip ci] 2018-07-01 21:40:45 +02:00
James Cole
c6b60ff6b4 Different order for recurrences [skip ci] 2018-07-01 21:32:48 +02:00
James Cole
e9655e6d86 Different order for recurrences [skip ci] 2018-07-01 21:31:27 +02:00
James Cole
3bca9b06f8 Implement category and configuration tests. 2018-07-01 21:27:25 +02:00
James Cole
d97fdc3393 Implement budget limit API tests 2018-07-01 21:02:39 +02:00
James Cole
7dc72f98bf Include tests for budget API 2018-07-01 20:19:34 +02:00
James Cole
da00179066 Test available budget API. 2018-07-01 18:58:41 +02:00
James Cole
89910031cd Test the attachment controller. 2018-07-01 18:31:02 +02:00
James Cole
5676aeac80 Improve test filter. 2018-07-01 16:13:22 +02:00
James Cole
b0b9055e2e Remove extra semi-colon. 2018-07-01 15:48:02 +02:00
James Cole
c0aefed764 Fix extra semicolon in test description 2018-07-01 14:55:06 +02:00
James Cole
e2ec9ca5fb Improve amount conversion code. 2018-07-01 13:34:57 +02:00
James Cole
8e38f5c2c0 Disable amount debit and credit tests. 2018-07-01 12:34:58 +02:00
James Cole
99b2858863 Go for php 7.1.8 to mimic dev machine. 2018-07-01 10:47:54 +02:00
James Cole
b43669e731 Update amount test codes. 2018-07-01 10:32:27 +02:00
James Cole
3bc9905715 Remove php7.2 tests. 2018-07-01 10:19:00 +02:00
James Cole
c55aebd005 Fix credit test. 2018-07-01 10:11:41 +02:00
James Cole
55c331f536 Update read me file. 2018-07-01 09:53:03 +02:00
James Cole
ce236284f4 Update test code. 2018-07-01 09:52:56 +02:00
James Cole
c24cac68f6 Fix for #1518 2018-07-01 09:43:44 +02:00
James Cole
db149ca6e1 Fix tests. 2018-07-01 09:27:22 +02:00
James Cole
0502f2a4a5 Implement rule group API. 2018-06-30 18:10:54 +02:00
James Cole
f13df7e605 Implement rules in API. 2018-06-30 17:49:14 +02:00
James Cole
36a6981329 Halfway rule API. 2018-06-30 16:46:51 +02:00
James Cole
7abcdea816 New translations [skip ci] 2018-06-30 06:16:09 +02:00
James Cole
0509e54a95 Complete API for recurring transactions. 2018-06-30 06:14:39 +02:00
James Cole
b8893bcad7 Fix bulk editor. 2018-06-30 05:54:23 +02:00
James Cole
c9356c1237 Restructure code to rename a variable. 2018-06-30 05:21:21 +02:00
James Cole
2d7b7c2f3f Expand recurring transactions API 2018-06-29 19:27:07 +02:00
James Cole
d0db1117f7 Recurrence first start and API routes. 2018-06-29 14:07:33 +02:00
James Cole
e287e76db5 Complete preferences. 2018-06-29 12:28:29 +02:00
James Cole
8c28c4b5ac New translations and routes. 2018-06-29 12:11:44 +02:00
James Cole
f048e943f8 Implement piggy bank API. 2018-06-29 08:06:17 +02:00
James Cole
12a84572e2 First code for the piggy bank API. 2018-06-29 06:43:44 +02:00
James Cole
c8de1d3372 New (empty) API controllers. 2018-06-28 22:15:22 +02:00
James Cole
234e3f4ca5 Implement link type controller. 2018-06-28 22:14:50 +02:00
James Cole
7749fb1a0b Expand API for journal links. 2018-06-28 17:02:13 +02:00
James Cole
f55d4e32c0 Implement currency exchange rate API. 2018-06-28 07:32:58 +02:00
James Cole
cfd98a33fe Fix #1463 2018-06-28 06:43:59 +02:00
James Cole
7bdf20fee5 Fix #1446 2018-06-28 06:40:04 +02:00
James Cole
e906fa3653 Bot cannot close bug tickets [skip ci] 2018-06-28 06:34:36 +02:00
James Cole
57cf7f6f0d Update some things for recurring transactions. 2018-06-28 06:31:31 +02:00
James Cole
d378e7e897 New translations [skip ci] 2018-06-27 21:37:16 +02:00
James Cole
a8e666db34 Expand view to include weekend responses. 2018-06-27 18:30:53 +02:00
James Cole
7b46339a5d Add some logging to weekly recurring. 2018-06-27 05:40:14 +02:00
James Cole
20aa6e429b Expand support for weekend and add some logging. 2018-06-27 05:37:56 +02:00
James Cole
7ba11a57a8 make sure recurrence can skip weekends. 2018-06-26 21:17:50 +02:00
James Cole
49de4f2200 Expand report email. 2018-06-26 19:26:10 +02:00
James Cole
5d01955133 Various extensions to recurring transactions. 2018-06-26 18:49:33 +02:00
James Cole
7591f3fa29 Send mail message when cron has hit. 2018-06-25 16:01:45 +02:00
James Cole
89f8f9b45b Fix view of bills. 2018-06-24 16:17:42 +02:00
James Cole
59f5b38dca Fix for #1509 2018-06-24 15:43:05 +02:00
James Cole
5b0e61033c Add configuration to Api. 2018-06-24 15:33:36 +02:00
James Cole
096af00a72 Add Category to API 2018-06-24 15:05:59 +02:00
James Cole
dca2dc4600 Add budgets to API. 2018-06-24 14:54:06 +02:00
James Cole
96b482dac5 Fix #1510 2018-06-24 13:59:20 +02:00
James Cole
e05664f34f Fix #1509 2018-06-24 13:46:34 +02:00
James Cole
72cca5ccbf Expand schedule. 2018-06-24 13:23:08 +02:00
James Cole
0b9be029ac Expand API with budget limits 2018-06-24 13:20:29 +02:00
James Cole
91701473af Expand API with available budgets. 2018-06-24 08:33:06 +02:00
James Cole
ad6a9a7df7 Expand API for attachments. 2018-06-24 06:51:22 +02:00
James Cole
32b6ded008 Fix #1505 2018-06-23 19:56:04 +02:00
James Cole
4f2d0a0322 Sentence patch [skip ci] 2018-06-23 17:59:57 +02:00
James Cole
793cfcb2c5 Code for #1503 2018-06-23 17:59:37 +02:00
James Cole
3a71bd01fb Remove dead code. 2018-06-23 17:40:41 +02:00
James Cole
a1d99c1954 Bunq and Spectre will ask to apply rules. 2018-06-23 10:55:26 +02:00
James Cole
19a874b274 Ability to delete recurring transactions. 2018-06-23 08:19:29 +02:00
James Cole
b95dd5c238 Updated language strings [skip ci] 2018-06-23 06:29:14 +02:00
James Cole
7c84af2370 Schedule recurring transactions daily. 2018-06-23 05:41:14 +02:00
James Cole
db1c27d833 First attempt at job to create transactions for recurring transactions. 2018-06-22 18:42:23 +02:00
James Cole
636cd84f4f Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Change in YunoHost links
2018-06-22 18:40:37 +02:00
James Cole
f2d4fae813 Make sure directories exist #1500 2018-06-22 18:40:06 +02:00
James Cole
986c9ab20a Merge pull request #1499 from anmol26s/patch-2
Change in YunoHost links
2018-06-22 07:44:07 +02:00
anmol26s
cd7e222b72 Change in YunoHost links
As the link was changed, the current link was broken. So fixed it.
2018-06-22 03:05:02 +05:30
James Cole
50b599b1a9 Some refactoring. 2018-06-21 18:58:27 +02:00
James Cole
1d162edb59 Improve code for recurring transactions. 2018-06-21 18:57:51 +02:00
James Cole
7bdd4ddeab Small refactoring. 2018-06-21 18:56:44 +02:00
James Cole
ae6e5a5599 Clean up API references. 2018-06-20 21:17:16 +02:00
James Cole
1222184b68 Include softdelete 2018-06-20 21:16:42 +02:00
James Cole
18f779c6de Various fixes. 2018-06-20 16:27:57 +02:00
James Cole
138f67581c Fix #1483 2018-06-20 16:09:15 +02:00
James Cole
597d6ac513 Fix #1492 2018-06-20 16:06:47 +02:00
James Cole
3ab25c2e8c Merge pull request #1493 from invidian/typo
Fix typo in en_US translations
2018-06-20 15:14:45 +02:00
James Cole
b11d97ba4e Merge pull request #1491 from anmol26s/patch-1
Added support for YunoHost
2018-06-20 15:14:23 +02:00
Mateusz Gozdek
080c810131 Fix typo in en_US translations 2018-06-19 22:20:27 +02:00
James Cole
56bc79d64e Various code to fix checkboxes. 2018-06-18 21:07:09 +02:00
anmol26s
72d2c9d600 Added support for YunoHost
Hi 
I have packaged a Firefly  III app for YunoHost. It has install,remove,update,backup,restore script along with multi-instance(can be installed multiple times on different domains on a single server). The app is tested and works well. 
The CL passing will take a day to show up on the app page.
Thanks for coding this app.
2018-06-18 01:05:02 +05:30
James Cole
0374c32236 Improve code for edit routine #1469 2018-06-17 17:45:47 +02:00
James Cole
d73cd4b515 Can now create recurring transactions. #1469 2018-06-17 15:14:34 +02:00
James Cole
54e3e3f051 Play around with boxes layout. 2018-06-17 07:45:21 +02:00
James Cole
abf218fc21 Prevent empty box. 2018-06-17 07:45:10 +02:00
James Cole
dcf90b6159 Cannot create transfer 2018-06-17 07:44:59 +02:00
James Cole
1cf91c78f8 Lots of new code for recurring transactions. #1469 2018-06-16 21:47:51 +02:00
James Cole
968abd26e8 Extend mail config and help. #1487 2018-06-16 07:23:54 +02:00
James Cole
aa05f7a2d2 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Various updated code for recurring transactions.
  Don't report authentication exceptions.
  Fix various bugs in the import routine, discovered by Doug.
  Prevent index error
  Spelcheck plz [skip ci]
  Set demo user back to English at login.
  Add calendar view.
  Demo text for recurring.
  Capital sensitive [skip ci]
  Various code related to the recurring transactions.
  Fix missing variable
  Some code optimalisations.
  First batch of code for recurring transactions #1469
  Fix #1434
  Invalidate cache right after storing data #1478
  Fix #1475
  Remove the option to check for updates from Sandstorm installations.
  Fix #1474
2018-06-15 22:18:53 +02:00
James Cole
181c23b07c Various updated code for recurring transactions. 2018-06-15 22:06:33 +02:00
James Cole
955cde3ed9 Don't report authentication exceptions. 2018-06-14 19:52:20 +02:00
James Cole
477a3c7eb2 Fix various bugs in the import routine, discovered by Doug. 2018-06-13 19:03:18 +02:00
James Cole
f4b66b980b Prevent index error 2018-06-13 08:22:10 +02:00
James Cole
281de63e0d Spelcheck plz [skip ci] 2018-06-12 21:44:03 +02:00
James Cole
c19a700662 Set demo user back to English at login. 2018-06-12 21:41:58 +02:00
James Cole
fc011ba1d9 Add calendar view. 2018-06-12 21:38:05 +02:00
James Cole
b941f590e0 Demo text for recurring. 2018-06-12 19:44:17 +02:00
James Cole
8f4db78ff2 Capital sensitive [skip ci] 2018-06-12 19:03:01 +02:00
James Cole
4b4dc2e298 Various code related to the recurring transactions. 2018-06-12 18:48:15 +02:00
James Cole
2de19547ca Fix missing variable 2018-06-11 11:41:38 +02:00
James Cole
5a058491b0 Some code optimalisations. 2018-06-10 16:59:41 +02:00
James Cole
6743d99d9b First batch of code for recurring transactions #1469 2018-06-10 16:59:03 +02:00
James Cole
35a5ec78c3 Fix #1434 2018-06-10 10:41:45 +02:00
James Cole
3440c3e77a Invalidate cache right after storing data #1478 2018-06-10 07:10:44 +02:00
James Cole
dd17f06362 Fix #1475 2018-06-09 07:09:43 +02:00
James Cole
8a15cb3a34 Remove the option to check for updates from Sandstorm installations. 2018-06-09 06:07:40 +02:00
James Cole
4a548ac282 Fix #1474 2018-06-09 05:50:31 +02:00
James Cole
d22353b13d Update screenshots and Sandstorm files. 2018-06-08 19:35:51 +02:00
James Cole
c18046c25d Update composer libs. 2018-06-06 21:23:17 +02:00
James Cole
4a12d4d156 Code cleanup [skip ci] 2018-06-06 21:23:00 +02:00
James Cole
20044427b4 Use Guzzle, not Requests library. 2018-06-06 21:20:21 +02:00
James Cole
073dedd483 Add debug info 2018-06-06 05:54:24 +02:00
James Cole
06c25c913c Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Still not sure what's causing the empty strings to appear.
2018-06-05 14:56:10 +02:00
James Cole
08d06cf465 Small updates to meta files [skip ci] 2018-06-05 07:57:18 +02:00
James Cole
1e9eb843c0 Still not sure what's causing the empty strings to appear. 2018-06-03 19:14:03 +02:00
James Cole
78a5dae2a0 Merge branch 'release/4.7.4' 2018-06-03 09:16:56 +02:00
James Cole
19443a5b34 Update readme [skip ci] 2018-06-03 09:11:18 +02:00
James Cole
74acc90702 Update readme [skip ci] 2018-06-03 09:08:24 +02:00
James Cole
349f580371 Update readme [skip ci] 2018-06-03 09:07:41 +02:00
James Cole
f019d33a03 New screenshots [skip ci] 2018-06-03 09:04:57 +02:00
James Cole
c7af25ac38 Fix last minute issues. 2018-06-03 08:23:49 +02:00
James Cole
b52bd59cea Upgrade various files for 4.7.4 [skip ci] 2018-06-02 20:05:39 +02:00
James Cole
332d32c319 Fix tests 2018-06-02 20:02:42 +02:00
James Cole
2f824ba1a8 Some more last-minute fixes. 2018-06-02 19:23:46 +02:00
James Cole
a6b09acd5e Some last minute fixes. 2018-06-02 18:19:35 +02:00
James Cole
d4779c8c8f Some last minute translations [skip ci] 2018-06-02 07:15:21 +02:00
James Cole
ba01c4bbe8 Ignore basic methods, improving code coverage. 2018-06-02 06:18:07 +02:00
James Cole
ddc1d81665 Fix tests, improve coverage. 2018-06-02 06:11:13 +02:00
James Cole
790aeb3c46 Fix #1458 2018-06-02 05:46:37 +02:00
James Cole
6ed5be10b1 Expand test coverage. 2018-06-01 22:20:08 +02:00
James Cole
a7b8470d9e Expand test coverage. 2018-06-01 22:04:52 +02:00
James Cole
2a05cc382f Update Turkish language files [skip ci] 2018-06-01 14:22:53 +02:00
James Cole
1e10a6ce1b Update Russian language files [skip ci] 2018-06-01 14:22:37 +02:00
James Cole
7645ef55c2 Update PT_BR language files [skip ci] 2018-06-01 14:22:19 +02:00
James Cole
6ce200b60d Update Polish language files [skip ci] 2018-06-01 14:22:08 +02:00
James Cole
d782e28906 Update Dutch language files [skip ci] 2018-06-01 14:21:54 +02:00
James Cole
da3bd31fb8 Update Italian language files [skip ci] 2018-06-01 14:21:27 +02:00
James Cole
aa3ed40430 Update Indonesian language files [skip ci] 2018-06-01 14:21:14 +02:00
James Cole
ad7e564f14 Update French language files [skip ci] 2018-06-01 14:20:52 +02:00
James Cole
f23ee2dac5 Update Spanish language files [skip ci] 2018-06-01 14:20:39 +02:00
James Cole
1962f74439 Update German language files [skip ci] 2018-06-01 14:20:17 +02:00
James Cole
0064d060ea Show bunq payment ID. #1443 2018-06-01 13:14:51 +02:00
James Cole
e47e6b1958 Fix null pointer. #1443 2018-06-01 13:11:23 +02:00
James Cole
4c04415e80 Fix #1452. 2018-06-01 13:11:10 +02:00
James Cole
3654e75b8c Improve test coverage. 2018-06-01 06:40:24 +02:00
James Cole
66fa73aea4 Fix tests. 2018-06-01 05:49:41 +02:00
James Cole
df87d03f32 FF3 will apply rules when importing from bunq #1443 2018-06-01 05:49:33 +02:00
James Cole
3fbe851a0b Include external ID with import. 2018-06-01 05:23:57 +02:00
James Cole
d1b2e63950 Small fixes for import routine. 2018-05-31 22:33:42 +02:00
James Cole
34fd8cf751 Fix #1442 2018-05-31 21:48:09 +02:00
James Cole
f1fe90fce0 Fix #1455 2018-05-31 21:30:25 +02:00
James Cole
2ba6fa0dda Add description to debug logging. #1443 2018-05-31 21:13:07 +02:00
James Cole
f2928e3d7d Possible fix for #1453 2018-05-31 20:34:49 +02:00
James Cole
895ab9c5d8 Updated lock file. 2018-05-31 20:34:32 +02:00
James Cole
fb07c68132 Updated tests 2018-05-31 20:04:19 +02:00
James Cole
68e7d45f63 Fix #1451 2018-05-30 18:38:39 +02:00
James Cole
49e302e1bc Reinstate ability to download config. 2018-05-30 18:36:21 +02:00
James Cole
b33ca786ae use cases for rules tested. 2018-05-30 18:05:06 +02:00
James Cole
dc77d8edda Extra upgrade instructions. 2018-05-30 18:04:53 +02:00
James Cole
c339a183b9 Fix code coverage and a test #1443 2018-05-30 18:04:43 +02:00
James Cole
f263795a99 Add config entries for tests 2018-05-30 18:04:23 +02:00
James Cole
e9e771e57b List 100 entries for bunq. #1443 2018-05-30 18:04:00 +02:00
James Cole
fbb9d7c6b4 It's about expecting JSON, not accepting it. 2018-05-29 18:33:43 +02:00
James Cole
10abd7b0ae Delete account meta data when field is made empty. 2018-05-29 18:31:48 +02:00
James Cole
3de36901b8 Fix #1425 2018-05-29 07:25:04 +02:00
James Cole
5b4967acb9 Changes in error handler 2018-05-29 07:09:11 +02:00
James Cole
0a007b1e6e Fix menu view. 2018-05-29 06:30:25 +02:00
James Cole
4ad68b7dfa Fix #1449 2018-05-28 19:07:06 +02:00
James Cole
73aef1b9a4 Code for #1415 2018-05-26 13:55:11 +02:00
James Cole
dcfea20973 Expand error logs. 2018-05-26 13:14:51 +02:00
James Cole
9b6766d3b2 Fix #1416 2018-05-26 08:04:50 +02:00
James Cole
b8bc8e2c47 Fix #1413 2018-05-26 07:58:36 +02:00
James Cole
039e3aa34c Fix for #1406 2018-05-26 07:55:31 +02:00
James Cole
551ff109c9 Fixed #1403 2018-05-26 07:53:32 +02:00
James Cole
664451d0c6 Fixed #1405 2018-05-26 07:48:49 +02:00
James Cole
4031057bc0 Fix #1386 2018-05-26 07:25:22 +02:00
James Cole
fcf9b782c1 Improve code coverage. #1443 2018-05-25 23:13:08 +02:00
James Cole
d693d382b9 Handle different account types #1443 2018-05-25 17:31:41 +02:00
James Cole
0a1b6c7793 Catch nullpointer #1443 2018-05-25 13:15:36 +02:00
James Cole
5acba2bddf Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Revert "Updated git ignore. (firefly-iii/firefly-iii#1443)"
  Update curl to latest version. (firefly-iii/firefly-iii#1443)
  Install composer before updating curl. (firefly-iii/firefly-iii#1443)
  Added missing new line at EOF. (firefly-iii/firefly-iii#1443)
  Updated libpng and added wget. (firefly-iii/firefly-iii#1443)
  Updated git ignore. (firefly-iii/firefly-iii#1443)
2018-05-25 12:08:43 +02:00
James Cole
883b16fad1 Fix IBAN selection. 2018-05-25 12:08:15 +02:00
James Cole
ef48b3e751 Merge pull request #1445 from OGKevin/update-curl-in-docker-firefly-iii/firefly-iii#1443
Update curl in docker firefly-iii/firefly-iii#1443
2018-05-25 11:48:00 +02:00
Kevin Hellemun
3c956e7e98 Revert "Updated git ignore. (firefly-iii/firefly-iii#1443)"
This reverts commit 656bb5043d.
2018-05-25 11:22:06 +02:00
Kevin Hellemun
519ea271a9 Update curl to latest version. (firefly-iii/firefly-iii#1443) 2018-05-25 10:10:08 +02:00
Kevin Hellemun
09d5160404 Install composer before updating curl. (firefly-iii/firefly-iii#1443) 2018-05-25 10:09:54 +02:00
Kevin Hellemun
97dcf03334 Added missing new line at EOF. (firefly-iii/firefly-iii#1443) 2018-05-25 10:07:09 +02:00
Kevin Hellemun
896a804a72 Updated libpng and added wget. (firefly-iii/firefly-iii#1443) 2018-05-25 10:06:45 +02:00
Kevin Hellemun
656bb5043d Updated git ignore. (firefly-iii/firefly-iii#1443) 2018-05-25 10:05:57 +02:00
James Cole
e953becbae Expand test coverage for bunq. 2018-05-25 08:38:15 +02:00
James Cole
6c9901b919 Redirect correctly. 2018-05-25 08:33:59 +02:00
James Cole
ff45c94106 Test coverage for routine and prerequisites. 2018-05-25 06:29:51 +02:00
James Cole
a8a3fbeef4 Write bunq lowercase. 2018-05-25 06:27:40 +02:00
James Cole
dae8092ecd Add return call so the error is not called. 2018-05-25 06:27:32 +02:00
James Cole
70110208fc Use non-static class for ApiContext to improve testability. 2018-05-25 06:26:37 +02:00
James Cole
217ca98933 Update composer lock + json 2018-05-25 06:26:10 +02:00
James Cole
c2945c532e Testing environment always uses the sandbox. 2018-05-25 06:25:59 +02:00
James Cole
ea750576b3 Move to bitly shortlinks. 2018-05-23 14:31:12 +02:00
James Cole
82538ba4fc Catch OpenSSL error. 2018-05-23 14:08:37 +02:00
James Cole
2b2f37a8c9 All code for bunq. 2018-05-23 12:36:12 +02:00
James Cole
4db2ec60e0 Update composer files. 2018-05-23 08:41:15 +02:00
James Cole
7d88d35556 Fix test for coverage. 2018-05-23 08:38:05 +02:00
James Cole
3c3e91ff48 Deprecate and ignore bunq code. 2018-05-23 07:38:27 +02:00
James Cole
039e8d6e17 Add debug info and update routine for multiple accounts. 2018-05-23 07:38:03 +02:00
James Cole
50bf79ab18 Ignore bunq objects. 2018-05-22 18:55:30 +02:00
James Cole
467c6762fa Catch all edge cases. 2018-05-22 18:42:34 +02:00
James Cole
740f4e403f Improve coverage for Spectre 2018-05-22 18:05:35 +02:00
James Cole
5664d51695 Fix #1439 2018-05-21 20:04:30 +02:00
James Cole
b195a61498 Improve coverage for Spectre. 2018-05-21 19:17:33 +02:00
James Cole
94e6816bf6 Improve test coverage. 2018-05-21 17:28:09 +02:00
James Cole
ebf97f710f Refactor code and fix tests. 2018-05-21 09:40:19 +02:00
James Cole
714b54ed06 Refactor and rename test code. 2018-05-21 07:22:38 +02:00
James Cole
620c5f515e Improve test coverage, remove dead code. 2018-05-20 16:26:27 +02:00
James Cole
c06fd12b07 Fix test coverage. 2018-05-19 22:23:08 +02:00
James Cole
2c206bba64 First working version of a working Spectre import. 2018-05-19 21:13:00 +02:00
James Cole
04953b5645 Lots of new code for the Spectre routine. 2018-05-19 10:44:33 +02:00
James Cole
1732ce63f3 Merge branch 'hotfix/4.7.3.2' into develop 2018-05-16 21:55:42 +02:00
James Cole
1e212c6da2 Merge branch 'hotfix/4.7.3.2' 2018-05-16 21:55:41 +02:00
James Cole
7d8fc54351 Fix version number. 2018-05-16 21:55:24 +02:00
James Cole
dd44a1e517 Code for Spectre. 2018-05-16 21:31:45 +02:00
James Cole
9f26757e8a First code for Spectre login and import routine. 2018-05-14 20:21:00 +02:00
James Cole
a9c8c8384d Merge branch 'hotfix/4.7.3.1' into develop 2018-05-14 19:24:54 +02:00
James Cole
a826b0e0fb Merge branch 'hotfix/4.7.3.1' 2018-05-14 19:24:53 +02:00
James Cole
4aaec0e379 Fix an issue where new users would be given a rule that always triggers. 2018-05-14 19:24:35 +02:00
James Cole
69019d5215 First code for Spectre import. 2018-05-14 17:59:43 +02:00
James Cole
96411b17e9 Fix tests, improve demo text. 2018-05-13 16:04:53 +02:00
James Cole
5a093b58d8 Prep for bunq and spectre import. 2018-05-13 15:00:30 +02:00
James Cole
470b3e0973 Remove middleware [skip ci] 2018-05-13 09:58:21 +02:00
James Cole
dc251c216c Add debug log [skip ci] 2018-05-13 09:51:05 +02:00
James Cole
ae9ef61f80 Add debug log [skip ci] 2018-05-13 09:47:51 +02:00
James Cole
d9ca7b7277 Better error messages [skip ci] 2018-05-13 09:39:06 +02:00
James Cole
0c99248deb Fix rules surrounding creation of jobs [skip ci] 2018-05-13 09:34:27 +02:00
James Cole
1aae84a4d0 Optimise tests and coverage. 2018-05-13 09:01:10 +02:00
James Cole
528da3f08e Allow the mapping of asset accounts for opposing value 2018-05-12 20:56:34 +02:00
James Cole
9c507f7f62 Refactor some code to handle command line imports. 2018-05-12 19:09:34 +02:00
James Cole
07da2fdda3 Remove unused imports. 2018-05-12 17:27:19 +02:00
James Cole
ca3366544e Add file used to test UTF8 check. 2018-05-12 16:54:07 +02:00
James Cole
ccee7b483c Fix tests 2018-05-12 16:04:46 +02:00
James Cole
5903133e3b Remove return type. 2018-05-12 15:54:20 +02:00
James Cole
5bf520b6ed Code consistency and new tests. 2018-05-12 15:50:01 +02:00
James Cole
a47da92d81 Test coverage for opposing account mapper. 2018-05-12 13:27:02 +02:00
James Cole
63f84ae7b1 Lots of refactoring and new tests. 2018-05-12 10:46:18 +02:00
James Cole
4d6bc55723 Update test code. 2018-05-11 19:58:10 +02:00
James Cole
9bb4df4cc3 Split and cleanup file import routine. 2018-05-11 19:56:52 +02:00
James Cole
c47a5379ae Improve code test coverage. 2018-05-11 10:37:13 +02:00
James Cole
cde9c4a2bc Update copyright statements. 2018-05-11 10:08:34 +02:00
James Cole
5a560b42ef Improve test coverage. 2018-05-11 09:51:47 +02:00
James Cole
50874c9cf7 Rename some variables. 2018-05-10 23:11:11 +02:00
James Cole
6f984aa591 Improve test coverage. 2018-05-10 23:01:21 +02:00
James Cole
274162afcd Fix test that could come up with journals with 0 transactions, and improve test coverage for file routine. 2018-05-10 20:05:02 +02:00
James Cole
6bd23d897f Try to get details about OAuth exceptions. 2018-05-10 09:48:13 +02:00
James Cole
73f29ebf69 make sure class is compatible with interface. 2018-05-10 09:18:40 +02:00
James Cole
cabcb9c6d0 Basic storage routine works, basic file handling. 2018-05-10 09:10:16 +02:00
James Cole
116f7ed613 First attempt to run file import. 2018-05-10 06:26:57 +02:00
James Cole
6ef0eb73d0 Improve importer. 2018-05-09 20:53:39 +02:00
James Cole
7f4feb0cfc More code for import routine. 2018-05-07 20:35:14 +02:00
James Cole
626f7357bb Improve CSV import routine. 2018-05-07 19:21:12 +02:00
James Cole
690c9203c8 Start processing files. 2018-05-06 21:06:23 +02:00
James Cole
1209f3b39a First start for CSV file import. 2018-05-06 20:42:30 +02:00
James Cole
a4524b3c2c Throw exception with empty amount. 2018-05-06 20:42:07 +02:00
James Cole
a3cbdadb39 Towards managing mapping for file imports. 2018-05-06 16:19:29 +02:00
James Cole
9e3c5fd984 Remove references to non-existing files. 2018-05-06 07:40:50 +02:00
James Cole
7d80ac37a6 Can configure file upload in file imports. 2018-05-06 07:09:08 +02:00
James Cole
f74b9ba7ab Add strict types and newlines. 2018-05-05 16:51:32 +02:00
James Cole
3ac240dc1c Add some randomness to test data. 2018-05-05 15:18:41 +02:00
James Cole
d233b3f24f Improve test (coverage). 2018-05-05 14:40:12 +02:00
James Cole
19fff681d2 Improve test coverage, mark as deprecated. 2018-05-05 13:53:12 +02:00
James Cole
bc7c3bb9b3 Improve test coverage and remove deprecated code. 2018-05-05 11:03:10 +02:00
James Cole
57be7f2905 Fix test coverage, ignore all other routines. 2018-05-05 06:47:35 +02:00
James Cole
1c0da454db Improved code for new import + some tests. 2018-05-04 20:21:27 +02:00
James Cole
b541f7b944 Improve fake import. 2018-05-04 06:59:14 +02:00
James Cole
6e84326583 Fix #1418 2018-05-04 06:00:16 +02:00
James Cole
ca14496e4e First code for file import. 2018-05-03 22:20:06 +02:00
James Cole
480d65fc1f Fake import works, won't fire rules yet. also needs a state. 2018-05-03 18:17:59 +02:00
James Cole
6bddb63b45 New code for updated import routine. 2018-05-03 17:23:16 +02:00
James Cole
c5142aeba5 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2018-05-03 17:22:34 +02:00
James Cole
38d9f10672 New issue templates. 2018-05-03 16:53:52 +02:00
James Cole
937394af7a Merge pull request #1409 from shashankmc/develop
Adding Indian rupee
2018-05-03 07:27:51 +02:00
Shashank M Chakravarthy
fe10955eb9 Adding Indian rupee
Adding Indian rupee under asian currencies.
2018-05-03 10:56:09 +05:30
James Cole
ccda71ff8e New code for updated import routine. 2018-05-01 20:47:38 +02:00
James Cole
cd75224cdd Create a fake routine, check for its progress. 2018-04-30 06:37:29 +02:00
James Cole
1c2089b8a3 Fixes #1400 2018-04-30 06:17:27 +02:00
James Cole
3ead4d4587 List rules as inactive if relevant #1392 2018-04-30 06:12:55 +02:00
James Cole
f2b71bc280 Fake jobs can be started and will crash. 2018-04-29 21:20:06 +02:00
James Cole
f027d71136 Fake jobs can be configured and can reach the landing stage. 2018-04-29 20:01:03 +02:00
James Cole
fa41d6df04 Clean up translations and strings in import routine. 2018-04-29 19:28:07 +02:00
James Cole
d2bb65bf04 Can now create jobs, and set prerequisites for the fake provider, which will be skipped when they're not necessary. 2018-04-29 19:07:54 +02:00
James Cole
b5be1b11d1 Update index and routes. 2018-04-29 18:07:58 +02:00
James Cole
9fb049991f Migration for 4.7.4 2018-04-29 18:07:47 +02:00
James Cole
fba847dd28 New bindable for import provider 2018-04-29 18:07:38 +02:00
James Cole
b33883b334 Small code improvements. 2018-04-29 18:07:23 +02:00
James Cole
f74a6dffca Update providers and repositories for new import job fields 2018-04-29 18:07:14 +02:00
James Cole
7390e20218 Add method to indicate completeness. 2018-04-29 18:06:47 +02:00
James Cole
9646dc439e Big fat reset in import controller to accomodate new routine. 2018-04-29 18:06:31 +02:00
James Cole
554c63b9c7 Expand config to handle new providers 2018-04-29 18:03:55 +02:00
James Cole
24d8640e9b Add logos for new providers. 2018-04-29 18:03:35 +02:00
James Cole
ea151d069c Merge pull request #1401 from paul999/select_bunq_option
Select the matching bunq account from the import. Fixes #1398
2018-04-29 17:32:07 +02:00
Paul Sohier
f140d2f37a Select the matching bunq account from the import. Fixes #1398 2018-04-29 16:26:19 +02:00
James Cole
4e163c4bda Merge pull request #1395 from nicoschreiner/patch-1
Fix alignment of sidebar-icons
2018-04-29 14:08:24 +02:00
Nico Schreiner
ddcf8b892b Fix alignment of sidebar-icons
I noticed a minor thing which was bothering me. The Icons in the sidebar weren't align correctly (the fa-repeat icon). This change should fix this.
2018-04-29 13:28:49 +02:00
James Cole
49138eb03a Can now import and handle external ID field. 2018-04-29 10:13:33 +02:00
James Cole
71b63bd33b Remove references to ExpandedForm. 2018-04-29 09:48:53 +02:00
James Cole
88348f59c2 Could repair #1389 2018-04-29 09:00:49 +02:00
James Cole
7eb5643204 Use new select options. 2018-04-29 07:46:30 +02:00
James Cole
565cb6d79e New select options 2018-04-29 07:46:14 +02:00
James Cole
c0d715c78a Add method to collect note text. 2018-04-29 07:46:03 +02:00
James Cole
a3d0355ddd Use new expanded for method. 2018-04-29 07:45:54 +02:00
James Cole
bc4e06568d Move references to repository 2018-04-29 07:45:38 +02:00
James Cole
8acb9f4056 Fix error when un-decryptable files would break the export. 2018-04-29 07:42:17 +02:00
James Cole
9cbbd581ee Rename template file. 2018-04-29 07:42:01 +02:00
James Cole
fdc9467218 Fix #1369 2018-04-28 21:54:48 +02:00
James Cole
84ac3df580 Merge branch 'release/4.7.3' 2018-04-28 16:27:55 +02:00
James Cole
7f459df9e9 Last minute sanity check. 2018-04-28 16:24:24 +02:00
James Cole
3625f3293a Code for 4.7.3 release. 2018-04-28 15:35:43 +02:00
James Cole
0a2308592f New language strings. 2018-04-28 15:26:45 +02:00
James Cole
8ef3f18da7 Update language strings for English. 2018-04-28 10:29:31 +02:00
James Cole
e126427809 Improve code quality and fix test coverage. 2018-04-28 10:27:33 +02:00
James Cole
7b39828980 Improve attachment list. 2018-04-28 06:53:37 +02:00
James Cole
d03de52735 New buttons and links [skip ci] 2018-04-28 06:44:37 +02:00
James Cole
cabe90b2dd Attachment controller basic index. 2018-04-28 06:34:01 +02:00
James Cole
13b78bdc20 Code cleanup 2018-04-28 06:23:13 +02:00
James Cole
6f0e1c79ac Fix #1353 2018-04-28 05:42:47 +02:00
James Cole
b66daad3d3 Fix coverage. 2018-04-28 05:40:23 +02:00
James Cole
9c5523252d Clean up old JS. 2018-04-28 05:40:08 +02:00
James Cole
bc8bcf7a1a Upgrade spectre to v4 2018-04-28 05:25:29 +02:00
James Cole
85d655d3e2 Upgrade Spectre to v4 2018-04-27 13:07:46 +02:00
James Cole
ac419e01d3 Catch open basedir errors. 2018-04-27 12:58:43 +02:00
James Cole
5d4467a6c0 Improve test speed. 2018-04-27 12:39:25 +02:00
James Cole
81da7f3667 Move to correct directory [skip ci] 2018-04-27 11:53:22 +02:00
James Cole
9734196eb9 Updated translations. 2018-04-27 11:48:52 +02:00
James Cole
7e0f9b9b8e Update packages. 2018-04-27 11:29:19 +02:00
James Cole
bb25132865 Fix tests 2018-04-27 11:29:09 +02:00
James Cole
28bcff99f6 Add config for stale bot. 2018-04-27 08:50:49 +02:00
James Cole
246cb36836 Expand support for trusted proxies configuration. 2018-04-27 07:01:03 +02:00
James Cole
9a0c0f6d21 Fix #1383 2018-04-27 06:50:41 +02:00
James Cole
a9dd8eb9e7 Fix #1382 2018-04-27 06:26:37 +02:00
James Cole
9026c9d6f1 Update docker file. 2018-04-26 21:16:45 +02:00
James Cole
d5f7430723 Move and update security txt [skip ci] 2018-04-26 21:00:29 +02:00
James Cole
5a53249fbb Merge pull request #1380 from paul999/fix_1378
iban returned from bunq might be empty.
2018-04-25 19:16:12 +02:00
Paul Sohier
d2848cf569 getIban might return null from the bunq API. Fixes #1378 as it gets imported now :) 2018-04-25 19:11:32 +02:00
James Cole
71f39f55f2 Push some more fixes for #1378 2018-04-25 17:02:43 +02:00
James Cole
490c817fc1 Some fixes for #1378 2018-04-25 16:01:51 +02:00
James Cole
2e1a777811 Fix small deprecated function call. [skip ci] 2018-04-24 19:49:54 +02:00
James Cole
48357d1cc9 Fix #1273 and #1272 2018-04-24 19:48:42 +02:00
James Cole
846df21764 Fix #1372 2018-04-24 19:26:31 +02:00
James Cole
f78b8f9267 Some code for #1272 2018-04-24 19:26:16 +02:00
James Cole
798d9ee876 Mail to logbooks. 2018-04-24 19:23:32 +02:00
James Cole
1eea81e9dd Update readme [skip ci] 2018-04-22 19:18:57 +02:00
James Cole
4fcdfd41fa Update readme [skip ci] 2018-04-22 19:17:43 +02:00
James Cole
36a5f17af2 Code cleanup as described in #1272 2018-04-22 17:12:22 +02:00
James Cole
8032684ad0 Some code cleanup for #1272 2018-04-22 17:10:11 +02:00
James Cole
f7d3d4a010 Updated language strings [skip ci] 2018-04-22 13:14:36 +02:00
James Cole
9975e0b3f3 And now without var_dump. 2018-04-22 12:01:34 +02:00
James Cole
ea484a7787 Small bill related fixes. 2018-04-22 12:01:18 +02:00
James Cole
c2e8a67330 Code for #1367 2018-04-22 11:29:20 +02:00
James Cole
8f3e4a2dee Code for #1356 2018-04-22 11:17:30 +02:00
James Cole
07768a43c8 Code for #1321 2018-04-22 09:40:03 +02:00
James Cole
01c10e320c Fix for #1364 2018-04-22 09:16:51 +02:00
James Cole
f16b2257c6 Custom input for amount. 2018-04-22 08:08:09 +02:00
James Cole
e005fe7ce1 Also show foreign amount. 2018-04-22 08:07:57 +02:00
James Cole
c682e69ee7 Keep order 2018-04-22 08:07:46 +02:00
James Cole
49421f50ac Will not store fields with empty strings or weird value 2018-04-22 08:07:33 +02:00
James Cole
529dd490b7 Fix #1336 2018-04-22 07:16:09 +02:00
James Cole
36329e596e Fix #1334 2018-04-21 23:48:54 +02:00
James Cole
fb75e2ef02 Move to MariaDB. [skip ci] #1366 2018-04-21 21:09:56 +02:00
James Cole
352171e339 New language strings [skip ci] 2018-04-21 20:48:18 +02:00
James Cole
592901b143 Code for @1346 2018-04-21 20:36:42 +02:00
James Cole
769b4819b2 Add timezone to Docker file. 2018-04-21 20:30:36 +02:00
James Cole
77fa2bcc39 Call test at wrong position [skip ci] 2018-04-21 20:30:07 +02:00
James Cole
1129001bc6 Possible solution for #1353 2018-04-21 20:29:44 +02:00
James Cole
8dd765ee89 Remove deprecated method. 2018-04-21 20:28:41 +02:00
James Cole
479648e7c1 Fix #1352 2018-04-21 20:28:30 +02:00
James Cole
45cd19d1e3 Fix #1363 2018-04-21 20:27:35 +02:00
James Cole
f8718e0b7b Fix some issues with verify database code. 2018-04-21 20:26:41 +02:00
James Cole
dcc45631da New language strings [skip ci] 2018-04-19 20:04:04 +02:00
James Cole
c6d3a5bedc Code for #1351 2018-04-19 20:03:02 +02:00
James Cole
7cc8539298 Fix for #1349, thanks to @NyKoF 2018-04-19 18:27:39 +02:00
James Cole
900e8202e6 Remove some deprecated functions. 2018-04-16 20:21:28 +02:00
James Cole
eb6ac7d1d1 Remove unused methods. 2018-04-16 20:12:30 +02:00
James Cole
178f917a49 Fix #1348 2018-04-16 19:29:26 +02:00
James Cole
1a8293d9ef Fix view for transaction controller. 2018-04-16 19:25:33 +02:00
James Cole
ecdc00dcb7 Debug code for transaction view. [skip ci] 2018-04-16 19:24:46 +02:00
James Cole
147e04ecd2 Debug code for transaction view. [skip ci] 2018-04-16 18:06:53 +02:00
James Cole
49e48725a5 Debug code for transaction view. [skip ci] 2018-04-16 18:03:56 +02:00
James Cole
b3af744041 Debug code for transaction view. [skip ci] 2018-04-16 18:02:35 +02:00
James Cole
58a6a95d90 Debug code for transaction view. [skip ci] 2018-04-16 17:59:35 +02:00
James Cole
1aa9461370 Fix reference to unknown method. 2018-04-16 17:51:37 +02:00
James Cole
1f78b9d4bc Add today as well. #1328 2018-04-15 19:24:20 +02:00
James Cole
6f974fe285 Improve API and test coverage. 2018-04-15 19:20:24 +02:00
James Cole
f4f3c8798e Fix for #1328 2018-04-15 19:20:04 +02:00
James Cole
ce1614f4e7 Fix chart range. 2018-04-15 19:11:10 +02:00
James Cole
91494584c2 Fix #1327 2018-04-15 17:58:39 +02:00
James Cole
a85ebb49b2 Improve test coverage. 2018-04-15 14:03:23 +02:00
James Cole
ae273f8320 Also test PHP 7.2 2018-04-15 10:44:47 +02:00
James Cole
ef62e31b61 Fix #1246 2018-04-15 10:12:04 +02:00
James Cole
0c2c5d5344 Code for #1326 2018-04-15 08:52:58 +02:00
James Cole
11e93eac3d Merge pull request #1341 from bconte/develop
Remove the 'php artisan optimize' line from .deploy/docker/entroypoin…
2018-04-15 08:52:04 +02:00
Brenden Conte
dbe17debb4 Remove the 'php artisan optimize' line from .deploy/docker/entroypoint.sh because the command was removed in artisan 5.6 2018-04-15 02:35:47 -04:00
James Cole
6c12337317 Improve transaction linking [skip ci] 2018-04-14 23:25:28 +02:00
James Cole
b2aa73b31e Improve transaction linking [skip ci] 2018-04-14 23:23:47 +02:00
James Cole
38b1fc7aa6 Improve logging [skip ci] 2018-04-14 23:12:54 +02:00
James Cole
f4afcb4d50 Add debug logging [skip ci] 2018-04-14 23:09:24 +02:00
James Cole
4b019fe38b Limit scope in transaction matcher. 2018-04-14 23:06:27 +02:00
James Cole
191401f32b Fix division by zero. 2018-04-14 22:37:20 +02:00
James Cole
62b68c6a21 Fix tests. 2018-04-14 21:21:20 +02:00
James Cole
15a22f0bfc Expand rules and bills. 2018-04-14 20:31:31 +02:00
James Cole
926c03986c Remove references to bill scanning. 2018-04-14 13:00:24 +02:00
James Cole
d8a00f4314 Various code for bills and rules. 2018-04-14 09:59:04 +02:00
James Cole
5862b832d9 Fix issue with API 2018-04-14 09:38:58 +02:00
James Cole
67fa4a0fc7 Add currency controls to API 2018-04-13 17:28:11 +02:00
James Cole
90cf7a3bf5 Fix several issues with bunq import #1330 2018-04-10 21:18:38 +02:00
James Cole
0847040017 Correct access rights #1320 2018-04-09 18:59:06 +02:00
James Cole
69b577048e New string [skip ci] 2018-04-08 18:35:13 +02:00
James Cole
3fbd2f93c8 Code for #1324 2018-04-08 17:36:37 +02:00
James Cole
8f0e36a8e4 Code for #1324 2018-04-08 16:27:52 +02:00
James Cole
7583698ee5 Remove hard exit from upgrade routine. 2018-04-08 16:26:26 +02:00
James Cole
b561e79a6c Catch null in currency pref. [skip ci] 2018-04-08 16:21:17 +02:00
James Cole
5850ad06b1 More debug [skip ci] 2018-04-08 16:18:35 +02:00
James Cole
e597f04b0d Add debug logging. 2018-04-08 16:17:29 +02:00
James Cole
7b715925cf Code for #1324 2018-04-07 22:23:16 +02:00
James Cole
d3701837e3 Possible fix for #1325 2018-04-07 18:00:09 +02:00
James Cole
7af10aca9e Add new action to link a transaction to a bill. 2018-04-07 06:20:45 +02:00
James Cole
b54e99642b Refactor some auto complete routes. 2018-04-07 06:19:40 +02:00
James Cole
b1ad0668cc Clean overview for bills. 2018-04-07 05:58:59 +02:00
James Cole
6583d0f69b Fix JS in installer. 2018-04-07 05:30:29 +02:00
James Cole
cee6bbf134 Update files for Sandstorm. 2018-04-06 22:24:57 +02:00
James Cole
43e49bf14a Fire middleware on index. 2018-04-06 21:38:43 +02:00
James Cole
371b58a807 Make upgrade routine not trigger everywhere. 2018-04-06 21:38:17 +02:00
James Cole
7812a1bb51 Fix for #1320 2018-04-06 18:14:48 +02:00
James Cole
538e045e4c Give error for proc_close. 2018-04-06 13:36:36 +02:00
James Cole
91fe1493a7 Improve edit routine for split transactions. 2018-04-06 12:44:43 +02:00
James Cole
4650a2ea52 Merge branch 'release/4.7.2.2' 2018-04-04 19:26:51 +02:00
James Cole
7cd51a7747 Update version. 2018-04-04 19:18:59 +02:00
James Cole
b55545b959 Fix #1317 2018-04-04 19:18:01 +02:00
James Cole
2685256c93 Fix split edit. 2018-04-04 19:15:05 +02:00
James Cole
3819de4e74 Fix security issue with markdown, thanks to @simhnna 2018-04-04 19:14:47 +02:00
James Cole
73fee4eb6b Fix #1313 2018-04-03 19:15:06 +02:00
James Cole
609c193b88 Fix #1312 2018-04-03 19:12:59 +02:00
James Cole
03a42976b1 Configure logging for Slack. [skip ci] 2018-04-02 20:05:18 +02:00
James Cole
6db0efdfbc Fix extremely specific piggy bank percentage. 2018-04-02 17:30:30 +02:00
James Cole
ebbbe1a620 Merge branch 'release/4.7.2.1' 2018-04-02 16:52:23 +02:00
James Cole
5d1c77cb16 New version: 4.7.2.1 2018-04-02 15:40:43 +02:00
James Cole
d48fb3ba55 Create keys by hand if not existing. 2018-04-02 15:26:33 +02:00
James Cole
8c024a1ae9 Create default token if none exist. 2018-04-02 15:17:03 +02:00
James Cole
a3c34e6b3c Code cleanup 2018-04-02 15:10:40 +02:00
James Cole
fa7ab45a40 Code cleanup 2018-04-02 14:50:17 +02:00
James Cole
379b104778 Refer to classes directly. 2018-04-02 14:43:06 +02:00
James Cole
d956c795a4 Vue components will now work in subdirs too. 2018-04-02 14:42:30 +02:00
James Cole
7d02d0f762 Code cleanup. 2018-04-02 14:42:07 +02:00
James Cole
f96f38b172 Code cleanup. 2018-04-02 14:17:11 +02:00
James Cole
4cea5d65a6 Expand language list #1310 2018-04-02 06:56:19 +02:00
James Cole
40d94e7a62 Avoid using serialised preferences for security purposes. This might break existing preferences. 2018-04-01 19:22:30 +02:00
James Cole
66019fdbbf Code for #1309 2018-04-01 16:00:15 +02:00
James Cole
37b02e3d5b Merge branch 'release/4.7.2' 2018-04-01 11:46:41 +02:00
James Cole
093bdd6090 Fix some last minute issues. 2018-04-01 08:50:23 +02:00
James Cole
52656b25da Let's cancel these tests for now. 2018-04-01 08:04:19 +02:00
James Cole
1386c9d915 Disable some tests. 2018-04-01 07:40:30 +02:00
James Cole
02c9441727 Last minute language updates. 2018-04-01 07:24:18 +02:00
James Cole
b1e926f2cb Use php unit 7, not 6. 2018-04-01 07:13:29 +02:00
James Cole
df9dcb395b Change composer build instructions 2018-04-01 07:02:46 +02:00
James Cole
ad59dad921 Remove deprecated features. 2018-03-31 21:42:08 +02:00
James Cole
46e75968f5 Update composer 2018-03-31 21:05:53 +02:00
James Cole
0df5c5121d Update language strings 2018-03-31 21:05:43 +02:00
James Cole
16f04b45ac Update composer file. 2018-03-31 21:05:17 +02:00
James Cole
5ce35a50c2 Make sure tests work. 2018-03-31 21:05:06 +02:00
James Cole
7110c1178a Fix bad parse error. 2018-03-30 22:49:46 +02:00
James Cole
220f5e2913 Add support for Italian. 2018-03-30 22:48:00 +02:00
James Cole
9f8c75efc6 Fix null pointer in account format. 2018-03-30 22:44:37 +02:00
James Cole
8f3e84df4d Fix possible null pointer. 2018-03-30 22:40:20 +02:00
James Cole
08ff3d8ad0 Implement test of import command. 2018-03-30 19:41:16 +02:00
James Cole
5c4d7734ac Expand test code for create export routine. 2018-03-30 16:44:33 +02:00
James Cole
15f8cd49d3 Log file security. 2018-03-30 14:50:44 +02:00
James Cole
62b3986fcd Update env files for #1280 2018-03-30 07:00:20 +02:00
James Cole
55b6d711f3 Currency exchange rate will not be saved when rate is 0. 2018-03-30 06:33:04 +02:00
James Cole
7e51d57d21 Update composer file. 2018-03-29 19:01:59 +02:00
James Cole
170d23d768 Code cleanup before release. 2018-03-29 19:01:47 +02:00
James Cole
40266c6821 Add support for Italian and update language files. 2018-03-29 19:00:21 +02:00
James Cole
0a71077513 Push updated tests. 2018-03-28 19:38:20 +02:00
James Cole
be5c44af61 Update some code, add security txt file. 2018-03-28 19:37:59 +02:00
James Cole
720dcb0fe5 Fix #1300 2018-03-27 19:29:58 +02:00
James Cole
c86b207b1c Fix #1297 2018-03-26 20:48:47 +02:00
James Cole
413c1bc2fe Fix #1294 2018-03-26 19:19:11 +02:00
James Cole
5ca31ea3dd Fix #1296 2018-03-26 19:09:58 +02:00
James Cole
dd5d2d1616 Consistent overview for #1292 2018-03-25 21:16:46 +02:00
James Cole
5f08790f12 Restore chart #1292 2018-03-25 20:52:21 +02:00
James Cole
d5ef5ee5a7 Fix #1293 2018-03-25 20:42:56 +02:00
James Cole
f641c70172 Fix #1292 2018-03-25 18:26:35 +02:00
James Cole
992657b942 Code for #1257 2018-03-25 13:30:55 +02:00
James Cole
41e468b507 Fix #1247 2018-03-25 10:17:07 +02:00
James Cole
6660306ac4 Various code cleanup. 2018-03-25 09:01:43 +02:00
James Cole
dd9694890a Code for #1291 2018-03-25 09:00:45 +02:00
James Cole
0b8654d865 Fix #1252 2018-03-25 07:59:06 +02:00
James Cole
f07dc7bd81 Finalize bunq import #1248 2018-03-25 07:55:31 +02:00
James Cole
6a6482dc7f Finish up bunq import routine. 2018-03-24 18:55:02 +01:00
James Cole
3c9b7c07af Move import to factory #1222 2018-03-24 14:05:29 +01:00
James Cole
796ab4bf2c Fixed some small issues in import routine. 2018-03-24 11:49:26 +01:00
James Cole
55602d632d Clean up code for import routine. 2018-03-24 10:35:42 +01:00
James Cole
310ed9f504 Add budget warnings #1202 2018-03-24 06:46:37 +01:00
James Cole
dafddfa39a Fix all tests. 2018-03-24 06:08:50 +01:00
James Cole
3e22c9860e Fix some tests. 2018-03-23 05:31:45 +01:00
James Cole
fb0a0c3fb5 Fix a few tests. 2018-03-23 05:31:30 +01:00
James Cole
3b735c7533 Expand views and files to use new methods. 2018-03-19 19:39:26 +01:00
James Cole
1645490f5c Avoid using model methods and use repository instead 2018-03-19 19:39:02 +01:00
James Cole
aecffe10d9 Import routine can handle new SEPA fields and many new date fields. See #1248 2018-03-19 19:38:17 +01:00
James Cole
4e69bc0e32 Add reference to FAQ [skip ci] 2018-03-19 15:44:08 +01:00
James Cole
909f72e6be Move notes for attachments to different object. This sacrifices the original notes. 2018-03-19 15:28:35 +01:00
James Cole
6a1d39d5f8 Add newlines and strict type declarations. 2018-03-19 13:23:26 +01:00
James Cole
c5d4ec17c3 Move strict type declaration. 2018-03-19 13:22:08 +01:00
James Cole
ed33a72945 Make sure that strict_types declaration is always at the very top of the file. 2018-03-19 12:09:12 +01:00
James Cole
d8c0091680 Make sure that strict_types declaration is always at the very top of the file. 2018-03-19 12:08:50 +01:00
James Cole
6419d68626 Add newlines to end of file. 2018-03-19 12:08:22 +01:00
James Cole
e2ecaf5bcf Include BIC in import routine 2018-03-19 10:03:08 +01:00
James Cole
31146954d1 Fix #1258 2018-03-19 09:33:48 +01:00
James Cole
601ca9ec80 Update German translations [skip ci] 2018-03-19 09:09:47 +01:00
James Cole
082b5ba895 Fix #1262 2018-03-19 09:09:02 +01:00
James Cole
e06361d5d7 Push strict declaration to top. 2018-03-19 08:17:42 +01:00
James Cole
552a8e130c Add support methods. 2018-03-19 08:17:31 +01:00
James Cole
40787bc29a Improve bunq import. 2018-03-19 08:17:15 +01:00
James Cole
6ab03bb228 Improve IBAN uniqueness. 2018-03-19 08:16:54 +01:00
James Cole
3fdb782321 Fix various tests. 2018-03-11 21:19:35 +01:00
James Cole
c8f52a1c40 Code cleanup [skip ci] 2018-03-11 20:41:03 +01:00
James Cole
eb63090387 Fix custom range thing for accounts #1240 [skip ci] 2018-03-11 19:01:19 +01:00
James Cole
5bc8f31c31 Add verify routine to installer. 2018-03-11 18:47:26 +01:00
James Cole
5776de7745 Update various tests. 2018-03-11 18:46:41 +01:00
James Cole
f45d0bb317 Expand install routine. 2018-03-11 18:46:18 +01:00
James Cole
93aa5b7753 Fix null pointer in chart JS [skip ci] 2018-03-11 18:40:08 +01:00
James Cole
dd6a6a565f Fix null pointer in budget report [skip ci] 2018-03-11 18:38:35 +01:00
James Cole
aba8025645 Move docker files, include kubernetes files. 2018-03-11 18:27:30 +01:00
James Cole
b12872e5de Various code cleanup. 2018-03-11 16:24:07 +01:00
James Cole
5a7b1ba292 Remove unused methods. 2018-03-11 15:55:36 +01:00
James Cole
24715c72a2 Remove unused functions. 2018-03-11 15:54:33 +01:00
James Cole
ed3a4e4663 View extension for amounts [skip ci] 2018-03-11 14:19:28 +01:00
James Cole
e97283b34b Make sure transfers can't get a budget. 2018-03-11 14:13:23 +01:00
James Cole
c2dfbcba10 Improve view for transactions. 2018-03-11 14:09:44 +01:00
James Cole
a9870b35be Remove some stuff, mark as deprecated. 2018-03-11 13:34:16 +01:00
James Cole
ed5cd2b9ca Add currency symbol. 2018-03-11 13:31:22 +01:00
James Cole
a9356ca1e2 Mark methods as deprecated. 2018-03-11 13:30:58 +01:00
James Cole
cfba11e9ca Code for #1244 2018-03-11 13:26:11 +01:00
James Cole
4304a3c916 Code for #1214 2018-03-11 13:22:34 +01:00
James Cole
9e6194bfdc Catch null pointer [skip ci] 2018-03-11 08:23:47 +01:00
James Cole
7d6c8aa9dc Fix null pointer. 2018-03-11 08:22:20 +01:00
James Cole
aad0864018 Various code cleanup [skip ci] 2018-03-10 22:38:20 +01:00
James Cole
a55d18709c More code to catch exceptions in #1238 2018-03-10 22:34:02 +01:00
James Cole
dd2f3c861b Optimize imports. 2018-03-10 20:30:09 +01:00
James Cole
da1dc67e1c Validation message. 2018-03-10 20:25:55 +01:00
James Cole
0c2b35e542 Improve bunq import. 2018-03-10 20:25:42 +01:00
James Cole
85dc1263ea Fix #1238 2018-03-10 20:25:11 +01:00
James Cole
c8ecb3e0ee Fix #1199 for web interface 2018-03-10 09:44:04 +01:00
James Cole
ce10036a27 Fix #1199 in API 2018-03-10 09:39:49 +01:00
James Cole
30e49846e0 First list existing devices, then try to get a new one. 2018-03-10 07:33:49 +01:00
James Cole
be97dd1c57 Expand various views. 2018-03-10 07:17:23 +01:00
James Cole
648a6dca42 Expand install routine. 2018-03-10 07:17:05 +01:00
James Cole
0566d0d198 Expand bunq import. 2018-03-10 07:16:38 +01:00
James Cole
dfc25722c9 Expand debug page with locale information. 2018-03-10 07:15:21 +01:00
James Cole
a436c55c50 Code for #1236 2018-03-10 06:49:03 +01:00
James Cole
0d58530f55 Fix #1237 2018-03-09 20:58:46 +01:00
James Cole
04b2eaf535 Fix tests that broke during Laravel 5.6 upgrade 2018-03-09 06:46:45 +01:00
James Cole
ace2ed8bd0 Fix #1213 2018-03-09 05:52:52 +01:00
James Cole
dff2d716a1 Move 2FA to profile #1153 2018-03-09 05:45:22 +01:00
James Cole
ad18b9b81b Remove optional chart (always enabled) 2018-03-09 05:44:35 +01:00
James Cole
eabfe0769b Update explanation for new PW hash check. 2018-03-09 04:48:17 +01:00
James Cole
19f7027718 Fix #1198 2018-03-09 04:47:43 +01:00
James Cole
f537945351 Fix #1236 2018-03-09 04:04:42 +01:00
James Cole
d02372ab90 Fix debug controller for Laravel 5.6 2018-03-08 21:08:26 +01:00
James Cole
1b020c522f Fix currency test. 2018-03-08 21:02:46 +01:00
James Cole
79d0450c77 Implement new password verifier #1187 2018-03-08 20:44:56 +01:00
James Cole
bc32bc8831 Stop Travis from optimising. 2018-03-08 06:13:06 +01:00
James Cole
f68a307eeb Fix file names, ignore installer in test env 2018-03-07 21:04:10 +01:00
James Cole
82e7479cfe Force fresh config var [skip ci] 2018-03-07 21:01:46 +01:00
James Cole
462fe5d89f Force migration [skip ci]Middleware log. [skip ci] 2018-03-07 20:59:32 +01:00
James Cole
b0d8ac83ae Middleware log. [skip ci] 2018-03-07 20:58:54 +01:00
James Cole
d8ac817c91 Middleware log. [skip ci] 2018-03-07 20:56:52 +01:00
James Cole
5105bc6f64 Add more debug logging to output. 2018-03-07 20:55:11 +01:00
James Cole
47c9f1e9b8 Update logging for Laravel 5.6 #1221 2018-03-07 20:47:39 +01:00
James Cole
49d0ed0c1b Fix null pointer. 2018-03-07 20:41:17 +01:00
James Cole
99f5151aab Remove coverage for methods that do not exist. 2018-03-07 20:39:33 +01:00
James Cole
0a056ad02d Upgrade to Laravel 5.6 #1221 2018-03-07 20:37:00 +01:00
James Cole
c76b634d0b Fix #1189 2018-03-07 20:27:10 +01:00
James Cole
a81698d50f Code for #1219 2018-03-07 20:25:58 +01:00
James Cole
bae79063e1 Code to fix #1234 2018-03-07 20:21:51 +01:00
James Cole
fb5323c283 Code to facilitate #1123 2018-03-07 20:21:36 +01:00
James Cole
e2d1de94b7 Fix tests to catch use of repositories 2018-03-07 10:18:50 +01:00
James Cole
7109fd8196 Correct reference to journal description 2018-03-07 10:18:36 +01:00
James Cole
a5fd821e0c Code to implement #1168 and #1197. 2018-03-07 10:18:22 +01:00
James Cole
6c63583e49 Fix test to always select correct journal. 2018-03-07 05:52:45 +01:00
James Cole
dd16e1b784 Expand list of bills for #1102 2018-03-07 05:52:34 +01:00
James Cole
d52d8d7970 Expand exception code and fix demo user redirect. 2018-03-07 05:51:51 +01:00
James Cole
f349aa47ce Merge pull request #1232 from benyanke/patch-1
Allow user to specify port
2018-03-06 05:22:46 +01:00
James Cole
ef4018934c Merge branch 'release/4.7.1.4' 2018-03-06 05:15:04 +01:00
Ben Yanke
951aa9535e Allow user to specify port 2018-03-05 20:49:21 -06:00
James Cole
de1fe36226 Fix #1226 2018-03-05 19:56:50 +01:00
James Cole
64fd36d437 Fix #1227 2018-03-05 19:39:41 +01:00
James Cole
6f9ecc0ffa Update version. [skip ci] 2018-03-05 19:37:06 +01:00
James Cole
a97bfc92e1 Add newlines and strict types 2018-03-05 19:35:58 +01:00
James Cole
0d72fcdf02 Fix #1225 2018-03-05 19:35:39 +01:00
James Cole
0e84ca1df5 Merge branch 'release/4.7.1.3' 2018-03-04 20:57:12 +01:00
James Cole
b28bdda510 Move base href to top of page. 2018-03-04 20:40:49 +01:00
James Cole
72314e2d9f Expand tests for updated triggers / actions. 2018-03-04 17:10:36 +01:00
James Cole
d22fb9f438 Improve tests for transaction rules. 2018-03-04 16:42:29 +01:00
James Cole
04b8552d27 Implement tests. 2018-03-04 16:30:20 +01:00
James Cole
5d6f44cd91 Fix test that could select a deposit or transfer. 2018-03-04 16:07:03 +01:00
James Cole
afc8ad7ff5 Clean test. 2018-03-04 15:57:19 +01:00
James Cole
ae039bf1c7 Update composer file for failed passport thing and update version. 2018-03-04 15:36:06 +01:00
James Cole
8fa25e9d37 Update read me file. 2018-03-04 15:25:43 +01:00
James Cole
0daab491ec Remove unused file [skip ci] 2018-03-04 15:16:37 +01:00
James Cole
4f825bac1a Add newlines to files [skip ci] 2018-03-04 15:16:18 +01:00
James Cole
39c8b79ebb Add newlines to files [skip ci] 2018-03-04 15:14:29 +01:00
James Cole
7d66c90beb Make sure that the API returns all entries of a split transaction. 2018-03-04 14:20:23 +01:00
James Cole
1b8b65582a Merge branch 'release/4.7.1.2' 2018-03-04 13:27:21 +01:00
James Cole
d25971cb44 Actually upgrade version. 2018-03-04 13:26:35 +01:00
James Cole
89a56e661d Merge branch 'hotfix/4.7.1.1' into develop 2018-03-04 13:24:07 +01:00
James Cole
3482746d7c Merge branch 'hotfix/4.7.1.1' 2018-03-04 13:24:06 +01:00
James Cole
d5aeca6222 Fix import problem in 4.7.1 2018-03-04 13:23:44 +01:00
James Cole
03f46638e1 Merge branch 'release/4.7.1' 2018-03-04 10:52:17 +01:00
James Cole
c2b000d910 Update change log. 2018-03-04 10:39:40 +01:00
James Cole
88eb702d7b Update Sandstorm files. 2018-03-04 10:39:31 +01:00
James Cole
b1d98f026f Update docker file. 2018-03-04 10:39:00 +01:00
James Cole
28dfe7b02c Update test config. 2018-03-04 10:38:50 +01:00
James Cole
84f0ee183c Fix tests. 2018-03-04 09:49:15 +01:00
James Cole
7eedd6c2fc Update changelog and increment version. 2018-03-04 09:13:15 +01:00
James Cole
e7b80c6d10 Fix parameter error in test script. 2018-03-04 09:12:58 +01:00
James Cole
d165609476 Expand debug view with API version. 2018-03-04 09:12:47 +01:00
James Cole
2f17521c06 Fix small errors in bulk and mass controller 2018-03-04 09:12:33 +01:00
James Cole
8b52006959 Updated all language strings. 2018-03-04 08:54:01 +01:00
James Cole
8eb3d43123 Fix tag auto select. 2018-03-04 08:52:06 +01:00
James Cole
a511368229 Fix missing index. 2018-03-04 08:51:46 +01:00
James Cole
f0006a0743 Update composer lock file. 2018-03-04 08:51:20 +01:00
James Cole
7171e69715 All API routes seem to work. 2018-03-04 08:22:32 +01:00
James Cole
2ab44fb33a Improve test coverage. 2018-03-04 07:56:30 +01:00
James Cole
7542175258 Improve test coverage. 2018-03-03 17:16:47 +01:00
James Cole
9dc4c50527 Expand test coverage. 2018-03-03 14:24:06 +01:00
James Cole
99d116f4ce Improve test coverage. 2018-03-03 10:15:39 +01:00
James Cole
9475fef8f6 Implement user API and first tests. 2018-03-03 08:12:18 +01:00
James Cole
60339a0f6a make sure randomly selected journals match prerequisites. 2018-03-02 17:29:47 +01:00
James Cole
36113f84be make sure randomly selected journals match prerequisites. 2018-03-02 17:07:32 +01:00
James Cole
139c2284b8 Various code cleanup. 2018-03-02 16:31:02 +01:00
James Cole
91909a70d7 Fix #1209 2018-03-02 03:14:36 +01:00
James Cole
a23d97563f Fix tests that selected split journals. 2018-03-01 21:39:31 +01:00
James Cole
bf538e2514 Merge pull request #1211 from m0nhawk/patch-1
3 new european currencies in database seed
2018-03-01 21:28:36 +01:00
Andrew Prokhorenkov
149b62f486 3 new european currencies in database seed 2018-03-01 22:20:04 +02:00
James Cole
06dc8a499b Expand factory tests. 2018-03-01 20:54:50 +01:00
James Cole
5b8479f3a4 Remove PHP 7.2 support. 2018-03-01 17:40:06 +01:00
James Cole
e803a5e26e Fix test coverage. 2018-03-01 17:20:06 +01:00
James Cole
959f798a7f Update English strings. 2018-02-28 21:33:14 +01:00
James Cole
5b8adbfd0c Repository and test clean up. 2018-02-28 21:32:59 +01:00
James Cole
54ba18975a Use different method for finding objects. 2018-02-28 20:23:45 +01:00
James Cole
fdd2dedfc6 Fix test cases. 2018-02-28 20:18:47 +01:00
James Cole
46f4fa1a7d Expand tests. 2018-02-28 15:50:00 +01:00
James Cole
28debb46be Needs to return bill to work. 2018-02-28 14:57:58 +01:00
James Cole
5f132be94d Add catalan (still in comments, because its incomplete [skip ci] 2018-02-28 07:22:57 +01:00
James Cole
9f9feea159 Code to fix #1185 2018-02-28 07:22:11 +01:00
James Cole
3bd9e0bcd4 Remove not existing method 2018-02-27 07:39:28 +01:00
James Cole
c80a76f8c0 Remove not existing method. 2018-02-27 07:37:40 +01:00
James Cole
c71f498587 Merge branches 'develop' and 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Update validation.php
  Update config.php

* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Update validation.php
  Update config.php
2018-02-26 21:09:51 +01:00
James Cole
e658d447ca Update validation. 2018-02-26 21:09:33 +01:00
James Cole
33def5b45d Update validation.php 2018-02-26 13:18:34 +01:00
James Cole
9fc26a8ee0 Update config.php 2018-02-26 13:15:54 +01:00
James Cole
1b304bf85e use journal repository instead of direct calls. 2018-02-25 19:09:05 +01:00
James Cole
99983a5c8f Match default values #1191 2018-02-25 17:39:19 +01:00
James Cole
d01b370cd7 Change docker vars #1191 2018-02-25 17:39:09 +01:00
James Cole
1a643e2042 Expand tests 2018-02-25 17:38:24 +01:00
James Cole
1aaf5fd288 Improve split controller code. 2018-02-25 16:04:25 +01:00
James Cole
8a758b8df0 Fix #1192 2018-02-25 15:09:57 +01:00
James Cole
211caa07dc Update edit and submit routines for transactions. 2018-02-24 14:31:20 +01:00
James Cole
ac66e89edb Expand some tests. 2018-02-24 09:18:01 +01:00
James Cole
6fe5b50410 Expand view + JS for view to cope with new factory 2018-02-24 09:17:48 +01:00
James Cole
166cdad58b Some intermittent changes to storing journals. 2018-02-24 09:17:15 +01:00
James Cole
1a721ac6b5 Fix transactions. 2018-02-23 16:59:21 +01:00
James Cole
6591fa9fb4 Small adjustments to fix tests. 2018-02-23 16:21:28 +01:00
James Cole
d804093f8b Expand destroy routine. 2018-02-23 15:13:30 +01:00
James Cole
5261b784b0 New validation 2018-02-23 15:13:23 +01:00
James Cole
5a188ceca3 Remove triggers 2018-02-23 15:13:16 +01:00
James Cole
ce56cc538d Remove bad method. 2018-02-23 15:13:09 +01:00
James Cole
269433bf00 Refactor reconciliation routine 2018-02-23 15:13:01 +01:00
James Cole
dae3371c69 Move common methods to traits 2018-02-23 15:12:47 +01:00
James Cole
38c1d332e2 Removed a lot of old spaghetti code. Now have to rewrite it 2018-02-22 20:13:00 +01:00
James Cole
b627d42160 Code removal. The code removed from these classes must move to respective services. 2018-02-22 20:07:14 +01:00
James Cole
4e923057ae Clean up repository. 2018-02-21 21:11:44 +01:00
James Cole
35d0bd1985 Factory seems to work for update and create 2018-02-21 21:06:59 +01:00
James Cole
085eb650e7 Code cleanup. 2018-02-21 20:34:48 +01:00
James Cole
b4157e8ce0 Build account update service. 2018-02-21 20:34:24 +01:00
James Cole
81221038f0 Expand services. 2018-02-21 18:42:15 +01:00
James Cole
9f37bf5875 Fix budget controller tests. 2018-02-21 09:23:20 +01:00
James Cole
140a5b20db Update transactions, delete splits. 2018-02-21 08:58:06 +01:00
James Cole
e9b6b45fc4 Expand code to be able to handle updates. 2018-02-21 08:51:30 +01:00
James Cole
f16760d607 Expand API validation. 2018-02-20 18:03:02 +01:00
James Cole
9d457787f7 Specify times for SQLite database. #1192 2018-02-20 17:17:14 +01:00
James Cole
4e6afd5afc Remove todo items [skip ci] 2018-02-19 20:32:44 +01:00
James Cole
36354c3846 Fix for #1111 2018-02-19 20:32:33 +01:00
James Cole
9f63dfb9cb Fix #1178 [skip ci] 2018-02-19 20:17:37 +01:00
James Cole
cae4faad0a Expand tests. 2018-02-19 20:02:27 +01:00
James Cole
e389d0f7fa Expand tests 2018-02-19 19:45:13 +01:00
James Cole
6b32213735 make findByName nullable. 2018-02-19 19:44:58 +01:00
James Cole
b3fe24b713 Expand and refactor factories. 2018-02-19 19:44:46 +01:00
James Cole
5bb7530642 Expand tests. 2018-02-18 20:40:32 +01:00
James Cole
0b61c16eb0 Expand test cases for transaction creation through the API. 2018-02-18 19:55:35 +01:00
James Cole
77aced6734 Test every happy path for journal creation. 2018-02-18 16:35:26 +01:00
James Cole
94a7b6b9bd First create basic objects. Then, enhance. 2018-02-18 10:52:56 +01:00
James Cole
f8bf6c163f Add some factory stuff before another refactoring. 2018-02-18 10:49:42 +01:00
James Cole
eb0da038fb Expand tests and API code. 2018-02-18 10:31:15 +01:00
James Cole
6cda9f2900 Expand tests for account API. 2018-02-17 19:56:45 +01:00
James Cole
ecd4a862ff Tests for API controllers 2018-02-17 14:46:12 +01:00
James Cole
632d50a0d0 Fix all tests. 2018-02-17 14:14:26 +01:00
James Cole
0f1cc46b71 Fix JSON tests 2018-02-17 12:33:42 +01:00
James Cole
60b225d61c Fix use of transformer. 2018-02-17 12:24:29 +01:00
James Cole
23e540a57a Fix missing methods in account controller test 2018-02-17 10:50:47 +01:00
James Cole
1998412a3c Remove API tests for the time being. 2018-02-17 10:48:31 +01:00
James Cole
7bbfb692de Move code to repository. 2018-02-17 10:47:32 +01:00
James Cole
c6da990748 Expand decryption routine. 2018-02-17 10:47:18 +01:00
James Cole
049e57d578 New tests for object transformers. 2018-02-17 10:47:06 +01:00
James Cole
78ba0f749c tests for bill and attachment transformers. 2018-02-16 22:47:08 +01:00
James Cole
9cc1bfb4b5 Improve code for test coverage 2018-02-16 22:14:53 +01:00
James Cole
278b7ac52b First tests for transformers. 2018-02-16 22:14:34 +01:00
James Cole
645a29e22b Add API test suite 2018-02-16 22:14:08 +01:00
James Cole
b22d30bc65 Add method to mark journals as completed. 2018-02-16 16:58:08 +01:00
James Cole
2ee0490141 Remove debug info. 2018-02-16 16:57:54 +01:00
James Cole
1fd783de69 Remove debug info. 2018-02-16 16:57:46 +01:00
James Cole
8073896965 Add request data for tags. 2018-02-16 16:57:35 +01:00
James Cole
8a26e43c40 Fix display for new transaction store. 2018-02-16 16:57:27 +01:00
James Cole
a302aba3ab Expand journal repos 2018-02-16 16:45:03 +01:00
James Cole
0458058cb1 Update piggy bank transformer 2018-02-16 16:44:52 +01:00
James Cole
999bb5ed49 Add new transaction type repository 2018-02-16 16:44:21 +01:00
James Cole
c9f4a1eb7b Add route binder to transaction 2018-02-16 16:43:57 +01:00
James Cole
45aa76afce Expand collector to return single journals. 2018-02-16 16:43:48 +01:00
James Cole
e89a77efb1 New factories for the creation of journals and associated meta data. 2018-02-16 16:43:25 +01:00
James Cole
8f930d6dd5 Transaction request with full validation 2018-02-16 16:43:00 +01:00
James Cole
9d62b4c70d Add return types 2018-02-16 16:42:23 +01:00
James Cole
834032f58e Updated transaction controller 2018-02-16 16:42:13 +01:00
James Cole
33db99ffd3 Update find methods to return null 2018-02-16 15:19:19 +01:00
James Cole
28b00f6507 New routes for transaction 2018-02-16 15:18:07 +01:00
James Cole
6559076c48 New strings for validation 2018-02-16 15:17:55 +01:00
James Cole
60f6311e00 Rule to validate if object belongs to submitting user. 2018-02-16 15:17:36 +01:00
James Cole
574a5630e0 Add binder for transactions 2018-02-16 14:52:16 +01:00
James Cole
d3294be1bc Add method that makes sure that URL's are expanded for page navigation/ 2018-02-16 14:51:59 +01:00
James Cole
22fdc81de2 Refactor transactions. 2018-02-13 21:04:15 +01:00
James Cole
370e9b25d1 Expand API. 2018-02-13 18:24:06 +01:00
James Cole
30f821af3e About controller for basic site info 2018-02-13 18:23:26 +01:00
James Cole
7a5aa1c39b Update and restructure YAML file for Docker. [skip ci] 2018-02-11 20:53:30 +01:00
James Cole
f674df4422 Fix empty title. 2018-02-11 20:45:48 +01:00
James Cole
c2da5931ec Expanded API code, wrote a bunch new transformers as well. 2018-02-11 20:45:33 +01:00
James Cole
94f6bd34c7 Fix some issues with semi-colon delimiters, see #1172 2018-02-11 15:52:24 +01:00
James Cole
e066a6421c Fix #1172 2018-02-11 15:36:16 +01:00
James Cole
ef338e2515 Fix #1174 2018-02-11 15:27:28 +01:00
James Cole
dcf549261c Fix for #1175 2018-02-11 15:24:19 +01:00
James Cole
8b868b426a First API routes for accounts. 2018-02-11 08:08:08 +01:00
James Cole
2ef1022c92 Make sure bills API is consistent. 2018-02-11 07:46:34 +01:00
James Cole
9b3abd3b19 Expand transformers to include other objects. 2018-02-10 10:58:06 +01:00
James Cole
db02fefcf4 Update composer. 2018-02-10 09:58:06 +01:00
James Cole
523ae83811 Show proper 404 page for JSON. 2018-02-10 09:57:56 +01:00
James Cole
4eb010f807 Use correct CSS in 404 page. 2018-02-10 09:57:47 +01:00
James Cole
4958f28052 Allow API to work with bills. 2018-02-10 09:57:31 +01:00
James Cole
7e727b63ed Use built-in PHPUnit in tests. 2018-02-10 09:57:05 +01:00
James Cole
138c38fbb5 Clean up code in validator. 2018-02-10 09:22:13 +01:00
James Cole
2e61bb7375 Fix tests. 2018-02-10 09:22:04 +01:00
James Cole
fce4c9174d Fix for #1154 2018-02-10 08:21:35 +01:00
James Cole
2220963899 Remove guard from user model. 2018-02-10 08:21:20 +01:00
James Cole
e69e6c1ce8 Would be nice to remove the references as well... 2018-02-09 19:28:16 +01:00
James Cole
0f09a9db4d Remove reference to guard from other bind support classes. 2018-02-09 19:24:30 +01:00
James Cole
53a6c10ada Remove reference to guard from models. 2018-02-09 19:24:15 +01:00
James Cole
14772469ed Remove reference to guard from binder 2018-02-09 19:23:31 +01:00
James Cole
55f13ef121 Code cleanup in 2FA middleware. 2018-02-09 19:12:46 +01:00
James Cole
95648c37b3 Various code cleanup. 2018-02-09 19:11:55 +01:00
James Cole
ac98822a55 Fix for issue #1167 2018-02-09 16:47:01 +01:00
James Cole
c460419166 Final fixes for API binder. 2018-02-09 15:01:22 +01:00
James Cole
d2a8819dd4 Merge branch 'apifix' into develop
* apifix:
  Fix issues with API authentication.

# Conflicts:
#	app/Api/V1/Controllers/BillController.php
#	app/Http/Middleware/HttpBinder.php
#	app/Transformers/AttachmentTransformer.php
#	app/Transformers/BillTransformer.php
#	app/Transformers/NoteTransformer.php
#	routes/api.php
2018-02-09 14:57:39 +01:00
James Cole
d393c693de Fix issues with API authentication. 2018-02-09 14:47:37 +01:00
James Cole
d4a84ed198 Update tests. 2018-02-07 16:49:11 +01:00
James Cole
e8c7986a58 Rename binder test 2018-02-07 16:20:40 +01:00
James Cole
809e40c5ce Remove double middleware from routes. 2018-02-07 11:20:37 +01:00
James Cole
f445a95c26 Consistent use of links in transformers. 2018-02-07 11:20:24 +01:00
James Cole
909dc212fb make sure all route binders use guard. 2018-02-07 11:15:36 +01:00
James Cole
eacc1da157 Implement multi purpose binder 2018-02-07 11:13:04 +01:00
James Cole
587ad1298d Make sure transformer accepts null dates. 2018-02-07 10:49:24 +01:00
James Cole
fae7dabbc2 Split binder in api and http binder 2018-02-07 10:49:06 +01:00
James Cole
3a813c30b4 Clean up js file. 2018-02-06 19:52:46 +01:00
James Cole
3de46f55fa Use transformer in view. 2018-02-06 19:49:53 +01:00
James Cole
3aa922341c Remove unused package from config 2018-02-06 19:49:38 +01:00
James Cole
e94043edc2 Expand transformers. 2018-02-06 19:49:29 +01:00
James Cole
da91645ec0 Clean up code. 2018-02-06 19:49:16 +01:00
James Cole
178072d3af Remove unused markdown method 2018-02-06 19:49:09 +01:00
James Cole
811d8e330f Refer to correct location for bill transformer. 2018-02-06 19:48:56 +01:00
James Cole
d3c8d06114 Update lock files 2018-02-06 19:48:43 +01:00
James Cole
82dc0045ba Move bill transformer to previous location 2018-02-06 19:48:32 +01:00
James Cole
3d06f0ac14 Remove unused dependencies 2018-02-06 18:15:26 +01:00
James Cole
b5c0ef01d9 Clean up app.js 2018-02-06 18:13:54 +01:00
James Cole
3a5d3016c7 Refer to correct bill route 2018-02-06 18:12:43 +01:00
James Cole
20690b4d5b Clean up API routes 2018-02-06 18:12:31 +01:00
James Cole
2816a4a325 Make bill views use transformer object. 2018-02-06 18:12:09 +01:00
James Cole
2f4f37778c Fix error page CSS 2018-02-06 18:11:46 +01:00
James Cole
c4507a7f75 Make sure the "classic" page uses the transformer as well. 2018-02-06 18:11:33 +01:00
James Cole
9a0672e359 Update previous view to use new strings. 2018-02-06 10:57:23 +01:00
James Cole
f128db35c6 Update view to use localized strings. 2018-02-06 10:57:07 +01:00
James Cole
a2cfaa0867 Update language strings. 2018-02-06 10:56:50 +01:00
James Cole
5850c5e20a Add code to enable localisation. 2018-02-06 10:56:37 +01:00
James Cole
e77a1e403f Expand config for localisation 2018-02-06 10:56:17 +01:00
James Cole
b72e8db7b1 Add localisation package. 2018-02-06 10:56:01 +01:00
James Cole
07506784f4 Add localisation package. 2018-02-06 10:55:40 +01:00
James Cole
0435e42b3d Update package files. 2018-02-06 07:52:04 +01:00
James Cole
31884bbba6 Add generated js / css to all views. 2018-02-06 07:51:49 +01:00
James Cole
6b38faf84e Expand views for bills. 2018-02-06 07:51:28 +01:00
James Cole
2f95f99890 Update exceptions thrown for better IDE support. 2018-02-06 07:50:19 +01:00
James Cole
9b78069f41 Expand API for bills. 2018-02-06 07:49:56 +01:00
James Cole
559c2042ac Remove library now included in npm build. 2018-02-06 07:49:19 +01:00
James Cole
ae3b369e9a Match layout to Firefly III 2018-02-04 15:58:03 +01:00
James Cole
31a6565e17 Add package fractal. 2018-02-04 15:57:48 +01:00
James Cole
f488bbde02 First basic routes and code for bills. 2018-02-04 15:57:35 +01:00
James Cole
e668b88fb5 Make sure authorise view is translatable and matches Firefly III 2018-02-04 14:04:52 +01:00
James Cole
2d0aa4af96 Give all web routes full namespace. 2018-02-04 14:04:29 +01:00
James Cole
6e67416c83 Blank namespace for route namespace prefix. 2018-02-04 13:55:36 +01:00
James Cole
1ef28cbc02 Changes to repair API auth 2018-02-04 13:41:59 +01:00
James Cole
58bdf14f6b First empty controllers for API. 2018-02-04 13:41:42 +01:00
James Cole
9f4ecb0963 Make authorise view a twig file. 2018-02-04 11:21:57 +01:00
James Cole
b1259a014f Add support for Spanish [skip ci] 2018-02-04 09:52:42 +01:00
James Cole
142d0b5af2 First set of JS/CSS built by npm. 2018-02-04 09:23:46 +01:00
James Cole
450e2bad1c New composer.lock after installing Laravel Passport. 2018-02-04 09:23:20 +01:00
James Cole
089300d57e Update date related code to fix several issues with SQLite 2018-02-04 09:22:52 +01:00
James Cole
36f67793cb Include Vue components. 2018-02-04 08:17:22 +01:00
James Cole
c335a9bbc8 Rename access token variables 2018-02-04 08:17:05 +01:00
James Cole
029688a594 Passport auth view. 2018-02-04 08:16:37 +01:00
James Cole
6f2eb33fd0 Future strings for JS translations 2018-02-04 08:16:06 +01:00
James Cole
8351020913 Add passport components to app.js 2018-02-04 08:15:20 +01:00
James Cole
220efca8d7 Add passport migrations 2018-02-04 08:14:36 +01:00
James Cole
28579f7b80 Add debug information to import routine. 2018-02-04 08:14:22 +01:00
James Cole
f1d77bdb50 Expand code to support laravel passport 2018-02-04 08:14:03 +01:00
James Cole
ca8b4cb11a Add laravel passport 2018-02-04 08:13:31 +01:00
James Cole
31dbb7b111 Update view to use new assets 2018-02-03 09:14:58 +01:00
James Cole
352cdf75c8 Include font awesome in assets. 2018-02-03 09:14:39 +01:00
James Cole
d81c99bcda Other name for CSRF token in html and JS. 2018-02-01 19:39:55 +01:00
James Cole
1e2c979341 Fix #1155 2018-02-01 19:39:41 +01:00
James Cole
d8664096f9 Fix view issues when user has multiple pages of budgets #1111 2018-02-01 17:55:18 +01:00
James Cole
0d9a221b00 Extend debug page with session fields. 2018-02-01 16:58:47 +01:00
James Cole
de85f17cac Improve login form autocomplete values [skip ci] 2018-02-01 16:54:42 +01:00
James Cole
e3d6f4f00f Add some Vue related components. Prep for inclusion of passport and other tools. 2018-01-31 17:55:49 +01:00
James Cole
d0e0054b00 Correct errors in English sentences. [skip ci] 2018-01-31 14:02:04 +01:00
James Cole
735222a8ed Merge branch 'release/4.7.0' 2018-01-31 07:14:15 +01:00
James Cole
66f299cd06 Update composer file. 2018-01-31 06:42:44 +01:00
James Cole
e3c5268143 Update changelog for Sandstorm. 2018-01-31 06:35:41 +01:00
James Cole
df32493d77 Final update for some translations. 2018-01-30 21:07:14 +01:00
James Cole
86faf44153 Small fixes in change log [skip ci] 2018-01-29 20:17:43 +01:00
James Cole
e2f3e4b555 Update sandstorm file list. 2018-01-29 19:56:57 +01:00
James Cole
e57ed6015c Updated composer lock file. 2018-01-29 19:31:36 +01:00
James Cole
9c34ca7fc4 Changelog for Sandstorm. 2018-01-29 19:14:58 +01:00
James Cole
7b94f4a441 Update change log. 2018-01-29 19:13:51 +01:00
James Cole
693f8d0738 Update language files. 2018-01-29 19:13:43 +01:00
James Cole
d6ecbc06bf Add Portuguese (Brazil) 2018-01-29 19:12:58 +01:00
James Cole
c31674fffc New version in Sandstorm file. 2018-01-29 19:10:29 +01:00
James Cole
b08de8cc00 Clean up config. 2018-01-29 19:09:52 +01:00
James Cole
4c503e4c7c Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Workaround IE tab order issue w/ js initial select
2018-01-29 19:09:13 +01:00
James Cole
dd4158c6b4 Expand tests 2018-01-29 19:09:00 +01:00
James Cole
5fd7ea2b96 Add code coverage. 2018-01-29 19:08:49 +01:00
James Cole
b9ff80eb5a Update changelog. 2018-01-29 19:08:26 +01:00
James Cole
afc725bbc8 Merge pull request #1148 from devlearner/login-tab-order
Workaround IE tab order issue on js initial select
2018-01-28 21:13:56 +01:00
James Cole
0342c371cc Fix debug issue caught by @devlearner. 2018-01-28 20:59:26 +01:00
devlearner
2da4e6b048 Workaround IE tab order issue w/ js initial select 2018-01-28 14:23:06 +00:00
James Cole
f50550d79c Fix unit tests 2018-01-25 20:38:50 +01:00
James Cole
3fa39a6805 Clean up view and route. 2018-01-25 19:21:58 +01:00
James Cole
3dbe6d4870 Clean up config. 2018-01-25 19:21:46 +01:00
James Cole
59c48268ab Support more icons. 2018-01-25 19:21:40 +01:00
James Cole
1f83c5195d Add view method. Clean up repository links 2018-01-25 19:21:31 +01:00
James Cole
49a95a08fe More friendly demo user message. 2018-01-25 19:02:14 +01:00
James Cole
c86c5ccfe9 Add forgotten migration [skip ci] 2018-01-25 18:55:31 +01:00
James Cole
8a2497fc67 Expand mime type and upgrade version [skip ci] 2018-01-25 18:41:51 +01:00
James Cole
7c70732247 Some light refactoring. No changes. 2018-01-25 18:41:27 +01:00
James Cole
53fc4f2740 Better link to Spectre docs. [skip ci] 2018-01-24 15:23:27 +01:00
James Cole
f3ade5621e Merge pull request #1145 from devlearner/woff2
Include Woff fonts as well
2018-01-24 14:30:57 +01:00
devlearner
ec2e08e33a Update fonts for Source Sans Pro
(Bold Italic)
2018-01-24 21:04:03 +08:00
devlearner
b9a26faa4d Update css for Source Sans Pro
(Bold Italic)
2018-01-24 12:52:48 +00:00
James Cole
1a434d0c83 Expand readme with links to contribution pages. [skip ci] 2018-01-24 12:00:41 +01:00
James Cole
9a2c6c2967 Expand test coverage. 2018-01-24 11:09:21 +01:00
James Cole
602b35d589 Breadcrumb shows the correct title. 2018-01-24 11:09:05 +01:00
James Cole
f42cd0c7c3 Give correct info about import jobs. 2018-01-24 11:08:50 +01:00
James Cole
cb81855a17 Fix #1143 2018-01-24 11:05:00 +01:00
James Cole
89cf351ad0 add some fixes for #1111 2018-01-24 05:17:26 +01:00
devlearner
3f70a3f06c Added woff fonts 2018-01-24 01:10:04 +08:00
devlearner
9df360f010 Updated woff2 fonts
Roboto: Last modified 2017-10-16 (v18)
Lato: Last modified 2017-10-11 (v14)
2018-01-24 00:59:27 +08:00
James Cole
9a26d6d49f Fix #1140 2018-01-22 18:37:59 +01:00
James Cole
bc4d801c12 Fix #1141 2018-01-22 18:16:50 +01:00
James Cole
f2d8e13576 Fix #1142 2018-01-22 18:14:30 +01:00
James Cole
ec0b5db973 Update change log. 2018-01-21 20:04:53 +01:00
James Cole
46a0d1ce35 Update change log. 2018-01-21 20:03:29 +01:00
James Cole
cb81446ca6 Clean up debug code 2018-01-21 20:03:13 +01:00
James Cole
9350b4939c Make some file names lowercase. 2018-01-21 19:47:19 +01:00
James Cole
33e8c8c415 Make some file names lowercase. 2018-01-21 19:46:56 +01:00
James Cole
48fa86cc54 Improve some test coverage. 2018-01-21 18:06:57 +01:00
James Cole
d5e6d1c578 Remove reference to website from read me. 2018-01-21 11:10:08 +01:00
James Cole
0bc688795a Small update in update routine. 2018-01-21 11:09:55 +01:00
James Cole
eb76ed5591 New text in contributing [skip ci] 2018-01-21 09:10:36 +01:00
James Cole
839cbaf37a Updated read me file [skip ci] 2018-01-21 00:08:14 +01:00
James Cole
788fc9204d Update readme [skip ci] 2018-01-21 00:06:40 +01:00
James Cole
3e3e304ef3 Updated read me file [skip ci] 2018-01-20 23:59:10 +01:00
James Cole
447d453fdc Update composer lock file [skip ci] 2018-01-20 07:15:39 +01:00
James Cole
36fd7884f3 Update demo pages. 2018-01-20 07:15:26 +01:00
James Cole
54da08b2f2 Change settings so demo user can use Spectre. 2018-01-20 06:40:23 +01:00
James Cole
3f02072ae9 Update read me[skip ci] 2018-01-20 06:40:05 +01:00
James Cole
a9c117703b Update composer.json 2018-01-19 08:35:25 +01:00
James Cole
c137255155 Update .scrutinizer.yml 2018-01-19 08:23:31 +01:00
James Cole
e7829ecc38 Committed bad help JS. [skip ci] 2018-01-17 14:26:31 +01:00
James Cole
529bdafa31 Code climate file. 2018-01-17 13:04:43 +01:00
James Cole
e2af0caa41 Fix tests 2018-01-17 12:29:00 +01:00
James Cole
80f96abf08 Fix notes in link types. 2018-01-17 10:40:44 +01:00
James Cole
70da38193f Fix issue with budget chart. 2018-01-17 10:17:49 +01:00
James Cole
13df973873 Fix query cache. 2018-01-17 10:03:47 +01:00
James Cole
3ccb791674 Various code cleanup. [skip ci] 2018-01-17 09:32:18 +01:00
James Cole
ccf1a6c182 Fix #1134 2018-01-17 09:22:45 +01:00
James Cole
493543c1f5 Update language files [skip ci] 2018-01-17 06:43:04 +01:00
James Cole
5f5725e0e3 Explicit language tag in layout 2018-01-17 06:25:32 +01:00
James Cole
107dd42957 Update English language files [skip ci] 2018-01-17 06:24:50 +01:00
James Cole
a9f3fe4d3a Remove memcached experiment. 2018-01-16 22:01:55 +01:00
James Cole
3e62e17b9e Add some echo to Sandstorm scripts. 2018-01-16 21:34:36 +01:00
James Cole
57855b1930 Remove references to unused cache thing. 2018-01-16 21:09:27 +01:00
James Cole
aa9e8227bb Smal changes in Sandstorm configuration. [skip ci] #1130 2018-01-15 17:48:20 +01:00
James Cole
a80f083b6e Catch errors in DB seeds. 2018-01-15 17:13:23 +01:00
James Cole
474e066d4a Expand debug message [skip ci] 2018-01-14 19:59:05 +01:00
James Cole
4428ccefbf Expand debug message [skip ci] 2018-01-14 19:58:39 +01:00
James Cole
d568a6c8a9 First version of actual update check. 2018-01-14 19:56:18 +01:00
James Cole
97e9ad6cb2 Small updates in read me. 2018-01-14 19:49:29 +01:00
James Cole
00607d2a6d Code for #1040 2018-01-14 19:36:24 +01:00
James Cole
c2a425121d Code for #1040 2018-01-14 16:32:26 +01:00
James Cole
435694e9ea Code for #989 2018-01-14 10:57:27 +01:00
James Cole
f59135a9ca Code for #989 2018-01-14 10:48:17 +01:00
James Cole
102b106402 Different “drop up” menu. 2018-01-13 18:52:06 +01:00
James Cole
5c27c8e633 Multi currency net worth box. 2018-01-13 18:40:28 +01:00
James Cole
edd5215b21 Different icon for view. [skip ci] 2018-01-13 18:07:25 +01:00
James Cole
94b173ae6b New language strings. 2018-01-13 18:02:41 +01:00
James Cole
7d96b281b6 Add buttons to views 2018-01-13 18:01:53 +01:00
James Cole
a5515ac89f Update tests. 2018-01-13 10:36:49 +01:00
James Cole
fb863b0bf2 Improve step count for spectre imports. 2018-01-13 07:52:35 +01:00
James Cole
50882f309b Make sure number of steps is always correct. 2018-01-13 07:36:44 +01:00
James Cole
ce854fbb43 Catch error when trying to read (non-existent) logs. 2018-01-12 21:43:04 +01:00
James Cole
6799268ec4 Add intval just in case. 2018-01-12 21:31:39 +01:00
James Cole
6fe5ce0485 Expand budget report #1106 2018-01-12 21:08:59 +01:00
James Cole
cbeaf8e16a Expand tag report #1106 2018-01-12 21:02:27 +01:00
James Cole
04de4c9b36 Expand category report #1106 2018-01-12 20:53:18 +01:00
James Cole
517731cb59 Extra buttons 2018-01-12 20:37:56 +01:00
James Cole
e34e43173c Fix #1132 2018-01-12 20:37:39 +01:00
James Cole
79d6055a78 Fix #1131 2018-01-12 20:32:09 +01:00
James Cole
7ac4d2a2f4 Various new strings [skip ci] 2018-01-12 18:44:59 +01:00
James Cole
4984eda320 Clean up view HTML 2018-01-12 18:42:48 +01:00
James Cole
89e0791e2f Add button to create transaction. 2018-01-12 18:42:25 +01:00
James Cole
922d487821 Update icon [skip ci] 2018-01-11 21:27:24 +01:00
James Cole
4b789979ac Fix 2FA check #1125 2018-01-11 20:56:42 +01:00
James Cole
554b38ccff Code for #1126 2018-01-11 20:49:55 +01:00
James Cole
9614310208 Extra button for #1124 2018-01-11 19:08:01 +01:00
James Cole
d9ec3ac354 Code for #1124 2018-01-11 19:06:46 +01:00
James Cole
f326f08f7b Fix #1088 2018-01-11 18:58:33 +01:00
James Cole
0ae8418f32 Fix tests. 2018-01-10 20:07:47 +01:00
James Cole
309f9cd076 Add new roles 2018-01-10 19:59:40 +01:00
James Cole
61f5ed3874 Fix check for column roles. 2018-01-10 19:06:27 +01:00
James Cole
91178d2604 Various cleanup in import. 2018-01-10 18:18:49 +01:00
James Cole
87dae6ea18 Expand some code for Spectre import. 2018-01-10 16:49:32 +01:00
James Cole
2e495c38d1 Make env files more readable. 2018-01-10 14:37:40 +01:00
James Cole
c2987aaf4c Update docker config #1081 2018-01-10 13:15:12 +01:00
James Cole
f4f4eecb7b Add routes to ignore. [skip ci] 2018-01-10 12:42:32 +01:00
James Cole
84d9287251 Remove unused route [skip ci] 2018-01-10 12:42:17 +01:00
James Cole
b71f334744 Small rewrite in readme [skip ci] 2018-01-10 12:42:01 +01:00
James Cole
ad306e4d01 Strings for #1116 (help text) 2018-01-10 08:03:37 +01:00
James Cole
e40d4ef829 Add strings for #1116 to intro page. 2018-01-10 07:57:36 +01:00
James Cole
48c16c3dcc Clean up binders. 2018-01-10 07:51:47 +01:00
James Cole
c045193246 Remove unnecessary routes. 2018-01-10 07:29:55 +01:00
James Cole
a816e59a97 Small update in readme [skip ci] 2018-01-10 07:19:28 +01:00
James Cole
892074eaf2 Final touches on readme [skipci] 2018-01-09 20:24:45 +01:00
James Cole
3e501e429d Fix link to softalucous [skip ci] 2018-01-09 20:23:31 +01:00
James Cole
0f40accb4c Expand links. [skipci] 2018-01-09 20:22:46 +01:00
James Cole
3dae6c99a4 Fix badges. [skipci] 2018-01-09 20:17:58 +01:00
James Cole
b185c83597 Update read me file. [skip ci] 2018-01-09 20:16:17 +01:00
James Cole
ef6b4120f1 Lower case some file names. 2018-01-09 19:27:12 +01:00
James Cole
a43eef01fc Lower case some file names. 2018-01-09 19:26:49 +01:00
James Cole
2cb9aa537f Experimental support for CodeCov. 2018-01-09 17:52:18 +01:00
James Cole
2edd49a8b4 First version that supports Spectre. 2018-01-08 20:20:45 +01:00
James Cole
a57554d380 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Fix charts in IE
2018-01-08 20:20:14 +01:00
James Cole
c89486b6d9 Expand Spectre import code. 2018-01-08 19:21:00 +01:00
James Cole
f737cb7235 Update language files for #1109 2018-01-08 19:20:41 +01:00
James Cole
f1fe169553 Disable Spectre again. 2018-01-08 19:19:17 +01:00
James Cole
2fc760780e Add support for Russian. 2018-01-08 19:19:03 +01:00
James Cole
8c3290bf6f Merge pull request #1107 from devlearner/patch-1
Fix charts in Internet Explorer
2018-01-08 10:21:09 +01:00
devlearner
495158b9c9 Fix charts in IE
since IE apparently doesn't support arrow function expression (and throws a syntax error)
2018-01-08 07:49:32 +00:00
James Cole
f9fc9b1889 Spectre should not be enabled. [skip ci] 2018-01-07 16:49:49 +01:00
James Cole
11ff2ab9d1 Debug controller cannot be accessed by demo user. 2018-01-07 12:53:20 +01:00
James Cole
52b138e6b2 Fix error in read me [skip ci] 2018-01-07 12:43:02 +01:00
James Cole
3562ec1f79 Merge branch 'release/4.6.13' 2018-01-07 12:40:54 +01:00
James Cole
943b4de6dc Update Sandstorm file list. 2018-01-07 12:29:18 +01:00
James Cole
4097f51f69 Updated composer file. 2018-01-07 12:28:43 +01:00
James Cole
cad5b2cae9 Final translations before release. 2018-01-07 12:20:05 +01:00
James Cole
8bb4b0b9b2 Make sure log stays small. 2018-01-06 20:26:21 +01:00
James Cole
9bcd1ed807 Make sure file content is trimmed. 2018-01-06 19:17:47 +01:00
James Cole
d7b1892bda Catch when no amount info is present. 2018-01-06 19:17:35 +01:00
James Cole
ea0980ba83 Update Sandstorm file list. 2018-01-06 16:27:20 +01:00
James Cole
b479a3ef99 Update change log, composer files. 2018-01-06 16:10:02 +01:00
James Cole
600e15d42f Jump back a version. 2018-01-06 15:48:44 +01:00
James Cole
824959e71a Fix form thing [skip ci] 2018-01-06 14:19:30 +01:00
James Cole
cfd8d231fb Update logging for #1089 [skip ci] 2018-01-06 12:21:24 +01:00
James Cole
87c3dc2ecc Improve comparisons for #1089 2018-01-06 12:20:02 +01:00
James Cole
590f0a83ea Code for #1098 2018-01-06 11:56:20 +01:00
James Cole
65e518856b Add warning message to index. 2018-01-06 10:25:21 +01:00
James Cole
469313eca7 Commit merge. 2018-01-06 10:12:43 +01:00
James Cole
f13f378d7f Merge pull request #1093 from jinformatique/patch-1
create .htaccess file
2018-01-06 10:10:41 +01:00
James Cole
76d8017be5 Small extension on import account, for testing mostly. 2018-01-06 09:33:28 +01:00
James Cole
af1bdc0c2c Expand debug view. 2018-01-06 09:33:06 +01:00
James Cole
6ac1e05e60 Clear cache sooner for #1096 2018-01-06 07:42:03 +01:00
James Cole
7fa937e80b Fixed tests to account for issue fixed by #1097 2018-01-06 07:33:30 +01:00
James Cole
ed0e14aee5 Merge pull request #1097 from kelvinhammond/patch-1
Fix issue with accounts in select map not matching
2018-01-06 07:23:21 +01:00
Kelvin
e300c1aab4 Fix issue with accounts in select map not matching
When mapping Opposing Accounts the select input's values are incorrect and do not match account ids.
2018-01-06 00:40:17 -05:00
James Cole
9e1586878b Test some preprocessors. 2018-01-05 17:51:05 +01:00
James Cole
5d54939bd4 Expand read me. 2018-01-05 17:29:57 +01:00
James Cole
3e9f98b43e Expand test coverage. 2018-01-05 17:29:42 +01:00
James Cole
c329ffa545 Updated tests and views 2018-01-05 07:54:10 +01:00
James Cole
d3cad66b69 Improve tests for import. 2018-01-05 07:41:26 +01:00
James Cole
246af608d3 Update repository to fix #972 2018-01-04 22:44:47 +01:00
James Cole
e7debc5466 Rewrote importer to be more clean about the stage it is in. 2018-01-04 19:33:16 +01:00
James Cole
5866300ac1 Rename and move some files. 2018-01-04 18:34:51 +01:00
J'informatique
c1221aef4b create .htaccess file
- To force HTTPS
- To hide directory listing
- To prevent access to .env and other files
2018-01-04 12:29:33 +01:00
James Cole
bc879a3872 Updated language files [skip ci] 2018-01-04 10:31:49 +01:00
James Cole
2b4a3d463b Update composer files. 2018-01-04 10:25:24 +01:00
James Cole
6b59b6de6e Fix some things in import routine. 2018-01-04 08:59:39 +01:00
James Cole
3ce5ccb98a Another fix for #1092 2018-01-04 08:09:26 +01:00
James Cole
a1b83def4f New strings for translation. [skip ci] 2018-01-03 20:37:11 +01:00
James Cole
5177619301 Lots of new code for Spectre import. 2018-01-03 19:17:30 +01:00
James Cole
4e0319bacc Fix for #1092 2018-01-03 07:35:29 +01:00
James Cole
30f64af55f Experimental cross OS command for #1083 [skip ci] 2018-01-02 20:08:56 +01:00
James Cole
cdeabaaf9a Extra fix to cover for #1091 2018-01-02 19:53:22 +01:00
James Cole
fa676f60fb Internationalise several forms for #1090 2018-01-02 17:25:59 +01:00
James Cole
4ec123a19a Add some logging for #1089 2018-01-02 16:25:47 +01:00
James Cole
de35bde048 Some updated language strings. 2018-01-02 15:18:22 +01:00
James Cole
3f786856f3 Expand code for Spectre login. 2018-01-02 15:17:31 +01:00
James Cole
d49aecdf49 Update tests. 2018-01-02 07:14:00 +01:00
James Cole
6713597621 Fix #1087 2018-01-02 06:39:34 +01:00
James Cole
09bd55675d Fix Turkish string [skip ci] 2018-01-01 16:46:56 +01:00
James Cole
d87dda40ee Clean up some JS and views. 2018-01-01 16:46:41 +01:00
James Cole
06cfc391a1 Add cast to string to fix chart. [skip ci] 2018-01-01 16:46:15 +01:00
James Cole
bea06a06a1 Various updated sentences and strings in Polish. 2018-01-01 15:38:09 +01:00
James Cole
06fa2ab7a1 Update string in Spectre import, as suggested by @pkoziol 2018-01-01 15:37:15 +01:00
James Cole
4926011f3f Fix #1085 2018-01-01 15:33:38 +01:00
James Cole
0455f8658d Move debug to new controller, add some fields. 2018-01-01 15:33:24 +01:00
James Cole
4773021ff0 Expand debug controller. 2017-12-31 11:38:21 +01:00
James Cole
e2bd1f6544 Update breadcrumbs for PHP 7.2 #1079 2017-12-31 11:10:36 +01:00
James Cole
b73884160a Fix account controller + coverage. 2017-12-31 10:40:27 +01:00
James Cole
8bcfa729b6 Updated language files. 2017-12-31 09:36:36 +01:00
James Cole
f8dda5b4a6 Added Turkish. 2017-12-31 09:10:38 +01:00
James Cole
c0961d438d Rename a view. 2017-12-31 09:01:27 +01:00
James Cole
d9dd00eb39 Fix #1074 2017-12-30 21:04:04 +01:00
James Cole
6d9baaa499 Updated language files. [skip ci] 2017-12-30 20:43:18 +01:00
James Cole
b37ed5ab23 Code for #1077 2017-12-30 20:07:49 +01:00
James Cole
3fba741f1b Update views and routes for #1078 2017-12-30 14:25:11 +01:00
James Cole
73051d7d42 Add budget list, expand view. #1078 2017-12-30 13:05:19 +01:00
James Cole
717e101b80 Start updating view. 2017-12-30 12:54:19 +01:00
James Cole
08f28d48af Refer to new views. 2017-12-30 12:44:10 +01:00
James Cole
ec2f693575 Update breadcrumb #1078 2017-12-30 12:43:57 +01:00
James Cole
3cc1bf52cb Move view. #1078 2017-12-30 12:43:13 +01:00
James Cole
5da9f0cfb6 Fix #1080 2017-12-30 12:33:44 +01:00
James Cole
64624bea1d Rename language string #1078 2017-12-30 12:24:28 +01:00
James Cole
dc95395f42 Clean up buttons #1078 2017-12-30 12:23:26 +01:00
James Cole
273f188101 Fix error in route (my error) #1078 2017-12-30 12:23:16 +01:00
James Cole
a6b22b5156 Remove unused language string. #1078 2017-12-30 12:23:03 +01:00
James Cole
9d8a4cd934 Clean up JS code #1078 (also old code removed) 2017-12-30 12:22:49 +01:00
James Cole
c73dd5f664 Update routes to reflect change. #1078 2017-12-30 12:14:10 +01:00
James Cole
7ff8c5e966 Move bulk methods to their own controller. #1078 2017-12-30 12:13:13 +01:00
James Cole
1c11aa13b8 Merge commit for PR #1078 2017-12-30 11:56:02 +01:00
James Cole
0c2ec58366 Merge pull request #1078 from vicmosin/issues/509
Introduced bulk edit endpoint for bulk edit of categories and tags
2017-12-30 11:54:06 +01:00
Victor Mosin
2955d7148f Merge branch 'develop' into issues/509
# Conflicts:
#	public/js/ff/transactions/list.js
2017-12-30 11:49:42 +01:00
James Cole
f9d87cb9f6 Remove unused translations. 2017-12-30 09:47:37 +01:00
Victor Mosin
50fcc42e99 Fixed wrong counter value 2017-12-30 09:39:47 +01:00
Victor Mosin
805456d032 Introduced bulk edit endpoint for bulk edit of categories and tags 2017-12-30 09:21:28 +01:00
James Cole
a9df7906eb Update JS and CSS libraries. 2017-12-30 06:51:16 +01:00
James Cole
59d732cba7 Merge branch 'release/4.6.12' 2017-12-29 20:06:56 +01:00
James Cole
61099bef27 Last changes for Sandstorm. 2017-12-29 20:02:33 +01:00
James Cole
dca44f1588 Code for new release. 2017-12-29 19:55:15 +01:00
James Cole
87174ddbb3 Fix language strings. 2017-12-29 19:35:51 +01:00
James Cole
c5cc101f4b Fix language strings. 2017-12-29 19:29:58 +01:00
James Cole
071c4286a7 Add a test for the Rabobank converter. 2017-12-29 12:27:29 +01:00
James Cole
7603fc0436 Some language updates. 2017-12-29 09:35:40 +01:00
James Cole
c7850f9f1a Update some French strings. 2017-12-29 09:32:58 +01:00
James Cole
c0eebb2b08 Updated languages. 2017-12-29 09:13:46 +01:00
James Cole
87147c37ae Clean up language. 2017-12-29 09:06:07 +01:00
James Cole
3815f9836f Various code cleanup. 2017-12-29 09:05:35 +01:00
James Cole
cf66ae61e1 Add extra info line. 2017-12-29 07:25:30 +01:00
James Cole
962324c3f7 Expand test coverage. 2017-12-28 20:06:16 +01:00
James Cole
bd3e262273 Expand coverage. 2017-12-28 19:55:10 +01:00
James Cole
fa65035664 make sure mocked class accepts all arguments. 2017-12-28 19:47:58 +01:00
James Cole
ca1b6046f3 Test update checker. 2017-12-28 19:16:27 +01:00
James Cole
128085963f Small update to update checker. 2017-12-28 19:03:15 +01:00
James Cole
67cc03e4dd More code for spectre. 2017-12-28 18:39:30 +01:00
James Cole
ca4db81dbd First code to check for new version. 2017-12-28 18:39:17 +01:00
James Cole
a10672a683 Progress for Spectre import. 2017-12-28 18:38:59 +01:00
James Cole
0977d8d631 Fix #1070 2017-12-28 18:28:22 +01:00
James Cole
42676746a2 Remove Spectre table. 2017-12-28 18:26:08 +01:00
James Cole
ae7933c8c9 use config, not preferences, first tests. 2017-12-28 11:57:38 +01:00
James Cole
b65e1e022e First code for #1050 2017-12-28 11:38:40 +01:00
James Cole
9ab3848755 New binary file that doesn’t look like a zip file in PHP7.2 2017-12-28 09:53:37 +01:00
James Cole
986d7de906 Code for #1040 2017-12-28 09:53:21 +01:00
James Cole
eda1673518 Also test PHP7.2 2017-12-27 22:29:25 +01:00
James Cole
97cde38d8f Create logins. 2017-12-27 18:34:03 +01:00
James Cole
5ba03bd222 Fix #1066 2017-12-27 18:11:22 +01:00
James Cole
a14ae02c27 Expand Spectre code. 2017-12-27 17:22:44 +01:00
James Cole
deebdef04d Updated language files [skip ci] 2017-12-27 15:58:03 +01:00
James Cole
e881bb55a7 Improve code coverage. 2017-12-26 17:34:59 +01:00
James Cole
9e3f31f2f0 Improve testing of middleware. 2017-12-26 17:33:53 +01:00
James Cole
f7652e7f01 Fix data export. 2017-12-26 08:32:00 +01:00
James Cole
5289f3e4c2 Limit export controller for demo users. 2017-12-25 15:31:57 +01:00
James Cole
01818af963 Expand binder test. 2017-12-25 15:30:50 +01:00
James Cole
58eaf3bccc Update code to match route binder. 2017-12-25 10:34:32 +01:00
James Cole
a3ec741d67 Updated code coverage, improved binder code. 2017-12-25 09:44:46 +01:00
James Cole
5cb948d0f3 Currency code test. 2017-12-25 09:00:09 +01:00
James Cole
56ae279c96 Code coverage ignore instruction is case sensitive. 2017-12-25 08:48:49 +01:00
James Cole
bf390b65d9 Replace Laravel binder with own binder. This will save in queries and increase security. 2017-12-25 08:45:23 +01:00
James Cole
96ccce5db3 Expand tests. 2017-12-24 11:29:16 +01:00
James Cole
d4aee258c4 Update language to fix #1064 2017-12-23 22:07:39 +01:00
James Cole
7f8e736928 Expand read me. 2017-12-23 22:03:06 +01:00
James Cole
f85bdcebaf Expand test coverage 2017-12-23 22:02:54 +01:00
James Cole
f6096339cb Fix #1063 2017-12-23 22:02:42 +01:00
James Cole
f6bd17c70b Update languages and language config. 2017-12-23 22:02:29 +01:00
James Cole
6a05ec98f4 Update job thing. 2017-12-23 21:30:30 +01:00
James Cole
c60ee14b86 Better context for language strings. 2017-12-23 21:29:05 +01:00
James Cole
26f196a067 Finally remove incomplete test flag 2017-12-23 21:05:12 +01:00
James Cole
93c463c349 Fix all tests after large composer update. 2017-12-23 20:46:52 +01:00
James Cole
59ea4a0364 Update packages. 2017-12-23 17:51:45 +01:00
James Cole
df406dd794 Update most, if not all dependencies. 2017-12-23 17:43:13 +01:00
James Cole
08b743ddcb Expand test coverage. 2017-12-23 17:42:07 +01:00
James Cole
8bd76d1ff0 Various code cleanup. 2017-12-22 18:32:43 +01:00
James Cole
f13a93348f Updated readme [skip ci] 2017-12-22 07:47:50 +01:00
James Cole
b0ecdfe01d Fix pagination of account lists for issue #1040 2017-12-21 21:18:30 +01:00
James Cole
4b869f0d9e Middleware does not fire when user is not logged in. 2017-12-21 19:55:28 +01:00
James Cole
707af8bb4e Code for #1045 2017-12-21 19:18:53 +01:00
James Cole
840705f793 No need to unset non-existing variable #1059 2017-12-21 07:59:22 +01:00
James Cole
36c8275f5e Fix #1061 2017-12-20 20:07:57 +01:00
James Cole
62a4af8607 Expand fix for #1059 [skip ci] 2017-12-19 21:56:29 +01:00
James Cole
46f894c09b Fix #1059 2017-12-19 21:54:15 +01:00
James Cole
e8f9796fc5 Make sure language files are up to date [skip ci] 2017-12-19 19:35:54 +01:00
James Cole
a69aad878e Fix #1056 2017-12-19 19:25:50 +01:00
James Cole
e21e339cb0 Fix some spelling errors. 2017-12-19 18:53:50 +01:00
James Cole
9ede6755c5 Update language files [skip ci] 2017-12-19 05:24:14 +01:00
James Cole
34fc9bc50a Fix Spectre, first code to create customer. 2017-12-19 05:20:37 +01:00
James Cole
79f700c622 Catch query exception 2017-12-19 05:20:05 +01:00
James Cole
ac04f77d94 Expand issue template 2017-12-19 05:19:54 +01:00
James Cole
9e8d7b18fa Disable not working imports [skip ci] 2017-12-17 19:24:43 +01:00
James Cole
3f62cf512f Limit some upload functions for demo users. 2017-12-17 19:22:34 +01:00
James Cole
51728efba1 Various cleanup [skip ci] 2017-12-17 19:06:11 +01:00
James Cole
c7d4ff6f27 Expand test code. 2017-12-17 18:23:10 +01:00
James Cole
c1e1da12c2 Fix division by zero. 2017-12-17 14:58:33 +01:00
James Cole
859b6fcea8 Update copyright [skip ci] 2017-12-17 14:44:46 +01:00
James Cole
1f6e42afd9 Update copyright [skip ci] 2017-12-17 14:44:05 +01:00
James Cole
ef3bc07249 Update copyright [skip ci] 2017-12-17 14:43:34 +01:00
James Cole
6c3204a8ce Update copyright [skip ci] 2017-12-17 14:43:13 +01:00
James Cole
250da33fd7 Update copyright [skip ci] 2017-12-17 14:42:49 +01:00
James Cole
dfda29cec3 Update copyright [skip ci] 2017-12-17 14:42:33 +01:00
James Cole
085876dd83 Update copyright [skip ci] 2017-12-17 14:42:21 +01:00
James Cole
ff9ad859b3 Update copyright [skip ci] 2017-12-17 14:41:58 +01:00
James Cole
78335e5814 Expand tests, do code cleanup. 2017-12-17 14:30:53 +01:00
James Cole
b08af77c98 Fixed a lot of tests and associated code. 2017-12-17 14:06:14 +01:00
James Cole
7d348f25ac Expand import routine to work over command line. 2017-12-16 20:47:08 +01:00
James Cole
22535c0e43 Last steps for import, in user interface. 2017-12-16 20:21:05 +01:00
James Cole
1d58d519a0 Unrelated code cleanup. 2017-12-16 19:48:31 +01:00
James Cole
8176356509 New code for import routine, part 3 2017-12-16 19:47:14 +01:00
James Cole
9086259a65 Small code change for controllers. 2017-12-16 19:46:36 +01:00
James Cole
66ee382da0 Lots of new code for the import routine part 2 2017-12-16 17:19:10 +01:00
James Cole
84b6708260 Massive rewrite for import routine, part 1. 2017-12-16 08:03:35 +01:00
James Cole
985cc100e2 Code to fix #964 2017-12-15 12:59:21 +01:00
James Cole
3d0ecaa8d2 Heroku composer [skip ci] 2017-12-15 11:19:51 +01:00
James Cole
009c5a438c Heroku composer [skip ci] 2017-12-15 11:18:14 +01:00
James Cole
c3af8fefde Better check for Heroku [skip ci] 2017-12-15 11:15:22 +01:00
James Cole
1b116e3a1d Update composer for heroku [skip ci] 2017-12-15 11:14:07 +01:00
James Cole
76632f5bae Update composer file [skip ci] 2017-12-15 11:06:33 +01:00
James Cole
ee6030bc62 Update composer file [skip ci] 2017-12-15 11:02:49 +01:00
James Cole
2a000d432f Update composer file [skip ci] 2017-12-15 10:59:06 +01:00
James Cole
7557d4d3cb Clean up docker compose file. 2017-12-15 10:05:37 +01:00
James Cole
54ecfac550 New docker related files. 2017-12-15 09:16:41 +01:00
James Cole
11b5a0294e Small changes in templates [skip ci] 2017-12-13 18:46:30 +01:00
James Cole
9264f1e9b9 Fix #1051 2017-12-13 17:09:55 +01:00
James Cole
044af254f3 Update links to new site. 2017-12-13 14:15:44 +01:00
James Cole
e60bbc78e6 Forgot to include include command. 2017-12-13 11:07:05 +01:00
James Cole
06ddfe3d41 Limit routes for demo user. 2017-12-13 10:59:48 +01:00
James Cole
df458b3913 Update composer file and version info. 2017-12-12 21:13:50 +01:00
James Cole
fc4165b800 Make sure new CSV reader is compatible with specifics #1015 2017-12-12 21:05:16 +01:00
James Cole
44496707fb Remove some comments [skip ci] 2017-12-12 20:53:40 +01:00
James Cole
bad889d450 Update ING description for #1015 2017-12-12 20:53:16 +01:00
James Cole
1b4edae4d9 Final code for #384 2017-12-12 18:22:29 +01:00
James Cole
cacd889193 New translations [skip ci] 2017-12-11 19:42:57 +01:00
James Cole
5a7cf04a7c Update import index [skip ci] 2017-12-11 15:17:02 +01:00
James Cole
fd7a293f4b Merge branch 'spectre' into develop
* spectre:
  Fix encryption.
  Can handle some mandatory fields (not all).
  More code for Spectre import.
  Initial code to get providers from Spectre.
  Exceptions when class does not exist.
2017-12-11 14:53:01 +01:00
James Cole
f35aa6a035 Remove GA event codes. 2017-12-11 14:52:30 +01:00
James Cole
d1c8e54798 Null pointer in verify routine. 2017-12-11 10:59:28 +01:00
James Cole
5d9e547d05 Allow profile index [skip ci] 2017-12-11 10:28:10 +01:00
James Cole
c91bb5a565 Update admin rights for demo user. 2017-12-11 10:26:44 +01:00
James Cole
1b5b79897a Fix demo user rights in admin. 2017-12-11 10:23:29 +01:00
James Cole
d7f2b7cd63 Remove unused overview #384 2017-12-11 05:57:07 +01:00
James Cole
12c15ea590 Fix #1049 2017-12-10 21:12:04 +01:00
James Cole
d3a6ccacf0 Fix earned by category view [skip ci] 2017-12-10 20:10:04 +01:00
James Cole
6fed773cb8 Fix view [skip ci] 2017-12-10 20:07:23 +01:00
James Cole
4a1e4bb821 Decrypt object names. [skip ci] 2017-12-10 20:05:56 +01:00
James Cole
0c529cb7e7 Updated code for #384 2017-12-10 20:03:10 +01:00
James Cole
b1b6fe553a Fix tests, expand flush routine. 2017-12-10 18:09:36 +01:00
James Cole
54c449f11b Some code to get #384 working. 2017-12-10 17:55:06 +01:00
James Cole
b93a96db23 Expand code for #384 2017-12-10 12:00:08 +01:00
James Cole
06683c57dd Update verify routine for issue #1048 2017-12-10 11:52:14 +01:00
James Cole
6ad90c7a87 Update copyright stuff [skip ci] 2017-12-10 09:02:26 +01:00
James Cole
2a87add745 New stuff for report. 2017-12-10 08:56:20 +01:00
James Cole
089214709f Remove wrong copyright blocks [skip ci] 2017-12-10 08:56:11 +01:00
James Cole
9bf891f3fb Add newline to file. [skip ci] 2017-12-09 21:50:23 +01:00
James Cole
583f376f11 Updated composer file. 2017-12-09 21:49:33 +01:00
James Cole
4998eaeaf1 Code for #384 2017-12-09 21:49:19 +01:00
James Cole
3cf6386bb6 Fix encryption. 2017-12-09 20:08:08 +01:00
James Cole
2365fb69b4 Can handle some mandatory fields (not all). 2017-12-09 20:02:26 +01:00
James Cole
1fec7d6271 Fix #1047 2017-12-09 19:19:15 +01:00
James Cole
17684a3ab3 Fix #1046 2017-12-09 19:14:31 +01:00
James Cole
e488d7d84c More code for Spectre import. 2017-12-09 19:13:00 +01:00
James Cole
aa9500f5ad Initial code to get providers from Spectre. 2017-12-09 12:23:28 +01:00
James Cole
0774258516 Exceptions when class does not exist. 2017-12-09 12:08:24 +01:00
James Cole
f231edaa6d Update composer.json for #1045 2017-12-09 09:23:25 +01:00
James Cole
e47b218fc1 Merge branch 'release/4.6.11.1' 2017-12-08 19:53:15 +01:00
James Cole
93bdecb07c Remove unused lib. 2017-12-08 19:46:44 +01:00
James Cole
5f6f59a851 Update list of languages to match available languages. 2017-12-08 19:40:30 +01:00
James Cole
6469c7f537 Fix logging in Sandstorm. 2017-12-08 19:35:22 +01:00
James Cole
80f72d9dd7 Sort currencies. 2017-12-08 19:35:09 +01:00
James Cole
84d0ec062e New files for coming release. 2017-12-08 17:47:04 +01:00
James Cole
9220c0de16 New translations [skip ci] 2017-12-07 19:00:26 +01:00
James Cole
db77a83ac5 Fix docker file. 2017-12-07 18:46:52 +01:00
James Cole
5da8c2200a Fixes #1038 2017-12-07 16:16:48 +01:00
James Cole
cbde9cdae9 This should fix tests. 2017-12-06 19:41:51 +01:00
James Cole
343eb3a768 Fix null pointer [skip ci] 2017-12-06 19:21:17 +01:00
James Cole
9a9257176a Restore log routine. 2017-12-05 20:50:19 +01:00
James Cole
e4a0a718d1 Code that add extra check for #1039 2017-12-05 20:50:04 +01:00
James Cole
1b56765da3 Touch journals so issue #1036 is fixed. 2017-12-04 20:57:33 +01:00
James Cole
462439a5ab Better chart display for #1034 2017-12-03 09:27:54 +01:00
James Cole
7158dfe29a Hide reconcile button #1032 2017-12-03 09:01:39 +01:00
James Cole
f300c66143 Fix #1033 2017-12-03 08:57:23 +01:00
James Cole
553586a159 Remove reference to incomplete translations [skip ci] 2017-12-02 07:53:23 +01:00
James Cole
afd8896896 Update language related stuff. 2017-12-02 07:42:12 +01:00
James Cole
c9f188e5a6 Remove incomplete languages from code base [skip ci] 2017-12-02 07:28:24 +01:00
James Cole
3ad833b3ae Will no longer show incomplete languages. [skip ci] 2017-12-02 07:28:03 +01:00
James Cole
8cfd19855a Various new translations [skip ci] 2017-12-02 07:24:51 +01:00
James Cole
14deade6a4 Whoops [skip ci] 2017-12-02 07:20:43 +01:00
James Cole
efaa69cba1 Updates to bill code for #1029 2017-12-02 07:10:36 +01:00
James Cole
8eded63055 Fix for #1028 2017-12-02 06:42:00 +01:00
James Cole
ab689111f9 In the spirit of #1030, fix other JS strings as well. 2017-12-02 06:37:23 +01:00
James Cole
b87ef6252c Fix #1030 2017-12-02 06:29:06 +01:00
James Cole
8a59380c6d First set of code for #956 2017-12-01 20:11:29 +01:00
James Cole
382c5e5760 Updated config files [skip ci] 2017-12-01 18:43:37 +01:00
James Cole
02b4de46db Fix #1026 2017-11-30 22:05:18 +01:00
James Cole
aca5d8b6e9 Remove upgrade method. 2017-11-30 20:26:56 +01:00
James Cole
c2a129ddb0 Remove unused reference to model. 2017-11-30 20:26:16 +01:00
James Cole
f7eb78364d Merge branch 'release/4.6.11' 2017-11-30 20:16:28 +01:00
James Cole
a43dd4b2e8 Updated file list. 2017-11-30 20:01:18 +01:00
James Cole
7ef2941b85 Updated French translation. 2017-11-30 19:51:15 +01:00
James Cole
8a2b581658 Update change log and composer lock file. 2017-11-30 19:50:50 +01:00
James Cole
51f07ce918 Fix #1024 and #1025 2017-11-30 19:43:02 +01:00
James Cole
f30442320c Remove meta field when content is empty. 2017-11-30 19:39:49 +01:00
James Cole
4a1c155874 Update file list for sandstorm. 2017-11-30 07:24:42 +01:00
James Cole
c8ae19b811 New translations. 2017-11-30 07:13:52 +01:00
James Cole
64db5b91e2 heroku is broken 2017-11-30 07:12:22 +01:00
James Cole
941392f5ae Update composer and change log for sandstorm. 2017-11-30 07:11:39 +01:00
James Cole
0d9ac8b9c7 Restore composer file 2017-11-30 06:59:45 +01:00
James Cole
3581925b18 Update changelog. 2017-11-30 06:59:36 +01:00
James Cole
79517fc6e0 Various Heroku related fixes. 2017-11-29 19:15:44 +01:00
James Cole
9ae878724a Test: remove copy env.example 2017-11-29 18:20:38 +01:00
James Cole
aacc94cb01 Remove pre-install thing. 2017-11-29 18:20:20 +01:00
James Cole
203556aa8e Do not overrule logging when it’s not set to daily. [skip ci] 2017-11-29 18:12:00 +01:00
James Cole
16b0264a79 Do not overrule logging when it’s not set to daily. 2017-11-29 18:10:43 +01:00
James Cole
86d8ba6fc5 Update config for Heroku [skip ci] 2017-11-29 16:57:14 +01:00
James Cole
4dee6a9f59 Now without PHP errors. 2017-11-29 16:26:00 +01:00
James Cole
dedf774bf2 Update config for Heroku [skip ci] 2017-11-29 16:23:17 +01:00
James Cole
18a5bb682d Heroku related changes. 2017-11-27 19:07:57 +01:00
James Cole
b0b904c32e Fix parse error in composer.json 2017-11-27 19:01:44 +01:00
James Cole
fbaf84c427 Remove package discovery. 2017-11-27 18:47:00 +01:00
James Cole
0b2934235d Experimenting with heroku settings. 2017-11-27 18:39:11 +01:00
James Cole
2db0550eee Update composer file for Heroku. 2017-11-27 16:31:52 +01:00
James Cole
99d3ff5e47 Update composer file. 2017-11-26 18:00:05 +01:00
James Cole
be3d8ed192 Update composer file. 2017-11-26 17:59:31 +01:00
James Cole
2df8368a54 Update Heroku script [skip ci] 2017-11-26 17:52:20 +01:00
James Cole
c366f741c1 Update code for heroku [skip ci] 2017-11-26 17:48:53 +01:00
James Cole
3ab7dd3fb7 Some code cleanup to generate a push for #1006 2017-11-26 17:30:26 +01:00
James Cole
7852f4df1f Expand test coverage. 2017-11-26 09:54:09 +01:00
James Cole
0cf359b75f Code for #959 2017-11-25 20:54:42 +01:00
James Cole
60abe2a3af Various code cleanup. 2017-11-25 20:27:53 +01:00
James Cole
23826557c3 Fix #1004 2017-11-25 20:27:36 +01:00
James Cole
35647a062c Add php doc blocks. 2017-11-25 15:20:53 +01:00
James Cole
f7b1168e7c Code cleanup for scrutinizer. 2017-11-25 08:54:52 +01:00
James Cole
f2cf0ed446 Some bread crumbs and stuff [skip ci] 2017-11-24 23:14:27 +01:00
James Cole
378b4abaf1 Fix tests. 2017-11-24 23:05:44 +01:00
James Cole
af8df75e49 Add link to debug thing. 2017-11-24 21:51:31 +01:00
James Cole
be0758ce8a Update reconciliation code for #1011 and #736 2017-11-24 21:51:07 +01:00
James Cole
644fa3027a Some code for #736 2017-11-24 18:05:58 +01:00
James Cole
7de512aff8 Fix #1014 2017-11-24 17:33:05 +01:00
James Cole
93c2f13807 New strings [skip ci] 2017-11-24 17:06:42 +01:00
James Cole
7a1f698d5e Fix for #1016 and #968 2017-11-24 17:05:22 +01:00
James Cole
1aa325053e Update some Dutch translations [skip ci] 2017-11-22 22:09:29 +01:00
James Cole
8198d86934 Fix #1012 2017-11-22 21:54:58 +01:00
James Cole
8f80ee25c2 Code for #1010 2017-11-22 21:41:48 +01:00
James Cole
24b63abf2f Fix Javascript [skip ci] 2017-11-22 21:18:55 +01:00
James Cole
781ca052d8 Code cleanup. 2017-11-22 21:12:27 +01:00
James Cole
4e6b782204 Fix tests. 2017-11-22 20:30:23 +01:00
James Cole
3cb3c7f60f Code for 2fa 2017-11-22 20:20:57 +01:00
James Cole
0faa599b4c Code for reconcile. 2017-11-22 20:20:44 +01:00
James Cole
1fee62566b Fix some markdown related items for #1009 2017-11-22 18:12:09 +01:00
James Cole
d9fa098ae5 Fix view things. [skip ci] 2017-11-22 18:03:32 +01:00
James Cole
aa42d0f131 Missing translation. [skip ci] 2017-11-22 18:00:16 +01:00
James Cole
ba6a147032 Create reconciliation transaction. 2017-11-22 17:49:06 +01:00
James Cole
69bb76b6fe Update code for reconciliation. 2017-11-22 16:54:49 +01:00
James Cole
4b87e5be55 Keep mysql on latest. 2017-11-22 16:54:00 +01:00
James Cole
8f6ea6a73f Fix #1003 2017-11-19 09:20:29 +01:00
James Cole
6a88064548 Fix currency code. 2017-11-19 08:53:08 +01:00
James Cole
c357d25335 Update CSS 2017-11-18 21:03:41 +01:00
James Cole
7f27e3ce67 Update currencies #994 2017-11-18 21:03:28 +01:00
James Cole
7e66794cf5 Fix #958 2017-11-18 20:26:57 +01:00
James Cole
cd42399c29 Fix #931 2017-11-18 20:26:42 +01:00
James Cole
6bda5c2d53 New version [skip ci] 2017-11-18 16:55:12 +01:00
James Cole
9db83bc6ad Session lifetime is a week. 2017-11-18 16:51:57 +01:00
James Cole
ee45cc2f73 Fix upgrade database thing. 2017-11-18 16:36:22 +01:00
James Cole
e8e0a44cca Fix for #1002 2017-11-18 16:30:45 +01:00
James Cole
5f127b7bec Expand types. 2017-11-18 15:53:27 +01:00
James Cole
03edf6c0a0 Create new account and transaction types. 2017-11-18 15:51:11 +01:00
James Cole
5cfe3cf8a9 Fix entry fields 2017-11-18 15:50:21 +01:00
James Cole
1cec7652bf Fix #1001 2017-11-18 15:34:11 +01:00
James Cole
1045ed13fa Fix #996 2017-11-18 11:32:35 +01:00
James Cole
64fc6b6523 Some charts will render correctly #1000 2017-11-18 06:02:15 +01:00
James Cole
0812901745 Various code cleanup. 2017-11-18 05:46:19 +01:00
James Cole
573e72f7fb Fix views for #1000 2017-11-18 05:45:58 +01:00
James Cole
51a1512a3f Language update [skip ci] 2017-11-18 05:23:19 +01:00
James Cole
de41f23fb1 Merge branch 'develop' of https://github.com/firefly-iii/firefly-iii into develop
* 'develop' of https://github.com/firefly-iii/firefly-iii:
  Blind attempt to fix #997
2017-11-17 19:32:17 +01:00
James Cole
141225c980 Code for #914 2017-11-17 19:31:48 +01:00
James Cole
7bdafb48d2 Fix tag repos #997 2017-11-17 08:23:49 +01:00
James Cole
32695ba960 Blind attempt to fix #997 2017-11-17 08:22:26 +01:00
James Cole
02c2636b7d Fix #997 2017-11-17 05:52:44 +01:00
James Cole
bf87ffb933 Simplify tag cloud. 2017-11-15 15:38:39 +01:00
James Cole
63d93968d0 Fix tests. 2017-11-15 15:30:15 +01:00
James Cole
0c1ff98c66 Remove reference to self. 2017-11-15 12:53:55 +01:00
James Cole
ffca858b8d Code clean up. 2017-11-15 12:25:49 +01:00
James Cole
57dcdfa0c4 Code clean up. 2017-11-15 11:33:07 +01:00
James Cole
ef837f20dd Code clean up. 2017-11-15 10:53:17 +01:00
James Cole
649dca77f5 Code clean up. 2017-11-15 10:52:29 +01:00
James Cole
aee17221eb Code clean up. 2017-11-15 10:50:23 +01:00
James Cole
845d7d701f Update language files. 2017-11-15 10:36:50 +01:00
James Cole
c1259843cb Update language config. 2017-11-15 07:18:02 +01:00
James Cole
f576074f67 Merge pull request #977 from firefly-iii/l10n_develop
New Crowdin translations
2017-11-15 06:38:31 +01:00
James Cole
9fbad8df07 New translations firefly.php (Polish) 2017-11-15 06:30:56 +01:00
James Cole
f6d0aea015 New translations firefly.php (Portuguese, Brazilian) 2017-11-15 06:30:53 +01:00
James Cole
683dde54b7 New translations firefly.php (Slovenian) 2017-11-15 06:30:51 +01:00
James Cole
af6f21c4fd New translations firefly.php (Spanish) 2017-11-15 06:30:48 +01:00
James Cole
56501930b9 New translations firefly.php (German) 2017-11-15 06:30:43 +01:00
James Cole
62b38f43cd New translations firefly.php (French) 2017-11-15 06:30:38 +01:00
James Cole
0cc33cc3f6 New translations firefly.php (Dutch) 2017-11-15 06:30:33 +01:00
James Cole
6b1b41d320 New translations firefly.php (Indonesian) 2017-11-15 06:30:24 +01:00
James Cole
50e32cd570 New translations firefly.php (Russian) 2017-11-15 06:30:15 +01:00
James Cole
5530347bb2 New code for #736 2017-11-15 06:29:49 +01:00
James Cole
88ebcd1086 New translations list.php (Spanish) 2017-11-14 17:20:26 +01:00
James Cole
1971fb7e29 New translations validation.php (Russian) 2017-11-14 10:30:10 +01:00
James Cole
3243288e44 New translations validation.php (Russian) 2017-11-14 10:20:11 +01:00
James Cole
080a4002c6 New translations validation.php (Russian) 2017-11-14 10:10:14 +01:00
James Cole
cf460a0584 New translations validation.php (Russian) 2017-11-14 10:00:16 +01:00
James Cole
16ebee549b New translations bank.php (Russian) 2017-11-14 09:50:11 +01:00
James Cole
e73a7a3d14 New translations demo.php (Russian) 2017-11-14 09:50:10 +01:00
James Cole
e2ecfc7073 New translations validation.php (Russian) 2017-11-14 09:50:09 +01:00
James Cole
d413615943 Update tag routine for #993 2017-11-13 16:26:44 +01:00
James Cole
6c8f631582 Fix #992 2017-11-12 08:42:25 +01:00
James Cole
c013ce5bdb New translations firefly.php (German) 2017-11-11 17:40:58 +01:00
James Cole
f3a2a467d4 New translations firefly.php (Polish) 2017-11-10 18:31:45 +01:00
James Cole
8f6a5672fa New translations firefly.php (Portuguese, Brazilian) 2017-11-10 18:31:42 +01:00
James Cole
f6ebabe41d New translations firefly.php (Slovenian) 2017-11-10 18:31:39 +01:00
James Cole
b950b82e10 New translations firefly.php (Spanish) 2017-11-10 18:31:37 +01:00
James Cole
65b9d2cb00 New translations firefly.php (German) 2017-11-10 18:31:31 +01:00
James Cole
b79cbacce9 New translations firefly.php (French) 2017-11-10 18:31:25 +01:00
James Cole
fb20293e40 New translations firefly.php (Dutch) 2017-11-10 18:31:20 +01:00
James Cole
34c74ee3a3 New translations firefly.php (Indonesian) 2017-11-10 18:31:11 +01:00
James Cole
18f2b28b11 New translations firefly.php (Russian) 2017-11-10 18:31:00 +01:00
James Cole
f0e195f33b Basic reconcile view for #736 2017-11-10 18:25:11 +01:00
James Cole
19611982fa New translations form.php (German) 2017-11-10 18:10:15 +01:00
James Cole
112168b57c New translations firefly.php (Polish) 2017-11-10 15:02:05 +01:00
James Cole
e549009964 New translations firefly.php (Portuguese, Brazilian) 2017-11-10 15:02:01 +01:00
James Cole
60c261cb31 New translations firefly.php (Slovenian) 2017-11-10 15:01:57 +01:00
James Cole
628457695c New translations firefly.php (Spanish) 2017-11-10 15:01:54 +01:00
James Cole
a3befd9b1f New translations firefly.php (German) 2017-11-10 15:01:47 +01:00
James Cole
8bcfc624da New translations firefly.php (French) 2017-11-10 15:01:38 +01:00
James Cole
f88c311de7 New translations firefly.php (Dutch) 2017-11-10 15:01:32 +01:00
James Cole
34564de5e2 New translations firefly.php (Indonesian) 2017-11-10 15:01:23 +01:00
James Cole
88fd257d2c New translations firefly.php (Russian) 2017-11-10 15:01:12 +01:00
James Cole
b899628dbe New code for #736 2017-11-10 15:00:24 +01:00
James Cole
8f57222098 fix for #988 2017-11-08 16:04:55 +01:00
James Cole
d6f2557793 New translations demo.php (French) 2017-11-08 11:30:49 +01:00
James Cole
e15e4808c2 New translations firefly.php (French) 2017-11-08 11:30:47 +01:00
James Cole
328fc1d9df New translations form.php (French) 2017-11-08 11:20:42 +01:00
James Cole
19cf814e19 New translations firefly.php (Polish) 2017-11-08 09:51:18 +01:00
James Cole
ce45076063 New translations firefly.php (Portuguese, Brazilian) 2017-11-08 09:51:13 +01:00
James Cole
52544fc20c New translations firefly.php (Slovenian) 2017-11-08 09:51:10 +01:00
James Cole
8e64b22c45 New translations firefly.php (Spanish) 2017-11-08 09:51:07 +01:00
James Cole
ed27918c98 New translations firefly.php (German) 2017-11-08 09:50:59 +01:00
James Cole
2470a38b32 New translations firefly.php (French) 2017-11-08 09:50:48 +01:00
James Cole
4c6ec557e9 New translations firefly.php (Dutch) 2017-11-08 09:50:41 +01:00
James Cole
ac62acef1a New translations firefly.php (Indonesian) 2017-11-08 09:50:30 +01:00
James Cole
35ef6e10ee New translations firefly.php (Russian) 2017-11-08 09:50:18 +01:00
James Cole
920c7a93bc Better cache for reconcile [skip ci] 2017-11-08 09:47:38 +01:00
James Cole
78009c1cc0 New strings for reconciled transactions. #736 2017-11-08 09:40:38 +01:00
James Cole
d65109885a New translations bank.php (Indonesian) 2017-11-08 09:31:20 +01:00
James Cole
e986a1fc05 New translations bank.php (Dutch) 2017-11-08 09:30:40 +01:00
James Cole
ce331ffaff New translations bank.php (French) 2017-11-08 09:30:39 +01:00
James Cole
eb5f8067c0 New translations bank.php (German) 2017-11-08 09:30:38 +01:00
James Cole
421ce0e8f7 New translations bank.php (Polish) 2017-11-08 09:30:37 +01:00
James Cole
043e72f96c New translations bank.php (Portuguese, Brazilian) 2017-11-08 09:30:36 +01:00
James Cole
57b6cab774 New translations bank.php (Russian) 2017-11-08 09:30:35 +01:00
James Cole
2448c97d4b New translations bank.php (Slovenian) 2017-11-08 09:30:34 +01:00
James Cole
3f7f63c308 New translations bank.php (Spanish) 2017-11-08 09:30:27 +01:00
James Cole
8707bc6612 Code cleanup. 2017-11-08 09:05:10 +01:00
James Cole
b6514c7e54 Fix #987 2017-11-08 08:28:04 +01:00
James Cole
428bdfbe6f Update debug information. 2017-11-08 08:23:58 +01:00
James Cole
b5e76c77d2 New translations firefly.php (Dutch) 2017-11-08 08:20:22 +01:00
James Cole
19c9fc794d Update env files. [skip ci] 2017-11-08 07:54:42 +01:00
James Cole
1dfdf48471 Fix for #987 2017-11-08 07:19:21 +01:00
James Cole
15e0010162 New translations firefly.php (German) 2017-11-07 07:50:09 +01:00
James Cole
a2889ea4c4 Reverse null. 2017-11-06 20:17:54 +01:00
James Cole
ad18e04ad6 Expand error reporting for bad databases. 2017-11-06 20:17:39 +01:00
James Cole
347be7f4fd Update sandstorm files. 2017-11-06 19:24:32 +01:00
James Cole
6c9616bbc4 Fix #985 2017-11-05 21:16:20 +01:00
James Cole
8145c23905 Fix list view. 2017-11-05 21:12:49 +01:00
James Cole
ca358fd869 New translations firefly.php (Polish) 2017-11-05 20:20:12 +01:00
James Cole
42f8ac50f5 New translations firefly.php (Polish) 2017-11-05 19:51:02 +01:00
James Cole
5ee3828acf New translations firefly.php (Portuguese, Brazilian) 2017-11-05 19:51:00 +01:00
James Cole
aad2d50091 New translations firefly.php (Slovenian) 2017-11-05 19:50:57 +01:00
James Cole
54ae2af0f1 New translations firefly.php (Spanish) 2017-11-05 19:50:55 +01:00
James Cole
e98a7b7196 New translations firefly.php (German) 2017-11-05 19:50:50 +01:00
James Cole
61b180759c New translations firefly.php (French) 2017-11-05 19:50:44 +01:00
James Cole
718356592c New translations firefly.php (Dutch) 2017-11-05 19:50:39 +01:00
James Cole
be18896f84 New translations firefly.php (Indonesian) 2017-11-05 19:50:29 +01:00
James Cole
6ffdc3a505 New translations firefly.php (Russian) 2017-11-05 19:50:20 +01:00
James Cole
d2ab03061f Various code cleanup. 2017-11-05 19:49:20 +01:00
James Cole
33d89d52c2 Code that allows transaction reconciliation. #736 2017-11-05 19:48:43 +01:00
James Cole
a3bd4ccfbf New translations firefly.php (Polish) 2017-11-04 07:20:56 +01:00
James Cole
5a8f8d2448 New translations firefly.php (Portuguese, Brazilian) 2017-11-04 07:20:53 +01:00
James Cole
3320b69cd8 New translations firefly.php (Slovenian) 2017-11-04 07:20:51 +01:00
James Cole
bc19919bed New translations firefly.php (Spanish) 2017-11-04 07:20:48 +01:00
James Cole
3d318abf1b New translations firefly.php (German) 2017-11-04 07:20:43 +01:00
James Cole
31b5899fb0 New translations firefly.php (French) 2017-11-04 07:20:38 +01:00
James Cole
e75ada49b7 New translations firefly.php (Dutch) 2017-11-04 07:20:33 +01:00
James Cole
71eeffdbf4 New translations firefly.php (Indonesian) 2017-11-04 07:20:24 +01:00
James Cole
a71e9e578d New translations firefly.php (Russian) 2017-11-04 07:20:13 +01:00
James Cole
bb46d034cd Various cleanup in transaction and journal display code. 2017-11-04 07:10:21 +01:00
James Cole
b4dc70244a Fix for #980 2017-11-04 06:23:52 +01:00
James Cole
8cb42d1114 New translations firefly.php (German) 2017-11-03 21:32:29 +01:00
James Cole
7db233d0e8 New translations demo.php (Dutch) 2017-11-03 20:20:20 +01:00
James Cole
25268fabb3 New translations firefly.php (Dutch) 2017-11-03 20:20:18 +01:00
James Cole
c6434991d3 New translations firefly.php (Polish) 2017-11-03 16:32:48 +01:00
James Cole
ac801c8b86 Update models. 2017-11-03 16:04:17 +01:00
James Cole
6a1265564b New translations firefly.php (Portuguese, Brazilian) 2017-11-03 15:52:21 +01:00
James Cole
75680aa3f7 New translations firefly.php (Slovenian) 2017-11-03 15:52:16 +01:00
James Cole
c2adfc23d3 New translations firefly.php (Spanish) 2017-11-03 15:52:11 +01:00
James Cole
00bc8cc81e New translations firefly.php (Polish) 2017-11-03 15:51:59 +01:00
James Cole
41ca02b2dd New translations firefly.php (German) 2017-11-03 15:51:49 +01:00
James Cole
29f3c40cbe New translations firefly.php (Dutch) 2017-11-03 15:51:44 +01:00
James Cole
65a3b2d74c New translations firefly.php (French) 2017-11-03 15:51:37 +01:00
James Cole
7ac041f036 New translations firefly.php (Indonesian) 2017-11-03 15:51:22 +01:00
James Cole
0bc7e244ec New translations firefly.php (Russian) 2017-11-03 15:50:57 +01:00
James Cole
a664451913 Merge pull request #979 from pkoziol/develop
Translate hard-coded strings
2017-11-03 15:35:28 +01:00
koziolek
62998f8d69 Translate hard-coded strings. 2017-11-03 14:53:00 +01:00
James Cole
b907f998d9 New translations demo.php (German) 2017-11-03 14:21:03 +01:00
James Cole
c74e65b391 New translations firefly.php (German) 2017-11-03 14:21:02 +01:00
James Cole
5dc9e16553 New translations firefly.php (Polish) 2017-11-03 14:10:35 +01:00
James Cole
80fd0fa419 New translations firefly.php (Polish) 2017-11-03 13:50:51 +01:00
James Cole
0c206c9a0f New translations firefly.php (Portuguese, Brazilian) 2017-11-03 13:50:47 +01:00
James Cole
10a2b2075e New translations firefly.php (Slovenian) 2017-11-03 13:50:42 +01:00
James Cole
69e3158144 New translations firefly.php (Spanish) 2017-11-03 13:50:38 +01:00
James Cole
5019946c65 New translations firefly.php (German) 2017-11-03 13:50:24 +01:00
James Cole
ea7bd15c3d New translations firefly.php (French) 2017-11-03 13:50:11 +01:00
James Cole
bf884175a7 New translations firefly.php (Dutch) 2017-11-03 13:49:59 +01:00
James Cole
fc9479e517 New translations firefly.php (Indonesian) 2017-11-03 13:49:45 +01:00
James Cole
b333af769e New translations firefly.php (Russian) 2017-11-03 13:49:30 +01:00
James Cole
ca5249d839 Fix #976 2017-11-03 13:48:52 +01:00
James Cole
ba57852513 New translations firefly.php (Polish) 2017-11-03 13:42:26 +01:00
James Cole
d6f93d3c13 New translations firefly.php (Portuguese, Brazilian) 2017-11-03 13:42:22 +01:00
James Cole
1fcad87de6 New translations firefly.php (Slovenian) 2017-11-03 13:42:17 +01:00
James Cole
359d366e6e New translations firefly.php (Spanish) 2017-11-03 13:42:13 +01:00
James Cole
cbc3326d4b New translations firefly.php (German) 2017-11-03 13:42:05 +01:00
James Cole
1a147ecdd5 New translations firefly.php (French) 2017-11-03 13:41:57 +01:00
James Cole
df9bb13df1 New translations firefly.php (Indonesian) 2017-11-03 13:41:37 +01:00
James Cole
c2ee12466c New translations demo.php (Indonesian) 2017-11-03 13:41:32 +01:00
James Cole
6d9a562d0f New translations demo.php (Dutch) 2017-11-03 13:41:25 +01:00
James Cole
9da16f2b78 New translations demo.php (French) 2017-11-03 13:41:24 +01:00
James Cole
8bcebee767 New translations demo.php (German) 2017-11-03 13:41:22 +01:00
James Cole
c8240ea54f New translations demo.php (Russian) 2017-11-03 13:41:21 +01:00
James Cole
5ac5206253 New translations demo.php (Polish) 2017-11-03 13:41:20 +01:00
James Cole
a73adaaba9 New translations demo.php (Slovenian) 2017-11-03 13:41:19 +01:00
James Cole
7031cbcd29 New translations demo.php (Spanish) 2017-11-03 13:41:18 +01:00
James Cole
2dad5fb066 New translations firefly.php (Russian) 2017-11-03 13:41:16 +01:00
James Cole
db0b1d1fa2 New translations demo.php (Portuguese, Brazilian) 2017-11-03 13:41:11 +01:00
James Cole
810d2a3d87 Fix language issues reported by Findus23 2017-11-03 13:40:11 +01:00
James Cole
75f38d20df New translations firefly.php (German) 2017-11-03 13:00:16 +01:00
James Cole
214f651831 New translations validation.php (German) 2017-11-03 12:50:17 +01:00
James Cole
bc1982fb7b New translations firefly.php (Polish) 2017-11-03 12:50:15 +01:00
James Cole
99c9b719e7 New translations firefly.php (German) 2017-11-03 12:50:12 +01:00
James Cole
15eeba4381 New translations demo.php (German) 2017-11-03 12:30:13 +01:00
James Cole
77a6e81f1f New translations firefly.php (German) 2017-11-03 12:30:12 +01:00
James Cole
129ba5ed30 New translations firefly.php (German) 2017-11-03 12:10:14 +01:00
James Cole
8d9aa9392e New translations intro.php (German) 2017-11-03 12:00:23 +01:00
James Cole
566aa66c8b New translations form.php (German) 2017-11-03 12:00:21 +01:00
James Cole
d3bec76ebd New translations firefly.php (German) 2017-11-03 12:00:14 +01:00
James Cole
4c6b4074f5 New translations intro.php (German) 2017-11-03 11:50:12 +01:00
James Cole
787470d629 New translations form.php (German) 2017-11-03 11:50:11 +01:00
James Cole
607f960b6b New translations firefly.php (German) 2017-11-03 11:50:10 +01:00
James Cole
a636e88f25 New translations intro.php (German) 2017-11-03 11:40:14 +01:00
James Cole
d3b5300fc9 New translations validation.php (German) 2017-11-03 11:40:12 +01:00
James Cole
7ba2f3243d New translations form.php (German) 2017-11-03 11:31:57 +01:00
James Cole
8c75f9af14 New translations firefly.php (German) 2017-11-03 11:31:55 +01:00
James Cole
1867294704 New translations form.php (German) 2017-11-03 11:20:30 +01:00
James Cole
2d7a83ca34 New translations firefly.php (German) 2017-11-03 11:20:29 +01:00
James Cole
39679f89cd New translations firefly.php (German) 2017-11-03 11:11:10 +01:00
James Cole
8c707f8918 New translations firefly.php (German) 2017-11-03 11:00:15 +01:00
James Cole
dac4f23d51 Expand debug page. 2017-11-03 10:28:45 +01:00
1896 changed files with 222545 additions and 58972 deletions

3314
.deploy/docker/cacert.pem Normal file

File diff suppressed because it is too large Load Diff

View File

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

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

29
.deploy/docker/entrypoint.sh Executable file
View File

@@ -0,0 +1,29 @@
#!/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

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

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

26
.deploy/docker/vhost.conf Normal file
View File

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

@@ -0,0 +1,82 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-export-claim
labels:
app: firefly-local
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-upload-claim
labels:
app: firefly-local
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: firefly-local
namespace: firefly
labels:
app: firefly-local
spec:
selector:
matchLabels:
app: firefly-local
template:
metadata:
labels:
app: firefly-local
spec:
containers:
- image: firefly-local
name: firefly-local
env:
- name: FF_APP_ENV
value: "local"
- name: FF_APP_KEY
value: "S0m3R@nd0mString0f32Ch@rsEx@ct1y"
- name: FF_DB_HOST
value: "172.17.0.9"
- name: FF_DB_NAME
value: "firefly_db"
- name: FF_DB_USER
value: "firefly_db"
- name: FF_DB_PASSWORD
value: "password"
volumeMounts:
- mountPath: "/var/www/firefly-iii/storage/export"
name: mysql-persistent-export
- mountPath: "/var/www/firefly-iii/storage/upload"
name: mysql-persistent-upload
imagePullPolicy: IfNotPresent
volumes:
- name: mysql-persistent-export
persistentVolumeClaim:
claimName: mysql-pv-export-claim
- name: mysql-persistent-upload
persistentVolumeClaim:
claimName: mysql-pv-upload-claim
---
apiVersion: v1
kind: Service
metadata:
name: firefly-local
spec:
ports:
- port: 80
type: NodePort
selector:
app: firefly-local

View File

@@ -0,0 +1,49 @@
apiVersion: v1
kind: Secret
metadata:
name: sql-pass
type: Opaque
data:
password: cGFzc3dvcmQ=
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql
namespace: firefly
labels:
app: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql
imagePullPolicy: IfNotPresent
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: sql-pass
key: password
ports:
- containerPort: 3306
name: mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
type: NodePort
selector:
app: mysql

View File

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

View File

@@ -1,57 +1,168 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=${FF_APP_ENV}
APP_DEBUG=false
APP_NAME=FireflyIII
APP_KEY=${FF_APP_KEY}
APP_LOG=daily
APP_LOG_LEVEL=warning
APP_URL=http://localhost
DB_CONNECTION=mysql
# 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=3306
DB_PORT=${FF_DB_PORT}
DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER}
DB_PASSWORD=${FF_DB_PASSWORD}
DB_PASSWORD="${FF_DB_PASSWORD}"
BROADCAST_DRIVER=log
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
# 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_HOST}
SFTP_PORT=${SFTP_PORT}
SFTP_UPLOAD_PATH=${SFTP_UPLOAD_PATH}
SFTP_EXPORT_PATH=${SFTP_EXPORT_PATH}
# SFTP uses either the username/password combination or the private key to authenticate.
SFTP_USERNAME=${SFTP_USERNAME}
SFTP_PASSWORD="${SFTP_PASSWORD}"
SFTP_PRIV_KEY=${SFTP_PRIV_KEY}
# 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
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=${SEND_REPORT_JOURNALS}
# 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
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=${LOGIN_PROVIDER}
# LDAP connection configuration
ADLDAP_CONNECTION_SCHEME=${ADLDAP_CONNECTION_SCHEME}
ADLDAP_AUTO_CONNECT=${ADLDAP_AUTO_CONNECT}
# LDAP connection settings
ADLDAP_CONTROLLERS=${ADLDAP_CONTROLLERS}
ADLDAP_PORT=${ADLDAP_PORT}
ADLDAP_TIMEOUT=${ADLDAP_TIMEOUT}
ADLDAP_BASEDN="${ADLDAP_BASEDN}"
ADLDAP_FOLLOW_REFFERALS=${ADLDAP_FOLLOW_REFFERALS}
ADLDAP_USE_SSL=${ADLDAP_USE_SSL}
ADLDAP_USE_TLS=${ADLDAP_USE_TLS}
ADLDAP_ADMIN_USERNAME=${ADLDAP_ADMIN_USERNAME}
ADLDAP_ADMIN_PASSWORD="${ADLDAP_ADMIN_PASSWORD}"
ADLDAP_ACCOUNT_PREFIX="${ADLDAP_ACCOUNT_PREFIX}"
ADLDAP_ACCOUNT_SUFFIX="${ADLDAP_ACCOUNT_SUFFIX}"
ADLDAP_ADMIN_ACCOUNT_PREFIX="${ADLDAP_ADMIN_ACCOUNT_PREFIX}"
ADLDAP_ADMIN_ACCOUNT_SUFFIX="${ADLDAP_ADMIN_ACCOUNT_SUFFIX}"
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=${ADLDAP_PASSWORD_SYNC}
ADLDAP_LOGIN_FALLBACK=${ADLDAP_LOGIN_FALLBACK}
ADLDAP_DISCOVER_FIELD=${ADLDAP_DISCOVER_FIELD}
ADLDAP_AUTH_FIELD=${ADLDAP_AUTH_FIELD}
# Will allow SSO if your server provides an AUTH_USER field.
WINDOWS_SSO_DISCOVER=${WINDOWS_SSO_DISCOVER}
WINDOWS_SSO_KEY=${WINDOWS_SSO_KEY}
# field to sync as local username.
ADLDAP_SYNC_FIELD=${ADLDAP_SYNC_FIELD}
# 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
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_FROM=changeme@example.com
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
SHOW_INCOMPLETE_TRANSLATIONS=false
CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
EXCHANGE_RATE_SERVICE=fixerio
MAPBOX_API_KEY=
ANALYTICS_ID=
SITE_OWNER=mail@example.com
USE_ENCRYPTION=true
PUSHER_KEY=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=true
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=false

View File

@@ -1,12 +1,43 @@
# 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
APP_NAME=FireflyIII
# This should be your email address
SITE_OWNER=mail@example.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=SomeRandomStringOf32CharsExactly
APP_LOG=daily
APP_LOG_LEVEL=warning
# 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=daily
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=notice
# 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
@@ -14,20 +45,31 @@ DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
BROADCAST_DRIVER=log
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
# 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=
COOKIE_SECURE=false
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
# 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
@@ -35,24 +77,93 @@ 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
SHOW_INCOMPLETE_TRANSLATIONS=false
CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
EXCHANGE_RATE_SERVICE=fixerio
# 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
# 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=
SITE_OWNER=mail@example.com
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" 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=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_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
# 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=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=false

169
.env.heroku Normal file
View File

@@ -0,0 +1,169 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=heroku
# Set to true if you want to see debug information in error screens.
APP_DEBUG=false
# This should be your email address
SITE_OWNER=heroku@example.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=UTC
# 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=pgsql
# 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=
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
# 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
# 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
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" 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=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_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
# 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=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=true
BUNQ_USE_SANDBOX=false

View File

@@ -1,11 +1,43 @@
# 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
APP_NAME=FireflyIII
# This should be your email address
SITE_OWNER=sandstorm@example.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=SomeRandomStringOf32CharsExactly
APP_LOG=syslog
APP_LOG_LEVEL=info
# 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
@@ -13,20 +45,31 @@ DB_DATABASE=firefly
DB_USERNAME=firefly
DB_PASSWORD=firefly
BROADCAST_DRIVER=log
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
# 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=
COOKIE_SECURE=false
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
# 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
@@ -34,23 +77,93 @@ 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
SHOW_INCOMPLETE_TRANSLATIONS=false
CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
EXCHANGE_RATE_SERVICE=fixerio
# 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
# 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=
SITE_OWNER=mail@example.com
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" 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
# or 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=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_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
# 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=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=true
IS_HEROKU=false
BUNQ_USE_SANDBOX=false

View File

@@ -1,31 +1,75 @@
# 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
APP_NAME=FireflyIII
# This should be your email address
SITE_OWNER=thegrumpydictator+testing@gmail.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=TestTestTestTestTestTestTestTest
APP_LOG=daily
APP_LOG_LEVEL=debug
# 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
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=homestead
DB_PASSWORD=
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
TRUSTED_PROXIES=
BROADCAST_DRIVER=log
# 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=info
# 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
QUEUE_DRIVER=sync
# 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=
COOKIE_SECURE=false
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
# 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
@@ -33,23 +77,93 @@ 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
SHOW_INCOMPLETE_TRANSLATIONS=false
SEND_ERROR_MESSAGE=false
CACHE_PREFIX=firefly
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
EXCHANGE_RATE_SERVICE=fixerio
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
GOOGLE_MAPS_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=
SITE_OWNER=mail@example.com
USE_ENCRYPTION=true
# 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
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" 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
# or 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=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_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
# 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_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

View File

@@ -1,9 +0,0 @@
I am running Firefly III version x.x.x
#### Description of my issue:
#### Steps to reproduce
(please include if this problem also exists on the demo site)
#### Other important details (log files, system info):

25
.github/ISSUE_TEMPLATE/Bug_report.md vendored Normal file
View File

@@ -0,0 +1,25 @@
---
name: Bug report
about: Create a report to help Firefly III improve
---
**Bug description**
I am running Firefly III version x.x.x
(please give a clear and concise description of what the bug is)
**Steps to reproduce**
What do you need to do to trigger this bug?
**Expected behavior**
What do you expect to see after those steps?
**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).
**Bonus points**
Earn bonus points by:
- Post a stacktrace from your log files
- Add a screenshot

27
.github/ISSUE_TEMPLATE/Custom.md vendored Normal file
View File

@@ -0,0 +1,27 @@
---
name: I have a question or a problem
about: Ask away!
---
I am running Firefly III version x.x.x
**Description**
**Steps to reproduce**
(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).
**Bonus points**
Earn bonus points by:
- Add a screenshot
- Replicate the problem on the demo site https://demo.firefly-iii.org/

View File

@@ -0,0 +1,21 @@
---
name: Feature request
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.
**Solution**
Describe what your feature would add to Firefly III.
**What are alternatives?**
Please describe what alternatives currently exist.
**Additional context**
Add any other context or screenshots about the feature request here.

11
.github/SUPPORT.md vendored
View File

@@ -1,11 +0,0 @@
# Welcome to Firefly III on Github!
:+1::tada: Thank you for taking the time to contribute something to Firefly III!
## Bugs
First of all: thank you for reporting a bug instead of ditching the tool altogether. If you find a bug, please take the time and see if the [demo site](https://firefly-iii.nder.be/) is also suffering from this bug. Include as many log files and details as you think are necessary. Bugs have a lot of priority!
## Installation problems
Please take the time to read the [installation guide FAQ](https://firefly-iii.github.io/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.

View File

@@ -4,7 +4,7 @@
## Feature requests
I am always interested in expanding Firefly III's many features. If you are requesting a new feature, please check out the list of [often requested features](https://firefly-iii.github.io/requested-features/).
I am always interested in expanding Firefly III's many features. Just open a ticket or [drop me a line](mailto:thegrumpydictator@gmail.com).
## Pull requests

56
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,56 @@
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 14
# 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.
daysUntilClose: 7
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
# - "[Status] Maybe Later"
exemptLabels:
- enhancement
- feature
- bug
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: false
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: false
# Label to use when marking as stale
staleLabel: stale
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when removing the stale label.
# unmarkComment: >
# Your comment here.
# Comment to post when closing a stale Issue or Pull Request.
# closeComment: >
# Your comment here.
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Limit to only `issues` or `pulls`
# only: issues
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
# pulls:
# daysUntilStale: 30
# markComment: >
# This pull request has been automatically marked as stale because it has not had
# recent activity. It will be closed if no further activity occurs. Thank you
# for your contributions.
# issues:
# exemptLabels:
# - confirmed

11
.github/support.md vendored Normal file
View File

@@ -0,0 +1,11 @@
# Welcome to Firefly III on Github!
:+1::tada: Thank you for taking the time to contribute something to Firefly III!
## Bugs
First of all: thank you for reporting a bug instead of ditching the tool altogether. If you find a bug, please take the time and see if the [demo site](https://demo.firefly-iii.org/) is also suffering from this bug. Include as many log files and details as you think are necessary. Bugs have a lot of priority!
## 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.

14
.htaccess Normal file
View File

@@ -0,0 +1,14 @@
# Optional: force HTTPS:
# <IfModule mod_rewrite.c>
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# </IfModule>
# To hide directory listing
Options All -Indexes
# To prevent access to .env and other files
<Files .*>
Deny from all
</Files>

9
.locales Normal file
View File

@@ -0,0 +1,9 @@
en_US
de_DE
fr_FR
it_IT
nl_NL
pl_PL
pt_BR
ru_RU
tr_TR

View File

@@ -9,9 +9,16 @@ VM_NAME = File.basename(File.dirname(File.dirname(__FILE__))) + "_sandstorm_#{Ti
# 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 = "sandstorm/debian-jessie64"
config.vm.box = "debian/contrib-jessie64"
if Vagrant.has_plugin?("vagrant-vbguest") then
# vagrant-vbguest is a Vagrant plugin that upgrades

View File

@@ -3,10 +3,9 @@
# 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

View File

@@ -1,3 +1,408 @@
$ 4.7.8
- [Issue 1005](https://github.com/firefly-iii/firefly-iii/issues/1005) You can now configure Firefly III to use LDAP.
- [Issue 1071](https://github.com/firefly-iii/firefly-iii/issues/1071) You can execute transaction rules using the command line (so you can cronjob it)
- [Issue 1108](https://github.com/firefly-iii/firefly-iii/issues/1108) You can now reorder budgets.
- [Issue 1159](https://github.com/firefly-iii/firefly-iii/issues/1159) The ability to import transactions from FinTS-enabled banks.
- [Issue 1727](https://github.com/firefly-iii/firefly-iii/issues/1727) You can now use SFTP as storage for uploads and exports.
- [Issue 1733](https://github.com/firefly-iii/firefly-iii/issues/1733) You can configure Firefly III not to send emails with transaction information in them.
- [Issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040) Fixed various things that would not scale properly in the past.
- [Issue 1771](https://github.com/firefly-iii/firefly-iii/issues/1771) A link to the transaction that fits the bill.
- [Issue 1800](https://github.com/firefly-iii/firefly-iii/issues/1800) Icon updated to match others.
- MySQL database connection now forces the InnoDB to be used.
- [Issue 1583](https://github.com/firefly-iii/firefly-iii/issues/1583) Some times recurring transactions would not fire.
- [Issue 1607](https://github.com/firefly-iii/firefly-iii/issues/1607) Problems with the bunq API, finally solved?! (I feel like a clickbait YouTube video now)
- [Issue 1698](https://github.com/firefly-iii/firefly-iii/issues/1698) Certificate problems in the Docker container
- [Issue 1751](https://github.com/firefly-iii/firefly-iii/issues/1751) Bug in autocomplete
- [Issue 1760](https://github.com/firefly-iii/firefly-iii/issues/1760) Tag report bad math
- [Issue 1765](https://github.com/firefly-iii/firefly-iii/issues/1765) API inconsistencies for piggy banks.
- [Issue 1774](https://github.com/firefly-iii/firefly-iii/issues/1774) Integer exception in SQLite databases
- [Issue 1775](https://github.com/firefly-iii/firefly-iii/issues/1775) Heroku now supports all locales
- [Issue 1778](https://github.com/firefly-iii/firefly-iii/issues/1778) More autocomplete problems fixed
- [Issue 1747](https://github.com/firefly-iii/firefly-iii/issues/1747) Rules now stop at the right moment.
- [Issue 1781](https://github.com/firefly-iii/firefly-iii/issues/1781) Problems when creating new rules.
- [Issue 1784](https://github.com/firefly-iii/firefly-iii/issues/1784) Can now create a liability with an empty balance.
- [Issue 1785](https://github.com/firefly-iii/firefly-iii/issues/1785) Redirect error
- [Issue 1790](https://github.com/firefly-iii/firefly-iii/issues/1790) Show attachments for bills.
- [Issue 1792](https://github.com/firefly-iii/firefly-iii/issues/1792) Mention excluded accounts.
- [Issue 1798](https://github.com/firefly-iii/firefly-iii/issues/1798) Could not recreate deleted piggy banks
- [Issue 1805](https://github.com/firefly-iii/firefly-iii/issues/1805) Fixes when handling foreign currencies
- [Issue 1807](https://github.com/firefly-iii/firefly-iii/issues/1807) Also decrypt deleted records.
- [Issue 1812](https://github.com/firefly-iii/firefly-iii/issues/1812) Fix in transactions API
- [Issue 1815](https://github.com/firefly-iii/firefly-iii/issues/1815) Opening balance account name can now be translated.
- [Issue 1830](https://github.com/firefly-iii/firefly-iii/issues/1830) Multi-user in a single browser could leak autocomplete data.
# 4.7.7
- [Issue 954](https://github.com/firefly-iii/firefly-iii/issues/954) Some additional view chart ranges
- [Issue 1710](https://github.com/firefly-iii/firefly-iii/issues/1710) Added a new currency ([hamuz](https://github.com/hamuz))
- Transactions will now store (in the database) how they were created.
- [Issue 907](https://github.com/firefly-iii/firefly-iii/issues/907) Better and more options on the transaction list.
- [Issue 1450](https://github.com/firefly-iii/firefly-iii/issues/1450) Add a rule to change the type of a transaction automagically
- [Issue 1701](https://github.com/firefly-iii/firefly-iii/issues/1701) Fix reference to PHP executable ([hertzg](https://github.com/hertzg))
- Budget limits have currency information, for future expansion.
- Some charts and pages can handle multiple currencies better.
- New GA code for those who use it.
- The credit card liability type has been removed.
- [Issue 896](https://github.com/firefly-iii/firefly-iii/issues/896) Better redirection when coming from deleted objects.
- [Issue 1519](https://github.com/firefly-iii/firefly-iii/issues/1519) Fix autocomplete tags
- [Issue 1607](https://github.com/firefly-iii/firefly-iii/issues/1607) Some fixes for the bunq api calls
- [Issue 1650](https://github.com/firefly-iii/firefly-iii/issues/1650) Add a negated amount column for CSV imports ([hamuz](https://github.com/hamuz))
- [Issue 1658](https://github.com/firefly-iii/firefly-iii/issues/1658) Make font heavy again.
- [Issue 1660](https://github.com/firefly-iii/firefly-iii/issues/1660) Add a negated amount column for CSV imports ([hamuz](https://github.com/hamuz))
- [Issue 1667](https://github.com/firefly-iii/firefly-iii/issues/1667) Fix pie charts
- [Issue 1668](https://github.com/firefly-iii/firefly-iii/issues/1668) YNAB iso_code fix
- [Issue 1670](https://github.com/firefly-iii/firefly-iii/issues/1670) Fix piggy bank API error
- [Issue 1671](https://github.com/firefly-iii/firefly-iii/issues/1671) More options for liability accounts.
- [Issue 1673](https://github.com/firefly-iii/firefly-iii/issues/1673) Fix reconciliation issues.
- [Issue 1675](https://github.com/firefly-iii/firefly-iii/issues/1675) Wrong sum in tag report.
- [Issue 1679](https://github.com/firefly-iii/firefly-iii/issues/1679) Change type of a transaction wouldn't trigger rules.
- [Issue 1682](https://github.com/firefly-iii/firefly-iii/issues/1682) Add liability accounts to transaction conversion
- [Issue 1683](https://github.com/firefly-iii/firefly-iii/issues/1683) See matching transaction showed transfers twice.
- [Issue 1685](https://github.com/firefly-iii/firefly-iii/issues/1685) fix autocomplete for rules
- [Issue 1690](https://github.com/firefly-iii/firefly-iii/issues/1690) Missing highlighted button in intro popup
- [Issue 1691](https://github.com/firefly-iii/firefly-iii/issues/1691) No mention of liabilities in demo text
- [Issue 1695](https://github.com/firefly-iii/firefly-iii/issues/1695) Small fixes in bills pages.
- [Issue 1708](https://github.com/firefly-iii/firefly-iii/issues/1708) Fix by [mathieupost](https://github.com/mathieupost) for bunq
- [Issue 1709](https://github.com/firefly-iii/firefly-iii/issues/1709) Fix oauth buttons
- [Issue 1712](https://github.com/firefly-iii/firefly-iii/issues/1712) Double slash fix by [hamuz](https://github.com/hamuz)
- [Issue 1719](https://github.com/firefly-iii/firefly-iii/issues/1719) Add missing accounts to API
- [Issue 1720](https://github.com/firefly-iii/firefly-iii/issues/1720) Fix validation for transaction type.
- [Issue 1723](https://github.com/firefly-iii/firefly-iii/issues/1723) API broken for currency exchange rates.
- [Issue 1728](https://github.com/firefly-iii/firefly-iii/issues/1728) Fix problem with transaction factory.
- [Issue 1729](https://github.com/firefly-iii/firefly-iii/issues/1729) Fix bulk transaction editor
- [Issue 1731](https://github.com/firefly-iii/firefly-iii/issues/1731) API failure for budget limits.
- Secure headers now allow Mapbox and the 2FA QR code.
# 4.7.6.2
- Docker file builds again.
- Fix CSS of OAuth2 authorization view.
# 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 income 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.
- The rule "tester" will now also take the "strict"-checkbox into account.
# 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)

View File

@@ -9,6 +9,10 @@ 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

View File

@@ -1,6 +1,7 @@
#!/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
@@ -30,22 +31,21 @@ 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 &
/usr/sbin/php-fpm7.2 --nodaemonize --fpm-config /etc/php/7.2/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"
while [ ! -e /var/run/php7.2-fpm.sock ] ; do
echo "waiting for php7.2-fpm to be available at /var/run/php7.2-fpm.sock"
sleep .5
done
@@ -58,5 +58,9 @@ 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;"

File diff suppressed because it is too large Load Diff

View File

@@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
manifest = (
appTitle = (defaultText = "Firefly III"),
appVersion = 2,
appMarketingVersion = (defaultText = "4.6.10"),
appVersion = 18,
appMarketingVersion = (defaultText = "4.7.8"),
actions = [
# Define your "new document" handlers here.
@@ -41,7 +41,7 @@ const pkgdef :Spk.PackageDefinition = (
market = (png = (dpi1x = embed "app-graphics/firefly-iii-150.png"))
),
website = "https://firefly-iii.github.io/",
website = "https://firefly-iii.org/",
codeUrl = "https://github.com/firefly-iii/firefly-iii",
license = (openSource = gpl3),
# The license this package is distributed under. See
@@ -65,9 +65,9 @@ const pkgdef :Spk.PackageDefinition = (
# 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 = 1291, height = 800, png = embed "screenshots/screenshot-1.png"),
(width = 1291, height = 800, png = embed "screenshots/screenshot-2.png"),
(width = 1291, height = 800, png = embed "screenshots/screenshot-3.png"),
(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"),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -53,10 +53,11 @@ http {
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php7.1-fpm.sock;
fastcgi_pass unix:/var/run/php7.2-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;

View File

@@ -2,6 +2,7 @@
# 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
@@ -12,10 +13,15 @@ apt-get update
apt-get install -y python-software-properties software-properties-common
# install all languages
sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.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
@@ -26,43 +32,43 @@ 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 apt-transport-https lsb-release ca-certificates
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
apt-get install -y nginx php7.2-fpm php7.2-mysql php7.2-gd php7.2-cli php7.2-curl git php7.2-dev php7.2-zip php7.2-intl php7.2-dom php7.2-mbstring php7.2-bcmath mysql-server
service nginx stop
service php7.1-fpm stop
service php7.2-fpm stop
service mysql stop
systemctl disable nginx
systemctl disable php7.1-fpm
systemctl disable php7.2-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
sed -i 's/display_errors = Off/display_errors = On/g' /etc/php/7.2/fpm/php.ini
# patch /etc/php/7.1/fpm/pool.d/www.conf to not change uid/gid to www-data
# patch /etc/php/7.2/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
/etc/php/7.2/fpm/pool.d/www.conf
# patch /etc/php/7.2/fpm/php-fpm.conf to not have a pidfile
sed --in-place='' \
--expression='s/^pid =/;pid =/' \
/etc/php/7.1/fpm/php-fpm.conf
/etc/php/7.2/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
--expression='s/^listen = \/run\/php\/php7.2-fpm.sock/listen = \/var\/run\/php7.2-fpm.sock/' \
/etc/php/7.2/fpm/pool.d/www.conf
# patch /etc/php/7.1/fpm/pool.d/www.conf to no clear environment variables
# patch /etc/php/7.2/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
/etc/php/7.2/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='' \

View File

@@ -1,51 +1,58 @@
# .scrutinizer.yml
tools:
external_code_coverage: false
filter:
paths:
---
build:
nodes:
analysis:
project_setup:
override: true
tests:
override:
- php-scrutinizer-run
checks:
javascript: true
php:
align_assignments: true
avoid_fixme_comments: true
avoid_multiple_statements_on_same_line: true
avoid_perl_style_comments: true
avoid_todo_comments: true
duplication: false
encourage_single_quotes: true
newline_at_end_of_file: true
no_goto: true
no_long_variable_names:
maximum: "20"
no_short_method_names:
minimum: "3"
no_short_variable_names:
minimum: "3"
optional_parameters_at_the_end: true
parameter_doc_comments: true
remove_extra_empty_lines: true
return_doc_comment_if_not_inferrable: true
return_doc_comments: true
uppercase_constants: true
use_self_instead_of_fqcn: true
coding_style:
php:
spaces:
around_operators:
concatenation: true
other:
after_type_cast: false
filter:
excluded_paths:
- database/migrations/*
- bootstrap/*
- config/*
- docker/*
- public/js/lib/*
- public/lib/adminlte/js/*
- public/lib/bootstrap/js/*
- resources/*
- routes/*
- storage/*
paths:
- app/*
- public/js/ff/*
excluded_paths:
- "database/migrations/*"
- "bootstrap/*"
- "config/*"
- "docker/*"
- "public/js/lib/*"
- "public/lib/adminlte/js/*"
- "public/lib/bootstrap/js/*"
- "resources/*"
- "routes/*"
- "storage/*"
checks:
php:
use_self_instead_of_fqcn: true
uppercase_constants: true
return_doc_comments: true
return_doc_comment_if_not_inferrable: true
remove_extra_empty_lines: true
parameter_doc_comments: true
optional_parameters_at_the_end: true
no_short_variable_names:
minimum: '3'
no_short_method_names:
minimum: '3'
no_long_variable_names:
maximum: '20'
no_goto: true
newline_at_end_of_file: true
encourage_single_quotes: true
avoid_todo_comments: true
avoid_perl_style_comments: true
avoid_fixme_comments: true
avoid_multiple_statements_on_same_line: true
align_assignments: true
duplication: false
javascript: true
coding_style:
php:
spaces:
around_operators:
concatenation: true
other:
after_type_cast: false
tools:
external_code_coverage: false

View File

@@ -1,6 +1,6 @@
language: php
php:
- 7.1
- 7.2
cache:
directories:
@@ -12,20 +12,18 @@ install:
- composer update --no-scripts
- cp .env.testing .env
- php artisan clear-compiled
- php artisan optimize
- php artisan env
- cp .env.testing .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:
- phpunit -c phpunit.coverage.xml
- ./vendor/bin/phpunit -c phpunit.coverage.xml
after_success:
- travis_retry php vendor/bin/coveralls -x storage/build/clover-all.xml
- travis_retry php vendor/bin/php-coveralls -x storage/build/clover-all.xml
# safelist
branches:
only:
- develop
- master
- master

View File

@@ -1,29 +1,91 @@
FROM php:7-apache
FROM php:7.2-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
ENV COMPOSER_ALLOW_SUPERUSER 1
LABEL version="1.1" 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 \
libpng12-dev \
wget \
libpng-dev \
libicu-dev \
libmcrypt-dev \
libldap2-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/*
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# LDAP install
RUN docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ && docker-php-ext-install ldap
RUN docker-php-ext-install -j$(nproc) curl gd intl json mcrypt readline tidy zip bcmath xml mbstring pdo_sqlite pdo_mysql bz2 pdo_pgsql
# 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
# Generate locales supported by firefly
RUN echo "en_US.UTF-8 UTF-8\nde_DE.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
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
COPY ./docker/apache2.conf /etc/apache2/apache2.conf
# 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
# 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
# copy ca certs to correct location
COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem
# 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
@@ -31,23 +93,27 @@ RUN a2enmod rewrite
# Enable apache mod ssl..
RUN a2enmod ssl
# Setup the Composer installer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Copy Apache Configs
COPY ./docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
ENV FIREFLY_PATH /var/www/firefly-iii
WORKDIR $FIREFLY_PATH
# The working directory
COPY . $FIREFLY_PATH
# 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
RUN composer install --prefer-dist --no-dev --no-scripts
# Copy in Firefly Source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# 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
# Run composer
RUN composer install --prefer-dist --no-dev --no-scripts --no-suggest
# Expose port 80
EXPOSE 80
ENTRYPOINT ["docker/entrypoint.sh"]
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

View File

@@ -1,79 +0,0 @@
# Firefly III: A personal finances manager
[![Requires PHP7.1](https://img.shields.io/badge/php-7.1-red.svg)](https://secure.php.net/downloads.php) [![Latest Stable Version](https://poser.pugx.org/grumpydictator/firefly-iii/v/stable)](https://packagist.org/packages/grumpydictator/firefly-iii) [![License](https://img.shields.io/badge/license-GPL-lightgrey.svg)](https://www.gnu.org/licenses/gpl.html) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA)
[![The index of Firefly III](https://i.nder.be/ccynyxy0/400)](https://i.nder.be/h327vx3y) [![The account overview of Firefly III](https://i.nder.be/g8v86y2g/400)](https://i.nder.be/hkpynqr9)
[![The useful financial reports of Firefly III](https://i.nder.be/cs3qx4f3/400)](https://i.nder.be/cwznmryd) [![Saving money is easy!](https://i.nder.be/gpq6ykym/400)](https://i.nder.be/gum2qf8z)
"Firefly III" is a financial manager for your personal finances. It can help you keep track of your expenses and income.
Firefly III supports the use of budgets. You can categorize and tag your transactions.
It also supports credit cards, shared household accounts and savings accounts.
There are many financial reports available.
## Want to try Firefly III?
There is a **[demo site](https://firefly-iii.nder.be)** with an example financial administration already present. You can use Docker, Heroku or Sandstorm.io (see below) to quickly setup your own instance.
## Install Firefly III
### Using docker
You can use docker-compose to [set up your personal secure](https://firefly-iii.github.io/using-docker.html) Firefly III environment. Advanced users can use the Dockerfile directly.
### Using vagrant (or other VMs)
You can install Firefly III on any Linux or Windows machine. You'll need a web server (preferrably on Linux) and access to the command line. Please read the [installation guide](https://firefly-iii.github.io/using-installing.html).
### Using Heroku
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/firefly-iii/firefly-iii/tree/master)
Register for a free Heroku account and instantly run Firefly III on your very own cloud instance.
### Using Sandstorm.io
You can find Firefly III in [the Sandstorm.io marketplace](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70). You can run it on your own installation or on Oasis.
## More about Firefly III
Personal financial management is pretty difficult, and everybody has their own approach to it.
Some people make budgets, other people limit their cashflow by throwing away their credit cards,
others try to increase their current cashflow. There are tons of ways to save and earn money.
Firefly works on the principle that if you know where you're money is going, you can stop it from going there.
### Some advantages of using Firefly
- Firefly can import any CSV file, so migrating from other systems is easy.
- Firefly runs on your own server, so you are fully in control of your data. Remember, there is no such thing as "the cloud", its just somebody elses computer!
- Firefly has lots of features without being fancy or bloated.
- If you feel you're missing something you can just ask me and I'll add it!
Firefly III has become pretty awesome over the years! (but please excuse me for bragging, it's just that I'm proud of it).
[You can read more about Firefly III, and its features, on the Github Pages](https://firefly-iii.github.io/).
### Contributing
Please read [CONTRIBUTING.md](https://github.com/firefly-iii/firefly-iii/blob/master/.github/CONTRIBUTING.md) for details on contributing, and the process for submitting pull requests. Please check out the [code of conduct](https://github.com/firefly-iii/firefly-iii/blob/master/CODE_OF_CONDUCT.md) as well.
### Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see [the tags](https://github.com/firefly-iii/firefly-iii/tags) on this repository.
### Authors
* James Cole
* Over time, [many people have contributed to Firefly III](https://github.com/firefly-iii/firefly-iii/graphs/contributors).
### License
This work [is licensed](https://github.com/firefly-iii/firefly-iii/blob/master/LICENSE) under the [GPL v3](https://www.gnu.org/licenses/gpl.html).
### Other stuff
If you like Firefly and if it helps you save lots of money, why not send me [a dime for every dollar saved](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA) (this is a joke, although the Paypal form works just fine, try it!)
If you want to contact me, please open an issue or [email me](mailto:thegrumpydictator@gmail.com).
[![Build Status](https://travis-ci.org/firefly-iii/firefly-iii.svg?branch=master)](https://travis-ci.org/firefly-iii/firefly-iii) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/firefly-iii/firefly-iii/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/firefly-iii/firefly-iii/?branch=master) [![Coverage Status](https://coveralls.io/repos/github/firefly-iii/firefly-iii/badge.svg?branch=master)](https://coveralls.io/github/firefly-iii/firefly-iii?branch=master)

View File

@@ -2,6 +2,7 @@
"name": "Firefly III",
"description": "A free and open source personal finances manager",
"repository": "https://github.com/firefly-iii/firefly-iii",
"website": "https://firefly-iii.org/",
"logo": "https://raw.githubusercontent.com/firefly-iii/firefly-iii/master/public/mstile-150x150.png",
"keywords": [
"finance",
@@ -36,18 +37,23 @@
"transfers",
"management"
],
"website": "https://firefly-iii.github.io/",
"addons": [
{
"plan": "heroku-postgresql"
"plan": "heroku-postgresql",
"options": {
"version": "9.5"
}
}
],
"scripts": {
"postdeploy": "export APP_KEY=$(php artisan --no-ansi key:generate --show)"
"postdeploy": "php artisan migrate:refresh --seed;php artisan firefly:instructions install"
},
"buildpacks": [
{
"url": "heroku/php"
},
{
"url": "https://github.com/heroku/heroku-buildpack-locale"
}
],
"env": {

View File

@@ -0,0 +1,82 @@
<?php
/**
* AboutController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
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.
*
* Class AboutController.
*/
class AboutController extends Controller
{
/**
* Returns system information.
*
* @return JsonResponse
*/
public function about(): JsonResponse
{
$search = ['~', '#'];
$replace = ['\~', '# '];
$phpVersion = str_replace($search, $replace, PHP_VERSION);
$phpOs = str_replace($search, $replace, PHP_OS);
$currentDriver = DB::getDriverName();
$data
= [
'version' => config('firefly.version'),
'api_version' => config('firefly.api_version'),
'php_version' => $phpVersion,
'os' => $phpOs,
'driver' => $currentDriver,
];
return response()->json(['data' => $data], 200)->header('Content-Type', 'application/vnd.api+json');
}
/**
* Returns information about the user.
*
* @param Request $request
*
* @return JsonResponse
*/
public function user(Request $request): JsonResponse
{
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item(auth()->user(), new UserTransformer($this->parameters), 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,250 @@
<?php
/**
* AccountController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\AccountRequest;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Transformers\AccountTransformer;
use 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 AccountController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class AccountController extends Controller
{
/** @var CurrencyRepositoryInterface The currency repository */
private $currencyRepository;
/** @var AccountRepositoryInterface The account repository */
private $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
// @var AccountRepositoryInterface repository
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->currencyRepository->setUser($user);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param \FireflyIII\Models\Account $account
*
* @return JsonResponse
*/
public function delete(Account $account): JsonResponse
{
$this->repository->destroy($account, null);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @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';
$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;
// get list of accounts. Count it and split it.
$collection = $this->repository->getAccountsByType($types);
$count = $collection->count();
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.accounts.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($accounts, new AccountTransformer($this->parameters), 'accounts');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show single instance.
*
* @param Request $request
* @param Account $account
*
* @return \Illuminate\Http\JsonResponse
*/
public function show(Request $request, Account $account): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a new instance.
*
* @param AccountRequest $request
*
* @return \Illuminate\Http\JsonResponse
*/
public function store(AccountRequest $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;
}
$account = $this->repository->store($data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update account.
*
* @param AccountRequest $request
* @param Account $account
*
* @return \Illuminate\Http\JsonResponse
*/
public function update(AccountRequest $request, Account $account): 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['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type);
$this->repository->update($account, $data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($account, new AccountTransformer($this->parameters), 'accounts');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* 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,AccountType::DEBT, AccountType::MORTGAGE],
'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,],
'hidden' => [AccountType::INITIAL_BALANCE, AccountType::IMPORT, AccountType::RECONCILIATION],
'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

@@ -0,0 +1,235 @@
<?php
/**
* AttachmentController.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\Controllers;
use FireflyIII\Api\V1\Requests\AttachmentRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\User;
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;
/**
* Class AttachmentController.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class AttachmentController extends Controller
{
/** @var AttachmentRepositoryInterface The attachment repository */
private $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(AttachmentRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param Attachment $attachment
*
* @return JsonResponse
*/
public function delete(Attachment $attachment): JsonResponse
{
$this->repository->destroy($attachment);
return response()->json([], 204);
}
/**
* Download an attachment.
*
* @param Attachment $attachment
*
* @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).');
}
if ($this->repository->exists($attachment)) {
$content = $this->repository->getContent($attachment);
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
/** @var LaravelResponse $response */
$response = response($content, 200);
$response
->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream')
->header('Content-Disposition', 'attachment; filename=' . $quoted)
->header('Content-Transfer-Encoding', 'binary')
->header('Connection', 'Keep-Alive')
->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public')
->header('Content-Length', \strlen($content));
return $response;
}
throw new FireflyException('Could not find the indicated attachment. The file is no longer there.');
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// types to get, page size:
$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();
$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.attachments.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($attachments, new AttachmentTransformer($this->parameters), 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Display the specified resource.
*
* @param Request $request
* @param Attachment $attachment
*
* @return JsonResponse
*/
public function show(Request $request, Attachment $attachment): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a newly created resource in storage.
*
* @param AttachmentRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(AttachmentRequest $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');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the specified resource in storage.
*
* @param AttachmentRequest $request
* @param Attachment $attachment
*
* @return JsonResponse
*/
public function update(AttachmentRequest $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));
$resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Upload an attachment.
*
* @param Request $request
* @param Attachment $attachment
*
* @return JsonResponse
*/
public function upload(Request $request, Attachment $attachment): JsonResponse
{
/** @var AttachmentHelperInterface $helper */
$helper = app(AttachmentHelperInterface::class);
$body = $request->getContent();
$helper->saveAttachmentFromApi($attachment, $body);
return response()->json([], 204);
}
}

View File

@@ -0,0 +1,195 @@
<?php
/**
* AvailableBudgetController.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\Controllers;
use FireflyIII\Api\V1\Requests\AvailableBudgetRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
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;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$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);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/
public function delete(AvailableBudget $availableBudget): JsonResponse
{
$this->repository->destroyAvailableBudget($availableBudget);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// 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.
$collection = $this->repository->getAvailableBudgets();
$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.available_budgets.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($availableBudgets, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Display the specified resource.
*
* @param Request $request
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/
public function show(Request $request, AvailableBudget $availableBudget): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a newly created resource in storage.
*
* @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));
$resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the specified resource in storage.
*
* @param AvailableBudgetRequest $request
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/
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');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,178 @@
<?php
/**
* BillController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\BillRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Transformers\BillTransformer;
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\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
/**
* Class BillController.
*/
class BillController extends Controller
{
/** @var BillRepositoryInterface The bill repository */
private $repository;
/**
* BillController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
/** @var BillRepositoryInterface repository */
$this->repository = app(BillRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param Bill $bill
*
* @return JsonResponse
*/
public function delete(Bill $bill): JsonResponse
{
$this->repository->destroy($bill);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$paginator = $this->repository->getPaginator($pageSize);
/** @var Collection $bills */
$bills = $paginator->getCollection();
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($bills, new BillTransformer($this->parameters), 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show the specified bill.
*
* @param Request $request
* @param Bill $bill
*
* @return JsonResponse
*/
public function show(Request $request, Bill $bill): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a bill.
*
* @param BillRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
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));
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new bill.'); // @codeCoverageIgnore
}
/**
* Update a bill.
*
* @param BillRequest $request
* @param Bill $bill
*
* @return JsonResponse
*/
public function update(BillRequest $request, Bill $bill): JsonResponse
{
$data = $request->getAll();
$bill = $this->repository->update($bill, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($bill, new BillTransformer($this->parameters), 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,188 @@
<?php
/**
* BudgetController.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\Controllers;
use FireflyIII\Api\V1\Requests\BudgetRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Transformers\BudgetTransformer;
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
{
/** @var BudgetRepositoryInterface The budget repository */
private $repository;
/**
* BudgetController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
/** @var BudgetRepositoryInterface repository */
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param Budget $budget
*
* @return JsonResponse
*/
public function delete(Budget $budget): JsonResponse
{
$this->repository->destroy($budget);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// 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->getBudgets();
$count = $collection->count();
$budgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$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');
$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
*
* @return JsonResponse
*/
public function show(Request $request, Budget $budget): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a budget.
*
* @param BudgetRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(BudgetRequest $request): JsonResponse
{
$budget = $this->repository->store($request->getAll());
if (null !== $budget) {
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new budget.'); // @codeCoverageIgnore
}
/**
* Update a budget.
*
* @param BudgetRequest $request
* @param Budget $budget
*
* @return JsonResponse
*/
public function update(BudgetRequest $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));
$resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,197 @@
<?php
/**
* BudgetLimitController.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\Controllers;
use FireflyIII\Api\V1\Requests\BudgetLimitRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\BudgetLimit;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Transformers\BudgetLimitTransformer;
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
{
/** @var BudgetRepositoryInterface The budget repository */
private $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
*/
public function delete(BudgetLimit $budgetLimit): JsonResponse
{
$this->repository->destroyBudgetLimit($budgetLimit);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$budgetId = (int)($request->get('budget_id') ?? 0);
$budget = $this->repository->findNull($budgetId);
$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'));
}
if (null !== $budget) {
$collection = $this->repository->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.budget_limits.index') . $this->buildParams());
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($budgetLimits, new BudgetLimitTransformer($this->parameters), 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Display the specified resource.
*
* @param Request $request
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
*/
public function show(Request $request, BudgetLimit $budgetLimit): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a newly created resource in storage.
*
* @param BudgetLimitRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(BudgetLimitRequest $request): JsonResponse
{
$data = $request->getAll();
$budget = $this->repository->findNull($data['budget_id']);
if (null === $budget) {
throw new FireflyException('Unknown budget.');
}
$data['budget'] = $budget;
$budgetLimit = $this->repository->storeBudgetLimit($data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the specified resource in storage.
*
* @param BudgetLimitRequest $request
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
*/
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));
$resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,188 @@
<?php
/**
* CategoryController.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\Controllers;
use FireflyIII\Api\V1\Requests\CategoryRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Transformers\CategoryTransformer;
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
{
/** @var CategoryRepositoryInterface The category repository */
private $repository;
/**
* CategoryController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
/** @var CategoryRepositoryInterface repository */
$this->repository = app(CategoryRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param Category $category
*
* @return JsonResponse
*/
public function delete(Category $category): JsonResponse
{
$this->repository->destroy($category);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// 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->getCategories();
$count = $collection->count();
$categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$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');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show the category.
*
* @param Request $request
* @param Category $category
*
* @return JsonResponse
*/
public function show(Request $request, Category $category): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($category, new CategoryTransformer($this->parameters), 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new category.
*
* @param CategoryRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
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));
$resource = new Item($category, new CategoryTransformer($this->parameters), 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new category.'); // @codeCoverageIgnore
}
/**
* Update the category.
*
* @param CategoryRequest $request
* @param Category $category
*
* @return JsonResponse
*/
public function update(CategoryRequest $request, Category $category): JsonResponse
{
$data = $request->getAll();
$category = $this->repository->update($category, $data);
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($category, new CategoryTransformer($this->parameters), 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,136 @@
<?php
/**
* ConfigurationController.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\Controllers;
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.
*/
class ConfigurationController extends Controller
{
/** @var UserRepositoryInterface The user repository */
private $repository;
/**
* BudgetController 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
}
return $next($request);
}
);
}
/**
* Show all configuration.
*
* @return JsonResponse
*/
public function index(): JsonResponse
{
$configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the configuration.
*
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(Request $request): 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);
$configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json');
}
/**
* Get all config values.
*
* @return array
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function getConfigData(): array
{
/** @var Configuration $isDemoSite */
$isDemoSite = app('fireflyconfig')->get('is_demo_site');
/** @var Configuration $updateCheck */
$updateCheck = app('fireflyconfig')->get('permission_update_check');
/** @var Configuration $lastCheck */
$lastCheck = app('fireflyconfig')->get('last_update_check');
/** @var Configuration $singleUser */
$singleUser = app('fireflyconfig')->get('single_user_mode');
$data = [
'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,
'single_user_mode' => null === $singleUser ? null : $singleUser->data,
];
return $data;
}
}

View File

@@ -0,0 +1,119 @@
<?php
/**
* Controller.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Log;
use Symfony\Component\HttpFoundation\ParameterBag;
/**
* Class Controller.
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.NumberOfChildren)
*/
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
/** @var ParameterBag Parameters from the URI are stored here. */
protected $parameters;
/**
* Controller constructor.
*
*/
public function __construct()
{
// get global parameters
$this->parameters = $this->getParameters();
}
/**
* Method to help build URI's.
*
* @return string
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function buildParams(): string
{
$return = '?';
$params = [];
foreach ($this->parameters as $key => $value) {
if ('page' === $key) {
continue;
}
if ($value instanceof Carbon) {
$params[$key] = $value->format('Y-m-d');
continue;
}
$params[$key] = $value;
}
$return .= http_build_query($params);
return $return;
}
/**
* 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');
if (0 === $page) {
$page = 1;
}
$bag->set('page', $page);
// some date fields:
$dates = ['start', 'end', 'date'];
foreach ($dates as $field) {
$date = request()->get($field);
$obj = null;
if (null !== $date) {
try {
$obj = new Carbon($date);
} catch (InvalidDateException $e) {
// don't care
Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage()));
}
}
$bag->set($field, $obj);
}
return $bag;
}
}

View File

@@ -0,0 +1,219 @@
<?php
/**
* CurrencyController.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\Controllers;
use FireflyIII\Api\V1\Requests\CurrencyRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Transformers\CurrencyTransformer;
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
{
/** @var CurrencyRepositoryInterface The currency repository */
private $repository;
/** @var UserRepositoryInterface The user repository */
private $userRepository;
/**
* CurrencyRepository constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
/** @var CurrencyRepositoryInterface repository */
$this->repository = app(CurrencyRepositoryInterface::class);
$this->userRepository = app(UserRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param TransactionCurrency $currency
*
* @return JsonResponse
* @throws FireflyException
*/
public function delete(TransactionCurrency $currency): JsonResponse
{
/** @var User $admin */
$admin = auth()->user();
if (!$this->userRepository->hasRole($admin, 'owner')) {
// access denied:
throw new FireflyException('No access to method, user is not owner.'); // @codeCoverageIgnore
}
if (!$this->repository->canDeleteCurrency($currency)) {
throw new FireflyException('No access to method, currency is in use.'); // @codeCoverageIgnore
}
$this->repository->destroy($currency);
return response()->json([], 204);
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $this->repository->get();
$count = $collection->count();
// slice them:
$currencies = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($currencies, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.index') . $this->buildParams());
$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 FractalCollection($currencies, new CurrencyTransformer($this->parameters), 'currencies');
$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
*/
public function show(Request $request, 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));
$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');
}
/**
* Store new currency.
*
* @param CurrencyRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
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');
}
throw new FireflyException('Could not store new currency.'); // @codeCoverageIgnore
}
/**
* Update a currency.
*
* @param CurrencyRequest $request
* @param TransactionCurrency $currency
*
* @return JsonResponse
*/
public function update(CurrencyRequest $request, TransactionCurrency $currency): JsonResponse
{
$data = $request->getAll();
$currency = $this->repository->update($currency, $data);
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');
}
}

View File

@@ -0,0 +1,111 @@
<?php
/**
* CurrencyExchangeRateController.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\Controllers;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Services\Currency\ExchangeRateInterface;
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
*/
class CurrencyExchangeRateController extends Controller
{
/** @var CurrencyRepositoryInterface The currency repository */
private $repository;
/**
* CurrencyExchangeRateController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
$this->repository = app(CurrencyRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Show an exchange rate.
*
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$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.');
}
if (null === $toCurrency) {
throw new FireflyException('Unknown destination currency.');
}
$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'));
$rate = $this->repository->getExchangeRate($fromCurrency, $toCurrency, $dateObj);
if (null === $rate) {
/** @var User $admin */
$admin = auth()->user();
// create service:
/** @var ExchangeRateInterface $service */
$service = app(ExchangeRateInterface::class);
$service->setUser($admin);
$rate = $service->getRate($fromCurrency, $toCurrency, $dateObj);
}
$resource = new Item($rate, new CurrencyExchangeRateTransformer($this->parameters), 'currency_exchange_rates');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,216 @@
<?php
/**
* JournalLinkController.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\Controllers;
use FireflyIII\Api\V1\Requests\JournalLinkRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Transformers\JournalLinkTransformer;
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 JournalLinkController extends Controller
{
/** @var JournalRepositoryInterface The journal repository */
private $journalRepository;
/** @var LinkTypeRepositoryInterface The link type repository */
private $repository;
/**
* JournalLinkController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(LinkTypeRepositoryInterface::class);
$this->journalRepository = app(JournalRepositoryInterface::class);
$this->repository->setUser($user);
$this->journalRepository->setUser($user);
return $next($request);
}
);
}
/**
* Delete the resource.
*
* @param TransactionJournalLink $link
*
* @return JsonResponse
*/
public function delete(TransactionJournalLink $link): JsonResponse
{
$this->repository->destroyLink($link);
return response()->json([], 204);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// read type from URI
$name = $request->get('name') ?? null;
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$linkType = $this->repository->findByName($name);
// get list of accounts. 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());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($journalLinks, new JournalLinkTransformer($this->parameters), 'journal_links');
$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 TransactionJournalLink $journalLink
*
* @return JsonResponse
*/
public function show(Request $request, TransactionJournalLink $journalLink): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param JournalLinkRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(JournalLinkRequest $request): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$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.');
}
$data['direction'] = 'inward';
$journalLink = $this->repository->storeLink($data, $inward, $outward);
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update object.
*
* @param JournalLinkRequest $request
* @param TransactionJournalLink $journalLink
*
* @return JsonResponse
* @throws FireflyException
*/
public function update(JournalLinkRequest $request, TransactionJournalLink $journalLink): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$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.');
}
$data['direction'] = 'inward';
$journalLink = $this->repository->updateLink($journalLink, $data);
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,210 @@
<?php
/**
* LinkTypeController.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\Controllers;
use FireflyIII\Api\V1\Requests\LinkTypeRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Transformers\LinkTypeTransformer;
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
{
/** @var LinkTypeRepositoryInterface The link type repository */
private $repository;
/** @var UserRepositoryInterface The user repository */
private $userRepository;
/**
* LinkTypeController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(LinkTypeRepositoryInterface::class);
$this->userRepository = app(UserRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* Delete the resource.
*
* @param LinkType $linkType
*
* @return JsonResponse
* @throws FireflyException
*/
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));
}
$this->repository->destroy($linkType, null);
return response()->json([], 204);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$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();
$linkTypes = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$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');
$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 LinkType $linkType
*
* @return JsonResponse
*/
public function show(Request $request, LinkType $linkType): JsonResponse
{
$manager = new Manager;
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param LinkTypeRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function store(LinkTypeRequest $request): JsonResponse
{
/** @var User $admin */
$admin = auth()->user();
if (!$this->userRepository->hasRole($admin, 'owner')) {
throw new FireflyException('You need the "owner"-role to do this.');
}
$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));
$resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types');
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
*/
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));
}
/** @var User $admin */
$admin = auth()->user();
if (!$this->userRepository->hasRole($admin, 'owner')) {
throw new FireflyException('You need the "owner"-role to do this.');
}
$data = $request->getAll();
$this->repository->update($linkType, $data);
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,188 @@
<?php
/**
* PiggyBankController.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\Controllers;
use FireflyIII\Api\V1\Requests\PiggyBankRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
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
{
/** @var PiggyBankRepositoryInterface The piggy bank repository */
private $repository;
/**
* PiggyBankController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
$this->repository = app(PiggyBankRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Delete the resource.
*
* @param PiggyBank $piggyBank
*
* @return JsonResponse
*/
public function delete(PiggyBank $piggyBank): JsonResponse
{
$this->repository->destroy($piggyBank);
return response()->json([], 204);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// 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();
$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.piggy_banks.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($piggyBanks, new PiggyBankTransformer($this->parameters), 'piggy_banks');
$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 PiggyBank $piggyBank
*
* @return JsonResponse
*/
public function show(Request $request, PiggyBank $piggyBank): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param PiggyBankRequest $request
*
* @return JsonResponse
* @throws FireflyException
*/
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));
$resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new piggy bank.');
}
/**
* Update piggy bank.
*
* @param PiggyBankRequest $request
* @param PiggyBank $piggyBank
*
* @return JsonResponse
*/
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));
$resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,145 @@
<?php
/**
* PreferencesController.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\Controllers;
use FireflyIII\Api\V1\Requests\PreferenceRequest;
use FireflyIII\Models\Preference;
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;
/**
*
* Class PreferenceController
*/
class PreferenceController extends Controller
{
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
/** @var User $user */
$user = auth()->user();
$available = [
'language', 'customFiscalYear', 'fiscalYearStart', 'currencyPreference',
'transaction_journal_optional_fields', 'frontPageAccounts', 'viewRange',
'listPageSize, twoFactorAuthEnabled',
];
$preferences = new Collection;
foreach ($available as $name) {
$pref = app('preferences')->getForUser($user, $name);
if (null !== $pref) {
$preferences->push($pref);
}
}
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($preferences, new PreferenceTransformer($this->parameters), 'preferences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* List single resource.
*
* @param Request $request
* @param Preference $preference
*
* @return JsonResponse
*/
public function show(Request $request, Preference $preference): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($preference, new PreferenceTransformer($this->parameters), 'preferences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a preference.
*
* @param PreferenceRequest $request
* @param Preference $preference
*
* @return JsonResponse
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(PreferenceRequest $request, Preference $preference): JsonResponse
{
$data = $request->getAll();
$newValue = $data['data'];
switch ($preference->name) {
default:
break;
case 'transaction_journal_optional_fields':
case 'frontPageAccounts':
$newValue = explode(',', $data['data']);
break;
case 'listPageSize':
$newValue = (int)$data['data'];
break;
case 'customFiscalYear':
case 'twoFactorAuthEnabled':
$newValue = 1 === (int)$data['data'];
break;
}
$result = app('preferences')->set($preference->name, $newValue);
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($result, new PreferenceTransformer($this->parameters), 'preferences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,180 @@
<?php
/**
* RecurrenceController.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\Controllers;
use FireflyIII\Api\V1\Requests\RecurrenceRequest;
use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Transformers\RecurrenceTransformer;
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 RecurrenceController
*/
class RecurrenceController extends Controller
{
/** @var RecurringRepositoryInterface The recurring transaction repository */
private $repository;
/**
* RecurrenceController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
/** @var RecurringRepositoryInterface repository */
$this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* Delete the resource.
*
* @param Recurrence $recurrence
*
* @return JsonResponse
*/
public function delete(Recurrence $recurrence): JsonResponse
{
$this->repository->destroy($recurrence);
return response()->json([], 204);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// 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->getAll();
$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.recurrences.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($piggyBanks, new RecurrenceTransformer($this->parameters), 'recurrences');
$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 Recurrence $recurrence
*
* @return JsonResponse
*/
public function show(Request $request, Recurrence $recurrence): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($recurrence, new RecurrenceTransformer($this->parameters), 'recurrences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param RecurrenceRequest $request
*
* @return JsonResponse
*/
public function store(RecurrenceRequest $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');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update single recurrence.
*
* @param RecurrenceRequest $request
* @param Recurrence $recurrence
*
* @return JsonResponse
*/
public function update(RecurrenceRequest $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));
$resource = new Item($category, new RecurrenceTransformer($this->parameters), 'recurrences');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,178 @@
<?php
/**
* RuleController.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\Controllers;
use FireflyIII\Api\V1\Requests\RuleRequest;
use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Transformers\RuleTransformer;
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 RuleController
*/
class RuleController extends Controller
{
/** @var RuleRepositoryInterface The rule repository */
private $ruleRepository;
/**
* RuleController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->ruleRepository = app(RuleRepositoryInterface::class);
$this->ruleRepository->setUser($user);
return $next($request);
}
);
}
/**
* Delete the resource.
*
* @param Rule $rule
*
* @return JsonResponse
*/
public function delete(Rule $rule): JsonResponse
{
$this->ruleRepository->destroy($rule);
return response()->json([], 204);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// 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->ruleRepository->getAll();
$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());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new FractalCollection($rules, new RuleTransformer($this->parameters), 'rules');
$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 Rule $rule
*
* @return JsonResponse
*/
public function show(Request $request, Rule $rule): JsonResponse
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($rule, new RuleTransformer($this->parameters), 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param RuleRequest $request
*
* @return JsonResponse
*/
public function store(RuleRequest $request): JsonResponse
{
$rule = $this->ruleRepository->store($request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($rule, new RuleTransformer($this->parameters), 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a rule.
*
* @param RuleRequest $request
* @param Rule $rule
*
* @return JsonResponse
*/
public function update(RuleRequest $request, Rule $rule): JsonResponse
{
$rule = $this->ruleRepository->update($rule, $request->getAll());
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($rule, new RuleTransformer($this->parameters), 'rules');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,179 @@
<?php
/**
* RuleGroupController.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\Controllers;
use FireflyIII\Api\V1\Requests\RuleGroupRequest;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\Transformers\RuleGroupTransformer;
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 RuleGroupController
*/
class RuleGroupController extends Controller
{
/** @var RuleGroupRepositoryInterface The rule group repository */
private $ruleGroupRepository;
/**
* RuleGroupController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class);
$this->ruleGroupRepository->setUser($user);
return $next($request);
}
);
}
/**
* Delete the resource.
*
* @param RuleGroup $ruleGroup
*
* @return JsonResponse
*/
public function delete(RuleGroup $ruleGroup): JsonResponse
{
$this->ruleGroupRepository->destroy($ruleGroup, null);
return response()->json([], 204);
}
/**
* List all of them.
*
* @param Request $request
*
* @return JsonResponse]
*/
public function index(Request $request): JsonResponse
{
// create some objects:
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of rule groups. Count it and split it.
$collection = $this->ruleGroupRepository->get();
$count = $collection->count();
$ruleGroups = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$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');
$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
{
$manager = new Manager();
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store new object.
*
* @param RuleGroupRequest $request
*
* @return JsonResponse
*/
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));
$resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a rule group.
*
* @param RuleGroupRequest $request
* @param RuleGroup $ruleGroup
*
* @return JsonResponse
*/
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));
$resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,314 @@
<?php
/**
* TransactionController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\TransactionRequest;
use FireflyIII\Events\StoredTransactionJournal;
use FireflyIII\Events\UpdatedTransactionJournal;
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\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\TransactionTransformer;
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;
/**
* Class TransactionController
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class TransactionController extends Controller
{
/** @var JournalRepositoryInterface The journal repository */
private $repository;
/**
* TransactionController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $admin */
$admin = auth()->user();
/** @var JournalRepositoryInterface repository */
$this->repository = app(JournalRepositoryInterface::class);
$this->repository->setUser($admin);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param \FireflyIII\Models\Transaction $transaction
*
* @return JsonResponse
*/
public function delete(Transaction $transaction): JsonResponse
{
$journal = $transaction->transactionJournal;
$this->repository->destroy($journal);
return response()->json([], 204);
}
/**
* Show all transactions.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
$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));
/** @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);
}
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->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a single transaction.
*
* @param Request $request
* @param Transaction $transaction
* @param string $include
*
* @return JsonResponse
*/
public function show(Request $request, Transaction $transaction, string $include = null): 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);
}
$transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a new transaction.
*
* @param TransactionRequest $request
*
* @param JournalRepositoryInterface $repository
*
* @throws FireflyException
* @return JsonResponse
*/
public function store(TransactionRequest $request, JournalRepositoryInterface $repository): JsonResponse
{
$data = $request->getAll();
$data['user'] = auth()->user()->id;
$journal = $repository->store($data);
event(new StoredTransactionJournal($journal, 0));
$manager = new Manager();
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
$collector->setJournals(new Collection([$journal]));
// add filter to remove transactions:
$transactionType = $journal->transactionType->type;
if ($transactionType === TransactionType::WITHDRAWAL) {
$collector->addFilter(PositiveAmountFilter::class);
}
if (!($transactionType === TransactionType::WITHDRAWAL)) {
$collector->addFilter(NegativeAmountFilter::class);
}
$transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a transaction.
*
* @param TransactionRequest $request
* @param JournalRepositoryInterface $repository
* @param Transaction $transaction
*
* @return JsonResponse
*/
public function update(TransactionRequest $request, JournalRepositoryInterface $repository, Transaction $transaction): 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));
event(new UpdatedTransactionJournal($journal));
// add include parameter:
$include = $request->get('include') ?? '';
$manager->parseIncludes($include);
// needs a lot of extra data to match the journal collector. Or just expand that one.
// collect transactions using the journal collector
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
$collector->setJournals(new Collection([$journal]));
// add filter to remove transactions:
$transactionType = $journal->transactionType->type;
if ($transactionType === TransactionType::WITHDRAWAL) {
$collector->addFilter(PositiveAmountFilter::class);
}
if (!($transactionType === TransactionType::WITHDRAWAL)) {
$collector->addFilter(NegativeAmountFilter::class);
}
$transactions = $collector->getTransactions();
$resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), '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,],
'expenses' => [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

@@ -0,0 +1,203 @@
<?php
/**
* UserController.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\UserRequest;
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
{
/** @var UserRepositoryInterface The user repository */
private $repository;
/**
* UserController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var UserRepositoryInterface repository */
$this->repository = app(UserRepositoryInterface::class);
return $next($request);
}
);
}
/**
* Remove the specified resource from storage.
*
* @param \FireflyIII\User $user
*
* @return JsonResponse
* @throws FireflyException
*/
public function delete(User $user): JsonResponse
{
/** @var User $admin */
$admin = auth()->user();
if ($this->repository->hasRole($admin, 'owner')) {
$this->repository->destroy($user);
return response()->json([], 204);
}
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
}
/**
* Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
*/
public function index(Request $request): 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));
// build collection
$collection = $this->repository->all();
$count = $collection->count();
$users = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($users, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.users.index') . $this->buildParams());
// make resource
$resource = new FractalCollection($users, new UserTransformer($this->parameters), 'users');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show a single user.
*
* @param Request $request
* @param User $user
*
* @return JsonResponse
*/
public function show(Request $request, 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);
// make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Store a new user.
*
* @param UserRequest $request
*
* @return JsonResponse
*/
public function store(UserRequest $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);
// make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update a user.
*
* @param UserRequest $request
* @param User $user
*
* @return JsonResponse
*/
public function update(UserRequest $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);
// make resource
$resource = new Item($user, new UserTransformer($this->parameters), 'users');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -0,0 +1,136 @@
<?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,97 @@
<?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,77 @@
<?php
/**
* AvailableBudgetRequest.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 AvailableBudgetRequest
*/
class AvailableBudgetRequest 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 [
'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'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
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',
'amount' => 'required|numeric|more:0',
'start_date' => 'required|date|before:end_date',
'end_date' => 'required|date|after:start_date',
];
return $rules;
}
}

View File

@@ -0,0 +1,123 @@
<?php
/**
* BillRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use Illuminate\Validation\Validator;
/**
* Class BillRequest
*/
class BillRequest 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'),
'amount_min' => $this->string('amount_min'),
'amount_max' => $this->string('amount_max'),
'currency_id' => $this->integer('currency_id'),
'currency_code' => $this->string('currency_code'),
'date' => $this->date('date'),
'repeat_freq' => $this->string('repeat_freq'),
'skip' => $this->integer('skip'),
'automatch' => $this->boolean('automatch'),
'active' => $this->boolean('active'),
'notes' => $this->string('notes'),
];
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'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',
'date' => 'required|date',
'repeat_freq' => 'required|in:weekly,monthly,quarterly,half-year,yearly',
'skip' => 'required|between:0,31',
'automatch' => 'required|boolean',
'active' => 'required|boolean',
'notes' => 'between:1,65536',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
$bill = $this->route()->parameter('bill');
$rules['name'] .= ',' . $bill->id;
break;
}
return $rules;
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$data = $validator->getData();
$min = (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'));
}
}
);
}
}

View File

@@ -0,0 +1,83 @@
<?php
/**
* BudgetLimitRequest.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 BudgetLimitRequest
*/
class BudgetLimitRequest 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 [
'budget_id' => $this->integer('budget_id'),
'start_date' => $this->date('start_date'),
'end_date' => $this->date('end_date'),
'amount' => $this->string('amount'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
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',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
$rules['budget_id'] = 'required|exists:budgets,id|belongsToUser:budgets,id';
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,82 @@
<?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,81 @@
<?php
/**
* CategoryRequest.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\Category;
/**
* Class CategoryRequest
*/
class CategoryRequest 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'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'name' => 'required|between:1,100|uniqueObjectForUser:categories,name',
'active' => 'required|boolean',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
/** @var Category $category */
$category = $this->route()->parameter('category');
$rules['name'] = sprintf('required|between:1,100|uniqueObjectForUser:categories,name,%d', $category->id);
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,89 @@
<?php
/**
* CurrencyRequest.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 CurrencyRequest
*/
class CurrencyRequest 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'),
'code' => $this->string('code'),
'symbol' => $this->string('symbol'),
'decimal_places' => $this->integer('decimal_places'),
'default' => $this->boolean('default'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'name' => 'required|between:1,255|unique:transaction_currencies,name',
'code' => 'required|between:3,3|unique:transaction_currencies,code',
'symbol' => 'required|between:1,5|unique:transaction_currencies,symbol',
'decimal_places' => 'required|between:0,20|numeric|min:0|max:20',
'default' => 'boolean',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
$currency = $this->route()->parameter('currency');
$rules['name'] = 'required|between:1,255|unique:transaction_currencies,name,' . $currency->id;
$rules['code'] = 'required|between:1,255|unique:transaction_currencies,code,' . $currency->id;
$rules['symbol'] = 'required|between:1,255|unique:transaction_currencies,symbol,' . $currency->id;
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,131 @@
<?php
/**
* JournalLinkRequest.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\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use Illuminate\Validation\Validator;
/**
*
* Class JournalLinkRequest
*/
class JournalLinkRequest 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 [
'link_type_id' => $this->integer('link_type_id'),
'link_type_name' => $this->string('link_type_name'),
'inward_id' => $this->integer('inward_id'),
'outward_id' => $this->integer('outward_id'),
'notes' => $this->string('notes'),
];
}
/**
*
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
return [
'link_type_id' => 'exists:link_types,id|required_without:link_type_name',
'link_type_name' => 'exists:link_types,name|required_without:link_type_id',
'inward_id' => 'required|belongsToUser:transaction_journals,id',
'outward_id' => 'required|belongsToUser:transaction_journals,id',
'notes' => 'between:0,65000',
];
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$this->validateExistingLink($validator);
}
);
}
/**
* @param Validator $validator
*/
private function validateExistingLink(Validator $validator): void
{
/** @var LinkTypeRepositoryInterface $repository */
$repository = app(LinkTypeRepositoryInterface::class);
$repository->setUser(auth()->user());
/** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class);
$journalRepos->setUser(auth()->user());
$data = $validator->getData();
$inwardId = (int)($data['inward_id'] ?? 0);
$outwardId = (int)($data['outward_id'] ?? 0);
$inward = $journalRepos->findNull($inwardId);
$outward = $journalRepos->findNull($outwardId);
if (null === $inward) {
$validator->errors()->add('inward_id', 'Invalid inward ID.');
return;
}
if (null === $outward) {
$validator->errors()->add('outward_id', 'Invalid outward ID.');
return;
}
if ($repository->findLink($inward, $outward)) {
$validator->errors()->add('outward_id', 'Already have a link between inward and outward.');
$validator->errors()->add('inward_id', 'Already have a link between inward and outward.');
}
}
}

View File

@@ -0,0 +1,91 @@
<?php
/**
* LinkTypeRequest.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\LinkType;
use Illuminate\Validation\Rule;
/**
*
* Class LinkTypeRequest
*/
class LinkTypeRequest 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'),
'outward' => $this->string('outward'),
'inward' => $this->string('inward'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'name' => 'required|unique:link_types,name|min:1',
'outward' => 'required|unique:link_types,outward|min:1|different:inward',
'inward' => 'required|unique:link_types,inward|min:1|different:outward',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
/** @var LinkType $linkType */
$linkType = $this->route()->parameter('linkType');
$rules['name'] = ['required', Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1'];
$rules['outward'] = ['required', 'different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1'];
$rules['inward'] = ['required', 'different:outward', Rule::unique('link_types', 'inward')->ignore($linkType->id), 'min:1'];
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,99 @@
<?php
/**
* PiggyBankRequest.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\PiggyBank;
use FireflyIII\Rules\IsAssetAccountId;
/**
*
* Class PiggyBankRequest
*/
class PiggyBankRequest 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
{
$current = $this->string('current_amount');
$current = '' === $current ? '0' : $current;
return [
'name' => $this->string('name'),
'account_id' => $this->integer('account_id'),
'targetamount' => $this->string('target_amount'),
'current_amount' => $current,
'startdate' => $this->date('start_date'),
'targetdate' => $this->date('target_date'),
'notes' => $this->string('notes'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'name' => 'required|between:1,255|uniquePiggyBankForUser',
'account_id' => ['required', 'belongsToUser:accounts', new IsAssetAccountId],
'target_amount' => 'required|numeric|more:0',
'current_amount' => 'numeric|more:0|lte:target_amount',
'start_date' => 'date|nullable',
'target_date' => 'date|nullable|after:start_date',
'notes' => 'max:65000',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
/** @var PiggyBank $piggyBank */
$piggyBank = $this->route()->parameter('piggyBank');
$rules['name'] = 'required|between:1,255|uniquePiggyBankForUser:' . $piggyBank->id;
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,69 @@
<?php
/**
* PreferenceRequest.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 PreferenceRequest
*/
class PreferenceRequest 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 [
'data' => $this->get('data'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
return [
'data' => 'required|between:1,65000',
];
}
}

View File

@@ -0,0 +1,203 @@
<?php
/**
* RecurrenceRequest.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 Carbon\Carbon;
use FireflyIII\Rules\BelongsUser;
use FireflyIII\Validation\RecurrenceValidation;
use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator;
/**
* Class RecurrenceRequest
*/
class RecurrenceRequest extends Request
{
use RecurrenceValidation, TransactionValidation;
/**
* 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 = [
'recurrence' => [
'type' => $this->string('type'),
'title' => $this->string('title'),
'description' => $this->string('description'),
'first_date' => $this->date('first_date'),
'repeat_until' => $this->date('repeat_until'),
'repetitions' => $this->integer('nr_of_repetitions'),
'apply_rules' => $this->boolean('apply_rules'),
'active' => $this->boolean('active'),
],
'meta' => [
'piggy_bank_id' => $this->integer('piggy_bank_id'),
'piggy_bank_name' => $this->string('piggy_bank_name'),
'tags' => explode(',', $this->string('tags')),
],
'transactions' => $this->getTransactionData(),
'repetitions' => $this->getRepetitionData(),
];
return $return;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$today = Carbon::now()->addDay();
return [
'type' => 'required|in:withdrawal,transfer,deposit',
'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title',
'description' => 'between:1,65000',
'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')),
'repeat_until' => sprintf('date|after:%s', $today->format('Y-m-d')),
'nr_of_repetitions' => 'numeric|between:1,31',
'apply_rules' => 'required|boolean',
'active' => 'required|boolean',
'tags' => 'between:1,64000',
'piggy_bank_id' => 'numeric',
'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly',
'repetitions.*.moment' => 'between:0,10',
'repetitions.*.skip' => 'required|numeric|between:0,31',
'repetitions.*.weekend' => 'required|numeric|min:1|max:4',
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|required_without:transactions.*.currency_code',
'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code|required_without:transactions.*.currency_id',
'transactions.*.foreign_amount' => 'numeric|more:0',
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id',
'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser],
'transactions.*.category_name' => 'between:1,255|nullable',
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser],
'transactions.*.source_name' => 'between:1,255|nullable',
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser],
'transactions.*.destination_name' => 'between:1,255|nullable',
'transactions.*.amount' => 'required|numeric|more:0',
'transactions.*.description' => 'required|between:1,255',
];
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$this->validateOneTransaction($validator);
$this->validateOneRepetition($validator);
$this->validateRecurrenceRepetition($validator);
$this->validateRepetitionMoment($validator);
$this->validateForeignCurrencyInformation($validator);
$this->validateAccountInformation($validator);
}
);
}
/**
* Returns the repetition data as it is found in the submitted data.
*
* @return array
*/
private function getRepetitionData(): array
{
$return = [];
// repetition data:
/** @var array $repetitions */
$repetitions = $this->get('repetitions');
/** @var array $repetition */
foreach ($repetitions as $repetition) {
$return[] = [
'type' => $repetition['type'],
'moment' => $repetition['moment'],
'skip' => (int)$repetition['skip'],
'weekend' => (int)$repetition['weekend'],
];
}
return $return;
}
/**
* Returns the transaction data as it is found in the submitted data. It's a complex method according to code
* standards but it just has a lot of ??-statements because of the fields that may or may not exist.
*
* @return array
* @SuppressWarnings(PHPMD.NPathComplexity)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function getTransactionData(): array
{
$return = [];
// transaction data:
/** @var array $transactions */
$transactions = $this->get('transactions');
/** @var array $transaction */
foreach ($transactions as $transaction) {
$return[] = [
'amount' => $transaction['amount'],
'currency_id' => isset($transaction['currency_id']) ? (int)$transaction['currency_id'] : null,
'currency_code' => $transaction['currency_code'] ?? null,
'foreign_amount' => $transaction['foreign_amount'] ?? null,
'foreign_currency_id' => isset($transaction['foreign_currency_id']) ? (int)$transaction['foreign_currency_id'] : null,
'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null,
'budget_id' => isset($transaction['budget_id']) ? (int)$transaction['budget_id'] : null,
'budget_name' => $transaction['budget_name'] ?? null,
'category_id' => isset($transaction['category_id']) ? (int)$transaction['category_id'] : null,
'category_name' => $transaction['category_name'] ?? null,
'source_id' => isset($transaction['source_id']) ? (int)$transaction['source_id'] : null,
'source_name' => isset($transaction['source_name']) ? (string)$transaction['source_name'] : null,
'destination_id' => isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null,
'destination_name' => isset($transaction['destination_name']) ? (string)$transaction['destination_name'] : null,
'description' => $transaction['description'],
];
}
return $return;
}
}

View File

@@ -0,0 +1,39 @@
<?php
/**
* Request.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Http\Requests\Request as FireflyIIIRequest;
/**
* Class Request.
*
* Technically speaking this class does not have to be extended like this but who knows what the future brings.
*
* @SuppressWarnings(PHPMD.NumberOfChildren)
*/
class Request extends FireflyIIIRequest
{
}

View File

@@ -0,0 +1,85 @@
<?php
/**
* RuleGroupRequest.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\RuleGroup;
/**
*
* Class RuleGroupRequest
*/
class RuleGroupRequest 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 [
'title' => $this->string('title'),
'description' => $this->string('description'),
'active' => $this->boolean('active'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'title' => 'required|between:1,100|uniqueObjectForUser:rule_groups,title',
'description' => 'between:1,5000|nullable',
'active' => 'required|boolean',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
/** @var RuleGroup $ruleGroup */
$ruleGroup = $this->route()->parameter('ruleGroup');
$rules['title'] = 'required|between:1,100|uniqueObjectForUser:rule_groups,title,' . $ruleGroup->id;
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,189 @@
<?php
/**
* RuleRequest.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 Illuminate\Validation\Validator;
/**
* Class RuleRequest
*/
class RuleRequest 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 = [
'title' => $this->string('title'),
'description' => $this->string('description'),
'rule_group_id' => $this->integer('rule_group_id'),
'rule_group_title' => $this->string('rule_group_title'),
'trigger' => $this->string('trigger'),
'strict' => $this->boolean('strict'),
'stop_processing' => $this->boolean('stop_processing'),
'active' => $this->boolean('active'),
'rule_triggers' => $this->getRuleTriggers(),
'rule_actions' => $this->getRuleActions(),
];
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$validTriggers = array_keys(config('firefly.rule-triggers'));
$validActions = array_keys(config('firefly.rule-actions'));
// some triggers and actions require text:
$contextTriggers = implode(',', config('firefly.context-rule-triggers'));
$contextActions = implode(',', config('firefly.context-rule-actions'));
$rules = [
'title' => 'required|between:1,100|uniqueObjectForUser:rules,title',
'description' => 'between:1,5000|nullable',
'rule_group_id' => 'required|belongsToUser:rule_groups|required_without:rule_group_title',
'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title',
'trigger' => 'required|in:store-journal,update-journal',
'rule_triggers.*.name' => 'required|in:' . implode(',', $validTriggers),
'rule_triggers.*.stop_processing' => 'boolean',
'rule_triggers.*.value' => 'required_if:rule_actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue',
'rule_actions.*.name' => 'required|in:' . implode(',', $validActions),
'rule_actions.*.value' => 'required_if:rule_actions.*.type,' . $contextActions . '|ruleActionValue',
'rule_actions.*.stop_processing' => 'boolean',
'strict' => 'required|boolean',
'stop_processing' => 'required|boolean',
'active' => 'required|boolean',
];
return $rules;
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$this->atLeastOneTrigger($validator);
$this->atLeastOneAction($validator);
}
);
}
/**
* Adds an error to the validator when there are no repetitions in the array of data.
*
* @param Validator $validator
*/
protected function atLeastOneAction(Validator $validator): void
{
$data = $validator->getData();
$repetitions = $data['rule_actions'] ?? [];
// need at least one transaction
if (0 === \count($repetitions)) {
$validator->errors()->add('title', (string)trans('validation.at_least_one_action'));
}
}
/**
* Adds an error to the validator when there are no repetitions in the array of data.
*
* @param Validator $validator
*/
protected function atLeastOneTrigger(Validator $validator): void
{
$data = $validator->getData();
$repetitions = $data['rule_triggers'] ?? [];
// need at least one transaction
if (0 === \count($repetitions)) {
$validator->errors()->add('title', (string)trans('validation.at_least_one_trigger'));
}
}
/**
* @return array
*/
private function getRuleActions(): array
{
$actions = $this->get('rule_actions');
$return = [];
if (\is_array($actions)) {
foreach ($actions as $action) {
$return[] = [
'name' => $action['name'],
'value' => $action['value'],
'stop_processing' => 1 === (int)($action['stop-processing'] ?? '0'),
];
}
}
return $return;
}
/**
* @return array
*/
private function getRuleTriggers(): array
{
$triggers = $this->get('rule_triggers');
$return = [];
if (\is_array($triggers)) {
foreach ($triggers as $trigger) {
$return[] = [
'name' => $trigger['name'],
'value' => $trigger['value'],
'stop_processing' => 1 === (int)($trigger['stop-processing'] ?? '0'),
];
}
}
return $return;
}
}

View File

@@ -0,0 +1,197 @@
<?php
/**
* TransactionRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\BelongsUser;
use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator;
/**
* Class TransactionRequest
*/
class TransactionRequest extends Request
{
use TransactionValidation;
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* Get all data. Is pretty complex because of all the ??-statements.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @return array
*/
public function getAll(): array
{
$data = [
'type' => $this->string('type'),
'date' => $this->date('date'),
'description' => $this->string('description'),
'piggy_bank_id' => $this->integer('piggy_bank_id'),
'piggy_bank_name' => $this->string('piggy_bank_name'),
'bill_id' => $this->integer('bill_id'),
'bill_name' => $this->string('bill_name'),
'tags' => explode(',', $this->string('tags')),
'interest_date' => $this->date('interest_date'),
'book_date' => $this->date('book_date'),
'process_date' => $this->date('process_date'),
'due_date' => $this->date('due_date'),
'payment_date' => $this->date('payment_date'),
'invoice_date' => $this->date('invoice_date'),
'internal_reference' => $this->string('internal_reference'),
'notes' => $this->string('notes'),
'original-source' => sprintf('api-v%s', config('firefly.api_version')),
'transactions' => $this->getTransactionData(),
];
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function rules(): array
{
$rules = [
// basic fields for journal:
'type' => 'required|in:withdrawal,deposit,transfer',
'date' => 'required|date',
'description' => 'between:1,255',
'piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser],
'piggy_bank_name' => ['between:1,255', 'nullable', new BelongsUser],
'bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser],
'bill_name' => ['between:1,255', 'nullable', new BelongsUser],
'tags' => 'between:1,255',
// then, custom fields for journal
'interest_date' => 'date|nullable',
'book_date' => 'date|nullable',
'process_date' => 'date|nullable',
'due_date' => 'date|nullable',
'payment_date' => 'date|nullable',
'invoice_date' => 'date|nullable',
'internal_reference' => 'min:1,max:255|nullable',
'notes' => 'min:1,max:50000|nullable',
// transaction rules (in array for splits):
'transactions.*.description' => 'nullable|between:1,255',
'transactions.*.amount' => 'required|numeric|more:0',
'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id|required_without:transactions.*.currency_code',
'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code|required_without:transactions.*.currency_id',
'transactions.*.foreign_amount' => 'numeric|more:0',
'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id',
'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code',
'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser],
'transactions.*.budget_name' => ['between:1,255', 'nullable', new BelongsUser],
'transactions.*.category_id' => ['mustExist:categories,id', new BelongsUser],
'transactions.*.category_name' => 'between:1,255|nullable',
'transactions.*.reconciled' => 'boolean|nullable',
// basic rules will be expanded later.
'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser],
'transactions.*.source_name' => 'between:1,255|nullable',
'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser],
'transactions.*.destination_name' => 'between:1,255|nullable',
];
if ('PUT' === $this->method()) {
unset($rules['type'], $rules['piggy_bank_id'], $rules['piggy_bank_name']);
}
return $rules;
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$this->validateOneTransaction($validator);
$this->validateDescriptions($validator);
$this->validateJournalDescription($validator);
$this->validateSplitDescriptions($validator);
$this->validateForeignCurrencyInformation($validator);
$this->validateAccountInformation($validator);
$this->validateSplitAccounts($validator);
}
);
}
/**
* Get transaction data.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @return array
*/
private function getTransactionData(): array
{
$return = [];
foreach ($this->get('transactions') as $index => $transaction) {
$return[] = [
'description' => $transaction['description'] ?? null,
'amount' => $transaction['amount'],
'currency_id' => isset($transaction['currency_id']) ? (int)$transaction['currency_id'] : null,
'currency_code' => $transaction['currency_code'] ?? null,
'foreign_amount' => $transaction['foreign_amount'] ?? null,
'foreign_currency_id' => isset($transaction['foreign_currency_id']) ? (int)$transaction['foreign_currency_id'] : null,
'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null,
'budget_id' => isset($transaction['budget_id']) ? (int)$transaction['budget_id'] : null,
'budget_name' => $transaction['budget_name'] ?? null,
'category_id' => isset($transaction['category_id']) ? (int)$transaction['category_id'] : null,
'category_name' => $transaction['category_name'] ?? null,
'source_id' => isset($transaction['source_id']) ? (int)$transaction['source_id'] : null,
'source_name' => isset($transaction['source_name']) ? (string)$transaction['source_name'] : null,
'destination_id' => isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null,
'destination_name' => isset($transaction['destination_name']) ? (string)$transaction['destination_name'] : null,
'reconciled' => $transaction['reconciled'] ?? false,
'identifier' => $index,
];
}
return $return;
}
}

View File

@@ -0,0 +1,101 @@
<?php
/**
* UserRequest.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
/**
* Class UserRequest
*/
class UserRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
$result = false;
// Only allow authenticated users
if (auth()->check()) {
/** @var User $user */
$user = auth()->user();
/** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class);
if ($repository->hasRole($user, 'owner')) {
$result = true; // @codeCoverageIgnore
}
}
return $result;
}
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
$data = [
'email' => $this->string('email'),
'blocked' => $this->boolean('blocked'),
'blocked_code' => $this->string('blocked_code'),
];
return $data;
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
$rules = [
'email' => 'required|email|unique:users,email,',
'blocked' => 'required|boolean',
'blocked_code' => 'in:email_changed',
];
switch ($this->method()) {
default:
break;
case 'PUT':
case 'PATCH':
$user = $this->route()->parameter('user');
$rules['email'] = 'required|email|unique:users,email,' . $user->id;
break;
}
return $rules;
}
}

View File

@@ -0,0 +1,392 @@
<?php
namespace FireflyIII\Console\Commands;
use Carbon\Carbon;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\Transaction;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\TransactionRules\Processor;
use Illuminate\Console\Command;
use Illuminate\Support\Collection;
/**
*
* Class ApplyRules
*/
class ApplyRules extends Command
{
use VerifiesAccessToken;
/**
* The console command description.
*
* @var string
*/
protected $description = 'This command will apply your rules and rule groups on a selection of your transactions.';
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature
= 'firefly:apply-rules
{--user=1 : The user ID that the import should import for.}
{--token= : The user\'s access token.}
{--accounts= : A comma-separated list of asset accounts or liabilities to apply your rules to.}
{--rule_groups= : A comma-separated list of rule groups to apply. Take the ID\'s of these rule groups from the Firefly III interface.}
{--rules= : A comma-separated list of rules to apply. Take the ID\'s of these rules from the Firefly III interface. Using this option overrules the option that selects rule groups.}
{--all_rules : If set, will overrule both settings and simply apply ALL of your rules.}
{--start_date= : The date of the earliest transaction to be included (inclusive). If omitted, will be your very first transaction ever. Format: YYYY-MM-DD}
{--end_date= : The date of the latest transaction to be included (inclusive). If omitted, will be your latest transaction ever. Format: YYYY-MM-DD}';
/** @var Collection */
private $accounts;
/** @var Carbon */
private $endDate;
/** @var Collection */
private $results;
/** @var Collection */
private $ruleGroups;
/** @var Collection */
private $rules;
/** @var Carbon */
private $startDate;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
$this->accounts = new Collection;
$this->rules = new Collection;
$this->ruleGroups = new Collection;
$this->results = new Collection;
}
/**
* Execute the console command.
*
* @return int
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function handle(): int
{
if (!$this->verifyAccessToken()) {
$this->error('Invalid access token.');
return 1;
}
$result = $this->verifyInput();
if (false === $result) {
return 1;
}
// get transactions from asset accounts.
/** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class);
$collector->setUser($this->getUser());
$collector->setAccounts($this->accounts);
$collector->setRange($this->startDate, $this->endDate);
$transactions = $collector->getTransactions();
$count = $transactions->count();
// first run all rule groups:
/** @var RuleGroupRepositoryInterface $ruleGroupRepos */
$ruleGroupRepos = app(RuleGroupRepositoryInterface::class);
$ruleGroupRepos->setUser($this->getUser());
/** @var RuleGroup $ruleGroup */
foreach ($this->ruleGroups as $ruleGroup) {
$this->line(sprintf('Going to apply rule group "%s" to %d transaction(s).', $ruleGroup->title, $count));
$rules = $ruleGroupRepos->getActiveStoreRules($ruleGroup);
$this->applyRuleSelection($rules, $transactions, true);
}
// then run all rules (rule groups should be empty).
if ($this->rules->count() > 0) {
$this->line(sprintf('Will apply %d rule(s) to %d transaction(s)', $this->rules->count(), $transactions->count()));
$this->applyRuleSelection($this->rules, $transactions, false);
}
// filter results:
$this->results = $this->results->unique(
function (Transaction $transaction) {
return (int)$transaction->journal_id;
}
);
$this->line('');
if (0 === $this->results->count()) {
$this->line('The rules were fired but did not influence any transactions.');
}
if ($this->results->count() > 0) {
$this->line(sprintf('The rule(s) was/were fired, and influenced %d transaction(s).', $this->results->count()));
foreach ($this->results as $result) {
$this->line(
vsprintf(
'Transaction #%d: "%s" (%s %s)',
[
$result->journal_id,
$result->description,
$result->transaction_currency_code,
round($result->transaction_amount, $result->transaction_currency_dp),
]
)
);
}
}
return 0;
}
/**
* @param Collection $rules
* @param Collection $transactions
* @param bool $breakProcessing
*
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function applyRuleSelection(Collection $rules, Collection $transactions, bool $breakProcessing): void
{
$bar = $this->output->createProgressBar($rules->count() * $transactions->count());
foreach ($rules as $rule) {
/** @var Processor $processor */
$processor = app(Processor::class);
$processor->make($rule, true);
/** @var Transaction $transaction */
foreach ($transactions as $transaction) {
/** @var Rule $rule */
$bar->advance();
$result = $processor->handleTransaction($transaction);
if (true === $result) {
$this->results->push($transaction);
}
}
if (true === $rule->stop_processing && true === $breakProcessing) {
$this->line('');
$this->line(sprintf('Rule #%d ("%s") says to stop processing.', $rule->id, $rule->title));
return;
}
}
$this->line('');
}
/**
*
*/
private function grabAllRules(): void
{
if (true === $this->option('all_rules')) {
/** @var RuleRepositoryInterface $ruleRepos */
$ruleRepos = app(RuleRepositoryInterface::class);
$ruleRepos->setUser($this->getUser());
$this->rules = $ruleRepos->getAll();
// reset rule groups.
$this->ruleGroups = new Collection;
}
}
/**
*
*/
private function parseDates(): void
{
// parse start date.
$startDate = Carbon::create()->startOfMonth();
$startString = $this->option('start_date');
if (null === $startString) {
/** @var JournalRepositoryInterface $repository */
$repository = app(JournalRepositoryInterface::class);
$repository->setUser($this->getUser());
$first = $repository->firstNull();
if (null !== $first) {
$startDate = $first->date;
}
}
if (null !== $startString && '' !== $startString) {
$startDate = Carbon::createFromFormat('Y-m-d', $startString);
}
// parse end date
$endDate = Carbon::now();
$endString = $this->option('end_date');
if (null !== $endString && '' !== $endString) {
$endDate = Carbon::createFromFormat('Y-m-d', $endString);
}
if ($startDate > $endDate) {
[$endDate, $startDate] = [$startDate, $endDate];
}
$this->startDate = $startDate;
$this->endDate = $endDate;
}
/**
* @return bool
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function verifyInput(): bool
{
// verify account.
$result = $this->verifyInputAccounts();
if (false === $result) {
return $result;
}
// verify rule groups.
$result = $this->verifyRuleGroups();
if (false === $result) {
return $result;
}
// verify rules.
$result = $this->verifyRules();
if (false === $result) {
return $result;
}
$this->grabAllRules();
$this->parseDates();
//$this->line('Number of rules found: ' . $this->rules->count());
$this->line('Start date is ' . $this->startDate->format('Y-m-d'));
$this->line('End date is ' . $this->endDate->format('Y-m-d'));
return true;
}
/**
* @return bool
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function verifyInputAccounts(): bool
{
$accountString = $this->option('accounts');
if (null === $accountString || '' === $accountString) {
$this->error('Please use the --accounts to indicate the accounts to apply rules to.');
return false;
}
$finalList = new Collection;
$accountList = explode(',', $accountString);
if (0 === \count($accountList)) {
$this->error('Please use the --accounts to indicate the accounts to apply rules to.');
return false;
}
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$accountRepository->setUser($this->getUser());
foreach ($accountList as $accountId) {
$accountId = (int)$accountId;
$account = $accountRepository->findNull($accountId);
if (null !== $account
&& \in_array(
$account->accountType->type, [AccountType::DEFAULT, AccountType::DEBT, AccountType::ASSET, AccountType::LOAN, AccountType::MORTGAGE], true
)) {
$finalList->push($account);
}
}
if (0 === $finalList->count()) {
$this->error('Please make sure all accounts in --accounts are asset accounts or liabilities.');
return false;
}
$this->accounts = $finalList;
return true;
}
/**
* @return bool
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function verifyRuleGroups(): bool
{
$ruleGroupString = $this->option('rule_groups');
if (null === $ruleGroupString || '' === $ruleGroupString) {
// can be empty.
return true;
}
$ruleGroupList = explode(',', $ruleGroupString);
if (0 === \count($ruleGroupList)) {
// can be empty.
return true;
}
/** @var RuleGroupRepositoryInterface $ruleGroupRepos */
$ruleGroupRepos = app(RuleGroupRepositoryInterface::class);
$ruleGroupRepos->setUser($this->getUser());
foreach ($ruleGroupList as $ruleGroupId) {
$ruleGroupId = (int)$ruleGroupId;
$ruleGroup = $ruleGroupRepos->find($ruleGroupId);
$this->ruleGroups->push($ruleGroup);
}
return true;
}
/**
* @return bool
* @throws \FireflyIII\Exceptions\FireflyException
*/
private function verifyRules(): bool
{
$ruleString = $this->option('rules');
if (null === $ruleString || '' === $ruleString) {
// can be empty.
return true;
}
$finalList = new Collection;
$ruleList = explode(',', $ruleString);
if (0 === \count($ruleList)) {
// can be empty.
return true;
}
/** @var RuleRepositoryInterface $ruleRepos */
$ruleRepos = app(RuleRepositoryInterface::class);
$ruleRepos->setUser($this->getUser());
foreach ($ruleList as $ruleId) {
$ruleId = (int)$ruleId;
$rule = $ruleRepos->find($ruleId);
if (null !== $rule) {
$finalList->push($rule);
}
}
if ($finalList->count() > 0) {
// reset rule groups.
$this->ruleGroups = new Collection;
$this->rules = $finalList;
}
return true;
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* CreateExport.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,11 +16,12 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
/** @noinspection MultipleReturnStatementsInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
@@ -32,19 +33,19 @@ use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use Illuminate\Console\Command;
use Storage;
use Illuminate\Support\Facades\Storage;
/**
* Class CreateExport
* Class CreateExport.
*
* Generates export from the command line.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class CreateExport extends Command
{
use VerifiesAccessToken;
/**
* The console command description.
*
@@ -65,29 +66,18 @@ class CreateExport extends Command
{--with_uploads : Include user\'s uploads?}';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five its fine.
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*
* Execute the console command.
*
* @return mixed
* @return int
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function handle()
public function handle(): int
{
if (!$this->verifyAccessToken()) {
$this->error('Invalid access token.');
return;
return 1;
}
$this->line('Full export is running...');
// make repositories
@@ -101,15 +91,18 @@ class CreateExport extends Command
$journalRepository = app(JournalRepositoryInterface::class);
// set user
$user = $userRepository->find(intval($this->option('user')));
$user = $userRepository->findNull((int)$this->option('user'));
if (null === $user) {
return 1;
}
$jobRepository->setUser($user);
$journalRepository->setUser($user);
$accountRepository->setUser($user);
// first date
$firstJournal = $journalRepository->first();
$firstJournal = $journalRepository->firstNull();
$first = new Carbon;
if (!is_null($firstJournal->id)) {
if (null !== $firstJournal) {
$first = $firstJournal->date;
}
@@ -125,7 +118,6 @@ class CreateExport extends Command
'job' => $job,
];
/** @var ProcessorInterface $processor */
$processor = app(ProcessorInterface::class);
$processor->setSettings($settings);
@@ -144,11 +136,15 @@ class CreateExport extends Command
$processor->createZipFile();
$disk = Storage::disk('export');
$fileName = sprintf('export-%s.zip', date('Y-m-d_H-i-s'));
$disk->move($job->key . '.zip', $fileName);
$localPath = storage_path('export') . '/' . $job->key . '.zip';
$this->line('The export has finished! You can find the ZIP file in this location:');
$this->line(storage_path(sprintf('export/%s', $fileName)));
// "move" from local to export disk
$disk->put($fileName, file_get_contents($localPath));
unlink($localPath);
return;
$this->line('The export has finished! You can find the ZIP file in export disk with file name:');
$this->line($fileName);
return 0;
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* CreateImport.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,28 +16,29 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** @noinspection MultipleReturnStatementsInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Artisan;
use FireflyIII\Import\Logging\CommandHandler;
use FireflyIII\Import\Routine\ImportRoutine;
use Exception;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\Prerequisites\PrerequisitesInterface;
use FireflyIII\Import\Routine\RoutineInterface;
use FireflyIII\Import\Storage\ImportArrayStorage;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use Illuminate\Console\Command;
use Illuminate\Support\MessageBag;
use Log;
use Monolog\Formatter\LineFormatter;
use Preferences;
/**
* Class CreateImport
* Class CreateImport.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class CreateImport extends Command
{
@@ -56,147 +57,244 @@ class CreateImport extends Command
*/
protected $signature
= 'firefly:create-import
{file : The file to import.}
{configuration : The configuration file to use for the import/}
{file? : The file to import.}
{configuration? : The configuration file to use for the import.}
{--type=csv : The file type of the import.}
{--user= : The user ID that the import should import for.}
{--provider=file : The file type of the import.}
{--user=1 : The user ID that the import should import for.}
{--token= : The user\'s access token.}
{--start : Starts the job immediately.}';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Run the command.
*
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly.
* @throws FireflyException
*/
public function handle()
public function handle(): int
{
if (!$this->verifyAccessToken()) {
$this->error('Invalid access token.');
$this->errorLine('Invalid access token.');
return;
return 1;
}
/** @var UserRepositoryInterface $userRepository */
$userRepository = app(UserRepositoryInterface::class);
$file = $this->argument('file');
$configuration = $this->argument('configuration');
$user = $userRepository->find(intval($this->option('user')));
$cwd = getcwd();
$type = strtolower($this->option('type'));
$userRepository = app(UserRepositoryInterface::class);
$file = (string)$this->argument('file');
$configuration = (string)$this->argument('configuration');
$user = $userRepository->findNull((int)$this->option('user'));
$cwd = getcwd();
$provider = strtolower((string)$this->option('provider'));
$configurationData = [];
if (null === $user) {
$this->errorLine('User is NULL.');
return 1;
}
if (!$this->validArguments()) {
return;
$this->errorLine('Invalid arguments.');
return 1;
}
if (\strlen($configuration) > 0) {
$configurationData = json_decode(file_get_contents($configuration), true);
if (null === $configurationData) {
$this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd));
return 1;
}
}
$configurationData = json_decode(file_get_contents($configuration));
if (is_null($configurationData)) {
$this->error(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd));
return;
}
$this->line(sprintf('Going to create a job to import file: %s', $file));
$this->line(sprintf('Using configuration file: %s', $configuration));
$this->line(sprintf('Import into user: #%d (%s)', $user->id, $user->email));
$this->line(sprintf('Type of import: %s', $type));
$this->infoLine(sprintf('Going to create a job to import file: %s', $file));
$this->infoLine(sprintf('Using configuration file: %s', $configuration));
$this->infoLine(sprintf('Import into user: #%d (%s)', $user->id, $user->email));
$this->infoLine(sprintf('Type of import: %s', $provider));
/** @var ImportJobRepositoryInterface $jobRepository */
$jobRepository = app(ImportJobRepositoryInterface::class);
$jobRepository->setUser($user);
$job = $jobRepository->create($type);
$this->line(sprintf('Created job "%s"', $job->key));
$importJob = $jobRepository->create($provider);
$this->infoLine(sprintf('Created job "%s"', $importJob->key));
Artisan::call('firefly:encrypt-file', ['file' => $file, 'key' => $job->key]);
$this->line('Stored import data...');
$job->configuration = $configurationData;
$job->status = 'configured';
$job->save();
$this->line('Stored configuration...');
if ($this->option('start') === true) {
$this->line('The import will start in a moment. This process is not visible...');
Log::debug('Go for import!');
// normally would refer to other firefly:start-import but that doesn't seem to work all to well...
$monolog = Log::getMonolog();
$handler = new CommandHandler($this);
$formatter = new LineFormatter(null, null, false, true);
$handler->setFormatter($formatter);
$monolog->pushHandler($handler);
// start the actual routine:
/** @var ImportRoutine $routine */
$routine = app(ImportRoutine::class);
$routine->setJob($job);
$routine->run();
// give feedback.
/** @var MessageBag $error */
foreach ($routine->errors as $index => $error) {
$this->error(sprintf('Error importing line #%d: %s', $index, $error));
// make sure that job has no prerequisites.
if ((bool)config(sprintf('import.has_prereq.%s', $provider))) {
// make prerequisites thing.
$class = (string)config(sprintf('import.prerequisites.%s', $provider));
if (!class_exists($class)) {
throw new FireflyException(sprintf('No class to handle prerequisites for "%s".', $provider)); // @codeCoverageIgnore
}
/** @var PrerequisitesInterface $object */
$object = app($class);
$object->setUser($user);
if (!$object->isComplete()) {
$this->errorLine(sprintf('Import provider "%s" has prerequisites that can only be filled in using the browser.', $provider));
return 1;
}
$this->line(
sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->journals->count(), $routine->lines)
);
}
// clear cache for user:
Preferences::setForUser($user, 'lastActivity', microtime());
// store file as attachment.
if (\strlen($file) > 0) {
$messages = $jobRepository->storeCLIUpload($importJob, 'import_file', $file);
if ($messages->count() > 0) {
$this->errorLine($messages->first());
return;
return 1;
}
$this->infoLine('File content saved.');
}
$this->infoLine('Job configuration saved.');
$jobRepository->setConfiguration($importJob, $configurationData);
$jobRepository->setStatus($importJob, 'ready_to_run');
if (true === $this->option('start')) {
$this->infoLine('The import routine has started. The process is not visible. Please wait.');
Log::debug('Go for import!');
// run it!
$key = sprintf('import.routine.%s', $provider);
$className = config($key);
if (null === $className || !class_exists($className)) {
// @codeCoverageIgnoreStart
$this->errorLine(sprintf('No routine for provider "%s"', $provider));
return 1;
// @codeCoverageIgnoreEnd
}
// keep repeating this call until job lands on "provider_finished"
$valid = ['provider_finished'];
$count = 0;
while (!\in_array($importJob->status, $valid, true) && $count < 6) {
Log::debug(sprintf('Now in loop #%d.', $count + 1));
/** @var RoutineInterface $routine */
$routine = app($className);
$routine->setImportJob($importJob);
try {
$routine->run();
} catch (FireflyException|Exception $e) {
$message = 'The import routine crashed: ' . $e->getMessage();
Log::error($message);
Log::error($e->getTraceAsString());
// set job errored out:
$jobRepository->setStatus($importJob, 'error');
$this->errorLine($message);
return 1;
}
$count++;
}
if ('provider_finished' === $importJob->status) {
$this->infoLine('Import has finished. Please wait for storage of data.');
// set job to be storing data:
$jobRepository->setStatus($importJob, 'storing_data');
/** @var ImportArrayStorage $storage */
$storage = app(ImportArrayStorage::class);
$storage->setImportJob($importJob);
try {
$storage->store();
} catch (FireflyException|Exception $e) {
$message = 'The import routine crashed: ' . $e->getMessage();
Log::error($message);
Log::error($e->getTraceAsString());
// set job errored out:
$jobRepository->setStatus($importJob, 'error');
$this->errorLine($message);
return 1;
}
// set storage to be finished:
$jobRepository->setStatus($importJob, 'storage_finished');
}
// give feedback:
$this->infoLine('Job has finished.');
if (null !== $importJob->tag) {
$this->infoLine(sprintf('%d transaction(s) have been imported.', $importJob->tag->transactionJournals->count()));
$this->infoLine(sprintf('You can find your transactions under tag "%s"', $importJob->tag->tag));
}
if (null === $importJob->tag) {
$this->errorLine('No transactions have been imported :(.');
}
if (\count($importJob->errors) > 0) {
$this->infoLine(sprintf('%d error(s) occurred:', \count($importJob->errors)));
foreach ($importJob->errors as $err) {
$this->errorLine('- ' . $err);
}
}
}
// clear cache for user:
app('preferences')->setForUser($user, 'lastActivity', microtime());
return 0;
}
/**
* @param string $message
* @param array|null $data
*/
private function errorLine(string $message, array $data = null): void
{
Log::error($message, $data ?? []);
$this->error($message);
}
/**
* @param string $message
* @param array $data
*/
private function infoLine(string $message, array $data = null): void
{
Log::info($message, $data ?? []);
$this->line($message);
}
/**
* Verify user inserts correct arguments.
*
* @noinspection MultipleReturnStatementsInspection
* @return bool
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly.
*/
private function validArguments(): bool
{
/** @var UserRepositoryInterface $userRepository */
$userRepository = app(UserRepositoryInterface::class);
$file = $this->argument('file');
$configuration = $this->argument('configuration');
$user = $userRepository->find(intval($this->option('user')));
$cwd = getcwd();
$validTypes = array_keys(config('firefly.import_formats'));
$type = strtolower($this->option('type'));
if (is_null($user->id)) {
$this->error(sprintf('There is no user with ID %d.', $this->option('user')));
$file = (string)$this->argument('file');
$configuration = (string)$this->argument('configuration');
$cwd = getcwd();
$validTypes = config('import.options.file.import_formats');
$type = strtolower($this->option('type'));
$provider = strtolower($this->option('provider'));
$enabled = (bool)config(sprintf('import.enabled.%s', $provider));
if (false === $enabled) {
$this->errorLine(sprintf('Provider "%s" is not enabled.', $provider));
return false;
}
if (!in_array($type, $validTypes)) {
$this->error(sprintf('Cannot import file of type "%s"', $type));
if ('file' === $provider && !\in_array($type, $validTypes, true)) {
$this->errorLine(sprintf('Cannot import file of type "%s"', $type));
return false;
}
if (!file_exists($file)) {
$this->error(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd));
if ('file' === $provider && !file_exists($file)) {
$this->errorLine(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd));
return false;
}
if (!file_exists($configuration)) {
$this->error(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd));
if ('file' === $provider && !file_exists($configuration)) {
$this->errorLine(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd));
return false;
}

View File

@@ -0,0 +1,67 @@
<?php
namespace FireflyIII\Console\Commands;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Support\Cronjobs\RecurringCronjob;
use Illuminate\Console\Command;
/**
* Class Cron
*
* @codeCoverageIgnore
*/
class Cron extends Command
{
/**
* The console command description.
*
* @var string
*/
protected $description = 'Runs all Firefly III cron-job related commands. Configure a cron job according to the official Firefly III documentation.';
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'firefly:cron';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle(): int
{
$recurring = new RecurringCronjob;
try {
$result = $recurring->fire();
} catch (FireflyException $e) {
$this->error($e->getMessage());
return 0;
}
if (false === $result) {
$this->line('The recurring transaction cron job did not fire.');
}
if (true === $result) {
$this->line('The recurring transaction cron job fired successfully.');
}
$this->info('More feedback on the cron jobs can be found in the log files.');
return 0;
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* DecryptAttachment.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,9 +16,11 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** @noinspection MultipleReturnStatementsInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
@@ -28,9 +30,9 @@ use Illuminate\Console\Command;
use Log;
/**
* Class DecryptAttachment
* Class DecryptAttachment.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class DecryptAttachment extends Command
{
@@ -50,71 +52,60 @@ class DecryptAttachment extends Command
= 'firefly:decrypt-attachment {id:The ID of the attachment.} {name:The file name of the attachment.}
{directory:Where the file must be stored.}';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five its fine.
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*
* @return int
*/
public function handle()
public function handle(): int
{
/** @var AttachmentRepositoryInterface $repository */
$repository = app(AttachmentRepositoryInterface::class);
$attachmentId = intval($this->argument('id'));
$attachmentId = (int)$this->argument('id');
$attachment = $repository->findWithoutUser($attachmentId);
$attachmentName = trim($this->argument('name'));
$storagePath = realpath(trim($this->argument('directory')));
if (is_null($attachment->id)) {
$attachmentName = trim((string)$this->argument('name'));
$storagePath = realpath(trim((string)$this->argument('directory')));
if (null === $attachment) {
$this->error(sprintf('No attachment with id #%d', $attachmentId));
Log::error(sprintf('DecryptAttachment: No attachment with id #%d', $attachmentId));
return;
return 1;
}
if ($attachmentName !== $attachment->filename) {
$this->error('File name does not match.');
Log::error('DecryptAttachment: File name does not match.');
return;
return 1;
}
if (!is_dir($storagePath)) {
$this->error(sprintf('Path "%s" is not a directory.', $storagePath));
Log::error(sprintf('DecryptAttachment: Path "%s" is not a directory.', $storagePath));
return;
return 1;
}
if (!is_writable($storagePath)) {
$this->error(sprintf('Path "%s" is not writable.', $storagePath));
Log::error(sprintf('DecryptAttachment: Path "%s" is not writable.', $storagePath));
return;
return 1;
}
$fullPath = $storagePath . DIRECTORY_SEPARATOR . $attachment->filename;
$content = $repository->getContent($attachment);
$this->line(sprintf('Going to write content for attachment #%d into file "%s"', $attachment->id, $fullPath));
$result = file_put_contents($fullPath, $content);
if ($result === false) {
if (false === $result) {
$this->error('Could not write to file.');
return;
return 1;
}
$this->info(sprintf('%d bytes written. Exiting now..', $result));
return;
return 0;
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* EncryptFile.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,20 +16,21 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Crypt;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Internal\File\EncryptService;
use Illuminate\Console\Command;
/**
* Class EncryptFile
* Class EncryptFile.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class EncryptFile extends Command
{
@@ -38,7 +39,7 @@ class EncryptFile extends Command
*
* @var string
*/
protected $description = 'Encrypts a file and places it in the storage/upload directory.';
protected $description = 'Encrypts a file and places it in the upload disk.';
/**
* The name and signature of the console command.
@@ -47,32 +48,26 @@ class EncryptFile extends Command
*/
protected $signature = 'firefly:encrypt-file {file} {key}';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @throws \Illuminate\Contracts\Encryption\EncryptException
*/
public function handle()
public function handle(): int
{
$file = e(strval($this->argument('file')));
if (!file_exists($file)) {
$this->error(sprintf('File "%s" does not seem to exist.', $file));
$code = 0;
$file = (string)$this->argument('file');
$key = (string)$this->argument('key');
/** @var EncryptService $service */
$service = app(EncryptService::class);
return;
try {
$service->encrypt($file, $key);
} catch (FireflyException $e) {
$this->error($e->getMessage());
$code = 1;
}
$content = file_get_contents($file);
$content = Crypt::encrypt($content);
$newName = e(strval($this->argument('key'))) . '.upload';
$path = storage_path('upload') . '/' . $newName;
file_put_contents($path, $content);
$this->line(sprintf('Encrypted "%s" and put it in "%s"', $file, $path));
return $code;
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* Import.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,24 +16,27 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** @noinspection MultipleReturnStatementsInspection */
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use FireflyIII\Import\Logging\CommandHandler;
use FireflyIII\Import\Routine\ImportRoutine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\Routine\RoutineInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\Tag;
use Illuminate\Console\Command;
use Illuminate\Support\MessageBag;
use Log;
/**
* Class Import
* Class Import.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class Import extends Command
{
@@ -52,52 +55,87 @@ class Import extends Command
protected $signature = 'firefly:start-import {key}';
/**
* Create a new command instance.
* Run the import routine.
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*
* @throws FireflyException
*/
public function __construct()
public function handle(): int
{
parent::__construct();
Log::debug('Start start-import command');
$jobKey = (string)$this->argument('key');
/** @var ImportJob $job */
$job = ImportJob::where('key', $jobKey)->first();
if (null === $job) {
$this->errorLine(sprintf('No job found with key "%s"', $jobKey));
return 1;
}
if (!$this->isValid($job)) {
$this->errorLine('Job is not valid for some reason. Exit.');
return 1;
}
$this->infoLine(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type));
// actually start job:
$type = 'csv' === $job->file_type ? 'file' : $job->file_type;
$key = sprintf('import.routine.%s', $type);
$className = config($key);
if (null === $className || !class_exists($className)) {
throw new FireflyException(sprintf('Cannot find import routine class for job of type "%s".', $type)); // @codeCoverageIgnore
}
/** @var RoutineInterface $routine */
$routine = app($className);
$routine->setImportJob($job);
$routine->run();
/**
* @var int $index
* @var string $error
*/
foreach ($job->errors as $index => $error) {
$this->errorLine(sprintf('Error importing line #%d: %s', $index, $error));
}
/** @var Tag $tag */
$tag = $job->tag()->first();
$count = 0;
if (null === $tag) {
$count = $tag->transactionJournals()->count();
}
$this->infoLine(sprintf('The import has finished. %d transactions have been imported.', $count));
return 0;
}
/**
* Run the import routine.
* Displays an error.
*
* @param string $message
* @param array|null $data
*/
public function handle()
private function errorLine(string $message, array $data = null): void
{
Log::debug('Start start-import command');
$jobKey = $this->argument('key');
$job = ImportJob::where('key', $jobKey)->first();
if (is_null($job)) {
$this->error(sprintf('No job found with key "%s"', $jobKey));
Log::error($message, $data ?? []);
$this->error($message);
return;
}
if (!$this->isValid($job)) {
Log::error('Job is not valid for some reason. Exit.');
}
return;
}
$this->line(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type));
$monolog = Log::getMonolog();
$handler = new CommandHandler($this);
$monolog->pushHandler($handler);
/** @var ImportRoutine $routine */
$routine = app(ImportRoutine::class);
$routine->setJob($job);
$routine->run();
/** @var MessageBag $error */
foreach ($routine->errors as $index => $error) {
$this->error(sprintf('Error importing line #%d: %s', $index, $error));
}
$this->line(sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->journals->count(), $routine->lines));
return;
/**
* Displays an informational message.
*
* @param string $message
* @param array $data
*/
private function infoLine(string $message, array $data = null): void
{
Log::info($message, $data ?? []);
$this->line($message);
}
/**
@@ -109,16 +147,15 @@ class Import extends Command
*/
private function isValid(ImportJob $job): bool
{
if (is_null($job)) {
Log::error('This job does not seem to exist.');
$this->error('This job does not seem to exist.');
if (null === $job) {
$this->errorLine('This job does not seem to exist.');
return false;
}
if ($job->status !== 'configured') {
if ('configured' !== $job->status) {
Log::error(sprintf('This job is not ready to be imported (status is %s).', $job->status));
$this->error('This job is not ready to be imported.');
$this->errorLine('This job is not ready to be imported.');
return false;
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* ScanAttachments.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,9 +16,11 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
@@ -31,9 +33,9 @@ use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Storage;
/**
* Class ScanAttachments
* Class ScanAttachments.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class ScanAttachments extends Command
{
@@ -51,19 +53,10 @@ class ScanAttachments extends Command
*/
protected $signature = 'firefly:scan-attachments';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
$attachments = Attachment::get();
$disk = Storage::disk('upload');
@@ -73,13 +66,13 @@ class ScanAttachments extends Command
try {
$content = $disk->get($fileName);
} catch (FileNotFoundException $e) {
$this->error(sprintf('Could not find data for attachment #%d', $attachment->id));
$this->error(sprintf('Could not find data for attachment #%d: %s', $attachment->id, $e->getMessage()));
continue;
}
try {
$decrypted = Crypt::decrypt($content);
} catch (DecryptException $e) {
$this->error(sprintf('Could not decrypt data of attachment #%d', $attachment->id));
$this->error(sprintf('Could not decrypt data of attachment #%d: %s', $attachment->id, $e->getMessage()));
continue;
}
$tmpfname = tempnam(sys_get_temp_dir(), 'FireflyIII');
@@ -91,5 +84,7 @@ class ScanAttachments extends Command
$attachment->save();
$this->line(sprintf('Fixed attachment #%d', $attachment->id));
}
return 0;
}
}

View File

@@ -1,7 +1,8 @@
<?php
/**
* UpgradeDatabase.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,46 +17,58 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** @noinspection MultipleReturnStatementsInspection */
/** @noinspection PhpStaticAsDynamicMethodCallInspection */
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use DB;
use Exception;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill;
use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\LimitRepetition;
use FireflyIII\Models\Note;
use FireflyIII\Models\Preference;
use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleAction;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\RuleTrigger;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionJournalMeta;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\User;
use Illuminate\Console\Command;
use Illuminate\Database\QueryException;
use Illuminate\Support\Collection;
use Log;
use Preferences;
use Schema;
use UnexpectedValueException;
/**
* Class UpgradeDatabase
* Class UpgradeDatabase.
*
* Upgrade user database.
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) // it just touches a lot of things.
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class UpgradeDatabase extends Command
{
/**
* The console command description.
*
@@ -69,54 +82,174 @@ class UpgradeDatabase extends Command
*/
protected $signature = 'firefly:upgrade-database';
/**
* Create a new command instance.
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
$this->setTransactionIdentifier();
$this->migrateRepetitions();
$this->updateAccountCurrencies();
$this->createNewTypes();
$this->line('Updating currency information..');
$this->updateTransferCurrencies();
$this->updateOtherCurrencies();
$this->line('Done updating currency information..');
$this->migrateNotes();
$this->migrateAttachmentData();
$this->migrateBillsToRules();
$this->budgetLimitCurrency();
$this->removeCCLiabilities();
$this->info('Firefly III database is up to date.');
return;
return 0;
}
/**
* Migrate budget repetitions to new format where the end date is in the budget limit as well,
* making the limit_repetition table obsolete.
* Since it is one routine these warnings make sense and should be supressed.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function migrateRepetitions(): void
public function migrateBillsToRules(): void
{
$set = BudgetLimit::whereNull('end_date')->get();
/** @var BudgetLimit $budgetLimit */
foreach ($set as $budgetLimit) {
/** @var LimitRepetition $repetition */
$repetition = $budgetLimit->limitrepetitions()->first();
if (!is_null($repetition)) {
$budgetLimit->end_date = $repetition->enddate;
$budgetLimit->save();
$this->line(sprintf('Updated budget limit #%d', $budgetLimit->id));
$repetition->delete();
foreach (User::get() as $user) {
/** @var Preference $lang */
$lang = app('preferences')->getForUser($user, 'language', 'en_US');
$groupName = (string)trans('firefly.rulegroup_for_bills_title', [], $lang->data);
$ruleGroup = $user->ruleGroups()->where('title', $groupName)->first();
$currencyPreference = app('preferences')->getForUser($user, 'currencyPreference', config('firefly.default_currency', 'EUR'));
if (null === $currencyPreference) {
$this->error('User has no currency preference. Impossible.');
return;
}
$currency = TransactionCurrency::where('code', $currencyPreference->data)->first();
if (null === $currency) {
$this->line('Fall back to default currency in migrateBillsToRules().');
$currency = app('amount')->getDefaultCurrency();
}
if (null === $ruleGroup) {
$array = RuleGroup::get(['order'])->pluck('order')->toArray();
$order = \count($array) > 0 ? max($array) + 1 : 1;
$ruleGroup = RuleGroup::create(
[
'user_id' => $user->id,
'title' => (string)trans('firefly.rulegroup_for_bills_title', [], $lang->data),
'description' => (string)trans('firefly.rulegroup_for_bills_description', [], $lang->data),
'order' => $order,
'active' => 1,
]
);
}
// loop bills.
$order = 1;
/** @var Collection $collection */
$collection = $user->bills()->get();
/** @var Bill $bill */
foreach ($collection as $bill) {
if ('MIGRATED_TO_RULES' !== $bill->match) {
$rule = Rule::create(
[
'user_id' => $user->id,
'rule_group_id' => $ruleGroup->id,
'title' => (string)trans('firefly.rule_for_bill_title', ['name' => $bill->name], $lang->data),
'description' => (string)trans('firefly.rule_for_bill_description', ['name' => $bill->name], $lang->data),
'order' => $order,
'active' => $bill->active,
'stop_processing' => 1,
]
);
// add default trigger
RuleTrigger::create(
[
'rule_id' => $rule->id,
'trigger_type' => 'user_action',
'trigger_value' => 'store-journal',
'active' => 1,
'stop_processing' => 0,
'order' => 1,
]
);
// add trigger for description
$match = implode(' ', explode(',', $bill->match));
RuleTrigger::create(
[
'rule_id' => $rule->id,
'trigger_type' => 'description_contains',
'trigger_value' => $match,
'active' => 1,
'stop_processing' => 0,
'order' => 2,
]
);
if ($bill->amount_max !== $bill->amount_min) {
// add triggers for amounts:
RuleTrigger::create(
[
'rule_id' => $rule->id,
'trigger_type' => 'amount_less',
'trigger_value' => round($bill->amount_max, $currency->decimal_places),
'active' => 1,
'stop_processing' => 0,
'order' => 3,
]
);
RuleTrigger::create(
[
'rule_id' => $rule->id,
'trigger_type' => 'amount_more',
'trigger_value' => round((float)$bill->amount_min, $currency->decimal_places),
'active' => 1,
'stop_processing' => 0,
'order' => 4,
]
);
}
if ($bill->amount_max === $bill->amount_min) {
RuleTrigger::create(
[
'rule_id' => $rule->id,
'trigger_type' => 'amount_exactly',
'trigger_value' => round((float)$bill->amount_min, $currency->decimal_places),
'active' => 1,
'stop_processing' => 0,
'order' => 3,
]
);
}
// create action
RuleAction::create(
[
'rule_id' => $rule->id,
'action_type' => 'link_to_bill',
'action_value' => $bill->name,
'order' => 1,
'active' => 1,
'stop_processing' => 0,
]
);
$order++;
$bill->match = 'MIGRATED_TO_RULES';
$bill->save();
$this->line(sprintf('Updated bill #%d ("%s") so it will use rules.', $bill->id, $bill->name));
}
// give bills a currency when they dont have one.
if (null === $bill->transaction_currency_id) {
$this->line(sprintf('Gave bill #%d ("%s") a currency (%s).', $bill->id, $bill->name, $currency->name));
$bill->transactionCurrency()->associate($currency);
$bill->save();
}
}
}
return;
}
/**
@@ -146,34 +279,40 @@ class UpgradeDatabase extends Command
$journalIds = array_unique($result->pluck('id')->toArray());
foreach ($journalIds as $journalId) {
$this->updateJournalidentifiers(intval($journalId));
$this->updateJournalidentifiers((int)$journalId);
}
return;
}
/**
* Each (asset) account must have a reference to a preferred currency. If the account does not have one, it's forced upon the account.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's seven but it can't really be helped.
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function updateAccountCurrencies(): void
{
$accounts = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id')
->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->get(['accounts.*']);
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
$accounts->each(
function (Account $account) {
function (Account $account) use ($repository) {
$repository->setUser($account->user);
// get users preference, fall back to system pref.
$defaultCurrencyCode = Preferences::getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data;
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data;
$defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first();
$accountCurrency = intval($account->getMeta('currency_id'));
$accountCurrency = (int)$repository->getMetaValue($account, 'currency_id');
$openingBalance = $account->getOpeningBalance();
$obCurrency = intval($openingBalance->transaction_currency_id);
$obCurrency = (int)$openingBalance->transaction_currency_id;
if (null === $defaultCurrency) {
throw new UnexpectedValueException('The default currency is NULL, and this is more or less impossible.');
}
// both 0? set to default currency:
if ($accountCurrency === 0 && $obCurrency === 0) {
if (0 === $accountCurrency && 0 === $obCurrency) {
AccountMeta::where('account_id', $account->id)->where('name', 'currency_id')->forceDelete();
AccountMeta::create(['account_id' => $account->id, 'name' => 'currency_id', 'data' => $defaultCurrency->id]);
$this->line(sprintf('Account #%d ("%s") now has a currency setting (%s).', $account->id, $account->name, $defaultCurrencyCode));
@@ -181,7 +320,7 @@ class UpgradeDatabase extends Command
}
// account is set to 0, opening balance is not?
if ($accountCurrency === 0 && $obCurrency > 0) {
if (0 === $accountCurrency && $obCurrency > 0) {
AccountMeta::create(['account_id' => $account->id, 'name' => 'currency_id', 'data' => $obCurrency]);
$this->line(sprintf('Account #%d ("%s") now has a currency setting (%s).', $account->id, $account->name, $defaultCurrencyCode));
@@ -202,7 +341,6 @@ class UpgradeDatabase extends Command
}
);
return;
}
/**
@@ -212,42 +350,49 @@ class UpgradeDatabase extends Command
* Both source and destination must match the respective currency preference of the related asset account.
* So FF3 must verify all transactions.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function updateOtherCurrencies(): void
{
/** @var CurrencyRepositoryInterface $repository */
$repository = app(CurrencyRepositoryInterface::class);
$set = TransactionJournal
/** @var AccountRepositoryInterface $accountRepos */
$accountRepos = app(AccountRepositoryInterface::class);
$set = TransactionJournal
::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
->whereIn('transaction_types.type', [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::OPENING_BALANCE])
->get(['transaction_journals.*']);
$set->each(
function (TransactionJournal $journal) use ($repository) {
function (TransactionJournal $journal) use ($repository, $accountRepos) {
// get the transaction with the asset account in it:
/** @var Transaction $transaction */
$transaction = $journal->transactions()
->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id')
->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id')
->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->first(['transactions.*']);
if (is_null($transaction)) {
if (null === $transaction) {
return;
}
$accountRepos->setUser($journal->user);
/** @var Account $account */
$account = $transaction->account;
$currency = $repository->find(intval($account->getMeta('currency_id')));
$account = $transaction->account;
$currency = $repository->findNull((int)$accountRepos->getMetaValue($account, 'currency_id'));
if (null === $currency) {
return;
}
$transactions = $journal->transactions()->get();
$transactions->each(
function (Transaction $transaction) use ($currency) {
if (is_null($transaction->transaction_currency_id)) {
if (null === $transaction->transaction_currency_id) {
$transaction->transaction_currency_id = $currency->id;
$transaction->save();
}
// when mismatch in transaction:
if ($transaction->transaction_currency_id !== $currency->id) {
$transaction->foreign_currency_id = $transaction->transaction_currency_id;
if (!((int)$transaction->transaction_currency_id === (int)$currency->id)) {
$transaction->foreign_currency_id = (int)$transaction->transaction_currency_id;
$transaction->foreign_amount = $transaction->amount;
$transaction->transaction_currency_id = $currency->id;
$transaction->save();
@@ -260,7 +405,6 @@ class UpgradeDatabase extends Command
}
);
return;
}
/**
@@ -273,7 +417,7 @@ class UpgradeDatabase extends Command
* Both source and destination must match the respective currency preference. So FF3 must verify ALL
* transactions.
*/
public function updateTransferCurrencies()
public function updateTransferCurrencies(): void
{
$set = TransactionJournal
::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
@@ -295,29 +439,124 @@ class UpgradeDatabase extends Command
);
}
/**
*
*/
private function budgetLimitCurrency(): void
{
$budgetLimits = BudgetLimit::get();
/** @var BudgetLimit $budgetLimit */
foreach ($budgetLimits as $budgetLimit) {
if (null === $budgetLimit->transaction_currency_id) {
$budget = $budgetLimit->budget;
if (null !== $budget) {
$user = $budget->user;
if (null !== $user) {
$currency = \Amount::getDefaultCurrencyByUser($user);
$budgetLimit->transaction_currency_id = $currency->id;
$budgetLimit->save();
$this->line(
sprintf('Budget limit #%d (part of budget "%s") now has a currency setting (%s).', $budgetLimit->id, $budget->name, $currency->name)
);
}
}
}
}
}
private function createNewTypes(): void
{
// create transaction type "Reconciliation".
$type = TransactionType::where('type', TransactionType::RECONCILIATION)->first();
if (null === $type) {
TransactionType::create(['type' => TransactionType::RECONCILIATION]);
}
$account = AccountType::where('type', AccountType::RECONCILIATION)->first();
if (null === $account) {
AccountType::create(['type' => AccountType::RECONCILIATION]);
}
}
/**
* Move the description of each attachment (when not NULL) to the notes or to a new note object
* for all attachments.
*/
private function migrateAttachmentData(): void
{
$attachments = Attachment::get();
/** @var Attachment $att */
foreach ($attachments as $att) {
// move description:
$description = (string)$att->description;
if (\strlen($description) > 0) {
// find or create note:
$note = $att->notes()->first();
if (null === $note) {
$note = new Note;
$note->noteable()->associate($att);
}
$note->text = $description;
$note->save();
// clear description:
$att->description = '';
$att->save();
Log::debug(sprintf('Migrated attachment #%s description to note #%d', $att->id, $note->id));
}
}
}
/**
* Move all the journal_meta notes to their note object counter parts.
*/
private function migrateNotes(): void
{
/** @noinspection PhpUndefinedMethodInspection */
$set = TransactionJournalMeta::whereName('notes')->get();
/** @var TransactionJournalMeta $meta */
foreach ($set as $meta) {
$journal = $meta->transactionJournal;
$note = $journal->notes()->first();
if (is_null($note)) {
$note = new Note;
if (null === $note) {
$note = new Note();
$note->noteable()->associate($journal);
}
$note->text = $meta->data;
$note->save();
Log::debug(sprintf('Migrated meta note #%d to Note #%d', $meta->id, $note->id));
$meta->delete();
try {
$meta->delete();
} catch (Exception $e) {
Log::error(sprintf('Could not delete old meta entry #%d: %s', $meta->id, $e->getMessage()));
}
}
}
/**
*
*/
private function removeCCLiabilities(): void
{
$ccType = AccountType::where('type', AccountType::CREDITCARD)->first();
$debtType =AccountType::where('type', AccountType::DEBT)->first();
if(null === $ccType || null === $debtType) {
return;
}
/** @var Collection $accounts */
$accounts = Account::where('account_type_id', $ccType->id)->get();
foreach($accounts as $account) {
$account->account_type_id = $debtType->id;
$account->save();
$this->line(sprintf('Converted credit card liability account "%s" (#%d) to generic debt liability.', $account->name, $account->id));
}
if($accounts->count() > 0) {
$this->info('Credit card liability types are no longer supported and have been converted to generic debts. See: http://bit.ly/FF3-credit-cards');
}
}
/**
* This method makes sure that the transaction journal uses the currency given in the transaction.
@@ -328,13 +567,23 @@ class UpgradeDatabase extends Command
{
/** @var CurrencyRepositoryInterface $repository */
$repository = app(CurrencyRepositoryInterface::class);
$currency = $repository->find(intval($transaction->account->getMeta('currency_id')));
$journal = $transaction->transactionJournal;
/** @var AccountRepositoryInterface $accountRepos */
$accountRepos = app(AccountRepositoryInterface::class);
$accountRepos->setUser($transaction->account->user);
$currency = $repository->findNull((int)$accountRepos->getMetaValue($transaction->account, 'currency_id'));
$journal = $transaction->transactionJournal;
if (!(intval($currency->id) === intval($journal->transaction_currency_id))) {
if (null === $currency) {
return;
}
if (!((int)$currency->id === (int)$journal->transaction_currency_id)) {
$this->line(
sprintf(
'Transfer #%d ("%s") has been updated to use %s instead of %s.', $journal->id, $journal->description, $currency->code,
'Transfer #%d ("%s") has been updated to use %s instead of %s.',
$journal->id,
$journal->description,
$currency->code,
$journal->transactionCurrency->code
)
);
@@ -342,7 +591,6 @@ class UpgradeDatabase extends Command
$journal->save();
}
return;
}
/**
@@ -359,7 +607,7 @@ class UpgradeDatabase extends Command
/** @var Transaction $transaction */
foreach ($transactions as $transaction) {
// find opposing:
$amount = bcmul(strval($transaction->amount), '-1');
$amount = bcmul((string)$transaction->amount, '-1');
try {
/** @var Transaction $opposing */
@@ -376,7 +624,7 @@ class UpgradeDatabase extends Command
return;
}
if (!is_null($opposing)) {
if (null !== $opposing) {
// give both a new identifier:
$transaction->identifier = $identifier;
$opposing->identifier = $identifier;
@@ -385,10 +633,9 @@ class UpgradeDatabase extends Command
$processed[] = $transaction->id;
$processed[] = $opposing->id;
}
$identifier++;
++$identifier;
}
return;
}
/**
@@ -397,11 +644,11 @@ class UpgradeDatabase extends Command
*
* The transaction that is sent to this function MUST be the source transaction (amount negative).
*
* Method is long and complex bit I'm taking it for granted.
* Method is long and complex but I'll allow it. https://imgur.com/gallery/dVDJiez
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*
* @param Transaction $transaction
*/
@@ -409,25 +656,41 @@ class UpgradeDatabase extends Command
{
/** @var CurrencyRepositoryInterface $repository */
$repository = app(CurrencyRepositoryInterface::class);
$currency = $repository->find(intval($transaction->account->getMeta('currency_id')));
/** @var AccountRepositoryInterface $accountRepos */
$accountRepos = app(AccountRepositoryInterface::class);
/** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class);
$accountRepos->setUser($transaction->account->user);
$journalRepos->setUser($transaction->account->user);
$currency = $repository->findNull((int)$accountRepos->getMetaValue($transaction->account, 'currency_id'));
if (null === $currency) {
Log::error(sprintf('Account #%d ("%s") must have currency preference but has none.', $transaction->account->id, $transaction->account->name));
return;
}
// has no currency ID? Must have, so fill in using account preference:
if (is_null($transaction->transaction_currency_id)) {
$transaction->transaction_currency_id = $currency->id;
if (null === $transaction->transaction_currency_id) {
$transaction->transaction_currency_id = (int)$currency->id;
Log::debug(sprintf('Transaction #%d has no currency setting, now set to %s', $transaction->id, $currency->code));
$transaction->save();
}
// does not match the source account (see above)? Can be fixed
// when mismatch in transaction and NO foreign amount is set:
if ($transaction->transaction_currency_id !== $currency->id && is_null($transaction->foreign_amount)) {
if (!((int)$transaction->transaction_currency_id === (int)$currency->id) && null === $transaction->foreign_amount) {
Log::debug(
sprintf(
'Transaction #%d has a currency setting (#%d) that should be #%d. Amount remains %s, currency is changed.', $transaction->id,
$transaction->transaction_currency_id, $currency->id, $transaction->amount
'Transaction #%d has a currency setting #%d that should be #%d. Amount remains %s, currency is changed.',
$transaction->id,
$transaction->transaction_currency_id,
$currency->id,
$transaction->amount
)
);
$transaction->transaction_currency_id = $currency->id;
$transaction->transaction_currency_id = (int)$currency->id;
$transaction->save();
}
@@ -436,16 +699,16 @@ class UpgradeDatabase extends Command
$journal = $transaction->transactionJournal;
/** @var Transaction $opposing */
$opposing = $journal->transactions()->where('amount', '>', 0)->where('identifier', $transaction->identifier)->first();
$opposingCurrency = $repository->find(intval($opposing->account->getMeta('currency_id')));
$opposingCurrency = $repository->findNull((int)$accountRepos->getMetaValue($opposing->account, 'currency_id'));
if (is_null($opposingCurrency->id)) {
if (null === $opposingCurrency) {
Log::error(sprintf('Account #%d ("%s") must have currency preference but has none.', $opposing->account->id, $opposing->account->name));
return;
}
// if the destination account currency is the same, both foreign_amount and foreign_currency_id must be NULL for both transactions:
if ($opposingCurrency->id === $currency->id) {
if ((int)$opposingCurrency->id === (int)$currency->id) {
// update both transactions to match:
$transaction->foreign_amount = null;
$transaction->foreign_currency_id = null;
@@ -454,12 +717,21 @@ class UpgradeDatabase extends Command
$opposing->transaction_currency_id = $currency->id;
$transaction->save();
$opposing->save();
Log::debug(sprintf('Cleaned up transaction #%d and #%d', $transaction->id, $opposing->id));
Log::debug(
sprintf(
'Currency for account "%s" is %s, and currency for account "%s" is also
%s, so %s #%d (#%d and #%d) has been verified to be to %s exclusively.',
$opposing->account->name, $opposingCurrency->code,
$transaction->account->name, $transaction->transactionCurrency->code,
$journal->transactionType->type, $journal->id,
$transaction->id, $opposing->id, $currency->code
)
);
return;
}
// if destination account currency is different, both transactions must have this currency as foreign currency id.
if ($opposingCurrency->id !== $currency->id) {
if (!((int)$opposingCurrency->id === (int)$currency->id)) {
$transaction->foreign_currency_id = $opposingCurrency->id;
$opposing->foreign_currency_id = $opposingCurrency->id;
$transaction->save();
@@ -468,36 +740,37 @@ class UpgradeDatabase extends Command
}
// if foreign amount of one is null and the other is not, use this to restore:
if (is_null($transaction->foreign_amount) && !is_null($opposing->foreign_amount)) {
$transaction->foreign_amount = bcmul(strval($opposing->foreign_amount), '-1');
if (null === $transaction->foreign_amount && null !== $opposing->foreign_amount) {
$transaction->foreign_amount = bcmul((string)$opposing->foreign_amount, '-1');
$transaction->save();
Log::debug(sprintf('Restored foreign amount of transaction (1) #%d to %s', $transaction->id, $transaction->foreign_amount));
}
// if foreign amount of one is null and the other is not, use this to restore (other way around)
if (is_null($opposing->foreign_amount) && !is_null($transaction->foreign_amount)) {
$opposing->foreign_amount = bcmul(strval($transaction->foreign_amount), '-1');
if (null === $opposing->foreign_amount && null !== $transaction->foreign_amount) {
$opposing->foreign_amount = bcmul((string)$transaction->foreign_amount, '-1');
$opposing->save();
Log::debug(sprintf('Restored foreign amount of transaction (2) #%d to %s', $opposing->id, $opposing->foreign_amount));
}
// when both are zero, try to grab it from journal:
if (is_null($opposing->foreign_amount) && is_null($transaction->foreign_amount)) {
$foreignAmount = $journal->getMeta('foreign_amount');
if (is_null($foreignAmount)) {
if (null === $opposing->foreign_amount && null === $transaction->foreign_amount) {
$foreignAmount = $journalRepos->getMetaField($journal, 'foreign_amount');
if (null === $foreignAmount) {
Log::debug(sprintf('Journal #%d has missing foreign currency data, forced to do 1:1 conversion :(.', $transaction->transaction_journal_id));
$transaction->foreign_amount = bcmul(strval($transaction->amount), '-1');
$opposing->foreign_amount = bcmul(strval($opposing->amount), '-1');
$transaction->foreign_amount = bcmul((string)$transaction->amount, '-1');
$opposing->foreign_amount = bcmul((string)$opposing->amount, '-1');
$transaction->save();
$opposing->save();
return;
}
$foreignPositive = app('steam')->positive(strval($foreignAmount));
$foreignPositive = app('steam')->positive((string)$foreignAmount);
Log::debug(
sprintf(
'Journal #%d has missing foreign currency info, try to restore from meta-data ("%s").', $transaction->transaction_journal_id, $foreignAmount
'Journal #%d has missing foreign currency info, try to restore from meta-data ("%s").',
$transaction->transaction_journal_id,
$foreignAmount
)
);
$transaction->foreign_amount = bcmul($foreignPositive, '-1');
@@ -506,7 +779,6 @@ class UpgradeDatabase extends Command
$opposing->save();
}
return;
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* UpgradeFireflyInstructions.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,7 +16,7 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
@@ -26,9 +26,9 @@ namespace FireflyIII\Console\Commands;
use Illuminate\Console\Command;
/**
* Class UpgradeFireflyInstructions
* Class UpgradeFireflyInstructions.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class UpgradeFireflyInstructions extends Command
{
@@ -45,35 +45,27 @@ class UpgradeFireflyInstructions extends Command
*/
protected $signature = 'firefly:instructions {task}';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
if ($this->argument('task') === 'update') {
if ('update' === (string)$this->argument('task')) {
$this->updateInstructions();
}
if ($this->argument('task') === 'install') {
if ('install' === (string)$this->argument('task')) {
$this->installInstructions();
}
return 0;
}
/**
* Show a nice box
* Show a nice box.
*
* @param string $text
*/
private function boxed(string $text)
private function boxed(string $text): void
{
$parts = explode("\n", wordwrap($text));
foreach ($parts as $string) {
@@ -82,11 +74,11 @@ class UpgradeFireflyInstructions extends Command
}
/**
* Show a nice info box
* Show a nice info box.
*
* @param string $text
*/
private function boxedInfo(string $text)
private function boxedInfo(string $text): void
{
$parts = explode("\n", wordwrap($text));
foreach ($parts as $string) {
@@ -97,7 +89,7 @@ class UpgradeFireflyInstructions extends Command
/**
* Render instructions.
*/
private function installInstructions()
private function installInstructions(): void
{
/** @var string $version */
$version = config('firefly.version');
@@ -105,16 +97,13 @@ class UpgradeFireflyInstructions extends Command
$text = '';
foreach (array_keys($config) as $compare) {
// if string starts with:
$len = strlen($compare);
if (substr($version, 0, $len) === $compare) {
if (0 === strpos($version, $compare)) {
$text = $config[$compare];
}
}
$this->showLine();
$this->boxed('');
if (is_null($text)) {
if (null === $text) {
$this->boxed(sprintf('Thank you for installing Firefly III, v%s!', $version));
$this->boxedInfo('There are no extra installation instructions.');
$this->boxed('Firefly III should be ready for use.');
@@ -131,23 +120,22 @@ class UpgradeFireflyInstructions extends Command
}
/**
* Show a line
* Show a line.
*/
private function showLine()
private function showLine(): void
{
$line = '+';
for ($i = 0; $i < 78; $i++) {
for ($i = 0; $i < 78; ++$i) {
$line .= '-';
}
$line .= '+';
$this->line($line);
}
/**
* Render upgrade instructions.
*/
private function updateInstructions()
private function updateInstructions(): void
{
/** @var string $version */
$version = config('firefly.version');
@@ -155,16 +143,13 @@ class UpgradeFireflyInstructions extends Command
$text = '';
foreach (array_keys($config) as $compare) {
// if string starts with:
$len = strlen($compare);
if (substr($version, 0, $len) === $compare) {
if (0 === strpos($version, $compare)) {
$text = $config[$compare];
}
}
$this->showLine();
$this->boxed('');
if (is_null($text)) {
if (null === $text) {
$this->boxed(sprintf('Thank you for updating to Firefly III, v%s', $version));
$this->boxedInfo('There are no extra upgrade instructions.');
$this->boxed('Firefly III should be ready for use.');

View File

@@ -1,8 +1,7 @@
<?php
/**
* UseEncryption.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -17,28 +16,19 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
/**
* UseEncryption.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* This software may be modified and distributed under the terms of the Creative Commons Attribution-ShareAlike 4.0 International License.
*
* See the LICENSE file for details.
*/
namespace FireflyIII\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
/**
* Class UseEncryption
*
* @package FireflyIII\Console\Commands
* Class UseEncryption.
* @codeCoverageIgnore
*/
class UseEncryption extends Command
{
@@ -55,20 +45,17 @@ class UseEncryption extends Command
*/
protected $signature = 'firefly:use-encryption';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
if (true === config('firefly.encryption')) {
$this->info('Firefly III configuration calls for encrypted data.');
}
if (false === config('firefly.encryption')) {
$this->info('Firefly III configuration calls for unencrypted data.');
}
$this->handleObjects('Account', 'name', 'encrypted');
$this->handleObjects('Bill', 'name', 'name_encrypted');
$this->handleObjects('Bill', 'match', 'match_encrypted');
@@ -76,6 +63,8 @@ class UseEncryption extends Command
$this->handleObjects('Category', 'name', 'encrypted');
$this->handleObjects('PiggyBank', 'name', 'encrypted');
$this->handleObjects('TransactionJournal', 'description', 'encrypted');
return 0;
}
/**
@@ -85,18 +74,21 @@ class UseEncryption extends Command
* @param string $field
* @param string $indicator
*/
public function handleObjects(string $class, string $field, string $indicator)
public function handleObjects(string $class, string $field, string $indicator): void
{
$fqn = sprintf('FireflyIII\Models\%s', $class);
$encrypt = config('firefly.encryption') ? 0 : 1;
$set = $fqn::where($indicator, $encrypt)->get();
$encrypt = true === config('firefly.encryption') ? 0 : 1;
/** @noinspection PhpUndefinedMethodInspection */
$set = $fqn::where($indicator, $encrypt)->withTrashed()->get();
foreach ($set as $entry) {
$newName = $entry->$field;
$entry->$field = $newName;
/** @noinspection PhpUndefinedMethodInspection */
$entry->save();
}
/** @noinspection PhpUndefinedMethodInspection */
$this->line(sprintf('Updated %d %s.', $set->count(), strtolower(Str::plural($class))));
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* VerifiesAccessToken.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,30 +16,48 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Log;
use Preferences;
/**
* Trait VerifiesAccessToken
* Trait VerifiesAccessToken.
*
* Verifies user access token for sensitive commands.
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
trait VerifiesAccessToken
{
/**
* @return User
* @throws FireflyException
*/
public function getUser(): User
{
$userId = (int)$this->option('user');
/** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class);
$user = $repository->findNull($userId);
if (null === $user) {
throw new FireflyException('User is unexpectedly NULL');
}
return $user;
}
/**
* Abstract method to make sure trait knows about method "option".
*
* @param null $key
* @param string|null $key
*
* @return mixed
*/
@@ -52,30 +70,30 @@ trait VerifiesAccessToken
*/
protected function verifyAccessToken(): bool
{
$userId = intval($this->option('user'));
$token = strval($this->option('token'));
$userId = (int)$this->option('user');
$token = (string)$this->option('token');
/** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class);
$user = $repository->find($userId);
$user = $repository->findNull($userId);
if (is_null($user->id)) {
if (null === $user) {
Log::error(sprintf('verifyAccessToken(): no such user for input "%d"', $userId));
return false;
}
$accessToken = Preferences::getForUser($user, 'access_token', null);
if (is_null($accessToken)) {
$accessToken = app('preferences')->getForUser($user, 'access_token', null);
if (null === $accessToken) {
Log::error(sprintf('User #%d has no access token, so cannot access command line options.', $userId));
return false;
}
if (!($accessToken->data === $token)) {
Log::error(sprintf('Invalid access token for user #%d.', $userId));
Log::error(sprintf('Token given is "%s", expected something else.', $token));
return false;
}
return true;
}
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* VerifyDatabase.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,17 +16,21 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Crypt;
use DB;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Budget;
use FireflyIII\Models\Category;
use FireflyIII\Models\LinkType;
use FireflyIII\Models\PiggyBankEvent;
use FireflyIII\Models\Transaction;
@@ -37,16 +41,16 @@ use FireflyIII\User;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\Eloquent\Builder;
use Preferences;
use Log;
use Schema;
use stdClass;
/**
* Class VerifyDatabase
* Class VerifyDatabase.
*
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*
* @package FireflyIII\Console\Commands
* @codeCoverageIgnore
*/
class VerifyDatabase extends Command
{
@@ -63,26 +67,18 @@ class VerifyDatabase extends Command
*/
protected $signature = 'firefly:verify';
/**
* Create a new command instance.
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
// if table does not exist, return false
if (!Schema::hasTable('users')) {
return;
return 1;
}
$this->reportObject('budget');
$this->reportObject('category');
$this->reportEmptyBudgets();
$this->reportEmptyCategories();
$this->reportObject('tag');
$this->reportAccounts();
$this->reportBudgetLimits();
@@ -96,32 +92,42 @@ class VerifyDatabase extends Command
$this->repairPiggyBanks();
$this->createLinkTypes();
$this->createAccessTokens();
$this->fixDoubleAmounts();
$this->fixBadMeta();
$this->removeBills();
return 0;
}
/**
* Create user access tokens, if not present already.
*/
private function createAccessTokens()
private function createAccessTokens(): void
{
$count = 0;
$users = User::get();
/** @var User $user */
foreach ($users as $user) {
$pref = Preferences::getForUser($user, 'access_token', null);
if (is_null($pref)) {
$pref = app('preferences')->getForUser($user, 'access_token', null);
if (null === $pref) {
$token = $user->generateAccessToken();
Preferences::setForUser($user, 'access_token', $token);
app('preferences')->setForUser($user, 'access_token', $token);
$this->line(sprintf('Generated access token for user %s', $user->email));
++$count;
}
}
if (0 === $count) {
$this->info('All access tokens OK!');
}
}
/**
* Create default link types if necessary.
*/
private function createLinkTypes()
private function createLinkTypes(): void
{
$set = [
$count = 0;
$set = [
'Related' => ['relates to', 'relates to'],
'Refund' => ['(partially) refunds', 'is (partially) refunded by'],
'Paid' => ['(partially) pays for', 'is (partially) paid for by'],
@@ -129,15 +135,155 @@ class VerifyDatabase extends Command
];
foreach ($set as $name => $values) {
$link = LinkType::where('name', $name)->where('outward', $values[0])->where('inward', $values[1])->first();
if (is_null($link)) {
if (null === $link) {
$link = new LinkType;
$link->name = $name;
$link->outward = $values[0];
$link->inward = $values[1];
++$count;
}
$link->editable = false;
$link->save();
}
if (0 === $count) {
$this->info('All link types OK!');
}
}
/**
* Fix the situation where the matching transactions of a journal somehow have non-matching categories or budgets.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
private function fixBadMeta(): void
{
// categories
$set = Transaction
::leftJoin('category_transaction', 'category_transaction.transaction_id', '=', 'transactions.id')
->whereNull('transactions.deleted_at')
->get(['transactions.id', 'transaction_journal_id', 'identifier', 'category_transaction.category_id', 'category_transaction.id as ct_id']);
$results = [];
foreach ($set as $obj) {
$key = $obj->transaction_journal_id . '-' . $obj->identifier;
$category = (int)$obj->category_id;
// value exists and is not category:
if (isset($results[$key]) && $results[$key] !== $category) {
$this->error(
sprintf(
'Transaction #%d referred to the wrong category. Was category #%d but is fixed to be category #%d.', $obj->transaction_journal_id,
$category, $results[$key]
)
);
DB::table('category_transaction')->where('id', $obj->ct_id)->update(['category_id' => $results[$key]]);
}
// value does not exist:
if ($category > 0 && !isset($results[$key])) {
$results[$key] = $category;
}
}
// budgets
$set = Transaction
::leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'transactions.id')
->whereNull('transactions.deleted_at')
->get(['transactions.id', 'transaction_journal_id', 'identifier', 'budget_transaction.budget_id', 'budget_transaction.id as ct_id']);
$results = [];
foreach ($set as $obj) {
$key = $obj->transaction_journal_id . '-' . $obj->identifier;
$budget = (int)$obj->budget_id;
// value exists and is not budget:
if (isset($results[$key]) && $results[$key] !== $budget) {
$this->error(
sprintf(
'Transaction #%d referred to the wrong budget. Was budget #%d but is fixed to be budget #%d.', $obj->transaction_journal_id, $budget,
$results[$key]
)
);
DB::table('budget_transaction')->where('id', $obj->ct_id)->update(['budget_id' => $results[$key]]);
}
// value does not exist:
if ($budget > 0 && !isset($results[$key])) {
$results[$key] = $budget;
}
}
}
/**
* Makes sure amounts are stored correctly.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
private function fixDoubleAmounts(): void
{
$count = 0;
// get invalid journals
$errored = [];
$journals = DB::table('transactions')
->groupBy('transaction_journal_id')
->get(['transaction_journal_id', DB::raw('SUM(amount) AS the_sum')]);
/** @var stdClass $entry */
foreach ($journals as $entry) {
if (0 !== bccomp((string)$entry->the_sum, '0')) {
$errored[] = $entry->transaction_journal_id;
}
}
foreach ($errored as $journalId) {
// select and update:
$res = Transaction::whereNull('deleted_at')->where('transaction_journal_id', $journalId)->groupBy('amount')->get([DB::raw('MIN(id) as first_id')]);
$ids = $res->pluck('first_id')->toArray();
DB::table('transactions')->whereIn('id', $ids)->update(['amount' => DB::raw('amount * -1')]);
++$count;
// report about it
/** @var TransactionJournal $journal */
$journal = TransactionJournal::find($journalId);
if (null === $journal) {
continue;
}
if (TransactionType::OPENING_BALANCE === $journal->transactionType->type) {
$this->error(
sprintf(
'Transaction #%d was stored incorrectly. One of your asset accounts may show the wrong balance. Please visit /transactions/show/%d to verify the opening balance.',
$journalId, $journalId
)
);
}
if (TransactionType::OPENING_BALANCE !== $journal->transactionType->type) {
$this->error(
sprintf(
'Transaction #%d was stored incorrectly. Could be that the transaction shows the wrong amount. Please visit /transactions/show/%d to verify the opening balance.',
$journalId, $journalId
)
);
}
}
if (0 === $count) {
$this->info('Amount integrity OK!');
}
}
/**
* Removes bills from journals that should not have bills.
*/
private function removeBills(): void
{
/** @var TransactionType $withdrawal */
$withdrawal = TransactionType::where('type', TransactionType::WITHDRAWAL)->first();
$journals = TransactionJournal::whereNotNull('bill_id')
->where('transaction_type_id', '!=', $withdrawal->id)->get();
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {
$this->line(sprintf('Transaction journal #%d should not be linked to bill #%d.', $journal->id, $journal->bill_id));
$journal->bill_id = null;
$journal->save();
}
}
/**
@@ -148,17 +294,17 @@ class VerifyDatabase extends Command
$set = PiggyBankEvent::with(['PiggyBank', 'TransactionJournal', 'TransactionJournal.TransactionType'])->get();
$set->each(
function (PiggyBankEvent $event) {
if (is_null($event->transaction_journal_id)) {
if (null === $event->transaction_journal_id) {
return true;
}
/** @var TransactionJournal $journal */
$journal = $event->transactionJournal()->first();
if (is_null($journal)) {
if (null === $journal) {
return true;
}
$type = $journal->transactionType->type;
if ($type !== TransactionType::TRANSFER) {
if (TransactionType::TRANSFER !== $type) {
$event->transaction_journal_id = null;
$event->save();
$this->line(sprintf('Piggy bank #%d was referenced by an invalid event. This has been fixed.', $event->piggy_bank_id));
@@ -167,14 +313,12 @@ class VerifyDatabase extends Command
return true;
}
);
return;
}
/**
* Reports on accounts with no transactions.
*/
private function reportAccounts()
private function reportAccounts(): void
{
$set = Account::leftJoin('transactions', 'transactions.account_id', '=', 'accounts.id')
->leftJoin('users', 'accounts.user_id', '=', 'users.id')
@@ -196,7 +340,7 @@ class VerifyDatabase extends Command
/**
* Reports on budgets with no budget limits (which makes them pointless).
*/
private function reportBudgetLimits()
private function reportBudgetLimits(): void
{
$set = Budget::leftJoin('budget_limits', 'budget_limits.budget_id', '=', 'budgets.id')
->leftJoin('users', 'budgets.user_id', '=', 'users.id')
@@ -208,7 +352,10 @@ class VerifyDatabase extends Command
foreach ($set as $entry) {
$line = sprintf(
'User #%d (%s) has budget #%d ("%s") which has no budget limits.',
$entry->user_id, $entry->email, $entry->id, $entry->name
$entry->user_id,
$entry->email,
$entry->id,
$entry->name
);
$this->line($line);
}
@@ -217,7 +364,7 @@ class VerifyDatabase extends Command
/**
* Reports on deleted accounts that still have not deleted transactions or journals attached to them.
*/
private function reportDeletedAccounts()
private function reportDeletedAccounts(): void
{
$set = Account::leftJoin('transactions', 'transactions.account_id', '=', 'accounts.id')
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
@@ -232,11 +379,11 @@ class VerifyDatabase extends Command
->get(
['accounts.id as account_id', 'accounts.deleted_at as account_deleted_at', 'transactions.id as transaction_id',
'transactions.deleted_at as transaction_deleted_at', 'transaction_journals.id as journal_id',
'transaction_journals.deleted_at as journal_deleted_at']
'transaction_journals.deleted_at as journal_deleted_at',]
);
/** @var stdClass $entry */
foreach ($set as $entry) {
$date = is_null($entry->transaction_deleted_at) ? $entry->journal_deleted_at : $entry->transaction_deleted_at;
$date = $entry->transaction_deleted_at ?? $entry->journal_deleted_at;
$this->error(
'Error: Account #' . $entry->account_id . ' should have been deleted, but has not.' .
' Find it in the table called "accounts" and change the "deleted_at" field to: "' . $date . '"'
@@ -244,10 +391,86 @@ class VerifyDatabase extends Command
}
}
/**
* Report on budgets with no transactions or journals.
*/
private function reportEmptyBudgets(): void
{
$set = Budget::leftJoin('budget_transaction_journal', 'budgets.id', '=', 'budget_transaction_journal.budget_id')
->leftJoin('users', 'budgets.user_id', '=', 'users.id')
->distinct()
->whereNull('budget_transaction_journal.budget_id')
->whereNull('budgets.deleted_at')
->get(['budgets.id', 'budgets.name', 'budgets.user_id', 'users.email']);
/** @var stdClass $entry */
foreach ($set as $entry) {
$objName = $entry->name;
try {
$objName = Crypt::decrypt($objName);
} catch (DecryptException $e) {
// it probably was not encrypted.
Log::debug(sprintf('Not a problem: %s', $e->getMessage()));
}
// also count the transactions:
$countTransactions = DB::table('budget_transaction')->where('budget_id', $entry->id)->count();
if (0 === $countTransactions) {
$line = sprintf(
'User #%d (%s) has budget #%d ("%s") which has no transactions.',
$entry->user_id,
$entry->email,
$entry->id,
$objName
);
$this->line($line);
}
}
}
/**
* Report on categories with no transactions or journals.
*/
private function reportEmptyCategories(): void
{
$set = Category::leftJoin('category_transaction_journal', 'categories.id', '=', 'category_transaction_journal.category_id')
->leftJoin('users', 'categories.user_id', '=', 'users.id')
->distinct()
->whereNull('category_transaction_journal.category_id')
->whereNull('categories.deleted_at')
->get(['categories.id', 'categories.name', 'categories.user_id', 'users.email']);
/** @var stdClass $entry */
foreach ($set as $entry) {
$objName = $entry->name;
try {
$objName = Crypt::decrypt($objName);
} catch (DecryptException $e) {
// it probably was not encrypted.
Log::debug(sprintf('Not a problem: %s', $e->getMessage()));
}
// also count the transactions:
$countTransactions = DB::table('category_transaction')->where('category_id', $entry->id)->count();
if (0 === $countTransactions) {
$line = sprintf(
'User #%d (%s) has category #%d ("%s") which has no transactions.',
$entry->user_id,
$entry->email,
$entry->id,
$objName
);
$this->line($line);
}
}
}
/**
* Report on journals with bad account types linked to them.
*/
private function reportIncorrectJournals()
private function reportIncorrectJournals(): void
{
$configuration = [
// a withdrawal can not have revenue account:
@@ -268,7 +491,7 @@ class VerifyDatabase extends Command
->whereNull('transaction_journals.deleted_at')
->get(
['transaction_journals.id', 'transaction_journals.user_id', 'users.email', 'account_types.type as a_type',
'transaction_types.type']
'transaction_types.type',]
);
foreach ($set as $entry) {
$this->error(
@@ -287,47 +510,56 @@ class VerifyDatabase extends Command
}
/**
* Any deleted transaction journals that have transactions that are NOT deleted:
* Any deleted transaction journals that have transactions that are NOT deleted:.
*/
private function reportJournals()
private function reportJournals(): void
{
$set = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->whereNotNull('transaction_journals.deleted_at')// USE THIS
->whereNull('transactions.deleted_at')
->whereNotNull('transactions.id')
->get(
[
'transaction_journals.id as journal_id',
'transaction_journals.description',
'transaction_journals.deleted_at as journal_deleted',
'transactions.id as transaction_id',
'transactions.deleted_at as transaction_deleted_at']
);
$count = 0;
$set = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->whereNotNull('transaction_journals.deleted_at')// USE THIS
->whereNull('transactions.deleted_at')
->whereNotNull('transactions.id')
->get(
[
'transaction_journals.id as journal_id',
'transaction_journals.description',
'transaction_journals.deleted_at as journal_deleted',
'transactions.id as transaction_id',
'transactions.deleted_at as transaction_deleted_at',]
);
/** @var stdClass $entry */
foreach ($set as $entry) {
$this->error(
'Error: Transaction #' . $entry->transaction_id . ' should have been deleted, but has not.' .
' Find it in the table called "transactions" and change the "deleted_at" field to: "' . $entry->journal_deleted . '"'
);
++$count;
}
if (0 === $count) {
$this->info('No orphaned transactions!');
}
}
/**
* Report on journals without transactions.
*/
private function reportNoTransactions()
private function reportNoTransactions(): void
{
$set = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->groupBy('transaction_journals.id')
->whereNull('transactions.transaction_journal_id')
->get(['transaction_journals.id']);
$count = 0;
$set = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->groupBy('transaction_journals.id')
->whereNull('transactions.transaction_journal_id')
->get(['transaction_journals.id']);
foreach ($set as $entry) {
$this->error(
'Error: Journal #' . $entry->id . ' has zero transactions. Open table "transaction_journals" and delete the entry with id #' . $entry->id
);
++$count;
}
if (0 === $count) {
$this->info('No orphaned journals!');
}
}
/**
@@ -335,31 +567,36 @@ class VerifyDatabase extends Command
*
* @param string $name
*/
private function reportObject(string $name)
private function reportObject(string $name): void
{
$plural = str_plural($name);
$class = sprintf('FireflyIII\Models\%s', ucfirst($name));
$field = $name === 'tag' ? 'tag' : 'name';
$set = $class::leftJoin($name . '_transaction_journal', $plural . '.id', '=', $name . '_transaction_journal.' . $name . '_id')
->leftJoin('users', $plural . '.user_id', '=', 'users.id')
->distinct()
->whereNull($name . '_transaction_journal.' . $name . '_id')
->whereNull($plural . '.deleted_at')
->get([$plural . '.id', $plural . '.' . $field . ' as name', $plural . '.user_id', 'users.email']);
$field = 'tag' === $name ? 'tag' : 'name';
/** @noinspection PhpUndefinedMethodInspection */
$set = $class::leftJoin($name . '_transaction_journal', $plural . '.id', '=', $name . '_transaction_journal.' . $name . '_id')
->leftJoin('users', $plural . '.user_id', '=', 'users.id')
->distinct()
->whereNull($name . '_transaction_journal.' . $name . '_id')
->whereNull($plural . '.deleted_at')
->get([$plural . '.id', $plural . '.' . $field . ' as name', $plural . '.user_id', 'users.email']);
/** @var stdClass $entry */
foreach ($set as $entry) {
$objName = $entry->name;
try {
$objName = Crypt::decrypt($objName);
} catch (DecryptException $e) {
// it probably was not encrypted.
Log::debug(sprintf('Not a problem: %s', $e->getMessage()));
}
$line = sprintf(
'User #%d (%s) has %s #%d ("%s") which has no transactions.',
$entry->user_id, $entry->email, $name, $entry->id, $objName
$entry->user_id,
$entry->email,
$name,
$entry->id,
$objName
);
$this->line($line);
}
@@ -368,31 +605,34 @@ class VerifyDatabase extends Command
/**
* Reports for each user when the sum of their transactions is not zero.
*/
private function reportSum()
private function reportSum(): void
{
/** @var UserRepositoryInterface $userRepository */
$userRepository = app(UserRepositoryInterface::class);
/** @var User $user */
foreach ($userRepository->all() as $user) {
$sum = strval($user->transactions()->sum('amount'));
if (bccomp($sum, '0') !== 0) {
$sum = (string)$user->transactions()->sum('amount');
if (0 !== bccomp($sum, '0')) {
$this->error('Error: Transactions for user #' . $user->id . ' (' . $user->email . ') are off by ' . $sum . '!');
}
if (0 === bccomp($sum, '0')) {
$this->info(sprintf('Amount integrity OK for user #%d', $user->id));
}
}
}
/**
* Reports on deleted transactions that are connected to a not deleted journal.
*/
private function reportTransactions()
private function reportTransactions(): void
{
$set = Transaction::leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->whereNotNull('transactions.deleted_at')
->whereNull('transaction_journals.deleted_at')
->get(
['transactions.id as transaction_id', 'transactions.deleted_at as transaction_deleted', 'transaction_journals.id as journal_id',
'transaction_journals.deleted_at']
'transaction_journals.deleted_at',]
);
/** @var stdClass $entry */
foreach ($set as $entry) {
@@ -406,7 +646,7 @@ class VerifyDatabase extends Command
/**
* Report on transfers that have budgets.
*/
private function reportTransfersBudgets()
private function reportTransfersBudgets(): void
{
$set = TransactionJournal::distinct()
->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')
@@ -419,11 +659,10 @@ class VerifyDatabase extends Command
$this->error(
sprintf(
'Error: Transaction journal #%d is a %s, but has a budget. Edit it without changing anything, so the budget will be removed.',
$entry->id, $entry->transactionType->type
$entry->id,
$entry->transactionType->type
)
);
}
}
}

View File

@@ -1,7 +1,8 @@
<?php
/**
* Kernel.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,62 +17,56 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
/**
* Kernel.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* This software may be modified and distributed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International License.
*
* See the LICENSE file for details.
*/
namespace FireflyIII\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Log;
/**
* File to make sure commnds work.
* File to make sure commands work.
* @codeCoverageIgnore
*/
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands
= [
//
];
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
protected function commands(): void
{
$this->load(__DIR__ . '/Commands');
/** @noinspection PhpIncludeInspection */
require base_path('routes/console.php');
}
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
*
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
* @param \Illuminate\Console\Scheduling\Schedule $schedule
*/
protected function schedule(Schedule $schedule)
protected function schedule(Schedule $schedule): void
{
$schedule->call(
function () {
Log::error('Firefly III no longer users the Laravel scheduler to do cron jobs! Please read the instructions at https://firefly-iii.readthedocs.io/en/latest/');
echo "\n";
echo '------------';
echo "\n";
echo wordwrap('Firefly III no longer users the Laravel scheduler to do cron jobs! Please read the instructions here:');
echo "\n";
echo 'https://firefly-iii.readthedocs.io/en/latest/';
echo "\n\n";
echo 'Disable this cron job!';
echo "\n";
echo '------------';
echo "\n";
}
)->everyMinute();
}
}

View File

@@ -1,7 +1,8 @@
<?php
/**
* AdminRequestedTestMessage.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
@@ -16,34 +17,34 @@
* 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/>.
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Events;
use FireflyIII\User;
use Illuminate\Queue\SerializesModels;
use Log;
/**
* Class AdminRequestedTestMessage
*
* @package FireflyIII\Events
* Class AdminRequestedTestMessage.
* @codeCoverageIgnore
*/
class AdminRequestedTestMessage extends Event
{
use SerializesModels;
/** @var string The users IP address */
public $ipAddress;
/** @var User The user */
public $user;
/**
* Create a new event instance.
*
* @param User $user
* @param User $user
* @param string $ipAddress
*/
public function __construct(User $user, string $ipAddress)

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