Merge branch 'release/4.6.10'

This commit is contained in:
James Cole
2017-11-03 07:26:19 +01:00
145 changed files with 1552 additions and 420 deletions

View File

@@ -40,9 +40,10 @@ SHOW_INCOMPLETE_TRANSLATIONS=false
CACHE_PREFIX=firefly CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
EXCHANGE_RATE_SERVICE=fixerio EXCHANGE_RATE_SERVICE=fixerio
GOOGLE_MAPS_API_KEY= MAPBOX_API_KEY=
ANALYTICS_ID= ANALYTICS_ID=
SITE_OWNER=mail@example.com SITE_OWNER=mail@example.com
USE_ENCRYPTION=true USE_ENCRYPTION=true

View File

@@ -41,6 +41,7 @@ SHOW_INCOMPLETE_TRANSLATIONS=false
CACHE_PREFIX=firefly CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
EXCHANGE_RATE_SERVICE=fixerio EXCHANGE_RATE_SERVICE=fixerio
MAPBOX_API_KEY= MAPBOX_API_KEY=

View File

@@ -1,9 +1,9 @@
APP_ENV=local APP_ENV=local
APP_DEBUG=true APP_DEBUG=false
APP_NAME=FireflyIII APP_NAME=FireflyIII
APP_KEY=SomeRandomStringOf32CharsExactly APP_KEY=SomeRandomStringOf32CharsExactly
APP_LOG=syslog APP_LOG=syslog
APP_LOG_LEVEL=debug APP_LOG_LEVEL=info
APP_URL=http://localhost APP_URL=http://localhost
DB_CONNECTION=mysql DB_CONNECTION=mysql
@@ -40,9 +40,10 @@ SHOW_INCOMPLETE_TRANSLATIONS=false
CACHE_PREFIX=firefly CACHE_PREFIX=firefly
SEARCH_RESULT_LIMIT=50
EXCHANGE_RATE_SERVICE=fixerio EXCHANGE_RATE_SERVICE=fixerio
GOOGLE_MAPS_API_KEY= MAPBOX_API_KEY=
ANALYTICS_ID= ANALYTICS_ID=
SITE_OWNER=mail@example.com SITE_OWNER=mail@example.com
USE_ENCRYPTION=true USE_ENCRYPTION=true

View File

