Compare commits

...

146 Commits

Author SHA1 Message Date
James Cole
76aa8acf0f Merge branch 'release/4.7.17' 2019-03-17 09:40:13 +01:00
James Cole
220add3eda Update lock file 2019-03-17 09:17:55 +01:00
James Cole
541280ee91 Update change logs and config files. 2019-03-17 09:17:07 +01:00
James Cole
01219c951c Enable norsk, update version of DB 2019-03-17 09:14:52 +01:00
James Cole
69fa60cd21 Various language string updates. 2019-03-17 09:14:33 +01:00
James Cole
a11d2df6bb Norwegian strings. 2019-03-17 09:13:23 +01:00
James Cole
07d39a23a8 Improve installer middleware for Sandstorm. 2019-03-17 09:06:45 +01:00
James Cole
ca67d98676 Fix some issues with importer #2166 2019-03-17 08:18:42 +01:00
James Cole
7b60d210ee Other delete thing. 2019-03-17 07:31:12 +01:00
James Cole
78d955ebf6 More debug things. 2019-03-17 07:20:11 +01:00
James Cole
f6f21e02ac Extra debug info for #2159 and some kernel changes. 2019-03-16 21:54:25 +01:00
James Cole
e2ebd01719 Extra debug info for #2159 2019-03-16 20:07:26 +01:00
James Cole
b8ac7c9d89 Fix #2173 2019-03-16 19:39:39 +01:00
James Cole
037d9b7017 Rename class and add copyright statement @wrouesnel #2167 2019-03-16 19:02:13 +01:00
James Cole
6462d2b87a Merge pull request #2167 from wrouesnel/bugfix/ldapauth
Fix LDAP auth configuration paths.
2019-03-16 18:58:21 +01:00
Will Rouesnel
cb4ff35adb Fix LDAP auth configuration paths.
This commit fixes parameters broken in the latest version of `adldap2`.

Specifically:

* `adldap` auth parameters have changed in the latest version.
  * "usernames" has become `identities` and `discover` has changed to
    `discover_users_by`, `auth` has changed to `bind_users_by`
* Add the missing objectguid field to the users table for adldap2.
  * This is added as a nullable (optional) field at the moment to support
    tracking LDAP users as adldap2 wants to.
2019-03-12 09:12:54 +11:00
James Cole
d063f32c1c Fix some cache issues and a version bump. 2019-03-08 17:57:42 +01:00
James Cole
244d8eecab Updated file list. 2019-03-08 07:09:45 +01:00
James Cole
b66f6d7e2e Updated list. 2019-03-08 07:07:43 +01:00
James Cole
aa3a88f537 New file list. 2019-03-08 06:48:04 +01:00
James Cole
e5476e6e7a Merge tag '4.7.16' into develop
4.7.16
2019-03-08 06:22:05 +01:00
James Cole
4d976312e8 Merge branch 'release/4.7.16' 2019-03-08 06:22:04 +01:00
James Cole
2ef5d3d4c6 Update composer file. 2019-03-08 06:11:22 +01:00
James Cole
eb3a89555d Small fix in changelog. 2019-03-08 06:11:13 +01:00
James Cole
0a80b7fca7 New translations. 2019-03-08 06:11:05 +01:00
James Cole
f682981c1e Fix test for PHPUnit8 2019-03-05 20:11:37 +01:00
James Cole
4aac969ae4 Update version and changelog. 2019-03-05 17:52:44 +01:00
James Cole
00651adf5e Fix issue with bill display 2019-03-05 17:52:34 +01:00
James Cole
ed94e71168 Update language strings. 2019-03-05 17:52:26 +01:00
James Cole
6e12f434ad Fix issue #2144 2019-03-05 16:55:03 +01:00
James Cole
b8c4ec1449 Add old string under new key. 2019-03-03 08:17:19 +01:00
James Cole
4ca60ca92a Code for upgrade of various libraries. 2019-03-02 21:18:26 +01:00
James Cole
48219c9af3 Update libraries. 2019-03-02 20:14:45 +01:00
James Cole
9887b9809d Merge branch 'master' into develop
* master:
  Bump version for travis build.
2019-03-02 17:36:44 +01:00
James Cole
a13ad5b417 Bump version for travis build. 2019-03-02 17:36:08 +01:00
James Cole
3f28fd689f Merge tag '4.7.15' into develop
4.7.15
2019-03-02 17:17:22 +01:00
James Cole
959025545e Merge branch 'release/4.7.15' 2019-03-02 17:17:21 +01:00
James Cole
1978463e59 Update language strings for new release. 2019-03-02 15:55:26 +01:00
James Cole
e85ac07c49 Update meta files for new release. 2019-03-02 15:55:01 +01:00
James Cole
b7f0a6fff4 Update migrations so you can always roll back. 2019-03-02 15:54:24 +01:00
James Cole
3a57e09447 Fix for #2128 2019-03-02 14:33:46 +01:00
James Cole
87d5cabe52 Search improvements. 2019-03-02 14:12:09 +01:00
James Cole
af07522f16 Fix for #2135 2019-03-02 10:42:43 +01:00
James Cole
1b8d4e4c63 Make sure bills show attachment notes 2019-03-02 09:18:41 +01:00
James Cole
9f3c114d57 Add JSON decrypt for #2125 2019-03-02 09:18:26 +01:00
James Cole
c51c1b8098 Some basic date tests 2019-03-02 08:05:15 +01:00
James Cole
143fe2a71f Fix #2125 2019-03-01 17:56:52 +01:00
James Cole
3379b723cf Last attempt I hope for #2125 2019-02-28 19:56:41 +01:00
James Cole
39321b320e Improve search speed. 2019-02-27 19:08:09 +01:00
James Cole
fe738fd321 Another fix for #2125 2019-02-27 18:55:56 +01:00
James Cole
95720673d2 Merge pull request #2130 from lastlink/patch-1
add missing rollback for 477 migration
2019-02-26 18:33:20 +01:00
lastlink
963be4a4fa add missing rollback for 477 migration 2019-02-26 00:16:05 -05:00
James Cole
61db419485 Fixes #2125 2019-02-25 20:57:29 +01:00
James Cole
cb17b09b24 Merge pull request #2120 from lastlink/fix/pwaApple
missing meta tag for ios
2019-02-25 07:23:50 +01:00
Mr. Funk
0f1236a597 missing meta tag for ios 2019-02-24 15:12:58 -05:00
James Cole
ac26427a63 Merge branch 'master' into develop
* master:
  Don't change ARM PHP settings.
2019-02-24 10:56:28 +01:00
James Cole
491903778a Don't change ARM PHP settings. 2019-02-24 10:56:08 +01:00
James Cole
405c3e110a Merge tag '4.7.14' into develop
4.7.14
2019-02-24 07:28:00 +01:00
James Cole
5464bfac19 Merge branch 'release/4.7.14' 2019-02-24 07:28:00 +01:00
James Cole
ad31cc1c1f Fixes #2119 and bump version. 2019-02-24 07:27:24 +01:00
James Cole
3aa79fb1e4 Merge tag '4.7.13' into develop
4.7.13
2019-02-23 21:27:05 +01:00
James Cole
e3de03e50d Merge branch 'release/4.7.13' 2019-02-23 21:27:04 +01:00
James Cole
d8b4af34e0 Update files for release 4.7.13 2019-02-23 14:32:24 +01:00
James Cole
222d8e071a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
* 'develop' of github.com:firefly-iii/firefly-iii:
  New check for journals with 0.00 amount.
2019-02-23 12:36:17 +01:00
James Cole
36c2f27d59 New check for journals with 0.00 amount. 2019-02-23 07:47:41 +01:00
James Cole
5d43faab96 Refactor script locations to clear up root directory. 2019-02-20 07:04:24 +01:00
James Cole
07048cb5fb Fix #2100 2019-02-19 20:19:30 +01:00
James Cole
38c79c3dc4 Upgrade fix for Softaculous. 2019-02-19 19:59:02 +01:00
James Cole
7610d9e0db Update Dockerfiles to increase PHP execution time. 2019-02-19 07:10:13 +01:00
James Cole
e4f3d0a0ea Some new strings. 2019-02-18 19:47:48 +01:00
James Cole
fdf147d9c6 Merge branch 'hotfix/4.7.12.1' 2019-02-16 23:01:29 +01:00
James Cole
f7e418f517 Merge tag '4.7.12.1' into develop
4.7.12.1
2019-02-16 23:01:29 +01:00
James Cole
738f6ed232 Fix #2093 2019-02-16 23:01:14 +01:00
James Cole
12217d9850 Merge tag '4.7.12' into develop
4.7.12
2019-02-16 19:35:01 +01:00
James Cole
87c8b3d7c6 Merge branch 'release/4.7.12' 2019-02-16 19:35:00 +01:00
James Cole
fd571abbb0 Slight change in build script. 2019-02-16 19:33:33 +01:00
James Cole
64ae56757e Updated meta files. 2019-02-16 19:22:16 +01:00
James Cole
7d75f00696 New translations. 2019-02-16 19:22:05 +01:00
James Cole
451c86e431 Final touches for #2085 2019-02-16 19:04:36 +01:00
James Cole
c8c71da903 Extra debug log. #2061 2019-02-16 14:27:54 +01:00
James Cole
423f3a9296 Fix build script. 2019-02-16 14:02:04 +01:00
James Cole
7658b7d9a6 Apply fix for #2070 2019-02-16 11:45:08 +01:00
James Cole
0d0906c5e2 Fix for #2070 2019-02-16 11:43:05 +01:00
James Cole
e0aa7f3ff5 Various code cleanup. 2019-02-16 08:05:48 +01:00
James Cole
59fdf5b77a Updates to the login procedure [skip ci] 2019-02-16 07:20:25 +01:00
James Cole
e28cfade8d Push and build stuff. 2019-02-15 17:15:42 +01:00
James Cole
19710c3eab Update LDAP config for #2085 2019-02-15 07:39:12 +01:00
James Cole
0782354160 Updated LDAP code #2085 2019-02-15 07:22:51 +01:00
James Cole
22bc6d507e Fix issue with upgrade. 2019-02-13 17:54:46 +01:00
James Cole
bf3c74e65f Add required PHP extensions to composer.json. 2019-02-13 17:54:36 +01:00
James Cole
71fb9d8fa5 Code cleaning stuff. 2019-02-13 17:38:41 +01:00
James Cole
9a461fc7b7 Fix for #2082 2019-02-13 17:34:03 +01:00
James Cole
e0d87aa11e First part of a large code cleanup commit. 2019-02-12 21:49:28 +01:00
James Cole
b273af341c Update version. 2019-02-12 21:01:19 +01:00
James Cole
2117fc2a5a Add thing to apply rules to fints #2081 2019-02-12 21:01:12 +01:00
James Cole
58e55dc789 Document things better. 2019-02-12 21:00:53 +01:00
James Cole
ac9b8b8c30 Build and push. 2019-02-12 17:33:34 +01:00
James Cole
4dcc66238e Make directory as well. 2019-02-12 17:31:30 +01:00
James Cole
90c0aa6360 Add touch command. 2019-02-12 17:29:45 +01:00
James Cole
1594335487 Experiment with manifest code. 2019-02-12 17:27:56 +01:00
James Cole
2517674849 Expand experimental things. 2019-02-12 17:21:52 +01:00
James Cole
c00bc2a1f3 Update build script. 2019-02-11 19:01:14 +01:00
James Cole
f999be81c2 Fix upgrade problem in Softaculous. 2019-02-11 17:22:46 +01:00
James Cole
e2530c5486 Refresh journal after a rule is applied, #2070 2019-02-11 17:09:52 +01:00
James Cole
7526f13ca9 Update build script. 2019-02-11 17:07:34 +01:00
James Cole
ed08d299de Fix for #2017 2019-02-11 17:07:07 +01:00
James Cole
b6ea2f1c64 Updated file list for sandstorm 2019-02-10 15:22:18 +01:00
James Cole
9ee14374bb Updated sandstorm file list. 2019-02-10 15:14:52 +01:00
James Cole
925401682b Merge tag '4.7.11' into develop
4.7.11
2019-02-10 14:53:58 +01:00
James Cole
53c71bb7a2 Merge branch 'release/4.7.11' 2019-02-10 14:53:57 +01:00
James Cole
3c036ae021 Fix issue with time stamps. 2019-02-10 14:53:24 +01:00
James Cole
bf89d9956d Update language strings. 2019-02-10 14:33:15 +01:00
James Cole
71104f375c Fix tests 2019-02-10 14:33:03 +01:00
James Cole
4c94820cf4 Update meta files. 2019-02-10 14:32:34 +01:00
James Cole
8998c9a672 Extra code for #1975 2019-02-10 10:54:30 +01:00
James Cole
ccf60f4cdc Back to classic build. 2019-02-10 08:07:25 +01:00
James Cole
c5af1d363c Add audit trail messages to several controllers. 2019-02-10 08:03:09 +01:00
James Cole
c6e3b54705 Make update code slightly more robust. 2019-02-10 07:59:11 +01:00
James Cole
4f274a290e Generic debug info. 2019-02-09 20:44:31 +01:00
James Cole
1774bcbabe Add copyright statements and newlines. 2019-02-09 10:36:59 +01:00
James Cole
492c11784b Update with manifest commands. 2019-02-09 06:40:55 +01:00
James Cole
21ddbd220a Include lib for arm 2019-02-08 17:40:29 +01:00
James Cole
e4a95e55ed Remove copy argument. 2019-02-08 17:34:46 +01:00
James Cole
3a0eb5a428 Do actual build 2019-02-08 17:31:32 +01:00
James Cole
e55fd968cf Rename file 2019-02-08 17:31:25 +01:00
James Cole
d41be08b48 Rename file 2019-02-08 17:30:42 +01:00
James Cole
a18272513d Fix YML 2019-02-08 17:28:04 +01:00
James Cole
e88061199c Trigger a new build. 2019-02-08 17:17:19 +01:00
James Cole
d0d7c437f2 Different build flow. 2019-02-08 17:15:54 +01:00
James Cole
a1ac1a4a29 Remove empty header from changelog [skip ci] 2019-02-08 17:01:49 +01:00
James Cole
41d22876c4 Update changelog and version. 2019-02-08 17:00:46 +01:00
James Cole
e1bb0298cb Fix category use date. 2019-02-08 16:56:07 +01:00
James Cole
1ec2772255 Fix #2052 2019-02-08 16:51:29 +01:00
James Cole
40d77d82cd Bunq import can now handle timestamps. 2019-02-08 16:45:42 +01:00
James Cole
311d51464d Add support for #2006 2019-02-08 07:14:45 +01:00
James Cole
d63c9c9aea Add audit logging. 2019-02-08 07:13:59 +01:00
James Cole
f1e83f240e Build with a new distribution. 2019-02-08 03:21:34 +01:00
James Cole
b0f847959f Merge pull request #2058 from skuzzle/develop
Remove console.log statement
2019-02-05 15:22:12 +01:00
Simon Taddiken
d3d4439b03 Remove console.log statement 2019-02-05 15:02:36 +01:00
James Cole
0e1da3f797 Fix webbased upgrade routine. 2019-02-04 20:35:46 +01:00
James Cole
def95df49e Fix link in changelog [skip ci] 2019-02-03 20:20:24 +01:00
James Cole
73c8c6de37 Disable manifest push [skip ci] 2019-02-03 20:19:59 +01:00
James Cole
25b2b43a38 Fix for #2049 2019-02-03 18:25:58 +01:00
James Cole
1fc2c998de Merge pull request #2048 from nescafe2002/patch-1
Fix delete-account confirmation
2019-02-03 14:52:40 +01:00
Joris
b7a577cc4c Fix delete-account confirmation 2019-02-03 14:44:32 +01:00
James Cole
2cdedd9c29 Merge tag '4.7.10' into develop
4.7.10
2019-02-03 10:10:41 +01:00
429 changed files with 9317 additions and 4515 deletions

