Compare commits

...

496 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
1299 changed files with 74485 additions and 23400 deletions

View File

@@ -1,12 +0,0 @@
---
exclude_patterns:
- public/lib/
- public/js/lib/
- public/fonts/
- public/css/jquery-ui/
- public/css/bootstrap-multiselect.css
- public/css/bootstrap-sortable.css
- public/css/bootstrap-tagsinput.css
- public/css/daterangepicker.css
- public/css/google-fonts.css
- .sandstorm/

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

@@ -22,8 +22,8 @@ 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 && cat .env
cat .env.docker | envsubst > .env
composer dump-autoload
php artisan package:discover
php artisan firefly:instructions install
exec apache2-foreground
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

@@ -13,37 +13,55 @@ SITE_OWNER=${SITE_OWNER}
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=${FF_APP_KEY}
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
# 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.
LOG_CHANNEL=${LOG_CHANNEL}
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
# If you use SQLite, set connection to `sqlite` and remove the database, username and password settings.
DB_CONNECTION=${FF_DB_CONNECTION}
DB_HOST=${FF_DB_HOST}
DB_PORT=${FF_DB_PORT}
DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER}
DB_PASSWORD=${FF_DB_PASSWORD}
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
APP_LOG=syslog
# 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=info
APP_LOG_LEVEL=${APP_LOG_LEVEL}
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
DB_CONNECTION=${FF_DB_CONNECTION}
DB_HOST=${FF_DB_HOST}
DB_PORT=${FF_DB_PORT}
DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER}
DB_PASSWORD="${FF_DB_PASSWORD}"
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# 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=
@@ -56,7 +74,7 @@ MAIL_HOST=${MAIL_HOST}
MAIL_PORT=${MAIL_PORT}
MAIL_FROM=${MAIL_FROM}
MAIL_USERNAME=${MAIL_USERNAME}
MAIL_PASSWORD=${MAIL_PASSWORD}
MAIL_PASSWORD="${MAIL_PASSWORD}"
MAIL_ENCRYPTION=${MAIL_ENCRYPTION}
# Other mail drivers:
@@ -69,6 +87,9 @@ SPARKPOST_SECRET=${SPARKPOST_SECRET}
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}
@@ -84,9 +105,51 @@ ANALYTICS_ID=${ANALYTICS_ID}
# 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
@@ -103,4 +166,3 @@ IS_DOCKER=true
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=false
TZ=${TZ}

View File

@@ -15,15 +15,27 @@ APP_KEY=SomeRandomStringOf32CharsExactly
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=UTC
TZ=Europe/Amsterdam
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
# 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
@@ -33,21 +45,23 @@ DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
APP_LOG=daily
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=notice
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
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=
@@ -73,6 +87,9 @@ SPARKPOST_SECRET=
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
@@ -88,9 +105,52 @@ ANALYTICS_ID=
# 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
@@ -105,7 +165,5 @@ DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
BUNQ_USE_SANDBOX=false
IS_HEROKU=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=
BUNQ_USE_SANDBOX=false

View File

@@ -17,12 +17,24 @@ APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2
# Example: Europe/Amsterdam
TZ=UTC
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
# 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=
# 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.
LOG_CHANNEL=syslog
# '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.
@@ -33,21 +45,23 @@ DB_CONNECTION=pgsql
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
APP_LOG=errorlog
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=debug
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
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=
@@ -73,6 +87,9 @@ SPARKPOST_SECRET=
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
@@ -88,9 +105,52 @@ ANALYTICS_ID=
# 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
@@ -105,7 +165,5 @@ DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
BUNQ_USE_SANDBOX=false
IS_HEROKU=true
MAILGUN_DOMAIN=
MAILGUN_SECRET=
BUNQ_USE_SANDBOX=false

View File

@@ -17,12 +17,24 @@ APP_KEY=SomeRandomStringOf32CharsExactly
# Example: Europe/Amsterdam
TZ=UTC
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
# 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.
LOG_CHANNEL=syslog
# '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.
@@ -33,21 +45,23 @@ DB_DATABASE=firefly
DB_USERNAME=firefly
DB_PASSWORD=firefly
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
APP_LOG=syslog
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=info
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
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=
@@ -73,6 +87,9 @@ SPARKPOST_SECRET=
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
@@ -88,9 +105,52 @@ ANALYTICS_ID=
# 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
@@ -105,7 +165,5 @@ DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=true
BUNQ_USE_SANDBOX=false
IS_HEROKU=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=
BUNQ_USE_SANDBOX=false

View File

@@ -17,32 +17,51 @@ APP_KEY=TestTestTestTestTestTestTestTest
# Example: Europe/Amsterdam
TZ=Europe/Amsterdam
# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy.
# 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.
LOG_CHANNEL=dailytest
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
DB_CONNECTION=sqlite
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog' and 'errorlog' which will log to the system itself.
APP_LOG=daily
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=dailytest
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=debug
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
# 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=
@@ -64,6 +83,12 @@ MAILGUN_SECRET=
MANDRILL_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=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
@@ -80,9 +105,52 @@ ANALYTICS_ID=
# 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
@@ -97,7 +165,5 @@ DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
BUNQ_USE_SANDBOX=true
IS_HEROKU=false
MAILGUN_DOMAIN=
MAILGUN_SECRET=
BUNQ_USE_SANDBOX=true

View File

@@ -12,6 +12,9 @@ I am running Firefly III version x.x.x
**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).
@@ -19,4 +22,4 @@ Please add extra info here, such as OS, browser, and the output from the /debug
Earn bonus points by:
- Post a stacktrace from your log files
- Add a screenshot
- Add a screenshot

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

@@ -1,3 +1,145 @@
$ 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.

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