@@ -1,12 +1,18 @@
# 4.6.9.1 # 4.6.10
- Greatly expanded Docker support thanks to [alazare619](https://github.com/alazare619)
- [Issue 967](https://github.com/firefly-iii/firefly-iii/issues/967), thanks to [Aquariu](https://github.com/Aquariu)
- Improved Sandstorm support.
- [Issue 963](https://github.com/firefly-iii/firefly-iii/issues/963), as reported by [gavu](https://github.com/gavu)
- [Issue 970](https://github.com/firefly-iii/firefly-iii/issues/970), as reported by [gavu](https://github.com/gavu)
- [Issue 971](https://github.com/firefly-iii/firefly-iii/issues/971), as reported by [gavu](https://github.com/gavu)
- Various Sandstorm.io related issues.
* Updated license # 4.6.9.1
* Updated file list - Updated license
- Updated file list
# 4.6.9 # 4.6.9
- First version that works!
* First version that works!
# 3.4.3 # 3.4.3
- Initial release on Sandstorm.io
* Initial release on Sandstorm.io

View File

@@ -39,6 +39,7 @@ etc/php/7.1/cli/conf.d/20-dom.ini
etc/php/7.1/cli/conf.d/20-exif.ini etc/php/7.1/cli/conf.d/20-exif.ini
etc/php/7.1/cli/conf.d/20-fileinfo.ini etc/php/7.1/cli/conf.d/20-fileinfo.ini
etc/php/7.1/cli/conf.d/20-ftp.ini etc/php/7.1/cli/conf.d/20-ftp.ini
etc/php/7.1/cli/conf.d/20-gd.ini
etc/php/7.1/cli/conf.d/20-gettext.ini etc/php/7.1/cli/conf.d/20-gettext.ini
etc/php/7.1/cli/conf.d/20-iconv.ini etc/php/7.1/cli/conf.d/20-iconv.ini
etc/php/7.1/cli/conf.d/20-intl.ini etc/php/7.1/cli/conf.d/20-intl.ini
@@ -75,6 +76,7 @@ etc/php/7.1/fpm/conf.d/20-dom.ini
etc/php/7.1/fpm/conf.d/20-exif.ini etc/php/7.1/fpm/conf.d/20-exif.ini
etc/php/7.1/fpm/conf.d/20-fileinfo.ini etc/php/7.1/fpm/conf.d/20-fileinfo.ini
etc/php/7.1/fpm/conf.d/20-ftp.ini etc/php/7.1/fpm/conf.d/20-ftp.ini
etc/php/7.1/fpm/conf.d/20-gd.ini
etc/php/7.1/fpm/conf.d/20-gettext.ini etc/php/7.1/fpm/conf.d/20-gettext.ini
etc/php/7.1/fpm/conf.d/20-iconv.ini etc/php/7.1/fpm/conf.d/20-iconv.ini
etc/php/7.1/fpm/conf.d/20-intl.ini etc/php/7.1/fpm/conf.d/20-intl.ini
@@ -109,6 +111,7 @@ etc/php/7.1/mods-available/dom.ini
etc/php/7.1/mods-available/exif.ini etc/php/7.1/mods-available/exif.ini
etc/php/7.1/mods-available/fileinfo.ini etc/php/7.1/mods-available/fileinfo.ini
etc/php/7.1/mods-available/ftp.ini etc/php/7.1/mods-available/ftp.ini
etc/php/7.1/mods-available/gd.ini
etc/php/7.1/mods-available/gettext.ini etc/php/7.1/mods-available/gettext.ini
etc/php/7.1/mods-available/iconv.ini etc/php/7.1/mods-available/iconv.ini
etc/php/7.1/mods-available/intl.ini etc/php/7.1/mods-available/intl.ini
@@ -177,6 +180,8 @@ lib/x86_64-linux-gnu/libnss_nis-2.19.so
lib/x86_64-linux-gnu/libnss_nis.so.2 lib/x86_64-linux-gnu/libnss_nis.so.2
lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/libpcre.so.3
lib/x86_64-linux-gnu/libpcre.so.3.13.3 lib/x86_64-linux-gnu/libpcre.so.3.13.3
lib/x86_64-linux-gnu/libpng12.so.0
lib/x86_64-linux-gnu/libpng12.so.0.50.0
lib/x86_64-linux-gnu/libpthread-2.19.so lib/x86_64-linux-gnu/libpthread-2.19.so
lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/libpthread.so.0
lib/x86_64-linux-gnu/libreadline.so.6 lib/x86_64-linux-gnu/libreadline.so.6
@@ -195,20 +200,12 @@ lib/x86_64-linux-gnu/libwrap.so.0.7.6
lib/x86_64-linux-gnu/libz.so.1 lib/x86_64-linux-gnu/libz.so.1
lib/x86_64-linux-gnu/libz.so.1.2.8 lib/x86_64-linux-gnu/libz.so.1.2.8
lib64/ld-linux-x86-64.so.2 lib64/ld-linux-x86-64.so.2
opt/app/.DS_Store
opt/app/.dockerignore opt/app/.dockerignore
opt/app/.env opt/app/.env
opt/app/.env.docker opt/app/.env.docker
opt/app/.env.example opt/app/.env.example
opt/app/.env.sandstorm opt/app/.env.sandstorm
opt/app/.env.testing
opt/app/.gitattributes opt/app/.gitattributes
opt/app/.gitignore
opt/app/.sandstorm/launcher.sh
opt/app/.sandstorm/service-config/mime.types
opt/app/.sandstorm/service-config/nginx.conf
opt/app/.scrutinizer.yml
opt/app/.travis.yml
opt/app/CHANGELOG.md opt/app/CHANGELOG.md
opt/app/CODE_OF_CONDUCT.md opt/app/CODE_OF_CONDUCT.md
opt/app/Dockerfile opt/app/Dockerfile
@@ -341,6 +338,7 @@ opt/app/app/Http/Controllers/JavascriptController.php
opt/app/app/Http/Controllers/Json/AutoCompleteController.php opt/app/app/Http/Controllers/Json/AutoCompleteController.php
opt/app/app/Http/Controllers/Json/BoxController.php opt/app/app/Http/Controllers/Json/BoxController.php
opt/app/app/Http/Controllers/Json/ExchangeController.php opt/app/app/Http/Controllers/Json/ExchangeController.php
opt/app/app/Http/Controllers/Json/FrontpageController.php
opt/app/app/Http/Controllers/Json/IntroController.php opt/app/app/Http/Controllers/Json/IntroController.php
opt/app/app/Http/Controllers/JsonController.php opt/app/app/Http/Controllers/JsonController.php
opt/app/app/Http/Controllers/NewUserController.php opt/app/app/Http/Controllers/NewUserController.php
@@ -375,6 +373,7 @@ opt/app/app/Http/Middleware/Range.php
opt/app/app/Http/Middleware/RedirectIfAuthenticated.php opt/app/app/Http/Middleware/RedirectIfAuthenticated.php
opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php
opt/app/app/Http/Middleware/Sandstorm.php opt/app/app/Http/Middleware/Sandstorm.php
opt/app/app/Http/Middleware/StartFireflySession.php
opt/app/app/Http/Middleware/TrimStrings.php opt/app/app/Http/Middleware/TrimStrings.php
opt/app/app/Http/Middleware/TrustProxies.php opt/app/app/Http/Middleware/TrustProxies.php
opt/app/app/Http/Middleware/VerifyCsrfToken.php opt/app/app/Http/Middleware/VerifyCsrfToken.php
@@ -509,6 +508,7 @@ opt/app/app/Providers/RouteServiceProvider.php
opt/app/app/Providers/RuleGroupServiceProvider.php opt/app/app/Providers/RuleGroupServiceProvider.php
opt/app/app/Providers/RuleServiceProvider.php opt/app/app/Providers/RuleServiceProvider.php
opt/app/app/Providers/SearchServiceProvider.php opt/app/app/Providers/SearchServiceProvider.php
opt/app/app/Providers/SessionServiceProvider.php
opt/app/app/Providers/TagServiceProvider.php opt/app/app/Providers/TagServiceProvider.php
opt/app/app/Repositories/Account/AccountRepository.php opt/app/app/Repositories/Account/AccountRepository.php
opt/app/app/Repositories/Account/AccountRepositoryInterface.php opt/app/app/Repositories/Account/AccountRepositoryInterface.php
@@ -688,6 +688,7 @@ opt/app/bootstrap/cache/packages.php
opt/app/bootstrap/cache/services.php opt/app/bootstrap/cache/services.php
opt/app/composer.json opt/app/composer.json
opt/app/composer.lock opt/app/composer.lock
opt/app/composer.phar
opt/app/config/app.php opt/app/config/app.php
opt/app/config/auth.php opt/app/config/auth.php
opt/app/config/broadcasting.php opt/app/config/broadcasting.php
@@ -704,7 +705,6 @@ opt/app/config/session.php
opt/app/config/twigbridge.php opt/app/config/twigbridge.php
opt/app/config/upgrade.php opt/app/config/upgrade.php
opt/app/config/view.php opt/app/config/view.php
opt/app/crowdin.yaml
opt/app/database/factories/ModelFactory.php opt/app/database/factories/ModelFactory.php
opt/app/database/migrations/2016_06_16_000000_create_support_tables.php opt/app/database/migrations/2016_06_16_000000_create_support_tables.php
opt/app/database/migrations/2016_06_16_000001_create_users_table.php opt/app/database/migrations/2016_06_16_000001_create_users_table.php
@@ -725,14 +725,12 @@ opt/app/database/seeds/LinkTypeSeeder.php
opt/app/database/seeds/PermissionSeeder.php opt/app/database/seeds/PermissionSeeder.php
opt/app/database/seeds/TransactionCurrencySeeder.php opt/app/database/seeds/TransactionCurrencySeeder.php
opt/app/database/seeds/TransactionTypeSeeder.php opt/app/database/seeds/TransactionTypeSeeder.php
opt/app/docker-compose.dockerhub.yml
opt/app/docker-compose.override.yml opt/app/docker-compose.override.yml
opt/app/docker-compose.prod.yml opt/app/docker-compose.prod.yml
opt/app/docker-compose.yml opt/app/docker-compose.yml
opt/app/nginx_app.conf opt/app/nginx_app.conf
opt/app/package.json
opt/app/phpunit.coverage.specific.xml
opt/app/phpunit.coverage.xml opt/app/phpunit.coverage.xml
opt/app/phpunit.xml
opt/app/public/.htaccess opt/app/public/.htaccess
opt/app/public/android-chrome-192x192.png opt/app/public/android-chrome-192x192.png
opt/app/public/android-chrome-512x512.png opt/app/public/android-chrome-512x512.png
@@ -743,6 +741,7 @@ opt/app/public/css/bootstrap-sortable.css
opt/app/public/css/bootstrap-tagsinput.css opt/app/public/css/bootstrap-tagsinput.css
opt/app/public/css/daterangepicker.css opt/app/public/css/daterangepicker.css
opt/app/public/css/firefly.css opt/app/public/css/firefly.css
opt/app/public/css/google-fonts.css
opt/app/public/css/jquery-ui/images/ui-icons_444444_256x240.png opt/app/public/css/jquery-ui/images/ui-icons_444444_256x240.png
opt/app/public/css/jquery-ui/images/ui-icons_555555_256x240.png opt/app/public/css/jquery-ui/images/ui-icons_555555_256x240.png
opt/app/public/css/jquery-ui/images/ui-icons_777620_256x240.png opt/app/public/css/jquery-ui/images/ui-icons_777620_256x240.png
@@ -754,6 +753,55 @@ opt/app/public/css/jquery-ui/jquery-ui.theme.min.css
opt/app/public/favicon-16x16.png opt/app/public/favicon-16x16.png
opt/app/public/favicon-32x32.png opt/app/public/favicon-32x32.png
opt/app/public/favicon.ico opt/app/public/favicon.ico
opt/app/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-Bold-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-Bold-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-Bold-greek.woff2
opt/app/public/fonts/SourceSansPro-Bold-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-Bold-latin.woff2
opt/app/public/fonts/SourceSansPro-Bold-vietnamese.woff2
opt/app/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-Italic-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-Italic-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-Italic-greek.woff2
opt/app/public/fonts/SourceSansPro-Italic-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-Italic-latin.woff2
opt/app/public/fonts/SourceSansPro-Italic-vietnamese.woff2
opt/app/public/fonts/SourceSansPro-Light-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-Light-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-Light-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-Light-greek.woff2
opt/app/public/fonts/SourceSansPro-Light-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-Light-latin.woff2
opt/app/public/fonts/SourceSansPro-Light-vietnamese.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-greek.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-latin.woff2
opt/app/public/fonts/SourceSansPro-LightItalic-vietnamese.woff2
opt/app/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-Regular-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-Regular-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-Regular-greek.woff2
opt/app/public/fonts/SourceSansPro-Regular-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-Regular-latin.woff2
opt/app/public/fonts/SourceSansPro-Regular-vietnamese.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-greek.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-latin.woff2
opt/app/public/fonts/SourceSansPro-SemiBold-vietnamese.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff2
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2
opt/app/public/fonts/lato-100.woff2 opt/app/public/fonts/lato-100.woff2
opt/app/public/fonts/roboto-light-300.woff2 opt/app/public/fonts/roboto-light-300.woff2
opt/app/public/images/error.png opt/app/public/images/error.png
@@ -826,6 +874,8 @@ opt/app/public/js/lib/daterangepicker.js
opt/app/public/js/lib/html5shiv.min.js opt/app/public/js/lib/html5shiv.min.js
opt/app/public/js/lib/jquery-3.1.1.min.js opt/app/public/js/lib/jquery-3.1.1.min.js
opt/app/public/js/lib/jquery-3.1.1.min.map opt/app/public/js/lib/jquery-3.1.1.min.map
opt/app/public/js/lib/jquery-3.2.1.min.js
opt/app/public/js/lib/jquery-3.2.1.min.map
opt/app/public/js/lib/jquery-ui.min.js opt/app/public/js/lib/jquery-ui.min.js
opt/app/public/js/lib/jquery.color-2.1.2.min.js opt/app/public/js/lib/jquery.color-2.1.2.min.js
opt/app/public/js/lib/modernizr-custom.js opt/app/public/js/lib/modernizr-custom.js
@@ -1062,6 +1112,7 @@ opt/app/resources/views/currencies/create.twig
opt/app/resources/views/currencies/delete.twig opt/app/resources/views/currencies/delete.twig
opt/app/resources/views/currencies/edit.twig opt/app/resources/views/currencies/edit.twig
opt/app/resources/views/currencies/index.twig opt/app/resources/views/currencies/index.twig
opt/app/resources/views/debug.twig
opt/app/resources/views/demo/accounts/index.twig opt/app/resources/views/demo/accounts/index.twig
opt/app/resources/views/demo/budgets/index.twig opt/app/resources/views/demo/budgets/index.twig
opt/app/resources/views/demo/currencies/index.twig opt/app/resources/views/demo/currencies/index.twig
@@ -1110,6 +1161,7 @@ opt/app/resources/views/form/location.twig
opt/app/resources/views/form/multiCheckbox.twig opt/app/resources/views/form/multiCheckbox.twig
opt/app/resources/views/form/multiRadio.twig opt/app/resources/views/form/multiRadio.twig
opt/app/resources/views/form/non-selectable-amount.twig opt/app/resources/views/form/non-selectable-amount.twig
opt/app/resources/views/form/number.twig
opt/app/resources/views/form/options.twig opt/app/resources/views/form/options.twig
opt/app/resources/views/form/password.twig opt/app/resources/views/form/password.twig
opt/app/resources/views/form/select.twig opt/app/resources/views/form/select.twig
@@ -1130,6 +1182,7 @@ opt/app/resources/views/index.twig
opt/app/resources/views/javascript/accounts.twig opt/app/resources/views/javascript/accounts.twig
opt/app/resources/views/javascript/currencies.twig opt/app/resources/views/javascript/currencies.twig
opt/app/resources/views/javascript/variables.twig opt/app/resources/views/javascript/variables.twig
opt/app/resources/views/json/piggy-banks.twig
opt/app/resources/views/layout/default.twig opt/app/resources/views/layout/default.twig
opt/app/resources/views/layout/empty.twig opt/app/resources/views/layout/empty.twig
opt/app/resources/views/layout/guest.twig opt/app/resources/views/layout/guest.twig
@@ -1228,9 +1281,7 @@ opt/app/routes/console.php
opt/app/routes/web.php opt/app/routes/web.php
opt/app/server.php opt/app/server.php
opt/app/storage opt/app/storage
opt/app/test.sh
opt/app/vendor/autoload.php opt/app/vendor/autoload.php
opt/app/vendor/bacon/bacon-qr-code/.travis.yml
opt/app/vendor/bacon/bacon-qr-code/LICENSE opt/app/vendor/bacon/bacon-qr-code/LICENSE
opt/app/vendor/bacon/bacon-qr-code/Module.php opt/app/vendor/bacon/bacon-qr-code/Module.php
opt/app/vendor/bacon/bacon-qr-code/README.md opt/app/vendor/bacon/bacon-qr-code/README.md
@@ -1291,11 +1342,8 @@ opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MatrixUtilTest.php
opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php
opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php
opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php
opt/app/vendor/bacon/bacon-qr-code/tests/phpunit.xml
opt/app/vendor/bin/commonmark opt/app/vendor/bin/commonmark
opt/app/vendor/bin/doctrine-dbal opt/app/vendor/bin/doctrine-dbal
opt/app/vendor/christian-riesen/base32/.scrutinizer.yml
opt/app/vendor/christian-riesen/base32/.travis.yml
opt/app/vendor/christian-riesen/base32/LICENSE opt/app/vendor/christian-riesen/base32/LICENSE
opt/app/vendor/christian-riesen/base32/README.md opt/app/vendor/christian-riesen/base32/README.md
opt/app/vendor/christian-riesen/base32/build.xml opt/app/vendor/christian-riesen/base32/build.xml
@@ -1318,9 +1366,7 @@ opt/app/vendor/davejamesmiller/laravel-breadcrumbs/README.md
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/RELEASE-CHECKLIST.md opt/app/vendor/davejamesmiller/laravel-breadcrumbs/RELEASE-CHECKLIST.md
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/phpunit.xml
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test.sh
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php
@@ -1487,7 +1533,6 @@ opt/app/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php
opt/app/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php opt/app/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php
opt/app/vendor/doctrine/common/lib/Doctrine/Common/Version.php opt/app/vendor/doctrine/common/lib/Doctrine/Common/Version.php
opt/app/vendor/doctrine/common/phpstan.neon opt/app/vendor/doctrine/common/phpstan.neon
opt/app/vendor/doctrine/dbal/.scrutinizer.yml
opt/app/vendor/doctrine/dbal/LICENSE opt/app/vendor/doctrine/dbal/LICENSE
opt/app/vendor/doctrine/dbal/README.md opt/app/vendor/doctrine/dbal/README.md
opt/app/vendor/doctrine/dbal/SECURITY.md opt/app/vendor/doctrine/dbal/SECURITY.md
@@ -3218,12 +3263,10 @@ opt/app/vendor/paragonie/random_compat/lib/random_int.php
opt/app/vendor/paragonie/random_compat/other/build_phar.php opt/app/vendor/paragonie/random_compat/other/build_phar.php
opt/app/vendor/paragonie/random_compat/psalm-autoload.php opt/app/vendor/paragonie/random_compat/psalm-autoload.php
opt/app/vendor/paragonie/random_compat/psalm.xml opt/app/vendor/paragonie/random_compat/psalm.xml
opt/app/vendor/pragmarx/google2fa/.travis.yml
opt/app/vendor/pragmarx/google2fa/LICENSE opt/app/vendor/pragmarx/google2fa/LICENSE
opt/app/vendor/pragmarx/google2fa/changelog.md opt/app/vendor/pragmarx/google2fa/changelog.md
opt/app/vendor/pragmarx/google2fa/composer.json opt/app/vendor/pragmarx/google2fa/composer.json
opt/app/vendor/pragmarx/google2fa/phpspec.yml opt/app/vendor/pragmarx/google2fa/phpspec.yml
opt/app/vendor/pragmarx/google2fa/phpunit.xml
opt/app/vendor/pragmarx/google2fa/readme.md opt/app/vendor/pragmarx/google2fa/readme.md
opt/app/vendor/pragmarx/google2fa/src/Contracts/Google2FA.php opt/app/vendor/pragmarx/google2fa/src/Contracts/Google2FA.php
opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php
@@ -3347,7 +3390,6 @@ opt/app/vendor/rcrowe/twigbridge/src/Twig/Globals.php
opt/app/vendor/rcrowe/twigbridge/src/Twig/Loader.php opt/app/vendor/rcrowe/twigbridge/src/Twig/Loader.php
opt/app/vendor/rcrowe/twigbridge/src/Twig/Template.php opt/app/vendor/rcrowe/twigbridge/src/Twig/Template.php
opt/app/vendor/rmccue/requests/.coveralls.yml opt/app/vendor/rmccue/requests/.coveralls.yml
opt/app/vendor/rmccue/requests/.travis.yml
opt/app/vendor/rmccue/requests/CHANGELOG.md opt/app/vendor/rmccue/requests/CHANGELOG.md
opt/app/vendor/rmccue/requests/LICENSE opt/app/vendor/rmccue/requests/LICENSE
opt/app/vendor/rmccue/requests/README.md opt/app/vendor/rmccue/requests/README.md
@@ -3454,7 +3496,6 @@ opt/app/vendor/swiftmailer/swiftmailer/.gitattributes
opt/app/vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md opt/app/vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md
opt/app/vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md opt/app/vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md
opt/app/vendor/swiftmailer/swiftmailer/.php_cs.dist opt/app/vendor/swiftmailer/swiftmailer/.php_cs.dist
opt/app/vendor/swiftmailer/swiftmailer/.travis.yml
opt/app/vendor/swiftmailer/swiftmailer/CHANGES opt/app/vendor/swiftmailer/swiftmailer/CHANGES
opt/app/vendor/swiftmailer/swiftmailer/LICENSE opt/app/vendor/swiftmailer/swiftmailer/LICENSE
opt/app/vendor/swiftmailer/swiftmailer/README opt/app/vendor/swiftmailer/swiftmailer/README
@@ -5087,7 +5128,6 @@ opt/app/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php
opt/app/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php opt/app/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php
opt/app/vendor/twig/twig/.editorconfig opt/app/vendor/twig/twig/.editorconfig
opt/app/vendor/twig/twig/.php_cs.dist opt/app/vendor/twig/twig/.php_cs.dist
opt/app/vendor/twig/twig/.travis.yml
opt/app/vendor/twig/twig/CHANGELOG opt/app/vendor/twig/twig/CHANGELOG
opt/app/vendor/twig/twig/LICENSE opt/app/vendor/twig/twig/LICENSE
opt/app/vendor/twig/twig/README.rst opt/app/vendor/twig/twig/README.rst
@@ -5790,6 +5830,7 @@ usr/lib/php/20160303/dom.so
usr/lib/php/20160303/exif.so usr/lib/php/20160303/exif.so
usr/lib/php/20160303/fileinfo.so usr/lib/php/20160303/fileinfo.so
usr/lib/php/20160303/ftp.so usr/lib/php/20160303/ftp.so
usr/lib/php/20160303/gd.so
usr/lib/php/20160303/gettext.so usr/lib/php/20160303/gettext.so
usr/lib/php/20160303/iconv.so usr/lib/php/20160303/iconv.so
usr/lib/php/20160303/intl.so usr/lib/php/20160303/intl.so
@@ -5819,6 +5860,14 @@ usr/lib/php/20160303/zip.so
usr/lib/ssl/openssl.cnf usr/lib/ssl/openssl.cnf
usr/lib/x86_64-linux-gnu/libGeoIP.so.1 usr/lib/x86_64-linux-gnu/libGeoIP.so.1
usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.2 usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.2
usr/lib/x86_64-linux-gnu/libX11.so.6
usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
usr/lib/x86_64-linux-gnu/libXau.so.6
usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
usr/lib/x86_64-linux-gnu/libXdmcp.so.6
usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
usr/lib/x86_64-linux-gnu/libXpm.so.4
usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0
usr/lib/x86_64-linux-gnu/libapparmor.so.1 usr/lib/x86_64-linux-gnu/libapparmor.so.1
usr/lib/x86_64-linux-gnu/libapparmor.so.1.2.0 usr/lib/x86_64-linux-gnu/libapparmor.so.1.2.0
usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
@@ -5831,6 +5880,12 @@ usr/lib/x86_64-linux-gnu/libexslt.so.0
usr/lib/x86_64-linux-gnu/libexslt.so.0.8.17 usr/lib/x86_64-linux-gnu/libexslt.so.0.8.17
usr/lib/x86_64-linux-gnu/libffi.so.6 usr/lib/x86_64-linux-gnu/libffi.so.6
usr/lib/x86_64-linux-gnu/libffi.so.6.0.2 usr/lib/x86_64-linux-gnu/libffi.so.6.0.2
usr/lib/x86_64-linux-gnu/libfontconfig.so.1
usr/lib/x86_64-linux-gnu/libfontconfig.so.1.8.0
usr/lib/x86_64-linux-gnu/libfreetype.so.6
usr/lib/x86_64-linux-gnu/libfreetype.so.6.11.1
usr/lib/x86_64-linux-gnu/libgd.so.3
usr/lib/x86_64-linux-gnu/libgd.so.3.0.0
usr/lib/x86_64-linux-gnu/libgmp.so.10 usr/lib/x86_64-linux-gnu/libgmp.so.10
usr/lib/x86_64-linux-gnu/libgmp.so.10.2.0 usr/lib/x86_64-linux-gnu/libgmp.so.10.2.0
usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28 usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28
@@ -5849,6 +5904,9 @@ usr/lib/x86_64-linux-gnu/libicuuc.so.52
usr/lib/x86_64-linux-gnu/libicuuc.so.52.1 usr/lib/x86_64-linux-gnu/libicuuc.so.52.1
usr/lib/x86_64-linux-gnu/libidn.so.11 usr/lib/x86_64-linux-gnu/libidn.so.11
usr/lib/x86_64-linux-gnu/libidn.so.11.6.12 usr/lib/x86_64-linux-gnu/libidn.so.11.6.12
usr/lib/x86_64-linux-gnu/libjbig.so.0
usr/lib/x86_64-linux-gnu/libjpeg.so.62
usr/lib/x86_64-linux-gnu/libjpeg.so.62.1.0
usr/lib/x86_64-linux-gnu/libk5crypto.so.3 usr/lib/x86_64-linux-gnu/libk5crypto.so.3
usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1 usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
usr/lib/x86_64-linux-gnu/libkrb5.so.3 usr/lib/x86_64-linux-gnu/libkrb5.so.3
@@ -5874,6 +5932,14 @@ usr/lib/x86_64-linux-gnu/libstdc++.so.6
usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
usr/lib/x86_64-linux-gnu/libtasn1.so.6 usr/lib/x86_64-linux-gnu/libtasn1.so.6
usr/lib/x86_64-linux-gnu/libtasn1.so.6.3.2 usr/lib/x86_64-linux-gnu/libtasn1.so.6.3.2
usr/lib/x86_64-linux-gnu/libtiff.so.5
usr/lib/x86_64-linux-gnu/libtiff.so.5.2.0
usr/lib/x86_64-linux-gnu/libvpx.so.1
usr/lib/x86_64-linux-gnu/libvpx.so.1.3.0
usr/lib/x86_64-linux-gnu/libwebp.so.5
usr/lib/x86_64-linux-gnu/libwebp.so.5.0.1
usr/lib/x86_64-linux-gnu/libxcb.so.1
usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
usr/lib/x86_64-linux-gnu/libxml2.so.2 usr/lib/x86_64-linux-gnu/libxml2.so.2
usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1 usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1
usr/lib/x86_64-linux-gnu/libxslt.so.1 usr/lib/x86_64-linux-gnu/libxslt.so.1

View File

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

View File

@@ -11,6 +11,16 @@ export DEBIAN_FRONTEND=noninteractive
apt-get update 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
sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
dpkg-reconfigure --frontend=noninteractive locales
# actually add repository # actually add repository
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9C74FEEA2098A6E apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9C74FEEA2098A6E
add-apt-repository "deb http://packages.dotdeb.org jessie all" add-apt-repository "deb http://packages.dotdeb.org jessie all"
@@ -29,6 +39,10 @@ service mysql stop
systemctl disable nginx systemctl disable nginx
systemctl disable php7.1-fpm systemctl disable php7.1-fpm
systemctl disable mysql systemctl disable mysql
# make php.ini display errors:
sed -i 's/display_errors = Off/display_errors = On/g' /etc/php/7.1/fpm/php.ini
# patch /etc/php/7.1/fpm/pool.d/www.conf to not change uid/gid to www-data # patch /etc/php/7.1/fpm/pool.d/www.conf to not change uid/gid to www-data
sed --in-place='' \ sed --in-place='' \
--expression='s/^listen.owner = www-data/;listen.owner = www-data/' \ --expression='s/^listen.owner = www-data/;listen.owner = www-data/' \
@@ -64,3 +78,5 @@ cat <<EOF > /etc/mysql/conf.d/sandstorm.cnf
# Set the main data file to grow by 1MB at a time, rather than 8MB at a time. # Set the main data file to grow by 1MB at a time, rather than 8MB at a time.
innodb_autoextend_increment = 1 innodb_autoextend_increment = 1
EOF EOF

View File

@@ -2,6 +2,20 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
## [4.6.10] - 2017-11-xx
### Added
- Greatly expanded Docker support thanks to [alazare619](https://github.com/alazare619)
- [Issue 967](https://github.com/firefly-iii/firefly-iii/issues/967), thanks to [Aquariu](https://github.com/Aquariu)
### Changed
- Improved Sandstorm support.
### Fixed
- [Issue 963](https://github.com/firefly-iii/firefly-iii/issues/963), as reported by [gavu](https://github.com/gavu)
- [Issue 970](https://github.com/firefly-iii/firefly-iii/issues/970), as reported by [gavu](https://github.com/gavu)
- [Issue 971](https://github.com/firefly-iii/firefly-iii/issues/971), as reported by [gavu](https://github.com/gavu)
- Various Sandstorm.io related issues.
## [4.6.9] - 2017-10-22 ## [4.6.9] - 2017-10-22
### Added ### Added
- Firefly III is now available on the [Sandstorm.io](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70) market. - Firefly III is now available on the [Sandstorm.io](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70) market.

View File

@@ -32,6 +32,7 @@ use Illuminate\Console\Command;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
use Log; use Log;
use Monolog\Formatter\LineFormatter; use Monolog\Formatter\LineFormatter;
use Preferences;
/** /**
* Class CreateImport * Class CreateImport
@@ -154,6 +155,9 @@ class CreateImport extends Command
); );
} }
// clear cache for user:
Preferences::setForUser($user, 'lastActivity', microtime());
return; return;
} }

View File

@@ -112,12 +112,17 @@ class AttachmentHelper implements AttachmentHelperInterface
public function saveAttachmentsForModel(Model $model, ?array $files): bool public function saveAttachmentsForModel(Model $model, ?array $files): bool
{ {
if (is_array($files)) { if (is_array($files)) {
/** @var UploadedFile $entry */
foreach ($files as $entry) { foreach ($files as $entry) {
if (!is_null($entry)) { if (!is_null($entry)) {
$this->processFile($entry, $model); $this->processFile($entry, $model);
} }
} }
Log::debug('Done processing uploads.');
return true;
} }
Log::debug('Array of files is not an array. Probably nothing uploaded. Will not store attachments.');
return true; return true;
} }
@@ -138,6 +143,7 @@ class AttachmentHelper implements AttachmentHelperInterface
if ($count > 0) { if ($count > 0) {
$msg = (string)trans('validation.file_already_attached', ['name' => $name]); $msg = (string)trans('validation.file_already_attached', ['name' => $name]);
$this->errors->add('attachments', $msg); $this->errors->add('attachments', $msg);
Log::error($msg);
return true; return true;
} }
@@ -204,6 +210,7 @@ class AttachmentHelper implements AttachmentHelperInterface
if (!in_array($mime, $this->allowedMimes)) { if (!in_array($mime, $this->allowedMimes)) {
$msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]); $msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]);
$this->errors->add('attachments', $msg); $this->errors->add('attachments', $msg);
Log::error($msg);
return false; return false;
} }
@@ -225,6 +232,7 @@ class AttachmentHelper implements AttachmentHelperInterface
if ($size > $this->maxUploadSize) { if ($size > $this->maxUploadSize) {
$msg = (string)trans('validation.file_too_large', ['name' => $name]); $msg = (string)trans('validation.file_too_large', ['name' => $name]);
$this->errors->add('attachments', $msg); $this->errors->add('attachments', $msg);
Log::error($msg);
return false; return false;
} }

View File

@@ -133,7 +133,7 @@ class JournalCollector implements JournalCollectorInterface
public function addFilter(string $filter): JournalCollectorInterface public function addFilter(string $filter): JournalCollectorInterface
{ {
$interfaces = class_implements($filter); $interfaces = class_implements($filter);
if (in_array(FilterInterface::class, $interfaces) && !in_array($filter, $this->filters) ) { if (in_array(FilterInterface::class, $interfaces) && !in_array($filter, $this->filters)) {
Log::debug(sprintf('Enabled filter %s', $filter)); Log::debug(sprintf('Enabled filter %s', $filter));
$this->filters[] = $filter; $this->filters[] = $filter;
} }
@@ -141,6 +141,78 @@ class JournalCollector implements JournalCollectorInterface
return $this; return $this;
} }
/**
* @param string $amount
*
* @return JournalCollectorInterface
*/
public function amountIs(string $amount): JournalCollectorInterface
{
$this->query->where(
function (EloquentBuilder $q) use ($amount) {
$q->where('transactions.amount', $amount);
$q->orWhere('transactions.amount', bcmul($amount, '-1'));
}
);
return $this;
}
/**
* @param string $amount
*
* @return JournalCollectorInterface
*/
public function amountLess(string $amount): JournalCollectorInterface
{
$this->query->where(
function (EloquentBuilder $q1) use ($amount) {
$q1->where(
function (EloquentBuilder $q2) use ($amount) {
// amount < 0 and .amount > -$amount
$amount = bcmul($amount,'-1');
$q2->where('transactions.amount', '<', 0)->where('transactions.amount', '>', $amount);
}
)
->orWhere(
function (EloquentBuilder $q3) use ($amount) {
// amount > 0 and .amount < $amount
$q3->where('transactions.amount', '>', 0)->where('transactions.amount', '<', $amount);
}
);
}
);
return $this;
}
/**
* @param string $amount
*
* @return JournalCollectorInterface
*/
public function amountMore(string $amount): JournalCollectorInterface
{
$this->query->where(
function (EloquentBuilder $q1) use ($amount) {
$q1->where(
function (EloquentBuilder $q2) use ($amount) {
// amount < 0 and .amount < -$amount
$amount = bcmul($amount,'-1');
$q2->where('transactions.amount', '<', 0)->where('transactions.amount', '<', $amount);
}
)
->orWhere(
function (EloquentBuilder $q3) use ($amount) {
// amount > 0 and .amount > $amount
$q3->where('transactions.amount', '>', 0)->where('transactions.amount', '>', $amount);
}
);
}
);
return $this;
}
/** /**
* @return int * @return int
* @throws FireflyException * @throws FireflyException
@@ -251,6 +323,20 @@ class JournalCollector implements JournalCollectorInterface
return $this; return $this;
} }
/**
* @param Carbon $after
*
* @return JournalCollectorInterface
*/
public function setAfter(Carbon $after): JournalCollectorInterface
{
$afterStr = $after->format('Y-m-d');
$this->query->where('transaction_journals.date', '>=', $afterStr);
Log::debug(sprintf('JournalCollector range is now after %s (inclusive)', $afterStr));
return $this;
}
/** /**
* @return JournalCollectorInterface * @return JournalCollectorInterface
*/ */
@@ -273,6 +359,20 @@ class JournalCollector implements JournalCollectorInterface
return $this; return $this;
} }
/**
* @param Carbon $before
*
* @return JournalCollectorInterface
*/
public function setBefore(Carbon $before): JournalCollectorInterface
{
$beforeStr = $before->format('Y-m-d');
$this->query->where('transaction_journals.date', '<=', $beforeStr);
Log::debug(sprintf('JournalCollector range is now before %s (inclusive)', $beforeStr));
return $this;
}
/** /**
* @param Collection $bills * @param Collection $bills
* *
@@ -523,7 +623,7 @@ class JournalCollector implements JournalCollectorInterface
->orderBy('transaction_journals.order', 'ASC') ->orderBy('transaction_journals.order', 'ASC')
->orderBy('transaction_journals.id', 'DESC') ->orderBy('transaction_journals.id', 'DESC')
->orderBy('transaction_journals.description', 'DESC') ->orderBy('transaction_journals.description', 'DESC')
->orderBy('transactions.amount','DESC'); ->orderBy('transactions.amount', 'DESC');
$this->query = $query; $this->query = $query;

View File

@@ -45,6 +45,27 @@ interface JournalCollectorInterface
*/ */
public function addFilter(string $filter): JournalCollectorInterface; public function addFilter(string $filter): JournalCollectorInterface;
/**
* @param string $amount
*
* @return JournalCollectorInterface
*/
public function amountMore(string $amount): JournalCollectorInterface;
/**
* @param string $amount
*
* @return JournalCollectorInterface
*/
public function amountLess(string $amount): JournalCollectorInterface;
/**
* @param string $amount
*
* @return JournalCollectorInterface
*/
public function amountIs(string $amount): JournalCollectorInterface;
/** /**
* @return int * @return int
*/ */
@@ -74,11 +95,25 @@ interface JournalCollectorInterface
*/ */
public function setAccounts(Collection $accounts): JournalCollectorInterface; public function setAccounts(Collection $accounts): JournalCollectorInterface;
/**
* @param Carbon $after
*
* @return JournalCollectorInterface
*/
public function setAfter(Carbon $after): JournalCollectorInterface;
/** /**
* @return JournalCollectorInterface * @return JournalCollectorInterface
*/ */
public function setAllAssetAccounts(): JournalCollectorInterface; public function setAllAssetAccounts(): JournalCollectorInterface;
/**
* @param Carbon $before
*
* @return JournalCollectorInterface
*/
public function setBefore(Carbon $before): JournalCollectorInterface;
/** /**
* @param Collection $bills * @param Collection $bills
* *

View File

@@ -27,7 +27,6 @@ use Carbon\Carbon;
use Exception; use Exception;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Helpers\Filter\InternalTransferFilter;
use FireflyIII\Http\Requests\BudgetFormRequest; use FireflyIII\Http\Requests\BudgetFormRequest;
use FireflyIII\Http\Requests\BudgetIncomeRequest; use FireflyIII\Http\Requests\BudgetIncomeRequest;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
@@ -49,6 +48,7 @@ use View;
* *
* @package FireflyIII\Http\Controllers * @package FireflyIII\Http\Controllers
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.TooManyPublicMethods)
*/ */
class BudgetController extends Controller class BudgetController extends Controller
{ {
@@ -256,6 +256,7 @@ class BudgetController extends Controller
/** /**
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
@@ -269,50 +270,49 @@ class BudgetController extends Controller
if ($cache->has()) { if ($cache->has()) {
$result = $cache->get(); // @codeCoverageIgnore $result = $cache->get(); // @codeCoverageIgnore
return view('budgets.info', compact('result', 'begin', 'currentEnd'));
} }
if (!$cache->has()) { $result = [
$result = [ 'available' => '0',
'available' => '0', 'earned' => '0',
'earned' => '0', 'suggested' => '0',
'suggested' => '0', ];
]; $currency = app('amount')->getDefaultCurrency();
$currency = app('amount')->getDefaultCurrency(); $range = Preferences::get('viewRange', '1M')->data;
$range = Preferences::get('viewRange', '1M')->data; $begin = Navigation::subtractPeriod($start, $range, 3);
$begin = Navigation::subtractPeriod($start, $range, 3);
// get average amount available. // get average amount available.
$total = '0'; $total = '0';
$count = 0; $count = 0;
$currentStart = clone $begin; $currentStart = clone $begin;
while ($currentStart < $start) { while ($currentStart < $start) {
$currentEnd = Navigation::endOfPeriod($currentStart, $range); $currentEnd = Navigation::endOfPeriod($currentStart, $range);
$total = bcadd($total, $this->repository->getAvailableBudget($currency, $currentStart, $currentEnd)); $total = bcadd($total, $this->repository->getAvailableBudget($currency, $currentStart, $currentEnd));
$currentStart = Navigation::addPeriod($currentStart, $range, 0); $currentStart = Navigation::addPeriod($currentStart, $range, 0);
$count++; $count++;
}
$result['available'] = bcdiv($total, strval($count));
// amount earned in this period:
$subDay = clone $end;
$subDay->subDay();
/** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount();
$result['earned'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
// amount spent in period
/** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount();
$result['spent'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
// suggestion starts with the amount spent
$result['suggested'] = bcmul($result['spent'], '-1');
$result['suggested'] = bccomp($result['suggested'], $result['earned']) === 1 ? $result['earned'] : $result['suggested'];
// unless it's more than you earned. So min() of suggested/earned
$cache->store($result);
} }
$result['available'] = bcdiv($total, strval($count));
// amount earned in this period:
$subDay = clone $end;
$subDay->subDay();
/** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount();
$result['earned'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
// amount spent in period
/** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount();
$result['spent'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
// suggestion starts with the amount spent
$result['suggested'] = bcmul($result['spent'], '-1');
$result['suggested'] = bccomp($result['suggested'], $result['earned']) === 1 ? $result['earned'] : $result['suggested'];
// unless it's more than you earned. So min() of suggested/earned
$cache->store($result);
return view('budgets.info', compact('result', 'begin', 'currentEnd')); return view('budgets.info', compact('result', 'begin', 'currentEnd'));
@@ -573,9 +573,7 @@ class BudgetController extends Controller
$start = Navigation::startOfPeriod($start, $range); $start = Navigation::startOfPeriod($start, $range);
$end = Navigation::endOfX(new Carbon, $range, null); $end = Navigation::endOfX(new Carbon, $range, null);
$entries = new Collection; $entries = new Collection;
$cache = new CacheProperties;
// properties for cache
$cache = new CacheProperties;
$cache->addProperty($start); $cache->addProperty($start);
$cache->addProperty($end); $cache->addProperty($end);
$cache->addProperty('no-budget-period-entries'); $cache->addProperty('no-budget-period-entries');
@@ -588,25 +586,15 @@ class BudgetController extends Controller
while ($end >= $start) { while ($end >= $start) {
$end = Navigation::startOfPeriod($end, $range); $end = Navigation::startOfPeriod($end, $range);
$currentEnd = Navigation::endOfPeriod($end, $range); $currentEnd = Navigation::endOfPeriod($end, $range);
// count journals without budget in this period:
/** @var JournalCollectorInterface $collector */ /** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class); $collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutBudget()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]); $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutBudget()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]);
$set = $collector->getJournals(); $set = $collector->getJournals();
$sum = $set->sum('transaction_amount'); $sum = $set->sum('transaction_amount') ?? '0';
$journals = $set->count(); $journals = $set->count();
$dateStr = $end->format('Y-m-d'); $dateStr = $end->format('Y-m-d');
$dateName = Navigation::periodShow($end, $range); $dateName = Navigation::periodShow($end, $range);
$entries->push( $entries->push(['string' => $dateStr, 'name' => $dateName, 'count' => $journals, 'sum' => $sum, 'date' => clone $end,]);
[
'string' => $dateStr,
'name' => $dateName,
'count' => $journals,
'sum' => $sum,
'date' => clone $end,
]
);
$end = Navigation::subtractPeriod($end, $range, 1); $end = Navigation::subtractPeriod($end, $range, 1);
} }
$cache->store($entries); $cache->store($entries);

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Http\Controllers;
use Artisan; use Artisan;
use Carbon\Carbon; use Carbon\Carbon;
use DB;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
@@ -87,6 +88,18 @@ class HomeController extends Controller
Session::put('end', $end); Session::put('end', $end);
} }
public function displayDebug()
{
$phpVersion = PHP_VERSION;
$now = Carbon::create()->format('Y-m-d H:i:s e');
$extensions = join(', ', get_loaded_extensions());
$drivers = join(', ', DB::availableDrivers());
$currentDriver = DB::getDriverName();
return view('debug', compact('phpVersion', 'extensions', 'carbon', 'now', 'drivers','currentDriver'));
}
/** /**
* @throws FireflyException * @throws FireflyException
*/ */
@@ -157,7 +170,7 @@ class HomeController extends Controller
} }
return view( return view(
'index', compact('count', 'subTitle', 'transactions', 'showDeps','billCount') 'index', compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount')
); );
} }