View File

@@ -45,6 +45,14 @@ DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER} DB_USERNAME=${FF_DB_USER}
DB_PASSWORD="${FF_DB_PASSWORD}" DB_PASSWORD="${FF_DB_PASSWORD}"
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL=${PGSQL_SSL}
PGSQL_SSL_MODE=${PGSQL_SSL_MODE}
PGSQL_SSL_ROOT_CERT=${PGSQL_SSL_ROOT_CERT}
PGSQL_SSL_CERT=${PGSQL_SSL_CERT}
PGSQL_SSL_KEY=${PGSQL_SSL_KEY}
PGSQL_SSL_CRL_FILE=${PGSQL_SSL_CRL_FILE}
# If you're looking for performance improvements, you could install memcached. # If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file CACHE_DRIVER=file
SESSION_DRIVER=file SESSION_DRIVER=file
@@ -112,7 +120,7 @@ ANALYTICS_ID=${ANALYTICS_ID}
USE_ENCRYPTION=true USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default, # Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers. # and "ldap" for LDAP servers.
# For full instructions on these settings please visit: # For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html # https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=${LOGIN_PROVIDER} LOGIN_PROVIDER=${LOGIN_PROVIDER}
@@ -135,8 +143,6 @@ ADLDAP_ADMIN_PASSWORD="${ADLDAP_ADMIN_PASSWORD}"
ADLDAP_ACCOUNT_PREFIX="${ADLDAP_ACCOUNT_PREFIX}" ADLDAP_ACCOUNT_PREFIX="${ADLDAP_ACCOUNT_PREFIX}"
ADLDAP_ACCOUNT_SUFFIX="${ADLDAP_ACCOUNT_SUFFIX}" 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. # LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=${ADLDAP_PASSWORD_SYNC} ADLDAP_PASSWORD_SYNC=${ADLDAP_PASSWORD_SYNC}

View File

@@ -3,16 +3,20 @@
# build image # build image
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
if [ "$TRAVIS_BRANCH" == "develop" ]; then if [ "$TRAVIS_BRANCH" == "develop" ]; then
echo "Build develop amd64" echo "Build develop amd64"
docker build -t jc5x/firefly-iii:develop-amd -f Dockerfile . docker build -t jc5x/firefly-iii:develop-amd64 -f Dockerfile.amd64 .
docker push jc5x/firefly-iii:develop-amd docker tag jc5x/firefly-iii:develop-amd64 jc5x/firefly-iii:develop-$VERSION-amd64
docker push jc5x/firefly-iii:develop-amd64
docker push jc5x/firefly-iii:develop-$VERSION-amd64
fi fi
if [ "$TRAVIS_BRANCH" == "master" ]; then if [ "$TRAVIS_BRANCH" == "master" ]; then
echo "Build master amd64" echo "Build master amd64"
docker build -t jc5x/firefly-iii:latest-amd -f Dockerfile . docker build -t jc5x/firefly-iii:latest-amd64 -f Dockerfile.amd64 .
docker tag jc5x/firefly-iii:latest-amd jc5x/firefly-iii:release-$VERSION-amd docker tag jc5x/firefly-iii:latest-amd64 jc5x/firefly-iii:release-$VERSION-amd64
docker push jc5x/firefly-iii:latest-amd docker push jc5x/firefly-iii:latest-amd64
docker push jc5x/firefly-iii:release-$VERSION-amd docker push jc5x/firefly-iii:release-$VERSION-amd64
fi fi

View File

@@ -15,13 +15,15 @@ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
if [ "$TRAVIS_BRANCH" == "develop" ]; then if [ "$TRAVIS_BRANCH" == "develop" ]; then
echo "Build develop arm" echo "Build develop arm"
docker build --tag jc5x/firefly-iii:develop-arm --file Dockerfile-ARM . docker build --tag jc5x/firefly-iii:develop-arm --file Dockerfile.arm .
docker tag jc5x/firefly-iii:develop-arm jc5x/firefly-iii:develop-$VERSION-arm
docker push jc5x/firefly-iii:develop-arm docker push jc5x/firefly-iii:develop-arm
docker push jc5x/firefly-iii:develop-$VERSION-arm
fi fi
if [ "$TRAVIS_BRANCH" == "master" ]; then if [ "$TRAVIS_BRANCH" == "master" ]; then
echo "Build master arm" echo "Build master arm"
docker build --tag jc5x/firefly-iii:latest-arm --file Dockerfile-ARM . docker build --tag jc5x/firefly-iii:latest-arm --file Dockerfile.arm .
docker tag jc5x/firefly-iii:latest-arm jc5x/firefly-iii:release-$VERSION-arm docker tag jc5x/firefly-iii:latest-arm jc5x/firefly-iii:release-$VERSION-arm
docker push jc5x/firefly-iii:latest-arm docker push jc5x/firefly-iii:latest-arm
docker push jc5x/firefly-iii:release-$VERSION-arm docker push jc5x/firefly-iii:release-$VERSION-arm

View File

@@ -2,6 +2,8 @@
echo "Now in entrypoint.sh for Firefly III" echo "Now in entrypoint.sh for Firefly III"
lscpu
# make sure the correct directories exists (suggested by @chrif): # make sure the correct directories exists (suggested by @chrif):
echo "Making directories..." echo "Making directories..."
mkdir -p $FIREFLY_PATH/storage/app/public mkdir -p $FIREFLY_PATH/storage/app/public
@@ -42,7 +44,7 @@ echo "Remove log file..."
rm -f $FIREFLY_PATH/storage/logs/laravel.log rm -f $FIREFLY_PATH/storage/logs/laravel.log
echo "Map environment variables on .env file..." echo "Map environment variables on .env file..."
cat .env.docker | envsubst > .env cat $FIREFLY_PATH/.deploy/docker/.env.docker | envsubst > $FIREFLY_PATH/.env
echo "Dump auto load..." echo "Dump auto load..."
composer dump-autoload composer dump-autoload
echo "Discover packages..." echo "Discover packages..."

View File

@@ -1,8 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
if [ "$TRAVIS_BRANCH" == "develop" ]; then if [ "$TRAVIS_BRANCH" == "develop" ]; then
TARGET=jc5x/firefly-iii:develop TARGET=jc5x/firefly-iii:develop
ARM=jc5x/firefly-iii:develop-arm ARM=jc5x/firefly-iii:develop-arm
AMD=jc5x/firefly-iii:develop-amd AMD=jc5x/firefly-iii:develop-amd64
docker manifest create $TARGET $AMD $ARM docker manifest create $TARGET $AMD $ARM
docker manifest annotate $TARGET $ARM --arch arm --os linux docker manifest annotate $TARGET $ARM --arch arm --os linux
@@ -15,7 +16,7 @@ echo "The version is $VERSION"
if [ "$TRAVIS_BRANCH" == "master" ]; then if [ "$TRAVIS_BRANCH" == "master" ]; then
TARGET=jc5x/firefly-iii:latest TARGET=jc5x/firefly-iii:latest
ARM=jc5x/firefly-iii:latest-arm ARM=jc5x/firefly-iii:latest-arm
AMD=jc5x/firefly-iii:latest-amd AMD=jc5x/firefly-iii:latest-amd64
docker manifest create $TARGET $AMD $ARM docker manifest create $TARGET $AMD $ARM
docker manifest annotate $TARGET $ARM --arch arm --os linux docker manifest annotate $TARGET $ARM --arch arm --os linux
@@ -25,7 +26,7 @@ if [ "$TRAVIS_BRANCH" == "master" ]; then
# and another one for version specific: # and another one for version specific:
TARGET=jc5x/firefly-iii:release-$VERSION TARGET=jc5x/firefly-iii:release-$VERSION
ARM=jc5x/firefly-iii:release-$VERSION-arm ARM=jc5x/firefly-iii:release-$VERSION-arm
AMD=jc5x/firefly-iii:release-$VERSION-amd AMD=jc5x/firefly-iii:release-$VERSION-amd64
docker manifest create $TARGET $AMD $ARM docker manifest create $TARGET $AMD $ARM
docker manifest annotate $TARGET $ARM --arch arm --os linux docker manifest annotate $TARGET $ARM --arch arm --os linux

View File

@@ -42,7 +42,12 @@ DB_CONNECTION=pgsql
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached. # If you're looking for performance improvements, you could install memcached.
@@ -112,7 +117,7 @@ ANALYTICS_ID=
USE_ENCRYPTION=true USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default, # Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers. # and "ldap" for LDAP servers.
# For full instructions on these settings please visit: # For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html # https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent LOGIN_PROVIDER=eloquent
@@ -136,8 +141,6 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX= ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX= ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings. # LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false ADLDAP_PASSWORD_SYNC=false

View File

@@ -1,4 +1,5 @@
en_US en_US
es_ES
de_DE de_DE
fr_FR fr_FR
it_IT it_IT
@@ -6,4 +7,4 @@ nl_NL
pl_PL pl_PL
pt_BR pt_BR
ru_RU ru_RU
tr_TR nb_NO

View File

@@ -112,7 +112,7 @@ ANALYTICS_ID=
USE_ENCRYPTION=true USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default, # Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers. # and "ldap" for LDAP servers.
# For full instructions on these settings please visit: # For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html # https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent LOGIN_PROVIDER=eloquent
@@ -136,8 +136,6 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX= ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX= ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings. # LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false ADLDAP_PASSWORD_SYNC=false

View File

@@ -45,6 +45,13 @@ DB_DATABASE=homestead
DB_USERNAME=homestead DB_USERNAME=homestead
DB_PASSWORD=secret DB_PASSWORD=secret
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached. # If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file CACHE_DRIVER=file
SESSION_DRIVER=file SESSION_DRIVER=file
@@ -112,7 +119,7 @@ ANALYTICS_ID=
USE_ENCRYPTION=true USE_ENCRYPTION=true
# Firefly III has two options for user authentication. "eloquent" is the default, # Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers. # and "ldap" for LDAP servers.
# For full instructions on these settings please visit: # For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html # https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent LOGIN_PROVIDER=eloquent
@@ -136,8 +143,6 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX= ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX= ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings. # LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false ADLDAP_PASSWORD_SYNC=false

View File

@@ -1,180 +0,0 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=testing
# Set to true if you want to see debug information in error screens.
APP_DEBUG=true
# This should be your email address
SITE_OWNER=thegrumpydictator+testing@gmail.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=TestTestTestTestTestTestTestTest
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=Europe/Amsterdam
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=http://localhost
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
TRUSTED_PROXIES=
# The log channel defines where your log entries go to.
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
LOG_CHANNEL=dailytest
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=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=
COOKIE_SECURE=false
# If you want Firefly III to mail you, update these settings
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_FROM=changeme@example.com
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
# Other mail drivers:
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MANDRILL_SECRET=
SPARKPOST_SECRET=
# Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=false
# 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=
# Firefly III currently supports two provider for live Currency Exchange Rates:
# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one.
# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates,
# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key.
CER_PROVIDER=fixer
# If you have select "fixer" as default currency exchange rates,
# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited
# the free API up to the point where you might as well offer nothing.
FIXER_API_KEY=
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
ANALYTICS_ID=
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
USE_ENCRYPTION=false
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "adldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
LOGIN_PROVIDER=eloquent
# LDAP connection configuration
# or FreeIPA or ActiveDirectory
ADLDAP_CONNECTION_SCHEME=OpenLDAP
ADLDAP_AUTO_CONNECT=true
# LDAP connection settings
ADLDAP_CONTROLLERS=
ADLDAP_PORT=389
ADLDAP_TIMEOUT=5
ADLDAP_BASEDN=""
ADLDAP_FOLLOW_REFFERALS=false
ADLDAP_USE_SSL=false
ADLDAP_USE_TLS=false
ADLDAP_ADMIN_USERNAME=
ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
ADLDAP_ADMIN_ACCOUNT_PREFIX=
ADLDAP_ADMIN_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false
ADLDAP_DISCOVER_FIELD=distinguishedname
ADLDAP_AUTH_FIELD=distinguishedname
# Will allow SSO if your server provides an AUTH_USER field.
WINDOWS_SSO_DISCOVER=samaccountname
WINDOWS_SSO_KEY=AUTH_USER
# field to sync as local username.
ADLDAP_SYNC_FIELD=userprincipalname
# You can disable the X-Frame-Options header if it interfears with tools like
# Organizr. This is at your own risk.
DISABLE_FRAME_HEADER=false
# Leave the following configuration vars as is.
# Unless you like to tinker and know what you're doing.
APP_NAME=FireflyIII
ADLDAP_CONNECTION=default
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
CACHE_PREFIX=firefly_tst
SEARCH_RESULT_LIMIT=50
PUSHER_KEY=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=true
FFIII_LAYOUT=v1