@@ -37,15 +37,15 @@ 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

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 = 14,
appMarketingVersion = (defaultText = "4.7.5.1"),
appVersion = 18,
appMarketingVersion = (defaultText = "4.7.8"),
actions = [
# Define your "new document" handlers here.

View File

@@ -53,7 +53,7 @@ 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;

View File

@@ -14,10 +14,7 @@ apt-get install -y python-software-properties software-properties-common
# install all languages
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# es_ES.UTF-8 UTF-8/es_ES.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# id_ID.UTF-8 UTF-8/id_ID.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# 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
@@ -35,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,6 +1,6 @@
language: php
php:
- 7.1.18
- 7.2
cache:
directories:

View File

@@ -1,12 +1,16 @@
# use PHP 7.1 and Apache as a base.
FROM php:7.1-apache
FROM php:7.2-apache
# set working dir
ENV FIREFLY_PATH /var/www/firefly-iii
# 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
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
ENV COMPOSER_ALLOW_SUPERUSER 1
LABEL version="1.1" maintainer="thegrumpydictator@gmail.com"
# install packages
RUN apt-get update -y && \
@@ -16,20 +20,24 @@ RUN apt-get update -y && \
wget \
libpng-dev \
libicu-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/*
# Setup the Composer installer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# LDAP install
RUN docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ && docker-php-ext-install ldap
# Install latest curl
RUN cd /tmp && \
@@ -37,29 +45,44 @@ RUN cd /tmp && \
tar -xvf openssl-${OPENSSL_VERSION}.tar.gz && \
cd openssl-${OPENSSL_VERSION} && \
./config && \
make && \
make -j${CORES} && \
make install
RUN cd /tmp && \
wget https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz && \
tar -xvf curl-${CURL_VERSION}.tar.gz && \
cd curl-${CURL_VERSION} && \
./configure --with-ssl && \
make && \
./configure --with-ssl --host=$(gcc -dumpmachine) && \
make -j${CORES} && \
make install
# Make sure that libcurl is using the newer curl libaries
RUN echo "/usr/local/lib" >> /etc/ld.so.conf.d/00-curl.conf && ldconfig
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# 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
# Setup cron job
RUN (crontab -l ; echo "* * * * * root $FIREFLY_PATH/artisan schedule:run >> /var/log/cron.log") | crontab
# 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) curl gd intl json readline tidy zip bcmath xml mbstring pdo_sqlite pdo_mysql bz2 pdo_pgsql
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 "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nes_ES.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8pt_BR.UTF-8 UTF-8ru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\n\n" > /etc/locale.gen && locale-gen
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
@@ -70,7 +93,7 @@ RUN a2enmod rewrite
# Enable apache mod ssl..
RUN a2enmod ssl
# Create volumes for several directories:
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Enable default site (Firefly III)
@@ -79,15 +102,18 @@ COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-defau
# Make sure we own Firefly III directory
RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage
# Copy in Firefly Source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# 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
# Run the command on container startup
CMD cron
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

View File

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

View File

@@ -213,14 +213,18 @@ class AccountController extends Controller
$types = [
'all' => [AccountType::DEFAULT, AccountType::CASH, AccountType::ASSET, AccountType::EXPENSE, AccountType::REVENUE,
AccountType::INITIAL_BALANCE, AccountType::BENEFICIARY, AccountType::IMPORT, AccountType::RECONCILIATION,
AccountType::LOAN,],
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,
AccountType::LOAN,],
'hidden' => [AccountType::INITIAL_BALANCE, AccountType::IMPORT, AccountType::RECONCILIATION, AccountType::LOAN,],
'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],
@@ -231,6 +235,10 @@ class AccountController extends Controller
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])) {

View File

@@ -232,4 +232,4 @@ class AttachmentController extends Controller
return response()->json([], 204);
}
}
}

View File

@@ -152,7 +152,10 @@ class AvailableBudgetController extends Controller
public function store(AvailableBudgetRequest $request): JsonResponse
{
$data = $request->getAll();
$currency = $this->currencyRepository->findNull($data['transaction_currency_id']);
$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.');
}
@@ -166,6 +169,8 @@ class AvailableBudgetController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Update the specified resource in storage.
*
@@ -187,4 +192,4 @@ class AvailableBudgetController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -185,4 +185,4 @@ class BudgetController extends Controller
}
}
}

View File

@@ -23,7 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon;
use FireflyIII\Api\V1\Requests\BudgetLimitRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\BudgetLimit;
@@ -34,13 +34,12 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use InvalidArgumentException;
use League\Fractal\Manager;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
use Log;
/**
* Class BudgetLimitController.
@@ -95,34 +94,17 @@ class BudgetLimitController extends Controller
{
$manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$start = null;
$end = null;
$budgetId = (int)($request->get('budget_id') ?? 0);
$budget = $this->repository->findNull($budgetId);
$this->parameters->set('budget_id', $budgetId);
try {
$start = Carbon::createFromFormat('Y-m-d', $request->get('start'));
$this->parameters->set('start', $start->format('Y-m-d'));
} catch (InvalidArgumentException $e) {
Log::debug(sprintf('Invalid date: %s', $e->getMessage()));
}
try {
$end = Carbon::createFromFormat('Y-m-d', $request->get('end'));
$this->parameters->set('end', $end->format('Y-m-d'));
} catch (InvalidArgumentException $e) {
Log::debug(sprintf('Invalid date: %s', $e->getMessage()));
}
$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($start, $end);
$collection = $this->repository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
}
if (null !== $budget) {
$collection = $this->repository->getBudgetLimits($budget, $start, $end);
$collection = $this->repository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
}
$count = $collection->count();
@@ -212,4 +194,4 @@ class BudgetLimitController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -185,4 +185,4 @@ class CategoryController extends Controller
}
}
}

View File

@@ -54,6 +54,7 @@ class ConfigurationController extends Controller
$admin = auth()->user();
if (!$this->repository->hasRole($admin, 'owner')) {
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
}
@@ -132,4 +133,4 @@ class ConfigurationController extends Controller
return $data;
}
}
}

View File

@@ -108,4 +108,4 @@ class CurrencyExchangeRateController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -175,8 +175,7 @@ class JournalLinkController extends Controller
$data['direction'] = 'inward';
$journalLink = $this->repository->storeLink($data, $inward, $outward);
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
$resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
@@ -214,4 +213,4 @@ class JournalLinkController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -207,4 +207,4 @@ class LinkTypeController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -161,7 +161,7 @@ class PiggyBankController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
throw new FireflyException('Could not store new piggy bank.'); // @codeCoverageIgnore
throw new FireflyException('Could not store new piggy bank.');
}
@@ -185,4 +185,4 @@ class PiggyBankController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -34,7 +34,6 @@ use League\Fractal\Manager;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
use League\Fractal\Serializer\JsonApiSerializer;
use Preferences;
/**
*
@@ -60,7 +59,7 @@ class PreferenceController extends Controller
];
$preferences = new Collection;
foreach ($available as $name) {
$pref = Preferences::getForUser($user, $name);
$pref = app('preferences')->getForUser($user, $name);
if (null !== $pref) {
$preferences->push($pref);
}
@@ -130,7 +129,7 @@ class PreferenceController extends Controller
$newValue = 1 === (int)$data['data'];
break;
}
$result = Preferences::set($preference->name, $newValue);
$result = app('preferences')->set($preference->name, $newValue);
// create some objects:
$manager = new Manager;
@@ -143,4 +142,4 @@ class PreferenceController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -177,4 +177,4 @@ class RecurrenceController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -101,7 +101,7 @@ class RuleController extends Controller
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.piggy_banks.index') . $this->buildParams());
$paginator->setPath(route('api.v1.rules.index') . $this->buildParams());
// present to user.
$manager->setSerializer(new JsonApiSerializer($baseUrl));
@@ -175,4 +175,4 @@ class RuleController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -95,7 +95,7 @@ class RuleGroupController extends Controller
// types to get, page size:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of budgets. Count it and split it.
// 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);
@@ -176,4 +176,4 @@ class RuleGroupController extends Controller
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}
}

View File

@@ -25,8 +25,10 @@ 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\JournalCollectorInterface;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Helpers\Filter\InternalTransferFilter;
use FireflyIII\Helpers\Filter\NegativeAmountFilter;
use FireflyIII\Helpers\Filter\PositiveAmountFilter;
@@ -108,8 +110,8 @@ class TransactionController extends Controller
/** @var User $admin */
$admin = auth()->user();
/** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class);
/** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class);
$collector->setUser($admin);
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
$collector->setAllAssetAccounts();
@@ -123,7 +125,7 @@ class TransactionController extends Controller
}
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
$collector->setTypes($types);
$paginator = $collector->getPaginatedJournals();
$paginator = $collector->getPaginatedTransactions();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
@@ -155,7 +157,7 @@ class TransactionController extends Controller
$manager->parseIncludes($include);
// collect transactions using the journal collector
$collector = app(JournalCollectorInterface::class);
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
@@ -170,7 +172,7 @@ class TransactionController extends Controller
$collector->addFilter(NegativeAmountFilter::class);
}
$transactions = $collector->getJournals();
$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');
@@ -192,6 +194,8 @@ class TransactionController extends Controller
$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));
@@ -201,7 +205,7 @@ class TransactionController extends Controller
$manager->parseIncludes($include);
// collect transactions using the journal collector
$collector = app(JournalCollectorInterface::class);
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
@@ -216,7 +220,7 @@ class TransactionController extends Controller
$collector->addFilter(NegativeAmountFilter::class);
}
$transactions = $collector->getJournals();
$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');
@@ -241,13 +245,15 @@ class TransactionController extends Controller
$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(JournalCollectorInterface::class);
$collector = app(TransactionCollectorInterface::class);
$collector->setUser(auth()->user());
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
// filter on specific journals.
@@ -262,7 +268,7 @@ class TransactionController extends Controller
$collector->addFilter(NegativeAmountFilter::class);
}
$transactions = $collector->getJournals();
$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');
@@ -284,6 +290,7 @@ class TransactionController extends Controller
'withdrawal' => [TransactionType::WITHDRAWAL,],
'withdrawals' => [TransactionType::WITHDRAWAL,],
'expense' => [TransactionType::WITHDRAWAL,],
'expenses' => [TransactionType::WITHDRAWAL,],
'income' => [TransactionType::DEPOSIT,],
'deposit' => [TransactionType::DEPOSIT,],
'deposits' => [TransactionType::DEPOSIT,],

View File

@@ -50,6 +50,7 @@ class AccountRequest extends Request
$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'),
@@ -64,7 +65,21 @@ class AccountRequest extends Request
'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;
}
@@ -91,10 +106,18 @@ class AccountRequest extends Request
'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:

View File

@@ -94,4 +94,4 @@ class AttachmentRequest extends Request
return $rules;
}
}
}

View File

@@ -47,15 +47,15 @@ class AvailableBudgetRequest extends Request
public function getAll(): array
{
return [
'transaction_currency_id' => $this->integer('transaction_currency_id'),
'amount' => $this->string('amount'),
'start_date' => $this->date('start_date'),
'end_date' => $this->date('end_date'),
'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'),
];
}
/**
* TODO must also accept currency code.
* The rules that the incoming request must be matched against.
*
* @return array
@@ -63,14 +63,15 @@ class AvailableBudgetRequest extends Request
public function rules(): array
{
$rules = [
'transaction_currency_id' => 'required|numeric|exists:transaction_currencies,id',
'amount' => 'required|numeric|more:0',
'start_date' => 'required|date|before:end_date',
'end_date' => 'required|date|after:start_date',
'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

@@ -115,7 +115,7 @@ class BillRequest extends Request
$min = (float)($data['amount_min'] ?? 0);
$max = (float)($data['amount_max'] ?? 0);
if ($min > $max) {
$validator->errors()->add('amount_min', trans('validation.amount_min_over_max'));
$validator->errors()->add('amount_min', (string)trans('validation.amount_min_over_max'));
}
}
);

View File

@@ -80,4 +80,4 @@ class BudgetLimitRequest extends Request
return $rules;
}
}
}

View File

@@ -79,4 +79,4 @@ class BudgetRequest extends Request
return $rules;
}
}
}

View File

@@ -78,4 +78,4 @@ class CategoryRequest extends Request
return $rules;
}
}
}

View File

@@ -23,6 +23,9 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use Illuminate\Validation\Validator;
/**
*
@@ -49,16 +52,15 @@ class JournalLinkRequest extends Request
public function getAll(): array
{
return [
'link_type_id' => $this->integer('link_type_id'),
'inward_id' => $this->integer('inward_id'),
'outward_id' => $this->integer('outward_id'),
'notes' => $this->string('notes'),
'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'),
];
}
/**
* TODO include link-type name as optional parameter.
* TODO be consistent and remove notes from this object.
*
* The rules that the incoming request must be matched against.
*
@@ -67,11 +69,63 @@ class JournalLinkRequest extends Request
public function rules(): array
{
return [
'link_type_id' => 'required|exists:link_types,id',
'inward_id' => 'required|belongsToUser:transaction_journals,id',
'outward_id' => 'required|belongsToUser:transaction_journals,id',
'notes' => 'between:0,65000',
'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

@@ -71,7 +71,6 @@ class LinkTypeRequest extends Request
'outward' => 'required|unique:link_types,outward|min:1|different:inward',
'inward' => 'required|unique:link_types,inward|min:1|different:outward',
];
// Rule::unique('users')->ignore($user->id),
switch ($this->method()) {
@@ -89,4 +88,4 @@ class LinkTypeRequest extends Request
return $rules;
}
}
}

View File

@@ -50,14 +50,17 @@ class PiggyBankRequest extends Request
*/
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' => $this->string('current_amount'),
'start_date' => $this->date('start_date'),
'target_date' => $this->date('target_date'),
'note' => $this->string('notes'),
'current_amount' => $current,
'startdate' => $this->date('start_date'),
'targetdate' => $this->date('target_date'),
'notes' => $this->string('notes'),
];
}
@@ -74,7 +77,7 @@ class PiggyBankRequest extends Request
'target_amount' => 'required|numeric|more:0',
'current_amount' => 'numeric|more:0|lte:target_amount',
'start_date' => 'date|nullable',
'target_date' => 'date|nullable',
'target_date' => 'date|nullable|after:start_date',
'notes' => 'max:65000',
];
@@ -93,4 +96,4 @@ class PiggyBankRequest extends Request
return $rules;
}
}
}