View File

@@ -142,26 +142,23 @@ class JavascriptController extends Controller
]; ];
Log::debug(sprintf('viewRange is %s', $viewRange)); Log::debug(sprintf('viewRange is %s', $viewRange));
// get the format for the ranges:
$format = $this->getFormatByRange($viewRange);
// when current range is a custom range, add the current period as the next range. // when current range is a custom range, add the current period as the next range.
if ($isCustom) { if ($isCustom) {
Log::debug('Custom is true.'); Log::debug('Custom is true.');
$index = $start->formatLocalized($format); $index = Navigation::periodShow($start, $viewRange);
$customPeriodStart = Navigation::startOfPeriod($start, $viewRange); $customPeriodStart = Navigation::startOfPeriod($start, $viewRange);
$customPeriodEnd = Navigation::endOfPeriod($customPeriodStart, $viewRange); $customPeriodEnd = Navigation::endOfPeriod($customPeriodStart, $viewRange);
$ranges[$index] = [$customPeriodStart, $customPeriodEnd]; $ranges[$index] = [$customPeriodStart, $customPeriodEnd];
} }
// then add previous range and next range // then add previous range and next range
$previousDate = Navigation::subtractPeriod($start, $viewRange); $previousDate = Navigation::subtractPeriod($start, $viewRange);
$index = $previousDate->formatLocalized($format); $index = Navigation::periodShow($previousDate, $viewRange);
$previousStart = Navigation::startOfPeriod($previousDate, $viewRange); $previousStart = Navigation::startOfPeriod($previousDate, $viewRange);
$previousEnd = Navigation::endOfPeriod($previousStart, $viewRange); $previousEnd = Navigation::endOfPeriod($previousStart, $viewRange);
$ranges[$index] = [$previousStart, $previousEnd]; $ranges[$index] = [$previousStart, $previousEnd];
$nextDate = Navigation::addPeriod($start, $viewRange, 0); $nextDate = Navigation::addPeriod($start, $viewRange, 0);
$index = $nextDate->formatLocalized($format); $index = Navigation::periodShow($nextDate, $viewRange);
$nextStart = Navigation::startOfPeriod($nextDate, $viewRange); $nextStart = Navigation::startOfPeriod($nextDate, $viewRange);
$nextEnd = Navigation::endOfPeriod($nextStart, $viewRange); $nextEnd = Navigation::endOfPeriod($nextStart, $viewRange);
$ranges[$index] = [$nextStart, $nextEnd]; $ranges[$index] = [$nextStart, $nextEnd];
@@ -188,33 +185,4 @@ class JavascriptController extends Controller
return $return; return $return;
} }
private function getFormatByRange(string $viewRange): string
{
switch ($viewRange) {
default:
throw new FireflyException(sprintf('The date picker does not yet support "%s".', $viewRange)); // @codeCoverageIgnore
case '1D':
case 'custom':
$format = (string)trans('config.month_and_day');
break;
case '3M':
$format = (string)trans('config.quarter_in_year');
break;
case '6M':
$format = (string)trans('config.half_year');
break;
case '1Y':
$format = (string)trans('config.year');
break;
case '1M':
$format = (string)trans('config.month');
break;
case '1W':
$format = (string)trans('config.week_in_year');
break;
}
return $format;
}
} }