View File

@@ -1,8 +1,10 @@
<!-- <!--
Please read me: Before you create a new PR, please consider the following two considerations.
1) DO NOT create a pull request for the MASTER branch. 1) Pull request for the MASTER branch will be closed.
2) DO NOT create pull requests to add new CURRENCIES. 2) We cannot accept pull requests to add new currencies.
Thanks.
--> -->
Fixes issue # (if relevant) Fixes issue # (if relevant)

View File

@@ -6,7 +6,7 @@ set -euo pipefail
echo "In build.sh" echo "In build.sh"
cd /opt/app cd /opt/app
cp .env.sandstorm .env cp .deploy/sandstorm/.env.sandstorm .env
if [ -f /opt/app/composer.json ] ; then if [ -f /opt/app/composer.json ] ; then
if [ ! -f composer.phar ] ; then if [ ! -f composer.phar ] ; then

View File

@@ -1,3 +1,58 @@
# 4.7.17 (API 0.9.2)
- Support for Norwegian!
- Clear cache during install routine.
- Add Firefly III version number to install routine.
- Initial release.
- [Issue 2159](https://github.com/firefly-iii/firefly-iii/issues/2159) Bad redirect due to Laravel upgrade.
- [Issue 2166](https://github.com/firefly-iii/firefly-iii/issues/2166) Importer had some issues with distinguishing double transfers.
- [Issue 2167](https://github.com/firefly-iii/firefly-iii/issues/2167) New LDAP package gave some configuration changes.
- [Issue 2173](https://github.com/firefly-iii/firefly-iii/issues/2173) Missing class when generating 2FA codes.
# 4.7.16 (API 0.9.2)
- 4.7.16 was released to fix a persistent issue with broken user preferences.
- Firefly III now uses Laravel 5.8
# 4.7.15 (API 0.9.2)
- 4.7.15 was released to fix some issues upgrading from older versions.
- [Issue 2128](https://github.com/firefly-iii/firefly-iii/issues/2128) Support for Postgres SSL
- [Issue 2120](https://github.com/firefly-iii/firefly-iii/issues/2120) Add a missing meta tag, thanks to @lastlink
- Search is a lot faster now.
- [Issue 2125](https://github.com/firefly-iii/firefly-iii/issues/2125) Decryption issues during upgrade
- [Issue 2130](https://github.com/firefly-iii/firefly-iii/issues/2130) Fixed database migrations and rollbacks.
- [Issue 2135](https://github.com/firefly-iii/firefly-iii/issues/2135) Date fixes in transaction overview
# 4.7.14 (API 0.9.2)
- 4.7.14 was released to fix an issue with the Composer installation script.
# 4.7.13 (API 0.9.2)
- 4.7.13 was released to fix an issue that affected the Softaculous build.
- A routine has been added that warns about transactions with a 0.00 amount.
- PHP maximum execution time is now 600 seconds in the Docker image.
- Moved several files outside of the root of Firefly III
- Fix issue where missing preference breaks the database upgrade.
- [Issue 2100](https://github.com/firefly-iii/firefly-iii/issues/2100) Mass edit transactions results in a reset of the date.
# 4.7.12
- 4.7.12 was released to fix several shortcomings in v4.7.11's Docker image. Those in turn were caused by me. My apologies.
- [Issue 2085](https://github.com/firefly-iii/firefly-iii/issues/2085) Upgraded the LDAP code. To keep using LDAP, set the `LOGIN_PROVIDER` to `ldap`.
- [Issue 2061](https://github.com/firefly-iii/firefly-iii/issues/2061) Some users reported empty update popups.
- [Issue 2070](https://github.com/firefly-iii/firefly-iii/issues/2070) A cache issue prevented rules from being applied correctly.
- [Issue 2071](https://github.com/firefly-iii/firefly-iii/issues/2071) Several issues with Postgres and date values with time zone information in them.
- [Issue 2081](https://github.com/firefly-iii/firefly-iii/issues/2081) Rules were not being applied when importing using FinTS.
- [Issue 2082](https://github.com/firefly-iii/firefly-iii/issues/2082) The mass-editor changed all dates to today.
# 4.7.11
- Experimental audit logging channel to track important events (separate from debug logging).
- [Issue 2003](https://github.com/firefly-iii/firefly-iii/issues/2003), [issue 2006](https://github.com/firefly-iii/firefly-iii/issues/2006) Transactions can be stored with a timestamp. The user-interface does not support this yet. But the API does.
- Docker image tags a new manifest for arm and amd64.
- [skuzzle](https://github.com/skuzzle) removed an annoying console.log statement.
- [Issue 2048](https://github.com/firefly-iii/firefly-iii/issues/2048) Fix "Are you sure?" popup, thanks to @nescafe2002!
- [Issue 2049](https://github.com/firefly-iii/firefly-iii/issues/2049) Empty preferences would crash Firefly III.
- [Issue 2052](https://github.com/firefly-iii/firefly-iii/issues/2052) Rules could not auto-covert to liabilities.
- Webbased upgrade routine will also decrypt the database.
- Last use date for categories was off.
- The `date`-field in any transaction object now returns a ISO 8601 timestamp instead of a date.
# 4.7.10 # 4.7.10
- [Issue 2037](https://github.com/firefly-iii/firefly-iii/issues/2037) Added some new magic keywords to reports. - [Issue 2037](https://github.com/firefly-iii/firefly-iii/issues/2037) Added some new magic keywords to reports.
- Added a new currency exchange rate service, [ratesapi.io](https://ratesapi.io/), that does not require expensive API keys. Built by [@BoGnY](https://github.com/BoGnY). - Added a new currency exchange rate service, [ratesapi.io](https://ratesapi.io/), that does not require expensive API keys. Built by [@BoGnY](https://github.com/BoGnY).

File diff suppressed because it is too large Load Diff

View File

@@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
manifest = ( manifest = (
appTitle = (defaultText = "Firefly III"), appTitle = (defaultText = "Firefly III"),
appVersion = 20, appVersion = 27,
appMarketingVersion = (defaultText = "4.7.10"), appMarketingVersion = (defaultText = "4.7.17"),
actions = [ actions = [
# Define your "new document" handlers here. # Define your "new document" handlers here.

View File

@@ -13,6 +13,7 @@ apt-get update
apt-get install -y python-software-properties software-properties-common apt-get install -y python-software-properties software-properties-common
# install all languages # install all languages
#en_US
sed -i 's/# es_ES.UTF-8 UTF-8/es_ES.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/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
@@ -22,6 +23,9 @@ sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# nb_NO.UTF-8 UTF-8/nb_NO.UTF-8 UTF-8/g' /etc/locale.gen
dpkg-reconfigure --frontend=noninteractive locales dpkg-reconfigure --frontend=noninteractive locales

View File

@@ -1,23 +1,29 @@
sudo: required sudo: required
language: bash language: bash
env:
- VERSION=4.7.17
dist: xenial
# safelist # safelist
branches: branches:
only: only:
- develop - develop
- master - master
env:
- VERSION=4.7.10
services: services:
- docker - docker
script: script:
# enable experimental features. # enable experimental features.
- echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json - echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
- mkdir $HOME/.docker
- touch $HOME/.docker/config.json
- echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json
- sudo service docker restart - sudo service docker restart
- docker version -f '{{.Server.Experimental}}' - docker version -f '{{.Server.Experimental}}'
- docker version - docker version
# build everything
- .deploy/docker/build-amd64.sh - .deploy/docker/build-amd64.sh
- .deploy/docker/build-arm.sh - .deploy/docker/build-arm.sh
- .deploy/docker/manifest.sh - .deploy/docker/manifest.sh

View File

@@ -1,7 +1,7 @@
FROM php:7.2-apache FROM php:7.2-apache
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1 ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com" LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes # Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
@@ -44,6 +44,11 @@ RUN chown -R www-data:www-data /var/www && \
locale-gen && \ locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest composer install --prefer-dist --no-dev --no-scripts --no-suggest
# configure PHP
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = 30/max_execution_time = 600/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/etc/php/php.ini
# Expose port 80 # Expose port 80
EXPOSE 80 EXPOSE 80

57
Dockerfile.amd64 Normal file
View File

@@ -0,0 +1,57 @@
FROM php:7.2-apache
ARG ARCH
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Install some stuff
RUN apt-get update && apt-get install -y libpng-dev \
libicu-dev \
unzip \
gettext-base \
libldap2-dev \
libpq-dev \
locales \
libmemcached-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Copy in Firefly III source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# copy ca certs to correct location
COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem
# copy Apache config to correct spot.
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
# Enable default site (Firefly III)
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
# Run a lot of installation commands:
RUN chown -R www-data:www-data /var/www && \
chmod -R 775 $FIREFLY_PATH/storage && \
a2enmod rewrite && a2enmod ssl && \
docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine)/ && \
docker-php-ext-install -j$(nproc) zip bcmath ldap gd pdo_pgsql pdo_mysql intl opcache && \
pecl install memcached-3.1.3 && \
docker-php-ext-enable memcached && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
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-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# configure PHP
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = 30/max_execution_time = 600/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/etc/php/php.ini
# Expose port 80
EXPOSE 80
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

View File

@@ -1,8 +1,8 @@
FROM arm32v7/php:7.2.8-apache-stretch FROM arm32v7/php:7.2.8-apache-stretch
ARG TARGETPLATFORM ARG ARCH
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1 ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com" LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes # Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload

50
Dockerfile.arm64 Normal file
View File

@@ -0,0 +1,50 @@
FROM arm32v7/php:7.2.8-apache-stretch
ARG ARCH
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
# Install some stuff
RUN apt-get update && apt-get install -y libpng-dev \
libicu-dev \
unzip \
gettext-base \
libldap2-dev \
libpq-dev \
locales \
libmemcached-dev
# Copy in Firefly III source
WORKDIR $FIREFLY_PATH
ADD . $FIREFLY_PATH
# copy ca certs to correct location
COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem
# copy Apache config to correct spot.
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
# Enable default site (Firefly III)
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
# Run a lot of installation commands:
RUN chown -R www-data:www-data /var/www && \
chmod -R 775 $FIREFLY_PATH/storage && \
a2enmod rewrite && a2enmod ssl && \
docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine)/ && \
docker-php-ext-install -j$(nproc) zip bcmath ldap gd pdo_pgsql pdo_mysql intl opcache && \
pecl install memcached-3.1.3 && \
docker-php-ext-enable memcached && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
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-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# Expose port 80
EXPOSE 80
# Run entrypoint thing
ENTRYPOINT [".deploy/docker/entrypoint.sh"]

View File

@@ -60,7 +60,7 @@ class AboutController extends Controller
'driver' => $currentDriver, 'driver' => $currentDriver,
]; ];
return response()->json(['data' => $data], 200)->header('Content-Type', 'application/vnd.api+json'); return response()->json(['data' => $data])->header('Content-Type', 'application/vnd.api+json');
} }
/** /**

View File

@@ -100,7 +100,7 @@ class AttachmentController extends Controller
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
/** @var LaravelResponse $response */ /** @var LaravelResponse $response */
$response = response($content, 200); $response = response($content);
$response $response
->header('Content-Description', 'File Transfer') ->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream') ->header('Content-Type', 'application/octet-stream')

View File

@@ -24,12 +24,10 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers; namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Api\V1\Requests\AvailableBudgetRequest; use FireflyIII\Api\V1\Requests\AvailableBudgetRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Factory\TransactionCurrencyFactory; use FireflyIII\Factory\TransactionCurrencyFactory;
use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\AvailableBudget;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer; use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -48,8 +46,6 @@ use League\Fractal\Serializer\JsonApiSerializer;
*/ */
class AvailableBudgetController extends Controller class AvailableBudgetController extends Controller
{ {
/** @var CurrencyRepositoryInterface The currency repository */
private $currencyRepository;
/** @var BudgetRepositoryInterface The budget repository */ /** @var BudgetRepositoryInterface The budget repository */
private $repository; private $repository;
@@ -64,7 +60,6 @@ class AvailableBudgetController extends Controller
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->repository->setUser($user); $this->repository->setUser($user);
return $next($request); return $next($request);
@@ -109,10 +104,12 @@ class AvailableBudgetController extends Controller
// TODO: put this in the query. // TODO: put this in the query.
$start = $this->parameters->get('start'); $start = $this->parameters->get('start');
$end = $this->parameters->get('end'); $end = $this->parameters->get('end');
if(null !== $start && null !== $end) { if (null !== $start && null !== $end) {
$collection = $collection->filter(function(AvailableBudget $availableBudget) use ($start, $end) { $collection = $collection->filter(
function (AvailableBudget $availableBudget) use ($start, $end) {
return $availableBudget->start_date->gte($start) && $availableBudget->end_date->lte($end); return $availableBudget->start_date->gte($start) && $availableBudget->end_date->lte($end);
}); }
);
} }
$count = $collection->count(); $count = $collection->count();
@@ -164,7 +161,6 @@ class AvailableBudgetController extends Controller
* @param AvailableBudgetRequest $request * @param AvailableBudgetRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
*/ */
public function store(AvailableBudgetRequest $request): JsonResponse public function store(AvailableBudgetRequest $request): JsonResponse
{ {

View File

@@ -1,4 +1,25 @@
<?php <?php
/**
* AccountController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart; namespace FireflyIII\Api\V1\Controllers\Chart;
@@ -135,94 +156,6 @@ class AccountController extends Controller
return response()->json($chartData); return response()->json($chartData);
} }
/**
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function revenueOverview(Request $request): JsonResponse
{
// parameters for chart:
$start = (string)$request->get('start');
$end = (string)$request->get('end');
if ('' === $start || '' === $end) {
throw new FireflyException('Start and end are mandatory parameters.');
}
$start = Carbon::createFromFormat('Y-m-d', $start);
$end = Carbon::createFromFormat('Y-m-d', $end);
$start->subDay();
// prep some vars:
$currencies = [];
$chartData = [];
$tempData = [];
// grab all accounts and names
$accounts = $this->repository->getAccountsByType([AccountType::REVENUE]);
$accountNames = $this->extractNames($accounts);
$startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start);
$endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end);
// loop the end balances. This is an array for each account ($expenses)
foreach ($endBalances as $accountId => $expenses) {
$accountId = (int)$accountId;
// loop each expense entry (each entry can be a different currency).
foreach ($expenses as $currencyId => $endAmount) {
$currencyId = (int)$currencyId;
// see if there is an accompanying start amount.
// grab the difference and find the currency.
$startAmount = $startBalances[$accountId][$currencyId] ?? '0';
$diff = bcsub($endAmount, $startAmount);
$currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId);
if (0 !== bccomp($diff, '0')) {
// store the values in a temporary array.
$tempData[] = [
'name' => $accountNames[$accountId],
'difference' => bcmul($diff,'-1'),
'diff_float' => (float)$diff * -1,
'currency_id' => $currencyId,
];
}
}
}
// sort temp array by amount.
$amounts = array_column($tempData, 'diff_float');
array_multisort($amounts, SORT_DESC, $tempData);
// loop all found currencies and build the data array for the chart.
/**
* @var int $currencyId
* @var TransactionCurrency $currency
*/
foreach ($currencies as $currencyId => $currency) {
$currentSet = [
'label' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'bar', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => $this->expandNames($tempData),
];
$chartData[$currencyId] = $currentSet;
}
// loop temp data and place data in correct array:
foreach ($tempData as $entry) {
$currencyId = $entry['currency_id'];
$name = $entry['name'];
$chartData[$currencyId]['entries'][$name] = round($entry['difference'], $chartData[$currencyId]['currency_decimal_places']);
}
$chartData = array_values($chartData);
return response()->json($chartData);
}
/** /**
* @param Request $request * @param Request $request
* *
@@ -287,6 +220,94 @@ class AccountController extends Controller
return response()->json($chartData); return response()->json($chartData);
} }
/**
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function revenueOverview(Request $request): JsonResponse
{
// parameters for chart:
$start = (string)$request->get('start');
$end = (string)$request->get('end');
if ('' === $start || '' === $end) {
throw new FireflyException('Start and end are mandatory parameters.');
}
$start = Carbon::createFromFormat('Y-m-d', $start);
$end = Carbon::createFromFormat('Y-m-d', $end);
$start->subDay();
// prep some vars:
$currencies = [];
$chartData = [];
$tempData = [];
// grab all accounts and names
$accounts = $this->repository->getAccountsByType([AccountType::REVENUE]);
$accountNames = $this->extractNames($accounts);
$startBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $start);
$endBalances = app('steam')->balancesPerCurrencyByAccounts($accounts, $end);
// loop the end balances. This is an array for each account ($expenses)
foreach ($endBalances as $accountId => $expenses) {
$accountId = (int)$accountId;
// loop each expense entry (each entry can be a different currency).
foreach ($expenses as $currencyId => $endAmount) {
$currencyId = (int)$currencyId;
// see if there is an accompanying start amount.
// grab the difference and find the currency.
$startAmount = $startBalances[$accountId][$currencyId] ?? '0';
$diff = bcsub($endAmount, $startAmount);
$currencies[$currencyId] = $currencies[$currencyId] ?? $this->currencyRepository->findNull($currencyId);
if (0 !== bccomp($diff, '0')) {
// store the values in a temporary array.
$tempData[] = [
'name' => $accountNames[$accountId],
'difference' => bcmul($diff, '-1'),
'diff_float' => (float)$diff * -1,
'currency_id' => $currencyId,
];
}
}
}
// sort temp array by amount.
$amounts = array_column($tempData, 'diff_float');
array_multisort($amounts, SORT_DESC, $tempData);
// loop all found currencies and build the data array for the chart.
/**
* @var int $currencyId
* @var TransactionCurrency $currency
*/
foreach ($currencies as $currencyId => $currency) {
$currentSet = [
'label' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]),
'currency_id' => $currency->id,
'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places,
'type' => 'bar', // line, area or bar
'yAxisID' => 0, // 0, 1, 2
'entries' => $this->expandNames($tempData),
];
$chartData[$currencyId] = $currentSet;
}
// loop temp data and place data in correct array:
foreach ($tempData as $entry) {
$currencyId = $entry['currency_id'];
$name = $entry['name'];
$chartData[$currencyId]['entries'][$name] = round($entry['difference'], $chartData[$currencyId]['currency_decimal_places']);
}
$chartData = array_values($chartData);
return response()->json($chartData);
}
/** /**
* Small helper function for the revenue and expense account charts. * Small helper function for the revenue and expense account charts.
* TODO should include Trait instead of doing this. * TODO should include Trait instead of doing this.

View File

@@ -1,4 +1,25 @@
<?php <?php
/**
* AvailableBudgetController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart; namespace FireflyIII\Api\V1\Controllers\Chart;
@@ -9,7 +30,6 @@ use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@@ -39,13 +59,11 @@ class AvailableBudgetController extends Controller
} }
/** /**
* @param Request $request
*
* @param AvailableBudget $availableBudget * @param AvailableBudget $availableBudget
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function overview(Request $request, AvailableBudget $availableBudget): JsonResponse public function overview(AvailableBudget $availableBudget): JsonResponse
{ {
$currency = $availableBudget->transactionCurrency; $currency = $availableBudget->transactionCurrency;
$budgets = $this->repository->getActiveBudgets(); $budgets = $this->repository->getActiveBudgets();

View File

@@ -1,4 +1,25 @@
<?php <?php
/**
* CategoryController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Chart; namespace FireflyIII\Api\V1\Controllers\Chart;

View File

@@ -54,7 +54,6 @@ class ConfigurationController extends Controller
$admin = auth()->user(); $admin = auth()->user();
if (!$this->repository->hasRole($admin, 'owner')) { if (!$this->repository->hasRole($admin, 'owner')) {
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw new FireflyException('No access to method.'); // @codeCoverageIgnore throw new FireflyException('No access to method.'); // @codeCoverageIgnore
} }
@@ -72,7 +71,7 @@ class ConfigurationController extends Controller
{ {
$configData = $this->getConfigData(); $configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json'); return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
} }
/** /**
@@ -82,7 +81,6 @@ class ConfigurationController extends Controller
* @param string $name * @param string $name
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
* @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
public function update(ConfigurationRequest $request, string $name): JsonResponse public function update(ConfigurationRequest $request, string $name): JsonResponse
@@ -91,7 +89,7 @@ class ConfigurationController extends Controller
app('fireflyconfig')->set($name, $data['value']); app('fireflyconfig')->set($name, $data['value']);
$configData = $this->getConfigData(); $configData = $this->getConfigData();
return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json'); return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
} }
/** /**

View File

@@ -104,7 +104,7 @@ class Controller extends BaseController
$obj = null; $obj = null;
if (null !== $date) { if (null !== $date) {
try { try {
$obj = new Carbon($date); $obj = Carbon::parse($date);
} catch (InvalidDateException $e) { } catch (InvalidDateException $e) {
// don't care // don't care
Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage())); Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage()));

View File

@@ -265,6 +265,8 @@ class CurrencyController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @param TransactionCurrency $currency
*
* @return JsonResponse * @return JsonResponse
*/ */
public function budgetLimits(Request $request, TransactionCurrency $currency): JsonResponse public function budgetLimits(Request $request, TransactionCurrency $currency): JsonResponse
@@ -491,6 +493,8 @@ class CurrencyController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @param TransactionCurrency $currency
*
* @return JsonResponse] * @return JsonResponse]
*/ */
public function recurrences(Request $request, TransactionCurrency $currency): JsonResponse public function recurrences(Request $request, TransactionCurrency $currency): JsonResponse

View File

@@ -127,6 +127,7 @@ class ImportController extends Controller
/** /**
* Show all transactions * Show all transactions
* *
* @param Request $request
* @param ImportJob $importJob * @param ImportJob $importJob
* *
* @return JsonResponse * @return JsonResponse

View File

@@ -90,7 +90,7 @@ class LinkTypeController extends Controller
if (false === $linkType->editable) { if (false === $linkType->editable) {
throw new FireflyException(sprintf('You cannot delete this link type (#%d, "%s")', $linkType->id, $linkType->name)); throw new FireflyException(sprintf('You cannot delete this link type (#%d, "%s")', $linkType->id, $linkType->name));
} }
$this->repository->destroy($linkType, null); $this->repository->destroy($linkType);
return response()->json([], 204); return response()->json([], 204);
} }
@@ -190,6 +190,7 @@ class LinkTypeController extends Controller
/** /**
* Delete the resource. * Delete the resource.
* *
* @param Request $request
* @param LinkType $linkType * @param LinkType $linkType
* *
* @return JsonResponse * @return JsonResponse

View File

@@ -59,7 +59,7 @@ class PreferenceController extends Controller
// an important fallback is that the frontPageAccount array gets refilled automatically // an important fallback is that the frontPageAccount array gets refilled automatically
// when it turns up empty. // when it turns up empty.
$frontPageAccounts = app('preferences')->getForUser($user, 'frontPageAccounts', [])->data; $frontPageAccounts = app('preferences')->getForUser($user, 'frontPageAccounts', [])->data;
if (\count($frontPageAccounts) === 0) { if (0 === \count($frontPageAccounts)) {
/** @var Collection $accounts */ /** @var Collection $accounts */
$accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]);
$accountIds = $accounts->pluck('id')->toArray(); $accountIds = $accounts->pluck('id')->toArray();

View File

@@ -247,7 +247,7 @@ class RecurrenceController extends Controller
return response()->json([], 204); return response()->json([], 204);
} }
if (true === $result) { if (true === $result) {
return response()->json([], 200); return response()->json();
} }
return response()->json([], 418); // @codeCoverageIgnore return response()->json([], 418); // @codeCoverageIgnore

View File

@@ -1,4 +1,25 @@
<?php <?php
/**
* SummaryController.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers; namespace FireflyIII\Api\V1\Controllers;
@@ -84,6 +105,7 @@ class SummaryController extends Controller
$spentData = $this->getLeftToSpendInfo($start, $end); $spentData = $this->getLeftToSpendInfo($start, $end);
$networthData = $this->getNetWorthInfo($start, $end); $networthData = $this->getNetWorthInfo($start, $end);
$total = array_merge($balanceData, $billData, $spentData, $networthData); $total = array_merge($balanceData, $billData, $spentData, $networthData);
// TODO: liabilities with icon line-chart // TODO: liabilities with icon line-chart
return response()->json($total); return response()->json($total);
@@ -340,7 +362,10 @@ class SummaryController extends Controller
*/ */
private function getNetWorthInfo(Carbon $start, Carbon $end): array private function getNetWorthInfo(Carbon $start, Carbon $end): array
{ {
$date = Carbon::create()->startOfDay(); /** @var User $user */
$user = auth()->user();
$date = Carbon::now()->startOfDay();
// start and end in the future? use $end // start and end in the future? use $end
if ($this->notInDateRange($date, $start, $end)) { if ($this->notInDateRange($date, $start, $end)) {
@@ -350,7 +375,7 @@ class SummaryController extends Controller
/** @var NetWorthInterface $netWorthHelper */ /** @var NetWorthInterface $netWorthHelper */
$netWorthHelper = app(NetWorthInterface::class); $netWorthHelper = app(NetWorthInterface::class);
$netWorthHelper->setUser(auth()->user()); $netWorthHelper->setUser($user);
$allAccounts = $this->accountRepository->getActiveAccountsByType([AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE]); $allAccounts = $this->accountRepository->getActiveAccountsByType([AccountType::ASSET, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE]);
// filter list on preference of being included. // filter list on preference of being included.
@@ -368,7 +393,7 @@ class SummaryController extends Controller
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */
$currency = $data['currency']; $currency = $data['currency'];
$amount = round($data['balance'], $currency->decimal_places); $amount = round($data['balance'], $currency->decimal_places);
if ($amount === 0.0) { if (0.0 === $amount) {
continue; continue;
} }
// return stuff // return stuff

View File

@@ -179,7 +179,7 @@ class TransactionController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
$events = $this->repository->getPiggyBankEventsByTr($transaction); $events = $this->repository->getPiggyBankEventsbyTr($transaction);
/** @var PiggyBankEventTransformer $transformer */ /** @var PiggyBankEventTransformer $transformer */
$transformer = app(PiggyBankEventTransformer::class); $transformer = app(PiggyBankEventTransformer::class);

View File

@@ -29,7 +29,6 @@ use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\JournalLinkTransformer;
use FireflyIII\Transformers\TransactionLinkTransformer; use FireflyIII\Transformers\TransactionLinkTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;

View File

@@ -52,7 +52,7 @@ class BillRequest extends Request
public function getAll(): array public function getAll(): array
{ {
$active = true; $active = true;
if(null !== $this->get('active')) { if (null !== $this->get('active')) {
$active = $this->boolean('active'); $active = $this->boolean('active');
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests; namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Rules\IsBoolean;
/** /**
* Class CategoryRequest * Class CategoryRequest
@@ -50,7 +49,7 @@ class CategoryRequest extends Request
public function getAll(): array public function getAll(): array
{ {
return [ return [
'name' => $this->string('name') 'name' => $this->string('name'),
]; ];
} }
@@ -62,7 +61,7 @@ class CategoryRequest extends Request
public function rules(): array public function rules(): array
{ {
$rules = [ $rules = [
'name' => 'required|between:1,100|uniqueObjectForUser:categories,name' 'name' => 'required|between:1,100|uniqueObjectForUser:categories,name',
]; ];
switch ($this->method()) { switch ($this->method()) {
default: default:

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\User;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
/** /**
@@ -98,13 +99,15 @@ class TransactionLinkRequest extends Request
*/ */
private function validateExistingLink(Validator $validator): void private function validateExistingLink(Validator $validator): void
{ {
/** @var User $user */
$user = auth()->user();
/** @var LinkTypeRepositoryInterface $repository */ /** @var LinkTypeRepositoryInterface $repository */
$repository = app(LinkTypeRepositoryInterface::class); $repository = app(LinkTypeRepositoryInterface::class);
$repository->setUser(auth()->user()); $repository->setUser($user);
/** @var JournalRepositoryInterface $journalRepos */ /** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class); $journalRepos = app(JournalRepositoryInterface::class);
$journalRepos->setUser(auth()->user()); $journalRepos->setUser($user);
$data = $validator->getData(); $data = $validator->getData();
$inwardId = (int)($data['inward_id'] ?? 0); $inwardId = (int)($data['inward_id'] ?? 0);

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\BelongsUser; use FireflyIII\Rules\BelongsUser;
use FireflyIII\Rules\IsBoolean; use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\IsDateOrTime;
use FireflyIII\Validation\TransactionValidation; use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
@@ -59,7 +60,7 @@ class TransactionRequest extends Request
{ {
$data = [ $data = [
'type' => $this->string('type'), 'type' => $this->string('type'),
'date' => $this->date('date'), 'date' => $this->dateTime('date'),
'description' => $this->string('description'), 'description' => $this->string('description'),
'piggy_bank_id' => $this->integer('piggy_bank_id'), 'piggy_bank_id' => $this->integer('piggy_bank_id'),
'piggy_bank_name' => $this->string('piggy_bank_name'), 'piggy_bank_name' => $this->string('piggy_bank_name'),
@@ -103,7 +104,7 @@ class TransactionRequest extends Request
// basic fields for journal: // basic fields for journal:
'type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation', 'type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
'description' => 'between:1,255', 'description' => 'between:1,255',
'date' => 'required|date', 'date' => ['required', new IsDateOrTime],
'piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser], 'piggy_bank_id' => ['numeric', 'nullable', 'mustExist:piggy_banks,id', new BelongsUser],
'piggy_bank_name' => ['between:1,255', 'nullable', new BelongsUser], 'piggy_bank_name' => ['between:1,255', 'nullable', new BelongsUser],
'bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser], 'bill_id' => ['numeric', 'nullable', 'mustExist:bills,id', new BelongsUser],

View File

@@ -41,6 +41,7 @@ use Illuminate\Support\Collection;
/** /**
* *
* Class ApplyRules * Class ApplyRules
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class ApplyRules extends Command class ApplyRules extends Command
@@ -184,6 +185,8 @@ class ApplyRules extends Command
private function applyRuleSelection(Collection $rules, Collection $transactions, bool $breakProcessing): void private function applyRuleSelection(Collection $rules, Collection $transactions, bool $breakProcessing): void
{ {
$bar = $this->output->createProgressBar($rules->count() * $transactions->count()); $bar = $this->output->createProgressBar($rules->count() * $transactions->count());
/** @var Rule $rule */
foreach ($rules as $rule) { foreach ($rules as $rule) {
/** @var Processor $processor */ /** @var Processor $processor */
$processor = app(Processor::class); $processor = app(Processor::class);
@@ -191,7 +194,7 @@ class ApplyRules extends Command
/** @var Transaction $transaction */ /** @var Transaction $transaction */
foreach ($transactions as $transaction) { foreach ($transactions as $transaction) {
/** @var Rule $rule */ /** @noinspection DisconnectedForeachInstructionInspection */
$bar->advance(); $bar->advance();
$result = $processor->handleTransaction($transaction); $result = $processor->handleTransaction($transaction);
if (true === $result) { if (true === $result) {
@@ -210,6 +213,7 @@ class ApplyRules extends Command
/** /**
* *
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
private function grabAllRules(): void private function grabAllRules(): void
{ {
@@ -226,11 +230,12 @@ class ApplyRules extends Command
/** /**
* *
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
private function parseDates(): void private function parseDates(): void
{ {
// parse start date. // parse start date.
$startDate = Carbon::create()->startOfMonth(); $startDate = Carbon::now()->startOfMonth();
$startString = $this->option('start_date'); $startString = $this->option('start_date');
if (null === $startString) { if (null === $startString) {
/** @var JournalRepositoryInterface $repository */ /** @var JournalRepositoryInterface $repository */

View File

@@ -97,7 +97,7 @@ class CreateImport extends Command
return 1; return 1;
} }
if (\strlen($configuration) > 0) { if ('' !== $configuration) {
$configurationData = json_decode(file_get_contents($configuration), true); $configurationData = json_decode(file_get_contents($configuration), true);
if (null === $configurationData) { if (null === $configurationData) {
$this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd)); $this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd));
@@ -136,7 +136,7 @@ class CreateImport extends Command
} }
// store file as attachment. // store file as attachment.
if (\strlen($file) > 0) { if ('' !== $file) {
$messages = $jobRepository->storeCLIUpload($importJob, 'import_file', $file); $messages = $jobRepository->storeCLIUpload($importJob, 'import_file', $file);
if ($messages->count() > 0) { if ($messages->count() > 0) {
$this->errorLine($messages->first()); $this->errorLine($messages->first());

View File

@@ -48,16 +48,6 @@ class Cron extends Command
*/ */
protected $signature = 'firefly:cron'; protected $signature = 'firefly:cron';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/** /**
* Execute the console command. * Execute the console command.
* *

View File

@@ -1,9 +1,33 @@
<?php <?php
/**
* DecryptDatabase.php
* Copyright (c) 2019 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Console\Commands; namespace FireflyIII\Console\Commands;
use Crypt; use Crypt;
use DB; use DB;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Preference;
use FireflyIII\Support\Facades\FireflyConfig; use FireflyIII\Support\Facades\FireflyConfig;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Encryption\DecryptException;
@@ -64,6 +88,22 @@ class DecryptDatabase extends Command
} }
$id = $row->id; $id = $row->id;
$value = $this->tryDecrypt($original); $value = $this->tryDecrypt($original);
// A separate routine for preferences:
if ('preferences' === $table) {
// try to json_decrypt the value.
$value = json_decode($value, true) ?? $value;
Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, print_r($value, true), $table, $id));
/** @var Preference $object */
$object = Preference::find((int)$id);
if (null !== $object) {
$object->data = $value;
$object->save();
}
continue;
}
if ($value !== $original) { if ($value !== $original) {
Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, $value, $table, $id)); Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, $value, $table, $id));
DB::table($table)->where('id', $id)->update([$field => $value]); DB::table($table)->where('id', $id)->update([$field => $value]);
@@ -91,7 +131,7 @@ class DecryptDatabase extends Command
$configName = sprintf('is_decrypted_%s', $table); $configName = sprintf('is_decrypted_%s', $table);
$configVar = FireflyConfig::get($configName, false); $configVar = FireflyConfig::get($configName, false);
if (null !== $configVar) { if (null !== $configVar) {
return $configVar->data; return (bool)$configVar->data;
} }
return false; return false;
@@ -108,7 +148,10 @@ class DecryptDatabase extends Command
try { try {
$value = Crypt::decrypt($value); $value = Crypt::decrypt($value);
} catch (DecryptException $e) { } catch (DecryptException $e) {
//Log::debug(sprintf('Could not decrypt. %s', $e->getMessage())); if ('The MAC is invalid.' === $e->getMessage()) {
throw new FireflyException($e->getMessage());
}
Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
} }
return $value; return $value;

View File

@@ -28,6 +28,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands; namespace FireflyIII\Console\Commands;
use Crypt;
use DB; use DB;
use Exception; use Exception;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@@ -35,6 +36,7 @@ use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\Note; use FireflyIII\Models\Note;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
@@ -52,6 +54,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
@@ -105,6 +108,22 @@ class UpgradeDatabase extends Command
return 0; return 0;
} }
/**
* @param string $value
*
* @return string
*/
private function tryDecrypt(string $value): string
{
try {
$value = Crypt::decrypt($value);
} catch (DecryptException $e) {
Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
}
return $value;
}
/** /**
* Since it is one routine these warnings make sense and should be supressed. * Since it is one routine these warnings make sense and should be supressed.
* *
@@ -126,11 +145,17 @@ class UpgradeDatabase extends Command
return; return;
} }
$currencyCode = $this->tryDecrypt($currencyPreference->data);
$currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); // try json decrypt just in case.
if (\strlen($currencyCode) > 3) {
$currencyCode = json_decode($currencyCode) ?? 'EUR';
}
$currency = TransactionCurrency::where('code', $currencyCode)->first();
if (null === $currency) { if (null === $currency) {
$this->line('Fall back to default currency in migrateBillsToRules().'); $this->line('Fall back to default currency in migrateBillsToRules().');
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrencyByUser($user);
} }
if (null === $ruleGroup) { if (null === $ruleGroup) {
@@ -272,6 +297,7 @@ class UpgradeDatabase extends Command
->whereNull('transactions.deleted_at') ->whereNull('transactions.deleted_at')
->groupBy(['transaction_journals.id']) ->groupBy(['transaction_journals.id'])
->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]); ->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]);
/** @noinspection PhpStrictTypeCheckingInspection */
$result = DB::table(DB::raw('(' . $subQuery->toSql() . ') AS derived')) $result = DB::table(DB::raw('(' . $subQuery->toSql() . ') AS derived'))
->mergeBindings($subQuery->getQuery()) ->mergeBindings($subQuery->getQuery())
->where('t_count', '>', 2) ->where('t_count', '>', 2)
@@ -292,23 +318,38 @@ class UpgradeDatabase extends Command
*/ */
public function updateAccountCurrencies(): void public function updateAccountCurrencies(): void
{ {
Log::debug('Now in updateAccountCurrencies()');
$defaultConfig = (string)config('firefly.default_currency', 'EUR');
Log::debug(sprintf('System default currency is "%s"', $defaultConfig));
$accounts = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') $accounts = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id')
->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->get(['accounts.*']); ->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->get(['accounts.*']);
/** @var AccountRepositoryInterface $repository */ /** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class); $repository = app(AccountRepositoryInterface::class);
$accounts->each( $accounts->each(
function (Account $account) use ($repository) { function (Account $account) use ($repository, $defaultConfig) {
$repository->setUser($account->user); $repository->setUser($account->user);
// get users preference, fall back to system pref. // get users preference, fall back to system pref.
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data;
// expand and debug routine.
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', $defaultConfig)->data;
Log::debug(sprintf('Default currency code is "%s"', var_export($defaultCurrencyCode, true)));
if (!is_string($defaultCurrencyCode)) {
$defaultCurrencyCode = $defaultConfig;
Log::debug(sprintf('Default currency code is not a string, now set to "%s"', $defaultCurrencyCode));
}
$defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first(); $defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first();
$accountCurrency = (int)$repository->getMetaValue($account, 'currency_id'); $accountCurrency = (int)$repository->getMetaValue($account, 'currency_id');
$openingBalance = $account->getOpeningBalance(); $openingBalance = $account->getOpeningBalance();
$obCurrency = (int)$openingBalance->transaction_currency_id; $obCurrency = (int)$openingBalance->transaction_currency_id;
if (null === $defaultCurrency) { if (null === $defaultCurrency) {
throw new UnexpectedValueException('The default currency is NULL, and this is more or less impossible.'); throw new UnexpectedValueException(sprintf('User has a preference for "%s", but this currency does not exist.', $defaultCurrencyCode));
} }
Log::debug(
sprintf('Found default currency #%d (%s) while searching for "%s"', $defaultCurrency->id, $defaultCurrency->code, $defaultCurrencyCode)
);
// both 0? set to default currency: // both 0? set to default currency:
if (0 === $accountCurrency && 0 === $obCurrency) { if (0 === $accountCurrency && 0 === $obCurrency) {
@@ -448,11 +489,12 @@ class UpgradeDatabase extends Command
/** @var BudgetLimit $budgetLimit */ /** @var BudgetLimit $budgetLimit */
foreach ($budgetLimits as $budgetLimit) { foreach ($budgetLimits as $budgetLimit) {
if (null === $budgetLimit->transaction_currency_id) { if (null === $budgetLimit->transaction_currency_id) {
/** @var Budget $budget */
$budget = $budgetLimit->budget; $budget = $budgetLimit->budget;
if (null !== $budget) { if (null !== $budget) {
$user = $budget->user; $user = $budget->user;
if (null !== $user) { if (null !== $user) {
$currency = \Amount::getDefaultCurrencyByUser($user); $currency = app('amount')->getDefaultCurrencyByUser($user);
$budgetLimit->transaction_currency_id = $currency->id; $budgetLimit->transaction_currency_id = $currency->id;
$budgetLimit->save(); $budgetLimit->save();
$this->line( $this->line(
@@ -464,6 +506,9 @@ class UpgradeDatabase extends Command
} }
} }
/**
*
*/
private function createNewTypes(): void private function createNewTypes(): void
{ {
// create transaction type "Reconciliation". // create transaction type "Reconciliation".
@@ -490,7 +535,7 @@ class UpgradeDatabase extends Command
// move description: // move description:
$description = (string)$att->description; $description = (string)$att->description;
if (\strlen($description) > 0) { if ('' !== $description) {
// find or create note: // find or create note:
$note = $att->notes()->first(); $note = $att->notes()->first();
if (null === $note) { if (null === $note) {
@@ -542,18 +587,18 @@ class UpgradeDatabase extends Command
private function removeCCLiabilities(): void private function removeCCLiabilities(): void
{ {
$ccType = AccountType::where('type', AccountType::CREDITCARD)->first(); $ccType = AccountType::where('type', AccountType::CREDITCARD)->first();
$debtType =AccountType::where('type', AccountType::DEBT)->first(); $debtType = AccountType::where('type', AccountType::DEBT)->first();
if(null === $ccType || null === $debtType) { if (null === $ccType || null === $debtType) {
return; return;
} }
/** @var Collection $accounts */ /** @var Collection $accounts */
$accounts = Account::where('account_type_id', $ccType->id)->get(); $accounts = Account::where('account_type_id', $ccType->id)->get();
foreach($accounts as $account) { foreach ($accounts as $account) {
$account->account_type_id = $debtType->id; $account->account_type_id = $debtType->id;
$account->save(); $account->save();
$this->line(sprintf('Converted credit card liability account "%s" (#%d) to generic debt liability.', $account->name, $account->id)); $this->line(sprintf('Converted credit card liability account "%s" (#%d) to generic debt liability.', $account->name, $account->id));
} }
if($accounts->count() > 0) { 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->info('Credit card liability types are no longer supported and have been converted to generic debts. See: http://bit.ly/FF3-credit-cards');
} }
} }

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands; namespace FireflyIII\Console\Commands;
use Crypt;
use DB; use DB;
use Exception;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
@@ -42,7 +42,6 @@ use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
@@ -100,6 +99,7 @@ class VerifyDatabase extends Command
$this->fixBadMeta(); $this->fixBadMeta();
$this->removeBills(); $this->removeBills();
$this->enableCurrencies(); $this->enableCurrencies();
$this->reportZeroAmount();
return 0; return 0;
} }
@@ -691,4 +691,24 @@ class VerifyDatabase extends Command
); );
} }
} }
/**
* Collect all journals with empty amount.
*/
private function reportZeroAmount(): void
{
$set = Transaction::where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
$set = array_unique($set);
/** @var Collection $journals */
$journals = TransactionJournal::whereIn('id', $set)->get();
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {
$message = sprintf(
'Transaction "%s" (#%d), owned by user %s, has amount zero (0.00). It should be deleted.', $journal->description,
$journal->id, $journal->user->email
);
$this->error($message);
}
}
} }

View File

@@ -30,6 +30,7 @@ use Log;
/** /**
* File to make sure commands work. * File to make sure commands work.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class Kernel extends ConsoleKernel class Kernel extends ConsoleKernel
@@ -54,7 +55,9 @@ class Kernel extends ConsoleKernel
{ {
$schedule->call( $schedule->call(
function () { 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/'); 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 "\n";
echo '------------'; echo '------------';
echo "\n"; echo "\n";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -110,7 +110,7 @@ class UploadCollector extends BasicCollector implements CollectorInterface
Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage())); Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage()));
} }
if (\strlen($content) > 0) { if ('' !== $content) {
// add to export disk. // add to export disk.
$date = $job->created_at->format('Y-m-d'); $date = $job->created_at->format('Y-m-d');
$file = sprintf('%s-Old %s import dated %s.%s', $this->job->key, strtoupper($job->file_type), $date, $job->file_type); $file = sprintf('%s-Old %s import dated %s.%s', $this->job->key, strtoupper($job->file_type), $date, $job->file_type);

View File

@@ -49,48 +49,24 @@ use FireflyIII\Models\Transaction;
*/ */
final class Entry final class Entry
{ {
/** @var int ID of the journal */
public $journal_id;
/** @var int ID of the transaction */
public $transaction_id = 0;
/** @var string The date. */
public $date;
/** @var string The description */
public $description;
/** @var string The currency code. */
public $currency_code;
/** @var string The amount. */ /** @var string The amount. */
public $amount; public $amount;
/** @var string The foreign currency code */ /** @var string Asset account BIC */
public $foreign_currency_code = ''; public $asset_account_bic;
/** @var string Foreign amount */ /** @var string Asset account IBAN */
public $foreign_amount = '0'; public $asset_account_iban;
/** @var string Transaction type */
public $transaction_type;
/** @var string Asset account ID */ /** @var string Asset account ID */
public $asset_account_id; public $asset_account_id;
/** @var string Asset account name */ /** @var string Asset account name */
public $asset_account_name; public $asset_account_name;
/** @var string Asset account IBAN */
public $asset_account_iban;
/** @var string Asset account BIC */
public $asset_account_bic;
/** @var string Asset account number */ /** @var string Asset account number */
public $asset_account_number; public $asset_account_number;
/** @var string Asset account currency code */ /** @var string Asset account currency code */
public $asset_currency_code; public $asset_currency_code;
/** @var string Opposing account ID */ /** @var string Bill ID */
public $opposing_account_id; public $bill_id;
/** @var string Opposing account name */ /** @var string Bill name */
public $opposing_account_name; public $bill_name;
/** @var string Opposing account IBAN */
public $opposing_account_iban;
/** @var string Opposing account BIC */
public $opposing_account_bic;
/** @var string Opposing account number */
public $opposing_account_number;
/** @var string Opposing account code */
public $opposing_currency_code;
/** @var string Budget ID */ /** @var string Budget ID */
public $budget_id; public $budget_id;
/** @var string Budget name */ /** @var string Budget name */
@@ -99,14 +75,38 @@ final class Entry
public $category_id; public $category_id;
/** @var string Category name */ /** @var string Category name */
public $category_name; public $category_name;
/** @var string Bill ID */ /** @var string The currency code. */
public $bill_id; public $currency_code;
/** @var string Bill name */ /** @var string The date. */
public $bill_name; public $date;
/** @var string The description */
public $description;
/** @var string Foreign amount */
public $foreign_amount = '0';
/** @var string The foreign currency code */
public $foreign_currency_code = '';
/** @var int ID of the journal */
public $journal_id;
/** @var string Notes */ /** @var string Notes */
public $notes; public $notes;
/** @var string Opposing account BIC */
public $opposing_account_bic;
/** @var string Opposing account IBAN */
public $opposing_account_iban;
/** @var string Opposing account ID */
public $opposing_account_id;
/** @var string Opposing account name */
public $opposing_account_name;
/** @var string Opposing account number */
public $opposing_account_number;
/** @var string Opposing account code */
public $opposing_currency_code;
/** @var string Tags */ /** @var string Tags */
public $tags; public $tags;
/** @var int ID of the transaction */
public $transaction_id = 0;
/** @var string Transaction type */
public $transaction_type;
/** /**
* Entry constructor. * Entry constructor.
@@ -132,7 +132,7 @@ final class Entry
$entry->transaction_id = $transaction->id; $entry->transaction_id = $transaction->id;
$entry->date = $transaction->date->format('Ymd'); $entry->date = $transaction->date->format('Ymd');
$entry->description = $transaction->description; $entry->description = $transaction->description;
if (\strlen((string)$transaction->transaction_description) > 0) { if ('' !== (string)$transaction->transaction_description) {
$entry->description = $transaction->transaction_description . '(' . $transaction->description . ')'; $entry->description = $transaction->transaction_description . '(' . $transaction->description . ')';
} }
$entry->currency_code = $transaction->transactionCurrency->code; $entry->currency_code = $transaction->transactionCurrency->code;

View File

@@ -25,7 +25,6 @@ declare(strict_types=1);
namespace FireflyIII\Export; namespace FireflyIII\Export;
use Crypt;
use DB; use DB;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Export\Collector\AttachmentCollector; use FireflyIII\Export\Collector\AttachmentCollector;
@@ -41,8 +40,8 @@ use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Log;
use ZipArchive; use ZipArchive;
/** /**
@@ -339,7 +338,7 @@ class ExpandedProcessor implements ProcessorInterface
$return = []; $return = [];
/** @var Note $note */ /** @var Note $note */
foreach ($notes as $note) { foreach ($notes as $note) {
if (\strlen(trim((string)$note->text)) > 0) { if ('' !== trim((string)$note->text)) {
$id = (int)$note->noteable_id; $id = (int)$note->noteable_id;
$return[$id] = $note->text; $return[$id] = $note->text;
} }

View File

@@ -25,8 +25,8 @@ declare(strict_types=1);
namespace FireflyIII\Export\Exporter; namespace FireflyIII\Export\Exporter;
use FireflyIII\Export\Entry\Entry; use FireflyIII\Export\Entry\Entry;
use League\Csv\Writer;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use League\Csv\Writer;
/** /**
* Class CsvExporter. * Class CsvExporter.

View File

@@ -49,6 +49,7 @@ class AccountFactory
/** /**
* AccountFactory constructor. * AccountFactory constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@@ -103,7 +104,7 @@ class AccountFactory
// use default currency: // use default currency:
$currency = app('amount')->getDefaultCurrencyByUser($this->user); $currency = app('amount')->getDefaultCurrencyByUser($this->user);
} }
$currency->enabled =true; $currency->enabled = true;
$currency->save(); $currency->save();
unset($data['currency_code']); unset($data['currency_code']);

View File

@@ -43,6 +43,7 @@ class AccountMetaFactory
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
} }
} }
/** /**
* @param array $data * @param array $data
* *
@@ -73,6 +74,7 @@ class AccountMetaFactory
// if $data has field and $entry is null, create new one: // if $data has field and $entry is null, create new one:
if (null === $entry) { if (null === $entry) {
Log::debug(sprintf('Created meta-field "%s":"%s" for account #%d ("%s") ', $field, $value, $account->id, $account->name)); 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]); return $this->create(['account_id' => $account->id, 'name' => $field, 'data' => $value]);
} }
@@ -89,6 +91,7 @@ class AccountMetaFactory
} catch (Exception $e) { // @codeCoverageIgnore } catch (Exception $e) { // @codeCoverageIgnore
Log::debug(sprintf('Could not delete entry: %s', $e->getMessage())); // @codeCoverageIgnore Log::debug(sprintf('Could not delete entry: %s', $e->getMessage())); // @codeCoverageIgnore
} }
return null; return null;
} }

View File

@@ -38,6 +38,9 @@ class BillFactory
{ {
use BillServiceTrait; use BillServiceTrait;
/** @var User */
private $user;
/** /**
* Constructor. * Constructor.
*/ */
@@ -48,9 +51,6 @@ class BillFactory
} }
} }
/** @var User */
private $user;
/** /**
* @param array $data * @param array $data
* *
@@ -63,7 +63,7 @@ class BillFactory
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */
$currency = $factory->find((int)($data['currency_id'] ?? null), (string)($data['currency_code'] ?? null)); $currency = $factory->find((int)($data['currency_id'] ?? null), (string)($data['currency_code'] ?? null));
if(null === $currency) { if (null === $currency) {
// use default currency: // use default currency:
$currency = app('amount')->getDefaultCurrencyByUser($this->user); $currency = app('amount')->getDefaultCurrencyByUser($this->user);
} }
@@ -111,7 +111,7 @@ class BillFactory
} }
// then find by name: // then find by name:
if (null === $bill && \strlen($billName) > 0) { if (null === $bill && '' !== $billName) {
$bill = $this->findByName($billName); $bill = $this->findByName($billName);
} }

View File

@@ -34,6 +34,9 @@ use Log;
*/ */
class BudgetFactory class BudgetFactory
{ {
/** @var User */
private $user;
/** /**
* Constructor. * Constructor.
*/ */
@@ -44,10 +47,6 @@ class BudgetFactory
} }
} }
/** @var User */
private $user;
/** /**
* @param int|null $budgetId * @param int|null $budgetId
* @param null|string $budgetName * @param null|string $budgetName

View File

@@ -34,6 +34,9 @@ use Log;
*/ */
class CategoryFactory class CategoryFactory
{ {
/** @var User */
private $user;
/** /**
* Constructor. * Constructor.
*/ */
@@ -44,9 +47,6 @@ class CategoryFactory
} }
} }
/** @var User */
private $user;
/** /**
* @param string $name * @param string $name
* *
@@ -94,7 +94,7 @@ class CategoryFactory
} }
} }
if (\strlen($categoryName) > 0) { if ('' !== $categoryName) {
$category = $this->findByName($categoryName); $category = $this->findByName($categoryName);
if (null !== $category) { if (null !== $category) {
return $category; return $category;

View File

@@ -33,6 +33,9 @@ use Log;
*/ */
class PiggyBankFactory class PiggyBankFactory
{ {
/** @var User */
private $user;
/** /**
* Constructor. * Constructor.
*/ */
@@ -43,9 +46,6 @@ class PiggyBankFactory
} }
} }
/** @var User */
private $user;
/** /**
* @param int|null $piggyBankId * @param int|null $piggyBankId
* @param null|string $piggyBankName * @param null|string $piggyBankName
@@ -70,7 +70,7 @@ class PiggyBankFactory
} }
// then find by name: // then find by name:
if (\strlen($piggyBankName) > 0) { if ('' !== $piggyBankName) {
/** @var PiggyBank $piggyBank */ /** @var PiggyBank $piggyBank */
$piggyBank = $this->findByName($piggyBankName); $piggyBank = $this->findByName($piggyBankName);
if (null !== $piggyBank) { if (null !== $piggyBank) {

View File

@@ -39,6 +39,11 @@ use Log;
*/ */
class RecurrenceFactory class RecurrenceFactory
{ {
/** @var User */
private $user;
use TransactionTypeTrait, TransactionServiceTrait, RecurringTransactionTrait;
/** /**
* Constructor. * Constructor.
*/ */
@@ -49,11 +54,6 @@ class RecurrenceFactory
} }
} }
use TransactionTypeTrait, TransactionServiceTrait, RecurringTransactionTrait;
/** @var User */
private $user;
/** /**
* @param array $data * @param array $data
* *

View File

@@ -38,6 +38,7 @@ class TransactionCurrencyFactory
{ {
/** /**
* TransactionCurrencyFactory constructor. * TransactionCurrencyFactory constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@@ -100,7 +101,7 @@ class TransactionCurrencyFactory
Log::warning(sprintf('Currency ID is %d but found nothing!', $currencyId)); Log::warning(sprintf('Currency ID is %d but found nothing!', $currencyId));
} }
// then by code: // then by code:
if (\strlen($currencyCode) > 0) { if ('' !== $currencyCode) {
$currency = TransactionCurrency::whereCode($currencyCode)->first(); $currency = TransactionCurrency::whereCode($currencyCode)->first();
if (null !== $currency) { if (null !== $currency) {
return $currency; return $currency;

View File

@@ -115,7 +115,7 @@ class TransactionFactory
$currency = $currency ?? $defaultCurrency; $currency = $currency ?? $defaultCurrency;
// enable currency: // enable currency:
if(false === $currency->enabled) { if (false === $currency->enabled) {
$currency->enabled = true; $currency->enabled = true;
$currency->save(); $currency->save();
} }

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Factory; namespace FireflyIII\Factory;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Services\Internal\Support\JournalServiceTrait; use FireflyIII\Services\Internal\Support\JournalServiceTrait;
@@ -70,6 +71,10 @@ class TransactionJournalFactory
Log::debug(sprintf('Going to store a %s', $type->type)); Log::debug(sprintf('Going to store a %s', $type->type));
$description = app('steam')->cleanString($data['description']); $description = app('steam')->cleanString($data['description']);
$description = str_replace(["\n", "\t", "\r"], "\x20", $description); $description = str_replace(["\n", "\t", "\r"], "\x20", $description);
/** @var Carbon $carbon */
$carbon = $data['date'];
$carbon->setTimezone(config('app.timezone'));
$journal = TransactionJournal::create( $journal = TransactionJournal::create(
[ [
'user_id' => $data['user'], 'user_id' => $data['user'],
@@ -77,7 +82,7 @@ class TransactionJournalFactory
'bill_id' => null, 'bill_id' => null,
'transaction_currency_id' => $defaultCurrency->id, 'transaction_currency_id' => $defaultCurrency->id,
'description' => $description, 'description' => $description,
'date' => $data['date']->format('Y-m-d'), 'date' => $carbon->format('Y-m-d H:i:s'),
'order' => 0, 'order' => 0,
'tag_count' => 0, 'tag_count' => 0,
'completed' => 0, 'completed' => 0,
@@ -92,7 +97,7 @@ class TransactionJournalFactory
/** @var TransactionFactory $factory */ /** @var TransactionFactory $factory */
$factory = app(TransactionFactory::class); $factory = app(TransactionFactory::class);
$factory->setUser($this->user); $factory->setUser($this->user);
$totalAmount= '0'; $totalAmount = '0';
Log::debug(sprintf('Found %d transactions in array.', \count($data['transactions']))); Log::debug(sprintf('Found %d transactions in array.', \count($data['transactions'])));
/** @var array $trData */ /** @var array $trData */
foreach ($data['transactions'] as $index => $trData) { foreach ($data['transactions'] as $index => $trData) {

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Factory;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use Log; use Log;
/** /**
* Class TransactionTypeFactory * Class TransactionTypeFactory
*/ */

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Chart\Basic;
use FireflyIII\Support\ChartColour; use FireflyIII\Support\ChartColour;
use Log; use Log;
/** /**
* Class ChartJsGenerator. * Class ChartJsGenerator.
*/ */
@@ -39,6 +40,46 @@ class ChartJsGenerator implements GeneratorInterface
} }
} }
/**
* Expects data as:.
*
* key => [value => x, 'currency_symbol' => 'x']
*
* @param array $data
*
* @return array
*/
public function multiCurrencyPieChart(array $data): array
{
$chartData = [
'datasets' => [
0 => [],
],
'labels' => [],
];
$amounts = array_column($data, 'amount');
$next = next($amounts);
$sortFlag = SORT_ASC;
if (!\is_bool($next) && 1 === bccomp((string)$next, '0')) {
$sortFlag = SORT_DESC;
}
array_multisort($amounts, $sortFlag, $data);
unset($next, $sortFlag, $amounts);
$index = 0;
foreach ($data as $key => $valueArray) {
// make larger than 0
$chartData['datasets'][0]['data'][] = (float)app('steam')->positive((string)$valueArray['amount']);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol'];
$chartData['labels'][] = $key;
++$index;
}
return $chartData;
}
/** /**
* Will generate a Chart JS compatible array from the given input. Expects this format. * Will generate a Chart JS compatible array from the given input. Expects this format.
* *
@@ -150,46 +191,6 @@ class ChartJsGenerator implements GeneratorInterface
return $chartData; return $chartData;
} }
/**
* Expects data as:.
*
* key => [value => x, 'currency_symbol' => 'x']
*
* @param array $data
*
* @return array
*/
public function multiCurrencyPieChart(array $data): array
{
$chartData = [
'datasets' => [
0 => [],
],
'labels' => [],
];
$amounts = array_column($data, 'amount');
$next = next($amounts);
$sortFlag = SORT_ASC;
if (!\is_bool($next) && 1 === bccomp((string)$next, '0')) {
$sortFlag = SORT_DESC;
}
array_multisort($amounts, $sortFlag, $data);
unset($next, $sortFlag, $amounts);
$index = 0;
foreach ($data as $key => $valueArray) {
// make larger than 0
$chartData['datasets'][0]['data'][] = (float)app('steam')->positive((string)$valueArray['amount']);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol'];
$chartData['labels'][] = $key;
++$index;
}
return $chartData;
}
/** /**
* Will generate a (ChartJS) compatible array from the given input. Expects this format:. * Will generate a (ChartJS) compatible array from the given input. Expects this format:.
* *

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Audit;
/** /**
* Class MultiYearReportGenerator. * Class MultiYearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MultiYearReportGenerator extends MonthReportGenerator class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Audit;
/** /**
* Class YearReportGenerator. * Class YearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class YearReportGenerator extends MonthReportGenerator class YearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Budget;
/** /**
* Class MultiYearReportGenerator. * Class MultiYearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MultiYearReportGenerator extends MonthReportGenerator class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Budget;
/** /**
* Class YearReportGenerator. * Class YearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class YearReportGenerator extends MonthReportGenerator class YearReportGenerator extends MonthReportGenerator

View File

@@ -40,6 +40,7 @@ use Throwable;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MonthReportGenerator extends Support implements ReportGeneratorInterface class MonthReportGenerator extends Support implements ReportGeneratorInterface

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Category;
/** /**
* Class MultiYearReportGenerator. * Class MultiYearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MultiYearReportGenerator extends MonthReportGenerator class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Category;
/** /**
* Class YearReportGenerator. * Class YearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class YearReportGenerator extends MonthReportGenerator class YearReportGenerator extends MonthReportGenerator

View File

@@ -27,6 +27,7 @@ use FireflyIII\Exceptions\FireflyException;
/** /**
* Class ReportGeneratorFactory. * Class ReportGeneratorFactory.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class ReportGeneratorFactory class ReportGeneratorFactory

View File

@@ -31,6 +31,7 @@ use Throwable;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MonthReportGenerator implements ReportGeneratorInterface class MonthReportGenerator implements ReportGeneratorInterface

View File

@@ -30,6 +30,7 @@ use Throwable;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MultiYearReportGenerator implements ReportGeneratorInterface class MultiYearReportGenerator implements ReportGeneratorInterface

View File

@@ -30,6 +30,7 @@ use Throwable;
/** /**
* Class MonthReportGenerator. * Class MonthReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class YearReportGenerator implements ReportGeneratorInterface class YearReportGenerator implements ReportGeneratorInterface

View File

@@ -31,6 +31,7 @@ use Illuminate\Support\Collection;
* Class Support. * Class Support.
* @method Collection getExpenses() * @method Collection getExpenses()
* @method Collection getIncome() * @method Collection getIncome()
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class Support class Support

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Tag;
/** /**
* Class MultiYearReportGenerator. * Class MultiYearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class MultiYearReportGenerator extends MonthReportGenerator class MultiYearReportGenerator extends MonthReportGenerator

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Generator\Report\Tag;
/** /**
* Class YearReportGenerator. * Class YearReportGenerator.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class YearReportGenerator extends MonthReportGenerator class YearReportGenerator extends MonthReportGenerator

View File

@@ -146,6 +146,7 @@ class UserEventHandler
} catch (Exception $e) { } catch (Exception $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
} }
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
return true; return true;
@@ -172,6 +173,7 @@ class UserEventHandler
} catch (Exception $e) { } catch (Exception $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
} }
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
return true; return true;
@@ -199,6 +201,7 @@ class UserEventHandler
} catch (Exception $e) { } catch (Exception $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
} }
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
return true; return true;

View File

@@ -26,11 +26,12 @@ use Crypt;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
use Log; use Log;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\File\UploadedFile;
/** /**
@@ -85,7 +86,7 @@ class AttachmentHelper implements AttachmentHelperInterface
try { try {
$content = Crypt::decrypt($this->uploadDisk->get(sprintf('at-%d.data', $attachment->id))); $content = Crypt::decrypt($this->uploadDisk->get(sprintf('at-%d.data', $attachment->id)));
} catch (DecryptException $e) { } catch (DecryptException|FileNotFoundException $e) {
Log::error(sprintf('Could not decrypt data of attachment #%d: %s', $attachment->id, $e->getMessage())); Log::error(sprintf('Could not decrypt data of attachment #%d: %s', $attachment->id, $e->getMessage()));
$content = ''; $content = '';
} }
@@ -102,8 +103,7 @@ class AttachmentHelper implements AttachmentHelperInterface
*/ */
public function getAttachmentLocation(Attachment $attachment): string public function getAttachmentLocation(Attachment $attachment): string
{ {
$path = sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int)$attachment->id); return sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int)$attachment->id);
return $path;
} }
/** /**
@@ -186,11 +186,11 @@ class AttachmentHelper implements AttachmentHelperInterface
* @param array|null $files * @param array|null $files
* *
* @return bool * @return bool
* @throws \Illuminate\Contracts\Encryption\EncryptException * @throws FireflyException
*/ */
public function saveAttachmentsForModel(object $model, ?array $files): bool public function saveAttachmentsForModel(object $model, ?array $files): bool
{ {
if(!($model instanceof Model)) { if (!($model instanceof Model)) {
return false; // @codeCoverageIgnore return false; // @codeCoverageIgnore
} }
Log::debug(sprintf('Now in saveAttachmentsForModel for model %s', \get_class($model))); Log::debug(sprintf('Now in saveAttachmentsForModel for model %s', \get_class($model)));
@@ -265,10 +265,10 @@ class AttachmentHelper implements AttachmentHelperInterface
$attachment->save(); $attachment->save();
Log::debug('Created attachment:', $attachment->toArray()); Log::debug('Created attachment:', $attachment->toArray());
$fileObject = $file->openFile('r'); $fileObject = $file->openFile();
$fileObject->rewind(); $fileObject->rewind();
if(0 === $file->getSize()) { if (0 === $file->getSize()) {
throw new FireflyException('Cannot upload empty or non-existent file.'); // @codeCoverageIgnore throw new FireflyException('Cannot upload empty or non-existent file.'); // @codeCoverageIgnore
} }

View File

@@ -651,6 +651,40 @@ class TransactionCollector implements TransactionCollectorInterface
return $this; return $this;
} }
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return TransactionCollectorInterface
*/
public function setSearchWords(array $array): TransactionCollectorInterface
{
// 'transaction_journals.description',
$this->query->where(
function (EloquentBuilder $q) use ($array) {
$q->where(
function (EloquentBuilder $q1) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q1->where('transaction_journals.description', 'LIKE', $keyword);
}
}
);
$q->orWhere(
function (EloquentBuilder $q2) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q2->where('transactions.description', 'LIKE', $keyword);
}
}
);
}
);
return $this;
}
/** /**
* @param Tag $tag * @param Tag $tag
* *

View File

@@ -145,15 +145,6 @@ interface TransactionCollectorInterface
*/ */
public function setAllAssetAccounts(): TransactionCollectorInterface; public function setAllAssetAccounts(): TransactionCollectorInterface;
/**
* Set the required currency (local or foreign)
*
* @param TransactionCurrency $currency
*
* @return TransactionCollectorInterface
*/
public function setCurrency(TransactionCurrency $currency): TransactionCollectorInterface;
/** /**
* Collect transactions before a specific date. * Collect transactions before a specific date.
* *
@@ -208,6 +199,15 @@ interface TransactionCollectorInterface
*/ */
public function setCategory(Category $category): TransactionCollectorInterface; public function setCategory(Category $category): TransactionCollectorInterface;
/**
* Set the required currency (local or foreign)
*
* @param TransactionCurrency $currency
*
* @return TransactionCollectorInterface
*/
public function setCurrency(TransactionCurrency $currency): TransactionCollectorInterface;
/** /**
* Set the journal IDs to filter on. * Set the journal IDs to filter on.
* *
@@ -272,6 +272,15 @@ interface TransactionCollectorInterface
*/ */
public function setRange(Carbon $start, Carbon $end): TransactionCollectorInterface; public function setRange(Carbon $start, Carbon $end): TransactionCollectorInterface;
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return TransactionCollectorInterface
*/
public function setSearchWords(array $array): TransactionCollectorInterface;
/** /**
* Set the tag to collect from. * Set the tag to collect from.
* *

View File

@@ -31,6 +31,7 @@ use Illuminate\Support\Collection;
/** /**
* Class CountAttachmentsFilter * Class CountAttachmentsFilter
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class CountAttachmentsFilter implements FilterInterface class CountAttachmentsFilter implements FilterInterface

View File

@@ -26,6 +26,7 @@ use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
/** /**
* Class TransferFilter. * Class TransferFilter.
* *

View File

@@ -25,7 +25,6 @@ namespace FireflyIII\Helpers\Help;
use Cache; use Cache;
use Exception; use Exception;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use League\CommonMark\CommonMarkConverter; use League\CommonMark\CommonMarkConverter;
use Log; use Log;
use Route; use Route;
@@ -87,14 +86,14 @@ class Help implements HelpInterface
$res = $client->request('GET', $uri, $opt); $res = $client->request('GET', $uri, $opt);
$statusCode = $res->getStatusCode(); $statusCode = $res->getStatusCode();
$content = trim($res->getBody()->getContents()); $content = trim($res->getBody()->getContents());
} catch (GuzzleException|Exception $e) { } catch (Exception $e) {
Log::info($e->getMessage()); Log::info($e->getMessage());
Log::info($e->getTraceAsString()); Log::info($e->getTraceAsString());
} }
Log::debug(sprintf('Status code is %d', $statusCode)); Log::debug(sprintf('Status code is %d', $statusCode));
if (\strlen($content) > 0) { if ('' !== $content) {
Log::debug('Content is longer than zero. Expect something.'); Log::debug('Content is longer than zero. Expect something.');
$converter = new CommonMarkConverter(); $converter = new CommonMarkConverter();
$content = $converter->convertToHtml($content); $content = $converter->convertToHtml($content);
@@ -153,7 +152,7 @@ class Help implements HelpInterface
public function putInCache(string $route, string $language, string $content): void public function putInCache(string $route, string $language, string $content): void
{ {
$key = sprintf(self::CACHEKEY, $route, $language); $key = sprintf(self::CACHEKEY, $route, $language);
if (\strlen($content) > 0) { if ('' !== $content) {
Log::debug(sprintf('Will store entry in cache: %s', $key)); Log::debug(sprintf('Will store entry in cache: %s', $key));
Cache::put($key, $content, 10080); // a week. Cache::put($key, $content, 10080); // a week.

View File

@@ -25,7 +25,6 @@ namespace FireflyIII\Helpers\Report;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\CacheProperties; use FireflyIII\Support\CacheProperties;

View File

@@ -31,6 +31,7 @@ use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
/** /**
* Class PopupReport. * Class PopupReport.
* *

View File

@@ -33,6 +33,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
/** /**
* Class ReportHelper. * Class ReportHelper.
* *

View File

@@ -50,6 +50,8 @@ trait UpdateTrait
$request->call(); $request->call();
} catch (FireflyException $e) { } catch (FireflyException $e) {
Log::error(sprintf('Could not check for updates: %s', $e->getMessage())); Log::error(sprintf('Could not check for updates: %s', $e->getMessage()));
return null;
} }
// get releases from array. // get releases from array.
@@ -81,17 +83,20 @@ trait UpdateTrait
Log::debug(sprintf('Now in parseResult(%d)', $versionCheck)); Log::debug(sprintf('Now in parseResult(%d)', $versionCheck));
$current = (string)config('firefly.version'); $current = (string)config('firefly.version');
$return = ''; $return = '';
$triggered = false;
if ($versionCheck === -2) { if ($versionCheck === -2) {
Log::debug('-2, so give error.'); Log::debug('-2, so give error.');
$return = (string)trans('firefly.update_check_error'); $return = (string)trans('firefly.update_check_error');
$triggered = true;
} }
if ($versionCheck === -1 && null !== $release) { if ($versionCheck === -1 && null !== $release) {
$triggered = true;
Log::debug('New version!'); Log::debug('New version!');
// there is a new FF version! // there is a new FF version!
// has it been released for at least three days? // has it been released for at least three days?
$today = new Carbon; $today = new Carbon;
$releaseDate = $release->getUpdated(); $releaseDate = $release->getUpdated();
if ($today->diffInDays($releaseDate, true) > 3) { if ($today->diffInDays($releaseDate) > 3) {
Log::debug('New version is older than 3 days!'); Log::debug('New version is older than 3 days!');
$monthAndDayFormat = (string)trans('config.month_and_day'); $monthAndDayFormat = (string)trans('config.month_and_day');
$return = (string)trans( $return = (string)trans(
@@ -106,16 +111,23 @@ trait UpdateTrait
} }
if (0 === $versionCheck) { if (0 === $versionCheck) {
$triggered = true;
Log::debug('User is running current version.'); Log::debug('User is running current version.');
// you are running the current version! // you are running the current version!
$return = (string)trans('firefly.update_current_version_alert', ['version' => $current]); $return = (string)trans('firefly.update_current_version_alert', ['version' => $current]);
} }
if (1 === $versionCheck && null !== $release) { if (1 === $versionCheck && null !== $release) {
$triggered = true;
Log::debug('User is running NEWER version.'); Log::debug('User is running NEWER version.');
// you are running a newer version! // you are running a newer version!
$return = (string)trans('firefly.update_newer_version_alert', ['your_version' => $current, 'new_version' => $release->getTitle()]); $return = (string)trans('firefly.update_newer_version_alert', ['your_version' => $current, 'new_version' => $release->getTitle()]);
} }
if (false === $triggered) {
Log::debug('No option was triggered.');
$return = (string)trans('firefly.update_check_error');
}
return $return; return $return;
} }
@@ -131,6 +143,7 @@ trait UpdateTrait
Log::debug('Now in versionCheck()'); Log::debug('Now in versionCheck()');
if (null === $release) { if (null === $release) {
Log::debug('Release is null, return -2.'); Log::debug('Release is null, return -2.');
return -2; return -2;
} }
$current = (string)config('firefly.version'); $current = (string)config('firefly.version');

View File

@@ -111,6 +111,7 @@ class CreateController extends Controller
$this->rememberPreviousUri('accounts.create.uri'); $this->rememberPreviousUri('accounts.create.uri');
} }
$request->session()->forget('accounts.create.fromStore'); $request->session()->forget('accounts.create.fromStore');
Log::channel('audit')->info('Create new account.');
return view('accounts.create', compact('subTitleIcon', 'what', 'interestPeriods', 'subTitle', 'roles', 'liabilityTypes')); return view('accounts.create', compact('subTitleIcon', 'what', 'interestPeriods', 'subTitle', 'roles', 'liabilityTypes'));
} }
@@ -131,7 +132,7 @@ class CreateController extends Controller
$request->session()->flash('success', (string)trans('firefly.stored_new_account', ['name' => $account->name])); $request->session()->flash('success', (string)trans('firefly.stored_new_account', ['name' => $account->name]));
app('preferences')->mark(); app('preferences')->mark();
Log::channel('audit')->info('Store new account.', $data);
// update preferences if necessary: // update preferences if necessary:
$frontPage = app('preferences')->get('frontPageAccounts', [])->data; $frontPage = app('preferences')->get('frontPageAccounts', [])->data;

View File

@@ -145,7 +145,6 @@ class ShowController extends Controller
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View
* *
* @throws FireflyException
* *
*/ */
public function showAll(Request $request, Account $account) public function showAll(Request $request, Account $account)
@@ -177,7 +176,7 @@ class ShowController extends Controller
return view( return view(
'accounts.show', 'accounts.show',
compact('account', 'showAll','isLiability', 'currency', 'today', 'chartUri', 'periods', 'subTitleIcon', 'transactions', 'subTitle', 'start', 'end') compact('account', 'showAll', 'isLiability', 'currency', 'today', 'chartUri', 'periods', 'subTitleIcon', 'transactions', 'subTitle', 'start', 'end')
); );
} }

View File

@@ -27,8 +27,8 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser; use FireflyIII\Http\Middleware\IsSandStormUser;
use FireflyIII\Http\Requests\ConfigurationRequest; use FireflyIII\Http\Requests\ConfigurationRequest;
use FireflyIII\Support\Facades\FireflyConfig;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Log;
/** /**
* Class ConfigurationController. * Class ConfigurationController.
@@ -64,10 +64,12 @@ class ConfigurationController extends Controller
$subTitle = (string)trans('firefly.instance_configuration'); $subTitle = (string)trans('firefly.instance_configuration');
$subTitleIcon = 'fa-wrench'; $subTitleIcon = 'fa-wrench';
Log::channel('audit')->info('User visits admin config index.');
// all available configuration and their default value in case // all available configuration and their default value in case
// they don't exist yet. // they don't exist yet.
$singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; $isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$siteOwner = config('firefly.site_owner'); $siteOwner = config('firefly.site_owner');
return view( return view(
@@ -88,9 +90,11 @@ class ConfigurationController extends Controller
// get config values: // get config values:
$data = $request->getConfigurationData(); $data = $request->getConfigurationData();
Log::channel('audit')->info('User updates global configuration.', $data);
// store config values // store config values
FireflyConfig::set('single_user_mode', $data['single_user_mode']); app('fireflyconfig')->set('single_user_mode', $data['single_user_mode']);
FireflyConfig::set('is_demo_site', $data['is_demo_site']); app('fireflyconfig')->set('is_demo_site', $data['is_demo_site']);
// flash message // flash message
session()->flash('success', (string)trans('firefly.configuration_updated')); session()->flash('success', (string)trans('firefly.configuration_updated'));

View File

@@ -52,6 +52,7 @@ class HomeController extends Controller
*/ */
public function index() public function index()
{ {
Log::channel('audit')->info('User visits admin index.');
$title = (string)trans('firefly.administration'); $title = (string)trans('firefly.administration');
$mainTitleIcon = 'fa-hand-spock-o'; $mainTitleIcon = 'fa-hand-spock-o';
$sandstorm = 1 === (int)getenv('SANDSTORM'); $sandstorm = 1 === (int)getenv('SANDSTORM');
@@ -68,6 +69,7 @@ class HomeController extends Controller
*/ */
public function testMessage(Request $request) public function testMessage(Request $request)
{ {
Log::channel('audit')->info('User sends test message.');
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$ipAddress = $request->ip(); $ipAddress = $request->ip();

View File

@@ -28,6 +28,7 @@ use FireflyIII\Http\Requests\LinkTypeFormRequest;
use FireflyIII\Models\LinkType; use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Log;
use View; use View;
/** /**
@@ -63,6 +64,8 @@ class LinkController extends Controller
$subTitle = (string)trans('firefly.create_new_link_type'); $subTitle = (string)trans('firefly.create_new_link_type');
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
Log::channel('audit')->info('User visits link index.');
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
if (true !== session('link-types.create.fromStore')) { if (true !== session('link-types.create.fromStore')) {
$this->rememberPreviousUri('link-types.create.uri'); $this->rememberPreviousUri('link-types.create.uri');
@@ -88,6 +91,8 @@ class LinkController extends Controller
return redirect(route('admin.links.index')); return redirect(route('admin.links.index'));
} }
Log::channel('audit')->info(sprintf('User wants to delete link type #%d', $linkType->id));
$subTitle = (string)trans('firefly.delete_link_type', ['name' => $linkType->name]); $subTitle = (string)trans('firefly.delete_link_type', ['name' => $linkType->name]);
$otherTypes = $repository->get(); $otherTypes = $repository->get();
$count = $repository->countJournals($linkType); $count = $repository->countJournals($linkType);
@@ -116,6 +121,7 @@ class LinkController extends Controller
*/ */
public function destroy(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) public function destroy(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType)
{ {
Log::channel('audit')->info(sprintf('User destroyed link type #%d', $linkType->id));
$name = $linkType->name; $name = $linkType->name;
$moveTo = $repository->findNull((int)$request->get('move_link_type_before_delete')); $moveTo = $repository->findNull((int)$request->get('move_link_type_before_delete'));
$repository->destroy($linkType, $moveTo); $repository->destroy($linkType, $moveTo);
@@ -144,6 +150,8 @@ class LinkController extends Controller
$subTitle = (string)trans('firefly.edit_link_type', ['name' => $linkType->name]); $subTitle = (string)trans('firefly.edit_link_type', ['name' => $linkType->name]);
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
Log::channel('audit')->info(sprintf('User wants to edit link type #%d', $linkType->id));
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('link-types.edit.fromUpdate')) { if (true !== session('link-types.edit.fromUpdate')) {
$this->rememberPreviousUri('link-types.edit.uri'); // @codeCoverageIgnore $this->rememberPreviousUri('link-types.edit.uri'); // @codeCoverageIgnore
@@ -165,6 +173,8 @@ class LinkController extends Controller
$subTitle = (string)trans('firefly.journal_link_configuration'); $subTitle = (string)trans('firefly.journal_link_configuration');
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
$linkTypes = $repository->get(); $linkTypes = $repository->get();
Log::channel('audit')->info('User on index of link types in admin.');
$linkTypes->each( $linkTypes->each(
function (LinkType $linkType) use ($repository) { function (LinkType $linkType) use ($repository) {
$linkType->journalCount = $repository->countJournals($linkType); $linkType->journalCount = $repository->countJournals($linkType);
@@ -187,6 +197,8 @@ class LinkController extends Controller
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
$links = $linkType->transactionJournalLinks()->get(); $links = $linkType->transactionJournalLinks()->get();
Log::channel('audit')->info(sprintf('User viewing link type #%d', $linkType->id));
return view('admin.link.show', compact('subTitle', 'subTitleIcon', 'linkType', 'links')); return view('admin.link.show', compact('subTitle', 'subTitleIcon', 'linkType', 'links'));
} }
@@ -206,6 +218,9 @@ class LinkController extends Controller
'outward' => $request->string('outward'), 'outward' => $request->string('outward'),
]; ];
$linkType = $repository->store($data); $linkType = $repository->store($data);
Log::channel('audit')->info('User stored new link type.', $linkType->toArray());
$request->session()->flash('success', (string)trans('firefly.stored_new_link_type', ['name' => $linkType->name])); $request->session()->flash('success', (string)trans('firefly.stored_new_link_type', ['name' => $linkType->name]));
$redirect = redirect($this->getPreviousUri('link-types.create.uri')); $redirect = redirect($this->getPreviousUri('link-types.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int)$request->get('create_another')) {
@@ -243,6 +258,8 @@ class LinkController extends Controller
]; ];
$repository->update($linkType, $data); $repository->update($linkType, $data);
Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data);
$request->session()->flash('success', (string)trans('firefly.updated_link_type', ['name' => $linkType->name])); $request->session()->flash('success', (string)trans('firefly.updated_link_type', ['name' => $linkType->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('link-types.edit.uri')); $redirect = redirect($this->getPreviousUri('link-types.edit.uri'));

View File

@@ -23,12 +23,12 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyConfig;
use FireflyIII\Helpers\Update\UpdateTrait; use FireflyIII\Helpers\Update\UpdateTrait;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser; use FireflyIII\Http\Middleware\IsSandStormUser;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Log;
/** /**
* Class HomeController. * Class HomeController.
@@ -87,8 +87,8 @@ class UpdateController extends Controller
public function post(Request $request) public function post(Request $request)
{ {
$checkForUpdates = (int)$request->get('check_for_updates'); $checkForUpdates = (int)$request->get('check_for_updates');
FireflyConfig::set('permission_update_check', $checkForUpdates); app('fireflyconfig')->set('permission_update_check', $checkForUpdates);
FireflyConfig::set('last_update_check', time()); app('fireflyconfig')->set('last_update_check', time());
session()->flash('success', (string)trans('firefly.configuration_updated')); session()->flash('success', (string)trans('firefly.configuration_updated'));
return redirect(route('admin.update-check')); return redirect(route('admin.update-check'));
@@ -102,12 +102,13 @@ class UpdateController extends Controller
$latestRelease = $this->getLatestRelease(); $latestRelease = $this->getLatestRelease();
$versionCheck = $this->versionCheck($latestRelease); $versionCheck = $this->versionCheck($latestRelease);
$resultString = $this->parseResult($versionCheck, $latestRelease); $resultString = $this->parseResult($versionCheck, $latestRelease);
Log::debug(sprintf('Result string is: "%s"', $resultString));
if (0 !== $versionCheck && '' !== $resultString) { if (0 !== $versionCheck && '' !== $resultString) {
// flash info // flash info
session()->flash('info', $resultString); session()->flash('info', $resultString);
} }
FireflyConfig::set('last_update_check', time()); app('fireflyconfig')->set('last_update_check', time());
return response()->json(['result' => $resultString]); return response()->json(['result' => $resultString]);
} }

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