View File

@@ -66,4 +66,4 @@ class PreferenceRequest extends Request
];
}
}
}

View File

@@ -84,8 +84,7 @@ class RecurrenceRequest extends Request
*/
public function rules(): array
{
$today = new Carbon;
$today->addDay();
$today = Carbon::now()->addDay();
return [
'type' => 'required|in:withdrawal,transfer,deposit',
@@ -201,4 +200,4 @@ class RecurrenceRequest extends Request
return $return;
}
}
}

View File

@@ -82,4 +82,4 @@ class RuleGroupRequest extends Request
return $rules;
}
}
}

View File

@@ -56,27 +56,12 @@ class RuleRequest extends Request
'rule_group_title' => $this->string('rule_group_title'),
'trigger' => $this->string('trigger'),
'strict' => $this->boolean('strict'),
'stop-processing' => $this->boolean('stop_processing'),
'stop_processing' => $this->boolean('stop_processing'),
'active' => $this->boolean('active'),
'rule-triggers' => [],
'rule-actions' => [],
'rule_triggers' => $this->getRuleTriggers(),
'rule_actions' => $this->getRuleActions(),
];
foreach ($this->get('rule-triggers') as $trigger) {
$data['rule-triggers'][] = [
'name' => $trigger['name'],
'value' => $trigger['value'],
'stop-processing' => 1 === (int)($trigger['stop-processing'] ?? 0),
];
}
foreach ($this->get('rule-actions') as $action) {
$data['rule-actions'][] = [
'name' => $action['name'],
'value' => $action['value'],
'stop-processing' => 1 === (int)($action['stop-processing'] ?? 0),
];
}
return $data;
}
@@ -90,8 +75,10 @@ class RuleRequest extends Request
$validTriggers = array_keys(config('firefly.rule-triggers'));
$validActions = array_keys(config('firefly.rule-actions'));
// some actions require text:
$contextActions = implode(',', config('firefly.rule-actions-text'));
// 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',
@@ -99,12 +86,12 @@ class RuleRequest extends Request
'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|min:1|ruleTriggerValue', //
'rule-actions.*.name' => 'required|in:' . implode(',', $validActions),
'rule-actions.*.value' => 'required_if:rule-action.*.type,' . $contextActions . '|ruleActionValue',
'rule-actions.*.stop-processing' => 'boolean',
'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',
@@ -138,10 +125,10 @@ class RuleRequest extends Request
protected function atLeastOneAction(Validator $validator): void
{
$data = $validator->getData();
$repetitions = $data['rule-actions'] ?? [];
$repetitions = $data['rule_actions'] ?? [];
// need at least one transaction
if (0 === \count($repetitions)) {
$validator->errors()->add('title', trans('validation.at_least_one_action'));
$validator->errors()->add('title', (string)trans('validation.at_least_one_action'));
}
}
@@ -153,10 +140,50 @@ class RuleRequest extends Request
protected function atLeastOneTrigger(Validator $validator): void
{
$data = $validator->getData();
$repetitions = $data['rule-triggers'] ?? [];
$repetitions = $data['rule_triggers'] ?? [];
// need at least one transaction
if (0 === \count($repetitions)) {
$validator->errors()->add('title', trans('validation.at_least_one_trigger'));
$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

@@ -73,6 +73,7 @@ class TransactionRequest extends Request
'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(),
];

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

@@ -33,12 +33,14 @@ 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.
*
* Generates export from the command line.
*
* @codeCoverageIgnore
*/
class CreateExport extends Command
{
@@ -134,10 +136,14 @@ 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);
$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

@@ -34,10 +34,11 @@ use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use Illuminate\Console\Command;
use Log;
use Preferences;
/**
* Class CreateImport.
*
* @codeCoverageIgnore
*/
class CreateImport extends Command
{
@@ -151,7 +152,7 @@ class CreateImport extends Command
if (true === $this->option('start')) {
$this->infoLine('The has started. The process is not visible. Please wait.');
$this->infoLine('The import routine has started. The process is not visible. Please wait.');
Log::debug('Go for import!');
// run it!
@@ -232,7 +233,7 @@ class CreateImport extends Command
}
}
// clear cache for user:
Preferences::setForUser($user, 'lastActivity', microtime());
app('preferences')->setForUser($user, 'lastActivity', microtime());
return 0;
}
@@ -266,8 +267,8 @@ class CreateImport extends Command
*/
private function validArguments(): bool
{
$file = $this->argument('file');
$configuration = $this->argument('configuration');
$file = (string)$this->argument('file');
$configuration = (string)$this->argument('configuration');
$cwd = getcwd();
$validTypes = config('import.options.file.import_formats');
$type = strtolower($this->option('type'));

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

@@ -31,6 +31,8 @@ use Log;
/**
* Class DecryptAttachment.
*
* @codeCoverageIgnore
*/
class DecryptAttachment extends Command
{
@@ -63,9 +65,9 @@ class DecryptAttachment extends Command
$repository = app(AttachmentRepositoryInterface::class);
$attachmentId = (int)$this->argument('id');
$attachment = $repository->findWithoutUser($attachmentId);
$attachmentName = trim($this->argument('name'));
$storagePath = realpath(trim($this->argument('directory')));
if (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));

View File

@@ -29,6 +29,8 @@ use Illuminate\Console\Command;
/**
* Class EncryptFile.
*
* @codeCoverageIgnore
*/
class EncryptFile extends Command
{
@@ -37,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.

View File

@@ -35,6 +35,8 @@ use Log;
/**
* Class Import.
*
* @codeCoverageIgnore
*/
class Import extends Command
{
@@ -59,20 +61,21 @@ class Import extends Command
*
* @throws FireflyException
*/
public function handle(): void
public function handle(): int
{
Log::debug('Start start-import command');
$jobKey = $this->argument('key');
$job = ImportJob::where('key', $jobKey)->first();
$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;
return 1;
}
if (!$this->isValid($job)) {
$this->errorLine('Job is not valid for some reason. Exit.');
return;
return 1;
}
$this->infoLine(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type));
@@ -106,6 +109,8 @@ class Import extends Command
}
$this->infoLine(sprintf('The import has finished. %d transactions have been imported.', $count));
return 0;
}
/**

View File

@@ -34,6 +34,8 @@ use Storage;
/**
* Class ScanAttachments.
*
* @codeCoverageIgnore
*/
class ScanAttachments extends Command
{
@@ -54,7 +56,7 @@ class ScanAttachments extends Command
/**
* Execute the console command.
*/
public function handle(): void
public function handle(): int
{
$attachments = Attachment::get();
$disk = Storage::disk('upload');
@@ -82,5 +84,7 @@ class ScanAttachments extends Command
$attachment->save();
$this->line(sprintf('Fixed attachment #%d', $attachment->id));
}
return 0;
}
}