View File

@@ -0,0 +1,74 @@
<?php
/**
* FrontpageController.php
* Copyright (c) 2017 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\Http\Controllers\Json;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use Response;
/**
* Class FrontpageController
*
* @package FireflyIII\Http\Controllers\Json
*/
class FrontpageController extends Controller
{
/**
* @return \Illuminate\Http\JsonResponse
*/
public function piggyBanks(PiggyBankRepositoryInterface $repository)
{
$set = $repository->getPiggyBanks();
$info = [];
/** @var PiggyBank $piggyBank */
foreach ($set as $piggyBank) {
$rep = $piggyBank->currentRelevantRep();
$amount = strval($rep->currentamount);
if (!is_null($rep->id) && bccomp($amount, '0') === 1) {
// percentage!
$pct = round(($amount / $piggyBank->targetamount) * 100);
$entry = [
'id' => $piggyBank->id,
'name' => $piggyBank->name,
'amount' => $amount,
'target' => $piggyBank->targetamount,
'percentage' => $pct,
];
$info[] = $entry;
}
}
$html = '';
if (count($info) > 0) {
$html = view('json.piggy-banks', compact('info'))->render();
}
return Response::json(['html' => $html]);
}
}

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Http\Controllers;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Http\Requests\NewUserFormRequest; use FireflyIII\Http\Requests\NewUserFormRequest;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use Preferences; use Preferences;
use Session; use Session;
use View; use View;
@@ -81,7 +82,7 @@ class NewUserController extends Controller
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/ */
public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository) public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository)
{ {
// create normal asset account: // create normal asset account:
$this->createAssetAccount($request, $repository); $this->createAssetAccount($request, $repository);
@@ -89,6 +90,16 @@ class NewUserController extends Controller
// create savings account // create savings account
$this->createSavingsAccount($request, $repository); $this->createSavingsAccount($request, $repository);
// also store currency preference from input:
$currency = $currencyRepository->find(intval($request->input('amount_currency_id_bank_balance')));
if(!is_null($currency->id)) {
// store currency preference:
Preferences::set('currencyPreference', $currency->code);
Preferences::mark();
}
Session::flash('success', strval(trans('firefly.stored_new_accounts_new_user'))); Session::flash('success', strval(trans('firefly.stored_new_accounts_new_user')));
Preferences::mark(); Preferences::mark();
@@ -137,7 +148,7 @@ class NewUserController extends Controller
'accountRole' => 'savingAsset', 'accountRole' => 'savingAsset',
'openingBalance' => round($request->input('savings_balance'), 12), 'openingBalance' => round($request->input('savings_balance'), 12),
'openingBalanceDate' => new Carbon, 'openingBalanceDate' => new Carbon,
'currency_id' => intval($request->input('amount_currency_id_savings_balance')), 'currency_id' => intval($request->input('amount_currency_id_bank_balance')),
]; ];
$repository->store($savingsAccount); $repository->store($savingsAccount);