View File

@@ -35,6 +35,7 @@ use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill;
use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\Note;
use FireflyIII\Models\Preference;
use FireflyIII\Models\Rule;
@@ -54,7 +55,6 @@ use Illuminate\Console\Command;
use Illuminate\Database\QueryException;
use Illuminate\Support\Collection;
use Log;
use Preferences;
use Schema;
use UnexpectedValueException;
@@ -64,6 +64,8 @@ use UnexpectedValueException;
* Upgrade user database.
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*
* @codeCoverageIgnore
*/
class UpgradeDatabase extends Command
{
@@ -83,7 +85,7 @@ class UpgradeDatabase extends Command
/**
* Execute the console command.
*/
public function handle(): void
public function handle(): int
{
$this->setTransactionIdentifier();
$this->updateAccountCurrencies();
@@ -95,8 +97,12 @@ class UpgradeDatabase extends Command
$this->migrateNotes();
$this->migrateAttachmentData();
$this->migrateBillsToRules();
$this->budgetLimitCurrency();
$this->removeCCLiabilities();
$this->info('Firefly III database is up to date.');
return 0;
}
/**
@@ -110,10 +116,10 @@ class UpgradeDatabase extends Command
{
foreach (User::get() as $user) {
/** @var Preference $lang */
$lang = Preferences::getForUser($user, 'language', 'en_US');
$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 = Preferences::getForUser($user, 'currencyPreference', config('firefly.default_currency', 'EUR'));
$currencyPreference = app('preferences')->getForUser($user, 'currencyPreference', config('firefly.default_currency', 'EUR'));
if (null === $currencyPreference) {
$this->error('User has no currency preference. Impossible.');
@@ -198,7 +204,7 @@ class UpgradeDatabase extends Command
[
'rule_id' => $rule->id,
'trigger_type' => 'amount_more',
'trigger_value' => round($bill->amount_min, $currency->decimal_places),
'trigger_value' => round((float)$bill->amount_min, $currency->decimal_places),
'active' => 1,
'stop_processing' => 0,
'order' => 4,
@@ -210,7 +216,7 @@ class UpgradeDatabase extends Command
[
'rule_id' => $rule->id,
'trigger_type' => 'amount_exactly',
'trigger_value' => round($bill->amount_min, $currency->decimal_places),
'trigger_value' => round((float)$bill->amount_min, $currency->decimal_places),
'active' => 1,
'stop_processing' => 0,
'order' => 3,
@@ -294,7 +300,7 @@ class UpgradeDatabase extends Command
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 = (int)$repository->getMetaValue($account, 'currency_id');
$openingBalance = $account->getOpeningBalance();
@@ -433,6 +439,31 @@ 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".
@@ -505,6 +536,28 @@ class UpgradeDatabase extends Command
}
}
/**
*
*/
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.
*

View File

@@ -27,6 +27,8 @@ use Illuminate\Console\Command;
/**
* Class UpgradeFireflyInstructions.
*
* @codeCoverageIgnore
*/
class UpgradeFireflyInstructions extends Command
{
@@ -46,14 +48,16 @@ class UpgradeFireflyInstructions extends Command
/**
* Execute the console command.
*/
public function handle(): void
public function handle(): int
{
if ('update' === $this->argument('task')) {
if ('update' === (string)$this->argument('task')) {
$this->updateInstructions();
}
if ('install' === $this->argument('task')) {
if ('install' === (string)$this->argument('task')) {
$this->installInstructions();
}
return 0;
}
/**

View File

@@ -28,6 +28,7 @@ use Illuminate\Support\Str;
/**
* Class UseEncryption.
* @codeCoverageIgnore
*/
class UseEncryption extends Command
{
@@ -47,7 +48,7 @@ class UseEncryption extends Command
/**
* Execute the console command.
*/
public function handle(): void
public function handle(): int
{
if (true === config('firefly.encryption')) {
$this->info('Firefly III configuration calls for encrypted data.');
@@ -62,6 +63,8 @@ class UseEncryption extends Command
$this->handleObjects('Category', 'name', 'encrypted');
$this->handleObjects('PiggyBank', 'name', 'encrypted');
$this->handleObjects('TransactionJournal', 'description', 'encrypted');
return 0;
}
/**
@@ -76,7 +79,7 @@ class UseEncryption extends Command
$fqn = sprintf('FireflyIII\Models\%s', $class);
$encrypt = true === config('firefly.encryption') ? 0 : 1;
/** @noinspection PhpUndefinedMethodInspection */
$set = $fqn::where($indicator, $encrypt)->get();
$set = $fqn::where($indicator, $encrypt)->withTrashed()->get();
foreach ($set as $entry) {
$newName = $entry->$field;

View File

@@ -23,17 +23,37 @@ 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.
*
* Verifies user access token for sensitive 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".
*
@@ -61,7 +81,7 @@ trait VerifiesAccessToken
return false;
}
$accessToken = Preferences::getForUser($user, 'access_token', null);
$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));

View File

@@ -42,7 +42,6 @@ use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\Eloquent\Builder;
use Log;
use Preferences;
use Schema;
use stdClass;
@@ -51,6 +50,7 @@ use stdClass;
*
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @codeCoverageIgnore
*/
class VerifyDatabase extends Command
{
@@ -70,11 +70,11 @@ class VerifyDatabase extends Command
/**
* Execute the console command.
*/
public function handle(): void
public function handle(): int
{
// if table does not exist, return false
if (!Schema::hasTable('users')) {
return;
return 1;
}
$this->reportEmptyBudgets();
@@ -95,6 +95,8 @@ class VerifyDatabase extends Command
$this->fixDoubleAmounts();
$this->fixBadMeta();
$this->removeBills();
return 0;
}
/**
@@ -106,10 +108,10 @@ class VerifyDatabase extends Command
$users = User::get();
/** @var User $user */
foreach ($users as $user) {
$pref = Preferences::getForUser($user, 'access_token', null);
$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;
}

View File

@@ -24,13 +24,13 @@ declare(strict_types=1);
namespace FireflyIII\Console;
use Carbon\Carbon;
use FireflyIII\Jobs\CreateRecurringTransactions;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Log;
/**
* File to make sure commands work.
* @codeCoverageIgnore
*/
class Kernel extends ConsoleKernel
{
@@ -52,6 +52,21 @@ class Kernel extends ConsoleKernel
*/
protected function schedule(Schedule $schedule): void
{
$schedule->job(new CreateRecurringTransactions(new Carbon))->daily();
$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

@@ -30,6 +30,7 @@ use Log;
/**
* Class AdminRequestedTestMessage.
* @codeCoverageIgnore
*/
class AdminRequestedTestMessage extends Event
{

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Events;
/**
* Class Event.
* @codeCoverageIgnore
*/
abstract class Event
{

View File

@@ -29,6 +29,7 @@ use Illuminate\Queue\SerializesModels;
/**
* Class RegisteredUser.
* @codeCoverageIgnore
*/
class RegisteredUser extends Event
{

View File

@@ -29,6 +29,7 @@ use Illuminate\Queue\SerializesModels;
/**
* Class RequestedNewPassword.
* @codeCoverageIgnore
*/
class RequestedNewPassword extends Event
{
@@ -36,10 +37,10 @@ class RequestedNewPassword extends Event
/** @var string The users IP address */
public $ipAddress;
/** @var User The user */
public $user;
/** @var string The token */
public $token;
/** @var User The user */
public $user;
/**
* Create a new event instance. This event is triggered when a users tries to reset his or her password.

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
/**
* RequestedReportOnJournals.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
@@ -30,6 +31,8 @@ use Log;
/**
* Class RequestedReportOnJournals
*
* @codeCoverageIgnore
*/
class RequestedReportOnJournals
{

View File

@@ -30,6 +30,8 @@ use Illuminate\Queue\SerializesModels;
/**
* Class RequestedVersionCheckStatus
*
* @codeCoverageIgnore
*/
class RequestedVersionCheckStatus extends Event
{

View File

@@ -29,6 +29,8 @@ use Illuminate\Queue\SerializesModels;
/**
* Class UserChangedEmail.
*
* @codeCoverageIgnore
*/
class UserChangedEmail extends Event
{

View File

@@ -31,13 +31,14 @@ use Exception;
use FireflyIII\Jobs\MailError;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Validation\ValidationException;
use Illuminate\Validation\ValidationException as LaravelValidationException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class Handler
* @codeCoverageIgnore
*/
class Handler extends ExceptionHandler
{
@@ -54,7 +55,7 @@ class Handler extends ExceptionHandler
*/
public function render($request, Exception $exception)
{
if ($exception instanceof ValidationException && $request->expectsJson()) {
if ($exception instanceof LaravelValidationException && $request->expectsJson()) {
// ignore it: controller will handle it.
return parent::render($request, $exception);
}

View File

@@ -28,13 +28,15 @@ use Crypt;
use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\Collection;
use Log;
use Storage;
/**
* Class AttachmentCollector.
*
* @deprecated
* @codeCoverageIgnore
*/
class AttachmentCollector extends BasicCollector implements CollectorInterface
{
@@ -108,7 +110,7 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface
if ($this->uploadDisk->exists($file)) {
try {
$decrypted = Crypt::decrypt($this->uploadDisk->get($file));
} catch (FileNotFoundException|DecryptException $e) {
} catch (DecryptException $e) {
Log::error('Catchable error: could not decrypt attachment #' . $attachment->id . ' because: ' . $e->getMessage());
return false;

View File

@@ -30,6 +30,9 @@ use Illuminate\Support\Collection;
/**
* Class BasicCollector.
*
* @codeCoverageIgnore
* @deprecated
*/
class BasicCollector
{

View File

@@ -29,6 +29,9 @@ use Illuminate\Support\Collection;
/**
* Interface CollectorInterface.
*
* @codeCoverageIgnore
* @deprecated
*/
interface CollectorInterface
{

View File

@@ -31,6 +31,9 @@ use Storage;
/**
* Class UploadCollector.
*
* @codeCoverageIgnore
* @deprecated
*/
class UploadCollector extends BasicCollector implements CollectorInterface
{

View File

@@ -43,6 +43,9 @@ use FireflyIII\Models\Transaction;
*
* @SuppressWarnings(PHPMD.LongVariable)
* @SuppressWarnings(PHPMD.TooManyFields)
*
* @codeCoverageIgnore
* @deprecated
*/
final class Entry
{

View File

@@ -31,7 +31,8 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Export\Collector\AttachmentCollector;
use FireflyIII\Export\Collector\UploadCollector;
use FireflyIII\Export\Entry\Entry;
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Export\Exporter\ExporterInterface;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Helpers\Filter\InternalTransferFilter;
use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\ExportJob;
@@ -41,19 +42,22 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use Illuminate\Support\Collection;
use Log;
use Storage;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
/**
* Class ExpandedProcessor.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) // its doing a lot.
*
* @codeCoverageIgnore
* @deprecated
*/
class ExpandedProcessor implements ProcessorInterface
{
/** @var Collection All accounts */
public $accounts;
/** @var string The export format*/
/** @var string The export format */
public $exportFormat;
/** @var bool Should include attachments */
public $includeAttachments;
@@ -61,7 +65,7 @@ class ExpandedProcessor implements ProcessorInterface
public $includeOldUploads;
/** @var ExportJob The export job itself */
public $job;
/** @var array The settings*/
/** @var array The settings */
public $settings;
/** @var Collection The entries to export. */
private $exportEntries;
@@ -106,13 +110,13 @@ class ExpandedProcessor implements ProcessorInterface
public function collectJournals(): bool
{
// use journal collector thing.
/** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class);
/** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class);
$collector->setUser($this->job->user);
$collector->setAccounts($this->accounts)->setRange($this->settings['startDate'], $this->settings['endDate'])
->withOpposingAccount()->withBudgetInformation()->withCategoryInformation()
->removeFilter(InternalTransferFilter::class);
$transactions = $collector->getJournals();
$transactions = $collector->getTransactions();
// get some more meta data for each entry:
$ids = $transactions->pluck('journal_id')->toArray();
$assetIds = $transactions->pluck('account_id')->toArray();
@@ -180,7 +184,7 @@ class ExpandedProcessor implements ProcessorInterface
}
/**
* Create a ZIP file.
* Create a ZIP file locally (!) in storage_path('export').
*
* @return bool
*
@@ -191,9 +195,9 @@ class ExpandedProcessor implements ProcessorInterface
{
$zip = new ZipArchive;
$file = $this->job->key . '.zip';
$fullPath = storage_path('export') . '/' . $file;
$localPath = storage_path('export') . '/' . $file;
if (true !== $zip->open($fullPath, ZipArchive::CREATE)) {
if (true !== $zip->open($localPath, ZipArchive::CREATE)) {
throw new FireflyException('Cannot store zip file.');
}
// for each file in the collection, add it to the zip file.
@@ -220,7 +224,8 @@ class ExpandedProcessor implements ProcessorInterface
public function exportJournals(): bool
{
$exporterClass = config('firefly.export_formats.' . $this->exportFormat);
$exporter = app($exporterClass);
/** @var ExporterInterface $exporter */
$exporter = app($exporterClass);
$exporter->setJob($this->job);
$exporter->setEntries($this->exportEntries);
$exporter->run();
@@ -258,7 +263,7 @@ class ExpandedProcessor implements ProcessorInterface
/**
* Delete files.
*/
private function deleteFiles():void
private function deleteFiles(): void
{
$disk = Storage::disk('export');
foreach ($this->getFiles() as $file) {

View File

@@ -29,6 +29,9 @@ use Illuminate\Support\Collection;
/**
* Class BasicExporter.
*
* @codeCoverageIgnore
* @deprecated
*/
class BasicExporter
{

View File

@@ -26,10 +26,13 @@ namespace FireflyIII\Export\Exporter;
use FireflyIII\Export\Entry\Entry;
use League\Csv\Writer;
use Storage;
use Illuminate\Support\Facades\Storage;
/**
* Class CsvExporter.
*
* @codeCoverageIgnore
* @deprecated
*/
class CsvExporter extends BasicExporter implements ExporterInterface
{
@@ -54,15 +57,11 @@ class CsvExporter extends BasicExporter implements ExporterInterface
*/
public function run(): bool
{
// create temporary file:
$this->tempFile();
// necessary for CSV writer:
$fullPath = storage_path('export') . DIRECTORY_SEPARATOR . $this->fileName;
// choose file name:
$this->fileName = $this->job->key . '-records.csv';
//we create the CSV into memory
$writer = Writer::createFromPath($fullPath);
$writer = Writer::createFromString('');
$rows = [];
// get field names for header row:
@@ -83,18 +82,9 @@ class CsvExporter extends BasicExporter implements ExporterInterface
$rows[] = $line;
}
$writer->insertAll($rows);
$disk = Storage::disk('export');
$disk->put($this->fileName, $writer->getContent());
return true;
}
/**
* Make a temp file.
*/
private function tempFile()
{
$this->fileName = $this->job->key . '-records.csv';
// touch file in export directory:
$disk = Storage::disk('export');
$disk->put($this->fileName, '');
}
}

View File

@@ -29,6 +29,9 @@ use Illuminate\Support\Collection;
/**
* Interface ExporterInterface.
*
* @codeCoverageIgnore
* @deprecated
*/
interface ExporterInterface
{

View File

@@ -28,6 +28,9 @@ use Illuminate\Support\Collection;
/**
* Interface ProcessorInterface.
*
* @codeCoverageIgnore
* @deprecated
*/
interface ProcessorInterface
{

View File

@@ -32,6 +32,7 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Services\Internal\Support\AccountServiceTrait;
use FireflyIII\User;
use Log;
/**
* Factory to create or return accounts.
@@ -40,10 +41,21 @@ use FireflyIII\User;
*/
class AccountFactory
{
use AccountServiceTrait;
/** @var User */
private $user;
use AccountServiceTrait;
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/**
* @param array $data
*
@@ -80,8 +92,9 @@ class AccountFactory
'iban' => $data['iban'],
];
// remove virtual balance when not an asset account:
if ($type->type !== AccountType::ASSET) {
// remove virtual balance when not an asset account or a liability
$canHaveVirtual = [AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD];
if (!\in_array($type->type, $canHaveVirtual, true)) {
$databaseData['virtual_balance'] = '0';
}
@@ -93,7 +106,7 @@ class AccountFactory
$return = Account::create($databaseData);
$this->updateMetaData($return, $data);
if ($type->type === AccountType::ASSET) {
if (\in_array($type->type, $canHaveVirtual, true)) {
if ($this->validIBData($data)) {
$this->updateIB($return, $data);
}
@@ -130,6 +143,7 @@ class AccountFactory
}
/**
*
* @param string $accountName
* @param string $accountType
*
@@ -138,17 +152,23 @@ class AccountFactory
*/
public function findOrCreate(string $accountName, string $accountType): Account
{
Log::debug(sprintf('Searching for "%s" of type "%s"', $accountName, $accountType));
$type = AccountType::whereType($accountType)->first();
$accounts = $this->user->accounts()->where('account_type_id', $type->id)->get(['accounts.*']);
$return = null;
Log::debug(sprintf('Account type is #%d', $type->id));
/** @var Account $object */
foreach ($accounts as $object) {
if ($object->name === $accountName) {
Log::debug(sprintf('Found account #%d "%s".', $object->id, $object->name));
$return = $object;
break;
}
}
if (null === $return) {
Log::debug('Found nothing. Will create a new one.');
$return = $this->create(
[
'user_id' => $this->user->id,
@@ -188,9 +208,13 @@ class AccountFactory
$result = AccountType::find($accountTypeId);
}
if (null === $result) {
/** @var string $type */
$type = (string)config('firefly.accountTypeByIdentifier.' . (string)$accountType);
$result = AccountType::whereType($type)->first();
Log::debug(sprintf('No account type found by ID, continue search for "%s".', $accountType));
/** @var array $types */
$types = config('firefly.accountTypeByIdentifier.' . $accountType) ?? [];
if (\count($types) > 0) {
Log::debug(sprintf('%d accounts in list from config', \count($types)), $types);
$result = AccountType::whereIn('type', $types)->first();
}
if (null === $result && null !== $accountType) {
// try as full name:
$result = AccountType::whereType($accountType)->first();

View File

@@ -24,13 +24,25 @@ declare(strict_types=1);
namespace FireflyIII\Factory;
use Exception;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta;
use Log;
/**
* Class AccountMetaFactory
*/
class AccountMetaFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/**
* @param array $data
*
@@ -41,4 +53,46 @@ class AccountMetaFactory
return AccountMeta::create($data);
}
/**
* Create update or delete meta data.
*
* @param Account $account
* @param string $field
* @param string $value
*
* @return AccountMeta|null
*/
public function crud(Account $account, string $field, string $value): ?AccountMeta
{
/** @var AccountMeta $entry */
$entry = $account->accountMeta()->where('name', $field)->first();
// must not be an empty string:
if ('' !== $value) {
// if $data has field and $entry is null, create new one:
if (null === $entry) {
Log::debug(sprintf('Created meta-field "%s":"%s" for account #%d ("%s") ', $field, $value, $account->id, $account->name));
return $this->create(['account_id' => $account->id, 'name' => $field, 'data' => $value]);
}
// if $data has field and $entry is not null, update $entry:
if (null !== $entry) {
$entry->data = $value;
$entry->save();
Log::debug(sprintf('Updated meta-field "%s":"%s" for #%d ("%s") ', $field, $value, $account->id, $account->name));
}
}
if ('' === $value && null !== $entry) {
try {
$entry->delete();
} catch (Exception $e) { // @codeCoverageIgnore
Log::debug(sprintf('Could not delete entry: %s', $e->getMessage())); // @codeCoverageIgnore
}
return null;
}
return $entry;
}
}

View File

@@ -26,12 +26,22 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\Note;
use FireflyIII\User;
use Log;
/**
* Class AttachmentFactory
*/
class AttachmentFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/** @var User */
private $user;
@@ -76,4 +86,4 @@ class AttachmentFactory
$this->user = $user;
}
}
}

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Factory;
use FireflyIII\Models\Bill;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Services\Internal\Support\BillServiceTrait;
use FireflyIII\User;
use Illuminate\Support\Collection;
@@ -35,6 +36,16 @@ use Log;
*/
class BillFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
use BillServiceTrait;
/** @var User */
private $user;
@@ -46,6 +57,10 @@ class BillFactory
*/
public function create(array $data): ?Bill
{
/** @var TransactionCurrencyFactory $factory */
$factory = app(TransactionCurrencyFactory::class);
/** @var TransactionCurrency $currency */
$currency = $factory->find((int)$data['currency_id'], (string)$data['currency_code']);
/** @var Bill $bill */
$bill = Bill::create(
[
@@ -53,7 +68,7 @@ class BillFactory
'match' => 'MIGRATED_TO_RULES',
'amount_min' => $data['amount_min'],
'user_id' => $this->user->id,
'transaction_currency_id' => $data['transaction_currency_id'],
'transaction_currency_id' => $currency->id,
'amount_max' => $data['amount_max'],
'date' => $data['date'],
'repeat_freq' => $data['repeat_freq'],

View File

@@ -27,12 +27,23 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\Budget;
use FireflyIII\User;
use Illuminate\Support\Collection;
use Log;
/**
* Class BudgetFactory.
*/
class BudgetFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/** @var User */
private $user;

View File

@@ -34,6 +34,16 @@ use Log;
*/
class CategoryFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/** @var User */
private $user;

View File

@@ -37,6 +37,16 @@ use Log;
*/
class PiggyBankEventFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/**
* @param TransactionJournal $journal
* @param PiggyBank|null $piggyBank

View File

@@ -26,12 +26,23 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\PiggyBank;
use FireflyIII\User;
use Log;
/**
* Class PiggyBankFactory
*/
class PiggyBankFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/** @var User */
private $user;

View File

@@ -39,6 +39,16 @@ use Log;
*/
class RecurrenceFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
use TransactionTypeTrait, TransactionServiceTrait, RecurringTransactionTrait;
/** @var User */
@@ -93,4 +103,4 @@ class RecurrenceFactory
$this->user = $user;
}
}
}

View File

@@ -27,12 +27,23 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\Tag;
use FireflyIII\User;
use Illuminate\Support\Collection;
use Log;
/**
* Class TagFactory
*/
class TagFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/** @var Collection */
private $tags;
/** @var User */

View File

@@ -36,6 +36,16 @@ use Log;
*/
class TransactionCurrencyFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/**
* @param array $data
*
@@ -43,7 +53,6 @@ class TransactionCurrencyFactory
*/
public function create(array $data): ?TransactionCurrency
{
$result = null;
try {
/** @var TransactionCurrency $currency */
$result = TransactionCurrency::create(
@@ -55,6 +64,7 @@ class TransactionCurrencyFactory
]
);
} catch (QueryException $e) {
$result = null;
Log::error(sprintf('Could not create new currency: %s', $e->getMessage()));
}

View File

@@ -40,6 +40,16 @@ use Log;
*/
class TransactionFactory
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === env('APP_ENV')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
use TransactionServiceTrait;
/** @var User */
@@ -59,10 +69,10 @@ class TransactionFactory
$currencyId = isset($data['currency']) ? $data['currency']->id : $currencyId;
if ('' === $data['amount']) {
Log::error('Empty string in data.', $data);
throw new FireflyException('Amount is an empty string, which Firefly III cannot handle. Apologies.'); // @codeCoverageIgnore
throw new FireflyException('Amount is an empty string, which Firefly III cannot handle. Apologies.');
}
if (null === $currencyId) {
throw new FireflyException('Cannot store transaction without currency information.'); // @codeCoverageIgnore
throw new FireflyException('Cannot store transaction without currency information.');
}
$data['foreign_amount'] = '' === (string)$data['foreign_amount'] ? null : $data['foreign_amount'];
Log::debug(sprintf('Create transaction for account #%d ("%s") with amount %s', $data['account']->id, $data['account']->name, $data['amount']));
@@ -98,6 +108,7 @@ class TransactionFactory
{
Log::debug('Start of TransactionFactory::createPair()', $data);
// all this data is the same for both transactions:
Log::debug('Searching for currency info.');
$currency = $this->findCurrency($data['currency_id'], $data['currency_code']);
$description = $journal->description === $data['description'] ? null : $data['description'];
@@ -109,21 +120,21 @@ class TransactionFactory
Log::debug(sprintf('Expect source destination to be of type "%s"', $destinationType));
// find source and destination account:
$sourceAccount = $this->findAccount($sourceType, $data['source_id'], $data['source_name']);
$destinationAccount = $this->findAccount($destinationType, $data['destination_id'], $data['destination_name']);
$sourceAccount = $this->findAccount($sourceType, (int)$data['source_id'], $data['source_name']);
$destinationAccount = $this->findAccount($destinationType, (int)$data['destination_id'], $data['destination_name']);
if (null === $sourceAccount || null === $destinationAccount) {
$debugData = $data;
$debugData['source_type'] = $sourceType;
$debugData['dest_type'] = $destinationType;
Log::error('Info about source/dest:', $debugData);
throw new FireflyException('Could not determine source or destination account.');
}
Log::debug(sprintf('Source type is "%s", destination type is "%s"', $sourceAccount->accountType->type, $destinationAccount->accountType->type));
// throw big fat error when source type === dest type and it's not a transfer or reconciliation.
if ($sourceAccount->accountType->type === $destinationAccount->accountType->type && $journal->transactionType->type !== TransactionType::TRANSFER) {
throw new FireflyException(sprintf('Source and destination account cannot be both of the type "%s"', $destinationAccount->accountType->type));
}
if ($sourceAccount->accountType->type !== AccountType::ASSET && $destinationAccount->accountType->type !== AccountType::ASSET) {
throw new FireflyException('At least one of the accounts must be an asset account.');
}
// based on the source type, destination type and transaction type, the system can start throwing FireflyExceptions.
$this->validateTransaction($sourceAccount->accountType->type, $destinationAccount->accountType->type, $journal->transactionType->type);
$source = $this->create(
[
@@ -150,10 +161,11 @@ class TransactionFactory
]
);
if (null === $source || null === $dest) {
throw new FireflyException('Could not create transactions.');
throw new FireflyException('Could not create transactions.'); // @codeCoverageIgnore
}
// set foreign currency
Log::debug('Trying to find foreign currency information.');
$foreign = $this->findCurrency($data['foreign_currency_id'], $data['foreign_currency_code']);
$this->setForeignCurrency($source, $foreign);
$this->setForeignCurrency($dest, $foreign);
@@ -190,5 +202,30 @@ class TransactionFactory
$this->user = $user;
}
/**
* @param string $sourceType
* @param string $destinationType
* @param string $transactionType
*
* @throws FireflyException
*/
private function validateTransaction(string $sourceType, string $destinationType, string $transactionType): void
{
// throw big fat error when source type === dest type and it's not a transfer or reconciliation.
if ($sourceType === $destinationType && $transactionType !== TransactionType::TRANSFER) {
throw new FireflyException(sprintf('Source and destination account cannot be both of the type "%s"', $destinationType));
}
// source must be in this list AND dest must be in this list:
$list = [AccountType::DEFAULT, AccountType::ASSET, AccountType::CREDITCARD, AccountType::CASH, AccountType::DEBT, AccountType::MORTGAGE,
AccountType::LOAN, AccountType::MORTGAGE];
if (
!\in_array($sourceType, $list, true)
&& !\in_array($destinationType, $list, true)) {
throw new FireflyException(sprintf('At least one of the accounts must be an asset account (%s, %s).', $sourceType, $destinationType));
}
// either of these must be asset or default account.
}
}

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