View File

@@ -285,7 +285,7 @@ class PiggyBankController extends Controller
*/ */
public function postAdd(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank) public function postAdd(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank)
{ {
$amount = $request->get('amount'); $amount = $request->get('amount') ?? '0';
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
if ($repository->canAddAmount($piggyBank, $amount)) { if ($repository->canAddAmount($piggyBank, $amount)) {
$repository->addAmount($piggyBank, $amount); $repository->addAmount($piggyBank, $amount);
@@ -324,7 +324,7 @@ class PiggyBankController extends Controller
*/ */
public function postRemove(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank) public function postRemove(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank)
{ {
$amount = $request->get('amount'); $amount = $request->get('amount') ?? '0';
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
if ($repository->canRemoveAmount($piggyBank, $amount)) { if ($repository->canRemoveAmount($piggyBank, $amount)) {
$repository->removeAmount($piggyBank, $amount); $repository->removeAmount($piggyBank, $amount);

View File

@@ -67,9 +67,9 @@ class PreferencesController extends Controller
public function code(Google2FA $google2fa) public function code(Google2FA $google2fa)
{ {
$domain = $this->getDomain(); $domain = $this->getDomain();
$secret = $google2fa->generateSecretKey(16); $secret = $google2fa->generateSecretKey();
Session::flash('two-factor-secret', $secret); Session::flash('two-factor-secret', $secret);
$image = $google2fa->getQRCodeInline('Firefly III at ' . $domain, auth()->user()->email, $secret, 150); $image = $google2fa->getQRCodeInline($domain, auth()->user()->email, $secret, 200);
return view('preferences.code', compact('image')); return view('preferences.code', compact('image'));

View File

@@ -261,6 +261,7 @@ class ReportController extends Controller
* @param ReportFormRequest $request * @param ReportFormRequest $request
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|\Illuminate\Routing\Redirector
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
public function postIndex(ReportFormRequest $request) public function postIndex(ReportFormRequest $request)
{ {
@@ -299,7 +300,7 @@ class ReportController extends Controller
return redirect(route('reports.index')); return redirect(route('reports.index'));
} }
if ($end < $start) { if ($request->getEndDate() < $request->getStartDate()) {
return view('error')->with('message', trans('firefly.end_after_start_date')); return view('error')->with('message', trans('firefly.end_after_start_date'));
} }

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\CacheProperties;
use FireflyIII\Support\Search\SearchInterface; use FireflyIII\Support\Search\SearchInterface;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Response; use Response;
@@ -75,11 +76,24 @@ class SearchController extends Controller
{ {
$fullQuery = strval($request->get('query')); $fullQuery = strval($request->get('query'));
// parse search terms: // cache
$searcher->parseQuery($fullQuery); $cache = new CacheProperties;
$searcher->setLimit(20); $cache->addProperty('search');
$transactions = $searcher->searchTransactions(); $cache->addProperty($fullQuery);
$html = view('search.search', compact('transactions'))->render();
if ($cache->has()) {
$transactions = $cache->get();
}
if (!$cache->has()) {
// parse search terms:
$searcher->parseQuery($fullQuery);
$searcher->setLimit(intval(env('SEARCH_RESULT_LIMIT', 50)));
$transactions = $searcher->searchTransactions();
$cache->store($transactions);
}
$html = view('search.search', compact('transactions'))->render();
return Response::json(['count' => $transactions->count(), 'html' => $html]); return Response::json(['count' => $transactions->count(), 'html' => $html]);

View File

@@ -355,6 +355,7 @@ class SingleController extends Controller
$this->attachments->saveAttachmentsForModel($journal, $files); $this->attachments->saveAttachmentsForModel($journal, $files);
// store the journal only, flash the rest. // store the journal only, flash the rest.
Log::debug(sprintf('Count of error messages is %d', $this->attachments->getErrors()->count()));
if (count($this->attachments->getErrors()->get('attachments')) > 0) { if (count($this->attachments->getErrors()->get('attachments')) > 0) {
Session::flash('error', $this->attachments->getErrors()->get('attachments')); Session::flash('error', $this->attachments->getErrors()->get('attachments'));
} }

View File

@@ -42,6 +42,7 @@ use FireflyIII\Http\Middleware\Range;
use FireflyIII\Http\Middleware\RedirectIfAuthenticated; use FireflyIII\Http\Middleware\RedirectIfAuthenticated;
use FireflyIII\Http\Middleware\RedirectIfTwoFactorAuthenticated; use FireflyIII\Http\Middleware\RedirectIfTwoFactorAuthenticated;
use FireflyIII\Http\Middleware\Sandstorm; use FireflyIII\Http\Middleware\Sandstorm;
use FireflyIII\Http\Middleware\StartFireflySession;
use FireflyIII\Http\Middleware\TrimStrings; use FireflyIII\Http\Middleware\TrimStrings;
use FireflyIII\Http\Middleware\TrustProxies; use FireflyIII\Http\Middleware\TrustProxies;
use FireflyIII\Http\Middleware\VerifyCsrfToken; use FireflyIII\Http\Middleware\VerifyCsrfToken;
@@ -54,7 +55,6 @@ use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\ValidatePostSize; use Illuminate\Foundation\Http\Middleware\ValidatePostSize;
use Illuminate\Routing\Middleware\SubstituteBindings; use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Routing\Middleware\ThrottleRequests;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession; use Illuminate\View\Middleware\ShareErrorsFromSession;
@@ -90,7 +90,7 @@ class Kernel extends HttpKernel
Sandstorm::class, Sandstorm::class,
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
StartSession::class, StartFireflySession::class,
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
VerifyCsrfToken::class, VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,
@@ -102,7 +102,7 @@ class Kernel extends HttpKernel
Sandstorm::class, Sandstorm::class,
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
StartSession::class, StartFireflySession::class,
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
VerifyCsrfToken::class, VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,
@@ -115,7 +115,7 @@ class Kernel extends HttpKernel
Sandstorm::class, Sandstorm::class,
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
StartSession::class, StartFireflySession::class,
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
VerifyCsrfToken::class, VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,
@@ -130,7 +130,7 @@ class Kernel extends HttpKernel
Sandstorm::class, Sandstorm::class,
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
StartSession::class, StartFireflySession::class,
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
VerifyCsrfToken::class, VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,
@@ -145,7 +145,7 @@ class Kernel extends HttpKernel
Sandstorm::class, Sandstorm::class,
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
StartSession::class, StartFireflySession::class,
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
VerifyCsrfToken::class, VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,
@@ -163,7 +163,7 @@ class Kernel extends HttpKernel
Sandstorm::class, Sandstorm::class,
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
StartSession::class, StartFireflySession::class,
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
VerifyCsrfToken::class, VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,

View File

@@ -49,6 +49,7 @@ class Sandstorm
* *
* @return mixed * @return mixed
* @throws FireflyException * @throws FireflyException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
public function handle(Request $request, Closure $next, $guard = null) public function handle(Request $request, Closure $next, $guard = null)
{ {

View File

@@ -0,0 +1,67 @@
<?php
/**
* StartFireflySession.php
* Copyright (c) 2017 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\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Session\Middleware\StartSession;
/**
* Class StartFireflySession
*
* @package FireflyIII\Http\Middleware
*/
class StartFireflySession extends StartSession
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param Closure $next
*
* @return mixed
*/
// public function handle($request, Closure $next)
// {
// return parent::handle($request, $next); // defer to the right stuff
// }
/**
* Store the current URL for the request if necessary.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Contracts\Session\Session $session
*
* @return void
*/
protected function storeCurrentUrl(Request $request, $session)
{
$uri = $request->fullUrl();
$strpos = strpos($uri, 'jscript');
if ($request->method() === 'GET' && $request->route() && !$request->ajax() && $strpos === false) {
$session->setPreviousUrl($uri);
}
}
}

View File

@@ -165,6 +165,7 @@ class ImportAccount
/** /**
* @return Account * @return Account
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
private function findExistingObject(): Account private function findExistingObject(): Account
{ {

View File

@@ -125,7 +125,7 @@ class AbnAmroDescription implements SpecificInterface
/** /**
* Parses the current description in SEPA format * Parses the current description in SEPA format
* * @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @return bool true if the description is SEPA format, false otherwise * @return bool true if the description is SEPA format, false otherwise
*/ */
protected function parseSepaDescription() protected function parseSepaDescription()

View File

@@ -0,0 +1,49 @@
<?php
/**
* SessionServiceProvider.php
* Copyright (c) 2017 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\Providers;
use FireflyIII\Http\Middleware\StartFireflySession;
use Illuminate\Session\SessionServiceProvider as BaseSessionServiceProvider;
/**
* Class SessionServiceProvider
*
* @package FireflyIII\Providers
*/
class SessionServiceProvider extends BaseSessionServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerSessionManager();
$this->registerSessionDriver();
$this->app->singleton(StartFireflySession::class);
}
}

View File

@@ -221,8 +221,7 @@ class AccountRepository implements AccountRepositoryInterface
*/ */
protected function openingBalanceTransaction(Account $account): TransactionJournal protected function openingBalanceTransaction(Account $account): TransactionJournal
{ {
$journal = TransactionJournal::sortCorrectly() $journal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->where('transactions.account_id', $account->id) ->where('transactions.account_id', $account->id)
->transactionTypes([TransactionType::OPENING_BALANCE]) ->transactionTypes([TransactionType::OPENING_BALANCE])
->first(['transaction_journals.*']); ->first(['transaction_journals.*']);
@@ -288,6 +287,8 @@ class AccountRepository implements AccountRepositoryInterface
} }
/** /**
* At this point strlen of amount > 0.
*
* @param Account $account * @param Account $account
* @param array $data * @param array $data
* *
@@ -296,6 +297,7 @@ class AccountRepository implements AccountRepositoryInterface
protected function storeInitialBalance(Account $account, array $data): TransactionJournal protected function storeInitialBalance(Account $account, array $data): TransactionJournal
{ {
$amount = strval($data['openingBalance']); $amount = strval($data['openingBalance']);
Log::debug(sprintf('Submitted amount is %s',$amount));
if (bccomp($amount, '0') === 0) { if (bccomp($amount, '0') === 0) {
return new TransactionJournal; return new TransactionJournal;
@@ -322,12 +324,15 @@ class AccountRepository implements AccountRepositoryInterface
$secondAccount = $opposing; $secondAccount = $opposing;
$firstAmount = $amount; $firstAmount = $amount;
$secondAmount = bcmul($amount, '-1'); $secondAmount = bcmul($amount, '-1');
Log::debug(sprintf('First amount is %s, second amount is %s', $firstAmount, $secondAmount));
if ($data['openingBalance'] < 0) { if (bccomp($amount,'0') === -1) {
Log::debug(sprintf('%s is a negative number.', $amount));
$firstAccount = $opposing; $firstAccount = $opposing;
$secondAccount = $account; $secondAccount = $account;
$firstAmount = bcmul($amount, '-1'); $firstAmount = bcmul($amount, '-1');
$secondAmount = $amount; $secondAmount = $amount;
Log::debug(sprintf('First amount is %s, second amount is %s', $firstAmount, $secondAmount));
} }
$one = new Transaction( $one = new Transaction(
@@ -374,6 +379,7 @@ class AccountRepository implements AccountRepositoryInterface
} }
/** /**
*
* @param Account $account * @param Account $account
* @param array $data * @param array $data
* *
@@ -381,6 +387,7 @@ class AccountRepository implements AccountRepositoryInterface
*/ */
protected function updateInitialBalance(Account $account, array $data): bool protected function updateInitialBalance(Account $account, array $data): bool
{ {
Log::debug(sprintf('updateInitialBalance() for account #%d', $account->id));
$openingBalance = $this->openingBalanceTransaction($account); $openingBalance = $this->openingBalanceTransaction($account);
// no opening balance journal? create it: // no opening balance journal? create it:
@@ -457,6 +464,8 @@ class AccountRepository implements AccountRepositoryInterface
$amount = strval($data['openingBalance']); $amount = strval($data['openingBalance']);
$currencyId = intval($data['currency_id']); $currencyId = intval($data['currency_id']);
Log::debug(sprintf('Submitted amount for opening balance to update is %s', $amount));
if (bccomp($amount, '0') === 0) { if (bccomp($amount, '0') === 0) {
$journal->delete(); $journal->delete();
@@ -471,12 +480,15 @@ class AccountRepository implements AccountRepositoryInterface
/** @var Transaction $transaction */ /** @var Transaction $transaction */
foreach ($journal->transactions()->get() as $transaction) { foreach ($journal->transactions()->get() as $transaction) {
if ($account->id === $transaction->account_id) { if ($account->id === $transaction->account_id) {
Log::debug(sprintf('Will change transaction #%d amount from %s to %s', $transaction->id, $transaction->amount, $amount));
$transaction->amount = $amount; $transaction->amount = $amount;
$transaction->transaction_currency_id = $currencyId; $transaction->transaction_currency_id = $currencyId;
$transaction->save(); $transaction->save();
} }
if ($account->id !== $transaction->account_id) { if ($account->id !== $transaction->account_id) {
$transaction->amount = bcmul($amount, '-1'); $negativeAmount = bcmul($amount, '-1');
Log::debug(sprintf('Will change transaction #%d amount from %s to %s', $transaction->id, $transaction->amount, $negativeAmount));
$transaction->amount = $negativeAmount;
$transaction->transaction_currency_id = $currencyId; $transaction->transaction_currency_id = $currencyId;
$transaction->save(); $transaction->save();
} }
@@ -495,7 +507,9 @@ class AccountRepository implements AccountRepositoryInterface
*/ */
protected function validOpeningBalanceData(array $data): bool protected function validOpeningBalanceData(array $data): bool
{ {
if (isset($data['openingBalance']) && isset($data['openingBalanceDate'])) { $data['openingBalance'] = strval($data['openingBalance'] ?? '');
if (isset($data['openingBalance']) && !is_null($data['openingBalance']) && strlen($data['openingBalance']) > 0 &&
isset($data['openingBalanceDate'])) {
Log::debug('Array has valid opening balance data.'); Log::debug('Array has valid opening balance data.');
return true; return true;

View File

@@ -111,7 +111,6 @@ class CurrencyRepository implements CurrencyRepositoryInterface
$currency = TransactionCurrency::find($currencyId); $currency = TransactionCurrency::find($currencyId);
if (is_null($currency)) { if (is_null($currency)) {
$currency = new TransactionCurrency; $currency = new TransactionCurrency;
} }
return $currency; return $currency;

View File

@@ -396,7 +396,7 @@ class RuleRepository implements RuleRepositoryInterface
$this->storeTrigger($rule, $triggerValues); $this->storeTrigger($rule, $triggerValues);
foreach ($data['rule-triggers'] as $index => $trigger) { foreach ($data['rule-triggers'] as $index => $trigger) {
$value = $data['rule-trigger-values'][$index]; $value = $data['rule-trigger-values'][$index] ?? '';
$stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false; $stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false;
$triggerValues = [ $triggerValues = [

View File

@@ -394,6 +394,21 @@ abstract class BunqRequest
return false; return false;
} }
/**
* @param array $headers
*
* @return string
*/
private function joinHeaders(array $headers): string
{
$string = '';
foreach ($headers as $header => $value) {
$string .= $header . ': ' . trim($value) . "\n";
}
return $string;
}
/** /**
* @param array $response * @param array $response
* *
@@ -447,10 +462,7 @@ abstract class BunqRequest
ksort($verifyHeaders); ksort($verifyHeaders);
// add them to data to sign: // add them to data to sign:
foreach ($verifyHeaders as $header => $value) { $dataToVerify .= $this->joinHeaders($verifyHeaders);
$dataToVerify .= $header . ': ' . trim($value) . "\n";
}
$signature = $headers['x-bunq-server-signature'][0]; $signature = $headers['x-bunq-server-signature'][0];
$dataToVerify .= "\n" . $body; $dataToVerify .= "\n" . $body;
$result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256); $result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256);
@@ -462,6 +474,8 @@ abstract class BunqRequest
} }
if (!is_int($result)) { if (!is_int($result)) {
Log::error(sprintf('Result of verification is a boolean (%d), return false.', $result)); Log::error(sprintf('Result of verification is a boolean (%d), return false.', $result));
return false;
} }
Log::info('Signature is a match, return true.'); Log::info('Signature is a match, return true.');

View File

@@ -190,7 +190,7 @@ class Amount
} }
$cache->store(config('firefly.default_currency', 'EUR')); $cache->store(config('firefly.default_currency', 'EUR'));
return config('firefly.default_currency', 'EUR'); return strval(config('firefly.default_currency', 'EUR'));
} }
} }

View File

@@ -300,7 +300,6 @@ class ExpandedForm
return $html; return $html;
} }
/** /**
* @param string $name * @param string $name
* @param null $value * @param null $value
@@ -331,6 +330,27 @@ class ExpandedForm
return $html; return $html;
} }
/**
* @param string $name
* @param null $value
* @param array $options
*
* @return string
*/
public function number(string $name, $value = null, array $options = []): string
{
$label = $this->label($name, $options);
$options = $this->expandOptionArray($name, $label, $options);
$classes = $this->getHolderClasses($name);
$value = $this->fillFieldValue($name, $value);
$options['step'] = 'any';
unset($options['placeholder']);
$html = view('form.number', compact( 'classes', 'name', 'label', 'value', 'options'))->render();
return $html;
}
/** /**
* @param $type * @param $type
* @param $name * @param $name

View File

@@ -233,7 +233,7 @@ class Navigation
*/ */
public function periodShow(Carbon $theDate, string $repeatFrequency): string public function periodShow(Carbon $theDate, string $repeatFrequency): string
{ {
$date = clone $theDate; $date = clone $theDate;
$formatMap = [ $formatMap = [
'1D' => trans('config.specific_day'), '1D' => trans('config.specific_day'),
'daily' => trans('config.specific_day'), 'daily' => trans('config.specific_day'),
@@ -241,8 +241,8 @@ class Navigation
'1W' => trans('config.week_in_year'), '1W' => trans('config.week_in_year'),
'week' => trans('config.week_in_year'), 'week' => trans('config.week_in_year'),
'weekly' => trans('config.week_in_year'), 'weekly' => trans('config.week_in_year'),
'3M' => trans('config.quarter_of_year'), //'3M' => trans('config.quarter_of_year'),
'quarter' => trans('config.quarter_of_year'), //'quarter' => trans('config.quarter_of_year'),
'1M' => trans('config.month'), '1M' => trans('config.month'),
'month' => trans('config.month'), 'month' => trans('config.month'),
'monthly' => trans('config.month'), 'monthly' => trans('config.month'),
@@ -253,10 +253,16 @@ class Navigation
]; ];
if (isset($formatMap[$repeatFrequency])) { if (isset($formatMap[$repeatFrequency])) {
return $date->formatLocalized(strval($formatMap[$repeatFrequency])); return $date->formatLocalized(strval($formatMap[$repeatFrequency]));
} }
if ($repeatFrequency === '3M' || $repeatFrequency === 'quarter') {
$quarter = ceil($theDate->month / 3);
return sprintf('Q%d %d', $quarter, $theDate->year);
}
// special formatter for quarter of year
throw new FireflyException(sprintf('No date formats for frequency "%s"!', $repeatFrequency)); throw new FireflyException(sprintf('No date formats for frequency "%s"!', $repeatFrequency));
} }

View File

@@ -176,7 +176,7 @@ class Preferences
/** /**
* @param $name * @param $name
* @param string $value * @param $value
* *
* @return Preference * @return Preference
*/ */

View File

@@ -28,6 +28,7 @@ use Carbon\Carbon;
use Exception; use Exception;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use Illuminate\Support\Str;
use Log; use Log;
use Steam; use Steam;
@@ -51,65 +52,41 @@ class Modifier
return $compare === $expected; return $compare === $expected;
} }
/**
* @param array $modifier
* @param Transaction $transaction
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*
* @return bool
* @throws FireflyException
*/
public static function apply(array $modifier, Transaction $transaction): bool public static function apply(array $modifier, Transaction $transaction): bool
{ {
$res = true;
switch ($modifier['type']) { switch ($modifier['type']) {
default:
throw new FireflyException(sprintf('Search modifier "%s" is not (yet) supported. Sorry!', $modifier['type']));
case 'amount':
case 'amount_is':
$res = self::amountCompare($transaction, $modifier['value'], 0);
Log::debug(sprintf('Amount is %s? %s', $modifier['value'], var_export($res, true)));
break;
case 'amount_min':
case 'amount_less':
$res = self::amountCompare($transaction, $modifier['value'], 1);
Log::debug(sprintf('Amount less than %s? %s', $modifier['value'], var_export($res, true)));
break;
case 'amount_max':
case 'amount_more':
$res = self::amountCompare($transaction, $modifier['value'], -1);
Log::debug(sprintf('Amount more than %s? %s', $modifier['value'], var_export($res, true)));
break;
case 'source': case 'source':
$res = self::stringCompare($transaction->account_name, $modifier['value']); $name = Steam::tryDecrypt($transaction->account_name);
$res = self::stringCompare($name, $modifier['value']);
Log::debug(sprintf('Source is %s? %s', $modifier['value'], var_export($res, true))); Log::debug(sprintf('Source is %s? %s', $modifier['value'], var_export($res, true)));
break; break;
case 'destination': case 'destination':
$res = self::stringCompare($transaction->opposing_account_name, $modifier['value']); $name = Steam::tryDecrypt($transaction->opposing_account_name);
$res = self::stringCompare($name, $modifier['value']);
Log::debug(sprintf('Destination is %s? %s', $modifier['value'], var_export($res, true))); Log::debug(sprintf('Destination is %s? %s', $modifier['value'], var_export($res, true)));
break; break;
case 'category': case 'category':
$res = self::category($transaction, $modifier['value']); $res = self::category($transaction, $modifier['value']);
Log::debug(sprintf('Category is %s? %s', $modifier['value'], var_export($res, true))); Log::debug(sprintf('Category is %s? %s', $modifier['value'], var_export($res, true)));
break; break;
case 'budget': case 'budget':
$res = self::budget($transaction, $modifier['value']); $res = self::budget($transaction, $modifier['value']);
Log::debug(sprintf('Budget is %s? %s', $modifier['value'], var_export($res, true))); Log::debug(sprintf('Budget is %s? %s', $modifier['value'], var_export($res, true)));
break; break;
case 'bill': case 'bill':
$res = self::stringCompare(strval($transaction->bill_name), $modifier['value']); $name = Steam::tryDecrypt($transaction->bill_name);
$res = self::stringCompare($name, $modifier['value']);
Log::debug(sprintf('Bill is %s? %s', $modifier['value'], var_export($res, true))); Log::debug(sprintf('Bill is %s? %s', $modifier['value'], var_export($res, true)));
break; break;
case 'type':
$res = self::stringCompare($transaction->transaction_type_type, $modifier['value']);
Log::debug(sprintf('Transaction type is %s? %s', $modifier['value'], var_export($res, true)));
break;
case 'date':
case 'on':
$res = self::sameDate($transaction->date, $modifier['value']);
Log::debug(sprintf('Date same as %s? %s', $modifier['value'], var_export($res, true)));
break;
case 'date_before':
case 'before':
$res = self::dateBefore($transaction->date, $modifier['value']);
Log::debug(sprintf('Date before %s? %s', $modifier['value'], var_export($res, true)));
break;
case 'date_after':
case 'after':
$res = self::dateAfter($transaction->date, $modifier['value']);
Log::debug(sprintf('Date before %s? %s', $modifier['value'], var_export($res, true)));
break;
} }
return $res; return $res;

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Support\Search; namespace FireflyIII\Support\Search;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Helpers\Filter\InternalTransferFilter;
@@ -121,6 +122,10 @@ class Search implements SearchInterface
if ($this->hasModifiers()) { if ($this->hasModifiers()) {
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
} }
// some modifiers can be applied to the collector directly.
$collector = $this->applyModifiers($collector);
$collector->removeFilter(InternalTransferFilter::class); $collector->removeFilter(InternalTransferFilter::class);
$set = $collector->getPaginatedJournals()->getCollection(); $set = $collector->getPaginatedJournals()->getCollection();
@@ -186,6 +191,57 @@ class Search implements SearchInterface
$this->user = $user; $this->user = $user;
} }
private function applyModifiers(JournalCollectorInterface $collector): JournalCollectorInterface
{
foreach ($this->modifiers as $modifier) {
switch ($modifier['type']) {
case 'amount_is':
case 'amount':
$amount = app('steam')->positive(strval($modifier['value']));
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $amount));
$collector->amountIs($amount);
break;
case 'amount_max':
case 'amount_less':
$amount = app('steam')->positive(strval($modifier['value']));
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $amount));
$collector->amountLess($amount);
break;
case 'amount_min':
case 'amount_more':
$amount = app('steam')->positive(strval($modifier['value']));
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $amount));
$collector->amountMore($amount);
break;
case 'type':
$collector->setTypes([ucfirst($modifier['value'])]);
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
break;
case 'date':
case 'on':
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
$start = new Carbon($modifier['value']);
$collector->setRange($start, $start);
break;
case 'date_before':
case 'before':
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
$before = new Carbon($modifier['value']);
$collector->setBefore($before);
break;
case 'date_after':
case 'after':
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
$after = new Carbon($modifier['value']);
$collector->setBefore($after);
break;
}
}
return $collector;
}
/** /**
* @param string $string * @param string $string
*/ */

View File

@@ -248,7 +248,7 @@ class Journal extends Twig_Extension
$txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer')); $txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer'));
break; break;
case $journal->isOpeningBalance(): case $journal->isOpeningBalance():
$txt = sprintf('<i class="fa-fw fa fa-ban" title="%s"></i>', trans('firefly.openingBalance')); $txt = sprintf('<i class="fa-fw fa fa-star-o" title="%s"></i>', trans('firefly.openingBalance'));
break; break;
default: default:
$txt = ''; $txt = '';

View File

@@ -24,8 +24,11 @@ declare(strict_types=1);
namespace FireflyIII\Support\Twig; namespace FireflyIII\Support\Twig;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\Transaction as TransactionModel; use FireflyIII\Models\Transaction as TransactionModel;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Support\CacheProperties;
use Lang;
use Steam; use Steam;
use Twig_Extension; use Twig_Extension;
use Twig_SimpleFilter; use Twig_SimpleFilter;
@@ -38,6 +41,41 @@ use Twig_SimpleFunction;
*/ */
class Transaction extends Twig_Extension class Transaction extends Twig_Extension
{ {
/**
* @return Twig_SimpleFunction
*/
public function attachmentIndicator(): Twig_SimpleFunction
{
return new Twig_SimpleFunction(
'attachmentIndicator', function (int $journalId) {
$cache = new CacheProperties;
$cache->addProperty('attachments_journal');
$cache->addProperty($journalId);
if ($cache->has()) {
return $cache->get();
}
$count = Attachment::whereNull('deleted_at')
->where('attachable_type', 'FireflyIII\Models\TransactionJournal')
->where('attachable_id', $journalId)
->count();
if ($count > 0) {
$res = sprintf('<i class="fa fa-paperclip" title="%s"></i>', Lang::choice('firefly.nr_of_attachments', $count, ['count' => $count]));
$cache->store($res);
return $res;
}
$res = '';
$cache->store($res);
return $res;
}, ['is_safe' => ['html']]
);
}
/** /**
* @return array * @return array
*/ */
@@ -63,6 +101,7 @@ class Transaction extends Twig_Extension
$this->transactionCategories(), $this->transactionCategories(),
$this->transactionIdCategories(), $this->transactionIdCategories(),
$this->splitJournalIndicator(), $this->splitJournalIndicator(),
$this->attachmentIndicator(),
]; ];
return $functions; return $functions;
@@ -85,12 +124,25 @@ class Transaction extends Twig_Extension
{ {
return new Twig_SimpleFunction( return new Twig_SimpleFunction(
'splitJournalIndicator', function (int $journalId) { 'splitJournalIndicator', function (int $journalId) {
$cache = new CacheProperties;
$cache->addProperty('is_split_journal');
$cache->addProperty($journalId);
if ($cache->has()) {
return $cache->get();
}
$count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count(); $count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count();
if ($count > 2) { if ($count > 2) {
return '<i class="fa fa-fw fa-share-alt" aria-hidden="true"></i>'; $res = '<i class="fa fa-fw fa-share-alt" aria-hidden="true"></i>';
$cache->store($res);
return $res;
} }
return ''; $res = '';
$cache->store($res);
return $res;
}, ['is_safe' => ['html']] }, ['is_safe' => ['html']]
@@ -261,7 +313,7 @@ class Transaction extends Twig_Extension
$txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer')); $txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer'));
break; break;
case TransactionType::OPENING_BALANCE: case TransactionType::OPENING_BALANCE:
$txt = sprintf('<i class="fa-fw fa fa-ban" title="%s"></i>', trans('firefly.openingBalance')); $txt = sprintf('<i class="fa-fw fa fa-star-o" title="%s"></i>', trans('firefly.openingBalance'));
break; break;
default: default:
$txt = ''; $txt = '';

22
composer.lock generated
View File

@@ -788,16 +788,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v5.5.18", "version": "v5.5.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "1cc21baac11551377734b8c17ead17db4c34fe21" "reference": "c678100e84934ec85c9f8bc26bd0a60222682719"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/1cc21baac11551377734b8c17ead17db4c34fe21", "url": "https://api.github.com/repos/laravel/framework/zipball/c678100e84934ec85c9f8bc26bd0a60222682719",
"reference": "1cc21baac11551377734b8c17ead17db4c34fe21", "reference": "c678100e84934ec85c9f8bc26bd0a60222682719",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -915,7 +915,7 @@
"framework", "framework",
"laravel" "laravel"
], ],
"time": "2017-10-19T12:50:26+00:00" "time": "2017-10-25T19:10:45+00:00"
}, },
{ {
"name": "laravelcollective/html", "name": "laravelcollective/html",
@@ -984,16 +984,16 @@
}, },
{ {
"name": "league/commonmark", "name": "league/commonmark",
"version": "0.15.6", "version": "0.15.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/commonmark.git", "url": "https://github.com/thephpleague/commonmark.git",
"reference": "91742543c25fecedc84a4883d2919213e04a73b7" "reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91742543c25fecedc84a4883d2919213e04a73b7", "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/36d82f166e441dfa28643f8d01dd8bdd3a579adf",
"reference": "91742543c25fecedc84a4883d2919213e04a73b7", "reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1049,7 +1049,7 @@
"markdown", "markdown",
"parser" "parser"
], ],
"time": "2017-08-08T11:47:33+00:00" "time": "2017-10-26T15:41:07+00:00"
}, },
{ {
"name": "league/csv", "name": "league/csv",
@@ -1271,7 +1271,7 @@
}, },
{ {
"name": "mtdowling/cron-expression", "name": "mtdowling/cron-expression",
"version": "v1.2.0", "version": "v1.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/mtdowling/cron-expression.git", "url": "https://github.com/mtdowling/cron-expression.git",

View File

@@ -57,7 +57,7 @@ return [
Illuminate\Queue\QueueServiceProvider::class, Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class, FireflyIII\Providers\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class, Illuminate\View\ViewServiceProvider::class,

View File

@@ -33,7 +33,7 @@ return [
'is_demo_site' => false, 'is_demo_site' => false,
], ],
'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true), 'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true),
'version' => '4.6.9', 'version' => '4.6.10',
'maxUploadSize' => 15242880, 'maxUploadSize' => 15242880,
'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'], 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'],
'list_length' => 10, 'list_length' => 10,
@@ -126,15 +126,15 @@ return [
], ],
'languages' => [ 'languages' => [
'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German', 'complete' => true], 'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German', 'complete' => true],
'es_ES' => ['name_locale' => 'Spanish', 'name_english' => 'Spanish', 'complete' => false],
'en_US' => ['name_locale' => 'English', 'name_english' => 'English', 'complete' => true], 'en_US' => ['name_locale' => 'English', 'name_english' => 'English', 'complete' => true],
'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French', 'complete' => true], 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French', 'complete' => true],
'id_ID' => ['name_locale' => 'Indonesian', 'name_english' => 'Indonesian', 'complete' => false], 'id_ID' => ['name_locale' => 'Indonesian', 'name_english' => 'Indonesian', 'complete' => false],
'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch', 'complete' => true], 'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch', 'complete' => true],
'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish ', 'complete' => false], 'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish ', 'complete' => true],
'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)', 'complete' => true], 'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)', 'complete' => true],
'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian', 'complete' => false], 'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian', 'complete' => false],
'sl_SI' => ['name_locale' => 'Slovenščina', 'name_english' => 'Slovenian', 'complete' => false], 'sl_SI' => ['name_locale' => 'Slovenščina', 'name_english' => 'Slovenian', 'complete' => false],
'zh-TW' => ['name_locale' => '正體中文', 'name_english' => 'Chinese Traditional', 'complete' => false],
], ],
'transactionTypesByWhat' => [ 'transactionTypesByWhat' => [
'expenses' => ['Withdrawal'], 'expenses' => ['Withdrawal'],

View File

@@ -176,6 +176,7 @@ return [
'is_safe' => [ 'is_safe' => [
'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location', 'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location',
'multiRadio', 'file', 'multiCheckbox', 'staticText', 'amountSmall', 'password', 'nonSelectableBalance', 'nonSelectableAmount', 'multiRadio', 'file', 'multiCheckbox', 'staticText', 'amountSmall', 'password', 'nonSelectableBalance', 'nonSelectableAmount',
'number'
], ],
], ],
'Form' => [ 'Form' => [

View File

@@ -0,0 +1,33 @@
version: '2'
services:
firefly-db:
image: 'mysql:8'
environment:
- MYSQL_DATABASE=firefly_db
- MYSQL_USER=firefly_db
- MYSQL_PASSWORD=firefly_db_secret
- MYSQL_RANDOM_ROOT_PASSWORD=yes
volumes:
- firefly-storage:/var/lib/mysql
firefly-app:
image: 'jc5x/firefly-iii'
environment:
- FF_DB_HOST=firefly-db
- FF_DB_NAME=firefly_db
- FF_DB_USER=firefly_db
- FF_DB_PASSWORD=firefly_db_secret
- FF_APP_KEY=SomeRandomStringOf32CharsExactly
- FF_APP_ENV=local
ports:
- "9001:80"
links:
- firefly-db
volumes:
- firefly-app-storage:/var/www/firefly-iii/storage
volumes:
firefly-storage:
driver: local
firefly-app-storage:
driver: local

412
public/css/google-fonts.css vendored Normal file
View File

@@ -0,0 +1,412 @@
/*
* google-fonts.css
* Copyright (c) 2017 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/>.
*/
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 300;
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 400;
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: italic;
font-weight: 600;
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic.woff2') format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek.woff2') format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin-ext.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -26,7 +26,7 @@ $(function () {
configAccounting(currencySymbol); configAccounting(currencySymbol);
// on submit of form, disable any button in form: // on submit of form, disable any button in form:
$('form.form-horizontal').on('submit', function () { $('form.form-horizontal:not(.nodisablebutton)').on('submit', function () {
$('button[type="submit"]').prop('disabled', true); $('button[type="submit"]').prop('disabled', true);
}); });
@@ -65,7 +65,8 @@ $(function () {
$.post(dateRangeMeta.uri, { $.post(dateRangeMeta.uri, {
start: start.format('YYYY-MM-DD'), start: start.format('YYYY-MM-DD'),
end: end.format('YYYY-MM-DD'), end: end.format('YYYY-MM-DD'),
label: label label: label,
_token: token
}).done(function () { }).done(function () {
window.location.reload(true); window.location.reload(true);
}).fail(function () { }).fail(function () {

43
public/js/ff/index.js vendored
View File

@@ -43,13 +43,25 @@ function drawChart() {
getBillsBox(); getBillsBox();
getAvailableBox(); getAvailableBox();
getNetWorthBox(); getNetWorthBox();
getPiggyBanks();
//getBoxAmounts(); //getBoxAmounts();
} }
/**
*
*/
function getPiggyBanks() {
$.getJSON(piggyInfoUri).done(function (data) {
if (data.html.length > 0) {
$('#piggy_bank_overview').html(data.html);
}
});
}
function getNetWorthBox() { function getNetWorthBox() {
// box-net-worth // box-net-worth
$.getJSON('json/box/net-worth').done(function(data) { $.getJSON('json/box/net-worth').done(function (data) {
$('#box-net-worth').html(data.net_worth); $('#box-net-worth').html(data.net_worth);
}); });
} }
@@ -60,7 +72,7 @@ function getNetWorthBox() {
function getAvailableBox() { function getAvailableBox() {
// box-left-to-spend // box-left-to-spend
// box-left-per-day // box-left-per-day
$.getJSON('json/box/available').done(function(data) { $.getJSON('json/box/available').done(function (data) {
$('#box-left-to-spend').html(data.left); $('#box-left-to-spend').html(data.left);
$('#box-left-per-day').html(data.perDay); $('#box-left-per-day').html(data.perDay);
}); });
@@ -72,7 +84,7 @@ function getAvailableBox() {
function getBillsBox() { function getBillsBox() {
// box-bills-unpaid // box-bills-unpaid
// box-bills-paid // box-bills-paid
$.getJSON('json/box/bills').done(function(data) { $.getJSON('json/box/bills').done(function (data) {
$('#box-bills-paid').html(data.paid); $('#box-bills-paid').html(data.paid);
$('#box-bills-unpaid').html(data.unpaid); $('#box-bills-unpaid').html(data.unpaid);
}); });
@@ -85,32 +97,9 @@ function getBalanceBox() {
// box-balance-total // box-balance-total
// box-balance-out // box-balance-out
// box-balance-in // box-balance-in
$.getJSON('json/box/balance').done(function(data) { $.getJSON('json/box/balance').done(function (data) {
$('#box-balance-total').html(data.combined); $('#box-balance-total').html(data.combined);
$('#box-balance-in').html(data.income); $('#box-balance-in').html(data.income);
$('#box-balance-out').html(data.expense); $('#box-balance-out').html(data.expense);
}); });
}
function getBoxAmounts() {
"use strict";
var boxes = ['in', 'out', 'bills-unpaid', 'bills-paid'];
for (var x in boxes) {
if (!boxes.hasOwnProperty(x)) {
continue;
}
var box = boxes[x];
$.getJSON('json/box/' + box).done(putData).fail(failData);
}
}
function putData(data) {
"use strict";
$('#box-' + data.box).html(data.amount);
}
function failData() {
"use strict";
} }

View File

@@ -42,5 +42,5 @@ function setupIntro(steps) {
} }
function reportIntroFinished() { function reportIntroFinished() {
$.getJSON(routeForFinishedTour); $.post(routeForFinishedTour, {_token:token});
} }

View File

@@ -29,7 +29,6 @@ $(function () {
}); });
function startSearch(query) { function startSearch(query) {
$.post(searchUri, {query: query}).done(presentSearchResults).fail(searchFailure); $.post(searchUri, {query: query}).done(presentSearchResults).fail(searchFailure);
} }
@@ -44,4 +43,8 @@ function presentSearchResults(data) {
$('span.search_count').text(data.count); $('span.search_count').text(data.count);
$('.search_box').find('.overlay').remove(); $('.search_box').find('.overlay').remove();
$('.search_results').html(data.html).show(); $('.search_results').html(data.html).show();
$('.select_all_single').unbind('change').change(function () {
countChecked();
});
} }

View File

@@ -36,7 +36,7 @@ $(document).ready(function () {
countChecked(); countChecked();
} }
}); });
$('.select_all_single').change(function () { $('.select_all_single').unbind('change').change(function () {
countChecked(); countChecked();
}); });
@@ -147,7 +147,6 @@ function stopMassSelect() {
function startMassSelect() { function startMassSelect() {
"use strict"; "use strict";
// show "select all" box in table header. // show "select all" box in table header.
$('.select_boxes').show(); $('.select_boxes').show();

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