From 3ed65617027b8e76cb8bbe58b59821f6816fc95d Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 13 Nov 2015 07:16:23 +0100 Subject: [PATCH 001/135] Updated all packages. --- composer.lock | 497 +++++++++++++++++++++++++++----------------------- 1 file changed, 268 insertions(+), 229 deletions(-) diff --git a/composer.lock b/composer.lock index 671e496e1d..91e97ac052 100644 --- a/composer.lock +++ b/composer.lock @@ -4,33 +4,34 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "c33eed9ad14c084a1e6d3448a29c9c4b", + "hash": "79e0f94d7571803d13e30aa48111b1ab", + "content-hash": "968497c3098b5a38109e66c170c8becd", "packages": [ { "name": "classpreloader/classpreloader", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/ClassPreloader/ClassPreloader.git", - "reference": "8c3c14b10309e3b40bce833913a6c0c0b8c8f962" + "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/8c3c14b10309e3b40bce833913a6c0c0b8c8f962", - "reference": "8c3c14b10309e3b40bce833913a6c0c0b8c8f962", + "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", + "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", "shasum": "" }, "require": { - "nikic/php-parser": "~1.3", + "nikic/php-parser": "^1.0|^2.0", "php": ">=5.5.9" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "^4.8|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -58,7 +59,7 @@ "class", "preload" ], - "time": "2015-06-28 21:39:13" + "time": "2015-11-09 22:51:51" }, { "name": "danielstjules/stringy", @@ -200,16 +201,16 @@ }, { "name": "doctrine/annotations", - "version": "v1.2.6", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "f4a91702ca3cd2e568c3736aa031ed00c3752af4" + "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/f4a91702ca3cd2e568c3736aa031ed00c3752af4", - "reference": "f4a91702ca3cd2e568c3736aa031ed00c3752af4", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", "shasum": "" }, "require": { @@ -264,20 +265,20 @@ "docblock", "parser" ], - "time": "2015-06-17 12:21:22" + "time": "2015-08-31 12:32:49" }, { "name": "doctrine/cache", - "version": "v1.4.1", + "version": "v1.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03" + "reference": "2b9cec5a5e722010cbebc91713d4c11eaa064d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/c9eadeb743ac6199f7eec423cb9426bc518b7b03", - "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03", + "url": "https://api.github.com/repos/doctrine/cache/zipball/2b9cec5a5e722010cbebc91713d4c11eaa064d5e", + "reference": "2b9cec5a5e722010cbebc91713d4c11eaa064d5e", "shasum": "" }, "require": { @@ -298,8 +299,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Cache\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" } }, "notification-url": "https://packagist.org/downloads/", @@ -334,7 +335,7 @@ "cache", "caching" ], - "time": "2015-04-15 00:11:59" + "time": "2015-11-02 18:35:48" }, { "name": "doctrine/collections", @@ -404,16 +405,16 @@ }, { "name": "doctrine/common", - "version": "v2.5.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3" + "reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/cd8daf2501e10c63dced7b8b9b905844316ae9d3", - "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3", + "url": "https://api.github.com/repos/doctrine/common/zipball/0009b8f0d4a917aabc971fb089eba80e872f83f9", + "reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9", "shasum": "" }, "require": { @@ -473,20 +474,20 @@ "persistence", "spl" ], - "time": "2015-04-02 19:55:44" + "time": "2015-08-31 13:00:22" }, { "name": "doctrine/dbal", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "628c2256b646ae2417d44e063bce8aec5199d48d" + "reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/628c2256b646ae2417d44e063bce8aec5199d48d", - "reference": "628c2256b646ae2417d44e063bce8aec5199d48d", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/01dbcbc5cd0a913d751418e635434a18a2f2a75c", + "reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c", "shasum": "" }, "require": { @@ -544,20 +545,20 @@ "persistence", "queryobject" ], - "time": "2015-01-12 21:52:47" + "time": "2015-09-16 16:29:33" }, { "name": "doctrine/inflector", - "version": "v1.0.1", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604" + "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604", - "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", + "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", "shasum": "" }, "require": { @@ -569,7 +570,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -611,7 +612,7 @@ "singularize", "string" ], - "time": "2014-12-20 21:24:13" + "time": "2015-11-06 14:35:42" }, { "name": "doctrine/lexer", @@ -896,20 +897,20 @@ }, { "name": "laravel/framework", - "version": "v5.1.10", + "version": "v5.1.24", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "d47ccc8de10ccb6f328cc90f901ca5e47e077c93" + "reference": "875baf2d1645ce23e2ec0bf94fa7bb3e7fbfd6ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/d47ccc8de10ccb6f328cc90f901ca5e47e077c93", - "reference": "d47ccc8de10ccb6f328cc90f901ca5e47e077c93", + "url": "https://api.github.com/repos/laravel/framework/zipball/875baf2d1645ce23e2ec0bf94fa7bb3e7fbfd6ed", + "reference": "875baf2d1645ce23e2ec0bf94fa7bb3e7fbfd6ed", "shasum": "" }, "require": { - "classpreloader/classpreloader": "~2.0", + "classpreloader/classpreloader": "~2.0|~3.0", "danielstjules/stringy": "~1.8", "doctrine/inflector": "~1.0", "ext-mbstring": "*", @@ -919,8 +920,9 @@ "monolog/monolog": "~1.11", "mtdowling/cron-expression": "~1.0", "nesbot/carbon": "~1.19", + "paragonie/random_compat": "~1.1", "php": ">=5.5.9", - "psy/psysh": "~0.5.1", + "psy/psysh": "0.6.*", "swiftmailer/swiftmailer": "~5.1", "symfony/console": "2.7.*", "symfony/css-selector": "2.7.*", @@ -1020,39 +1022,46 @@ "framework", "laravel" ], - "time": "2015-08-12 18:16:08" + "time": "2015-11-11 22:45:42" }, { "name": "league/commonmark", - "version": "0.7.2", + "version": "0.12.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "7fecb7bdef265e45c80c53e1000e2056a9463401" + "reference": "3eb64850ee688623db494398a5284a7a4cdf7b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/7fecb7bdef265e45c80c53e1000e2056a9463401", - "reference": "7fecb7bdef265e45c80c53e1000e2056a9463401", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3eb64850ee688623db494398a5284a7a4cdf7b47", + "reference": "3eb64850ee688623db494398a5284a7a4cdf7b47", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=5.3.3" + "php": ">=5.4.8" }, "replace": { "colinodell/commonmark-php": "*" }, "require-dev": { "erusev/parsedown": "~1.0", - "jgm/commonmark": "0.18", + "jgm/commonmark": "0.22", + "jgm/smartpunct": "0.22", "michelf/php-markdown": "~1.4", - "phpunit/phpunit": "~4.3" + "mikehaertl/php-shellcommand": "~1.1.0", + "phpunit/phpunit": "~4.3|~5.0", + "scrutinizer/ocular": "^1.1", + "symfony/finder": "~2.3" }, + "bin": [ + "bin/commonmark" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "0.8-dev" + "dev-master": "0.13-dev" } }, "autoload": { @@ -1079,20 +1088,20 @@ "markdown", "parser" ], - "time": "2015-03-08 17:48:53" + "time": "2015-11-04 14:24:41" }, { "name": "league/csv", - "version": "7.1.2", + "version": "7.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "2ee1760c262c41986f6371775907fc9e8603fd26" + "reference": "69bafa6ff924fbf9effe4275d6eb16be81a853ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/2ee1760c262c41986f6371775907fc9e8603fd26", - "reference": "2ee1760c262c41986f6371775907fc9e8603fd26", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/69bafa6ff924fbf9effe4275d6eb16be81a853ef", + "reference": "69bafa6ff924fbf9effe4275d6eb16be81a853ef", "shasum": "" }, "require": { @@ -1100,13 +1109,13 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "scrutinizer/ocular": "~1.1" + "fabpot/php-cs-fixer": "^1.9", + "phpunit/phpunit": "^4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.1-dev" + "dev-master": "7.2-dev" } }, "autoload": { @@ -1136,25 +1145,28 @@ "read", "write" ], - "time": "2015-06-10 11:12:37" + "time": "2015-11-02 07:36:25" }, { "name": "league/flysystem", - "version": "1.0.11", + "version": "1.0.15", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "c16222fdc02467eaa12cb6d6d0e65527741f6040" + "reference": "31525caf9e8772683672fefd8a1ca0c0736020f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c16222fdc02467eaa12cb6d6d0e65527741f6040", - "reference": "c16222fdc02467eaa12cb6d6d0e65527741f6040", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/31525caf9e8772683672fefd8a1ca0c0736020f4", + "reference": "31525caf9e8772683672fefd8a1ca0c0736020f4", "shasum": "" }, "require": { "php": ">=5.4.0" }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, "require-dev": { "ext-fileinfo": "*", "mockery/mockery": "~0.9", @@ -1217,20 +1229,20 @@ "sftp", "storage" ], - "time": "2015-07-28 20:41:58" + "time": "2015-09-30 22:26:59" }, { "name": "monolog/monolog", - "version": "1.16.0", + "version": "1.17.2", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7" + "reference": "bee7f0dc9c3e0b69a6039697533dca1e845c8c24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c0c0b4bee3aabce7182876b0d912ef2595563db7", - "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bee7f0dc9c3e0b69a6039697533dca1e845c8c24", + "reference": "bee7f0dc9c3e0b69a6039697533dca1e845c8c24", "shasum": "" }, "require": { @@ -1244,10 +1256,11 @@ "aws/aws-sdk-php": "^2.4.9", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", "php-console/php-console": "^3.1.3", "phpunit/phpunit": "~4.5", "phpunit/phpunit-mock-objects": "2.3.0", - "raven/raven": "~0.8", + "raven/raven": "^0.13", "ruflin/elastica": ">=0.90 <3.0", "swiftmailer/swiftmailer": "~5.3", "videlalvaro/php-amqplib": "~2.4" @@ -1293,7 +1306,7 @@ "logging", "psr-3" ], - "time": "2015-08-09 17:44:44" + "time": "2015-10-14 12:51:02" }, { "name": "mtdowling/cron-expression", @@ -1341,16 +1354,16 @@ }, { "name": "nesbot/carbon", - "version": "1.20.0", + "version": "1.21.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bfd3eaba109c9a2405c92174c8e17f20c2b9caf3" + "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bfd3eaba109c9a2405c92174c8e17f20c2b9caf3", - "reference": "bfd3eaba109c9a2405c92174c8e17f20c2b9caf3", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7", + "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7", "shasum": "" }, "require": { @@ -1358,12 +1371,12 @@ "symfony/translation": "~2.6|~3.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.0|~5.0" }, "type": "library", "autoload": { - "psr-0": { - "Carbon": "src" + "psr-4": { + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1384,20 +1397,20 @@ "datetime", "time" ], - "time": "2015-06-25 04:19:39" + "time": "2015-11-04 20:07:17" }, { "name": "nikic/php-parser", - "version": "v1.4.0", + "version": "v1.4.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "196f177cfefa0f1f7166c0a05d8255889be12418" + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/196f177cfefa0f1f7166c0a05d8255889be12418", - "reference": "196f177cfefa0f1f7166c0a05d8255889be12418", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", "shasum": "" }, "require": { @@ -1429,7 +1442,55 @@ "parser", "php" ], - "time": "2015-07-14 17:31:05" + "time": "2015-09-19 14:15:08" + }, + { + "name": "paragonie/random_compat", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "19f765b66c6fbb56ee3b11bc16d52e38eebdc295" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/19f765b66c6fbb56ee3b11bc16d52e38eebdc295", + "reference": "19f765b66c6fbb56ee3b11bc16d52e38eebdc295", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2015-11-10 00:45:41" }, { "name": "psr/log", @@ -1471,29 +1532,29 @@ }, { "name": "psy/psysh", - "version": "v0.5.2", + "version": "v0.6.1", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975" + "reference": "0f04df0b23663799a8941fae13cd8e6299bde3ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/aaf8772ade08b5f0f6830774a5d5c2f800415975", - "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0f04df0b23663799a8941fae13cd8e6299bde3ed", + "reference": "0f04df0b23663799a8941fae13cd8e6299bde3ed", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1", "jakub-onderka/php-console-highlighter": "0.3.*", - "nikic/php-parser": "^1.2.1", + "nikic/php-parser": "^1.2.1|~2.0", "php": ">=5.3.9", "symfony/console": "~2.3.10|^2.4.2|~3.0", "symfony/var-dumper": "~2.7|~3.0" }, "require-dev": { "fabpot/php-cs-fixer": "~1.5", - "phpunit/phpunit": "~3.7|~4.0", + "phpunit/phpunit": "~3.7|~4.0|~5.0", "squizlabs/php_codesniffer": "~2.0", "symfony/finder": "~2.1|~3.0" }, @@ -1509,15 +1570,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.6.x-dev" + "dev-develop": "0.7.x-dev" } }, "autoload": { "files": [ "src/Psy/functions.php" ], - "psr-0": { - "Psy\\": "src/" + "psr-4": { + "Psy\\": "src/Psy/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1539,7 +1600,7 @@ "interactive", "shell" ], - "time": "2015-07-16 15:26:57" + "time": "2015-11-12 16:18:56" }, { "name": "rcrowe/twigbridge", @@ -1660,16 +1721,16 @@ }, { "name": "symfony/console", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "d6cf02fe73634c96677e428f840704bfbcaec29e" + "url": "https://github.com/symfony/console.git", + "reference": "5efd632294c8320ea52492db22292ff853a43766" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/d6cf02fe73634c96677e428f840704bfbcaec29e", - "reference": "d6cf02fe73634c96677e428f840704bfbcaec29e", + "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", + "reference": "5efd632294c8320ea52492db22292ff853a43766", "shasum": "" }, "require": { @@ -1678,7 +1739,6 @@ "require-dev": { "psr/log": "~1.0", "symfony/event-dispatcher": "~2.1", - "symfony/phpunit-bridge": "~2.7", "symfony/process": "~2.1" }, "suggest": { @@ -1713,28 +1773,25 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-07-28 15:18:12" + "time": "2015-10-20 14:38:46" }, { "name": "symfony/css-selector", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/CssSelector.git", - "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092" + "url": "https://github.com/symfony/css-selector.git", + "reference": "e1b865b26be4a56d22a8dee398375044a80c865b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/CssSelector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092", - "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b", + "reference": "e1b865b26be4a56d22a8dee398375044a80c865b", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { @@ -1766,20 +1823,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:33:16" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/debug", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/Debug.git", - "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3" + "url": "https://github.com/symfony/debug.git", + "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/9daa1bf9f7e615fa2fba30357e479a90141222e3", - "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3", + "url": "https://api.github.com/repos/symfony/debug/zipball/fb9e6887db716939f41af0ba8ef38a1582eb501b", + "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b", "shasum": "" }, "require": { @@ -1791,13 +1848,7 @@ }, "require-dev": { "symfony/class-loader": "~2.2", - "symfony/http-foundation": "~2.1", - "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2", - "symfony/phpunit-bridge": "~2.7" - }, - "suggest": { - "symfony/http-foundation": "", - "symfony/http-kernel": "" + "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2" }, "type": "library", "extra": { @@ -1826,28 +1877,27 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2015-07-09 16:07:40" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/dom-crawler", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/DomCrawler.git", - "reference": "9dabece63182e95c42b06967a0d929a5df78bc35" + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/9dabece63182e95c42b06967a0d929a5df78bc35", - "reference": "9dabece63182e95c42b06967a0d929a5df78bc35", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5fef7d8b80d8f9992df99d8ee283f420484c9612", + "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/css-selector": "~2.3", - "symfony/phpunit-bridge": "~2.7" + "symfony/css-selector": "~2.3" }, "suggest": { "symfony/css-selector": "" @@ -1879,20 +1929,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2015-07-09 16:07:40" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/event-dispatcher", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", - "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8", + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8", "shasum": "" }, "require": { @@ -1903,7 +1953,6 @@ "symfony/config": "~2.0,>=2.0.5", "symfony/dependency-injection": "~2.6", "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", "symfony/stopwatch": "~2.3" }, "suggest": { @@ -1937,28 +1986,25 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-06-18 19:21:56" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/finder", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4" + "url": "https://github.com/symfony/finder.git", + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/ae0f363277485094edc04c9f3cbe595b183b78e4", - "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4", + "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { @@ -1986,28 +2032,27 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2015-07-09 16:07:40" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/http-foundation", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "863af6898081b34c65d42100c370b9f3c51b70ca" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "7598eea151ae3d4134df1f9957364b17809eea75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/863af6898081b34c65d42100c370b9f3c51b70ca", - "reference": "863af6898081b34c65d42100c370b9f3c51b70ca", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7598eea151ae3d4134df1f9957364b17809eea75", + "reference": "7598eea151ae3d4134df1f9957364b17809eea75", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/expression-language": "~2.4", - "symfony/phpunit-bridge": "~2.7" + "symfony/expression-language": "~2.4" }, "type": "library", "extra": { @@ -2039,20 +2084,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2015-07-22 10:11:00" + "time": "2015-10-23 14:47:27" }, { "name": "symfony/http-kernel", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/HttpKernel.git", - "reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/405d3e7a59ff7a28ec469441326a0ac79065ea98", - "reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4260f2273a446a6715063dc9ca89fd0c475c2f77", + "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77", "shasum": "" }, "require": { @@ -2075,7 +2120,6 @@ "symfony/dom-crawler": "~2.0,>=2.0.5", "symfony/expression-language": "~2.4", "symfony/finder": "~2.0,>=2.0.5", - "symfony/phpunit-bridge": "~2.7", "symfony/process": "~2.0,>=2.0.5", "symfony/routing": "~2.2", "symfony/stopwatch": "~2.3", @@ -2119,28 +2163,25 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-07-31 13:24:45" + "time": "2015-10-27 19:07:21" }, { "name": "symfony/process", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "48aeb0e48600321c272955132d7606ab0a49adb3" + "url": "https://github.com/symfony/process.git", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/48aeb0e48600321c272955132d7606ab0a49adb3", - "reference": "48aeb0e48600321c272955132d7606ab0a49adb3", + "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { @@ -2168,20 +2209,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2015-07-01 11:25:50" + "time": "2015-10-23 14:47:27" }, { "name": "symfony/routing", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26" + "url": "https://github.com/symfony/routing.git", + "reference": "f353e1f588679c3ec987624e6c617646bd01ba38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/ea9134f277162b02e5f80ac058b75a77637b0d26", - "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26", + "url": "https://api.github.com/repos/symfony/routing/zipball/f353e1f588679c3ec987624e6c617646bd01ba38", + "reference": "f353e1f588679c3ec987624e6c617646bd01ba38", "shasum": "" }, "require": { @@ -2197,7 +2238,6 @@ "symfony/config": "~2.7", "symfony/expression-language": "~2.4", "symfony/http-foundation": "~2.3", - "symfony/phpunit-bridge": "~2.7", "symfony/yaml": "~2.0,>=2.0.5" }, "suggest": { @@ -2239,20 +2279,20 @@ "uri", "url" ], - "time": "2015-07-09 16:07:40" + "time": "2015-10-27 15:38:06" }, { "name": "symfony/translation", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/Translation.git", - "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6" + "url": "https://github.com/symfony/translation.git", + "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/c8dc34cc936152c609cdd722af317e4239d10dd6", - "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6", + "url": "https://api.github.com/repos/symfony/translation/zipball/6ccd9289ec1c71d01a49d83480de3b5293ce30c8", + "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8", "shasum": "" }, "require": { @@ -2264,8 +2304,7 @@ "require-dev": { "psr/log": "~1.0", "symfony/config": "~2.7", - "symfony/intl": "~2.3", - "symfony/phpunit-bridge": "~2.7", + "symfony/intl": "~2.4", "symfony/yaml": "~2.2" }, "suggest": { @@ -2300,28 +2339,25 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2015-07-09 16:07:40" + "time": "2015-10-27 15:38:06" }, { "name": "symfony/var-dumper", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "e8903ebba5eb019f5886ffce739ea9e3b7519579" + "reference": "eb033050050916b6bfa51be71009ef67b16046c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e8903ebba5eb019f5886ffce739ea9e3b7519579", - "reference": "e8903ebba5eb019f5886ffce739ea9e3b7519579", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/eb033050050916b6bfa51be71009ef67b16046c9", + "reference": "eb033050050916b6bfa51be71009ef67b16046c9", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "suggest": { "ext-symfony_debug": "" }, @@ -2359,29 +2395,33 @@ "debug", "dump" ], - "time": "2015-07-28 15:18:12" + "time": "2015-10-25 17:17:38" }, { "name": "twig/twig", - "version": "v1.20.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "1ea4e5f81c6d005fe84d0b38e1c4f1955eb86844" + "reference": "d9b6333ae8dd2c8e3fd256e127548def0bc614c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/1ea4e5f81c6d005fe84d0b38e1c4f1955eb86844", - "reference": "1ea4e5f81c6d005fe84d0b38e1c4f1955eb86844", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/d9b6333ae8dd2c8e3fd256e127548def0bc614c6", + "reference": "d9b6333ae8dd2c8e3fd256e127548def0bc614c6", "shasum": "" }, "require": { "php": ">=5.2.7" }, + "require-dev": { + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~2.7" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.20-dev" + "dev-master": "1.23-dev" } }, "autoload": { @@ -2416,7 +2456,7 @@ "keywords": [ "templating" ], - "time": "2015-08-12 15:56:39" + "time": "2015-11-05 12:49:06" }, { "name": "vlucas/phpdotenv", @@ -2466,16 +2506,16 @@ }, { "name": "watson/validating", - "version": "1.0.3", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/dwightwatson/validating.git", - "reference": "c32912f760b456c043657951683ed6c468ab83e7" + "reference": "3aa4c6aeb10b64e2a012c6ea4a7254233488d3f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/validating/zipball/c32912f760b456c043657951683ed6c468ab83e7", - "reference": "c32912f760b456c043657951683ed6c468ab83e7", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/3aa4c6aeb10b64e2a012c6ea4a7254233488d3f9", + "reference": "3aa4c6aeb10b64e2a012c6ea4a7254233488d3f9", "shasum": "" }, "require": { @@ -2517,7 +2557,7 @@ "laravel", "validation" ], - "time": "2015-06-03 02:25:38" + "time": "2015-10-27 14:41:11" }, { "name": "zizaco/entrust", @@ -2525,12 +2565,12 @@ "source": { "type": "git", "url": "https://github.com/Zizaco/entrust.git", - "reference": "3a768eb52300ec4efe9d6a6685b9bf0db6a50ffd" + "reference": "be28aa634c44551ae5187894c903094a8ce8baee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Zizaco/entrust/zipball/3a768eb52300ec4efe9d6a6685b9bf0db6a50ffd", - "reference": "3a768eb52300ec4efe9d6a6685b9bf0db6a50ffd", + "url": "https://api.github.com/repos/Zizaco/entrust/zipball/be28aa634c44551ae5187894c903094a8ce8baee", + "reference": "be28aa634c44551ae5187894c903094a8ce8baee", "shasum": "" }, "require": { @@ -2584,22 +2624,22 @@ "permission", "roles" ], - "time": "2015-07-09 16:32:53" + "time": "2015-11-12 17:38:37" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v2.0.5", + "version": "v2.0.6", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "753106cd1f9c724d05bb48728bc652231174e279" + "reference": "23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/753106cd1f9c724d05bb48728bc652231174e279", - "reference": "753106cd1f9c724d05bb48728bc652231174e279", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c", + "reference": "23672cbbe78278ff1fdb258caa0b1de7b5d0bc0c", "shasum": "" }, "require": { @@ -2611,7 +2651,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -2640,7 +2680,7 @@ "profiler", "webprofiler" ], - "time": "2015-07-09 14:51:59" + "time": "2015-09-09 11:39:27" }, { "name": "barryvdh/laravel-ide-helper", @@ -2707,16 +2747,16 @@ }, { "name": "maximebf/debugbar", - "version": "v1.10.4", + "version": "v1.10.5", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "7b2006e6e095126b5a061ec33fca3d90ea8a8219" + "reference": "30e53e8a28284b69dd223c9f5ee8957befd72636" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/7b2006e6e095126b5a061ec33fca3d90ea8a8219", - "reference": "7b2006e6e095126b5a061ec33fca3d90ea8a8219", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30e53e8a28284b69dd223c9f5ee8957befd72636", + "reference": "30e53e8a28284b69dd223c9f5ee8957befd72636", "shasum": "" }, "require": { @@ -2759,7 +2799,7 @@ "keywords": [ "debug" ], - "time": "2015-02-05 07:51:20" + "time": "2015-10-19 20:35:12" }, { "name": "phpdocumentor/reflection-docblock", @@ -2812,24 +2852,23 @@ }, { "name": "symfony/class-loader", - "version": "v2.7.3", + "version": "v2.7.6", "source": { "type": "git", - "url": "https://github.com/symfony/ClassLoader.git", - "reference": "2fccbc544997340808801a7410cdcb96dd12edc4" + "url": "https://github.com/symfony/class-loader.git", + "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/2fccbc544997340808801a7410cdcb96dd12edc4", - "reference": "2fccbc544997340808801a7410cdcb96dd12edc4", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/320f8d2a9cdbcbeb24be602c124aae9d998474a4", + "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/finder": "~2.0,>=2.0.5", - "symfony/phpunit-bridge": "~2.7" + "symfony/finder": "~2.0,>=2.0.5" }, "type": "library", "extra": { @@ -2858,7 +2897,7 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2015-06-25 12:52:11" + "time": "2015-10-23 14:47:27" } ], "aliases": [], From d1329be2fa7be6b01d74ad7c49c1fa5109d2a65e Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 20 Nov 2015 20:13:10 +0100 Subject: [PATCH 002/135] Bill scan routine should not grab transfers and income. --- app/Repositories/Bill/BillRepository.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index f852266d03..3b8215729e 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -276,12 +276,21 @@ class BillRepository implements BillRepositoryInterface */ public function scan(Bill $bill, TransactionJournal $journal) { + + /* + * Can only support withdrawals. + */ + if ($journal->transactionType->type !== 'Withdrawal') { + return false; + } + $matches = explode(',', $bill->match); $description = strtolower($journal->description) . ' ' . strtolower($journal->destination_account->name); $wordMatch = $this->doWordMatch($matches, $description); $amountMatch = $this->doAmountMatch($journal->amount_positive, $bill->amount_min, $bill->amount_max); Log::debug('Journal #' . $journal->id . ' has description "' . $description . '"'); + /* * If both, update! */ From 791d12fbb4e2f91d2aca5081cc0b3764fdd91379 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 22 Nov 2015 11:25:15 +0100 Subject: [PATCH 003/135] Fix for issue #123 --- app/Http/Middleware/Authenticate.php | 1 + app/Support/Amount.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 8b196c51c8..a785f908c9 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -64,6 +64,7 @@ class Authenticate Carbon::setLocale($pref->data); setlocale(LC_TIME, Config::get('firefly.locales.' . $pref->data)); + setlocale(LC_MONETARY, Config::get('firefly.locales.' . $pref->data)); return $next($request); } diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 0ef9c0ad2c..4e8f03a460 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -60,7 +60,7 @@ class Amount { $amount = floatval($amount); $amount = round($amount, 2); - $string = number_format($amount, 2, ',', '.'); + $string = money_format('%!.2n', $amount); if ($coloured === true) { if ($amount === 0.0) { From 8a9d576f6157ecdb24acc32c99929d54a3523e4a Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 22 Nov 2015 11:30:06 +0100 Subject: [PATCH 004/135] Allow change to default currency. issue #121 --- .env.example | 2 ++ app/Helpers/Csv/PostProcessing/Currency.php | 2 +- app/Http/Controllers/CurrencyController.php | 2 +- app/Support/Amount.php | 8 ++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index 4fd2e2b837..46dcea9ba5 100644 --- a/.env.example +++ b/.env.example @@ -11,6 +11,8 @@ DB_PASSWORD=secret CACHE_DRIVER=file SESSION_DRIVER=file +DEFAULT_CURRENCY=EUR + EMAIL_SMTP= EMAIL_DRIVER=smtp EMAIL_USERNAME= diff --git a/app/Helpers/Csv/PostProcessing/Currency.php b/app/Helpers/Csv/PostProcessing/Currency.php index a03b9db27c..e5014120be 100644 --- a/app/Helpers/Csv/PostProcessing/Currency.php +++ b/app/Helpers/Csv/PostProcessing/Currency.php @@ -24,7 +24,7 @@ class Currency implements PostProcessorInterface // fix currency if (is_null($this->data['currency'])) { - $currencyPreference = Preferences::get('currencyPreference', 'EUR'); + $currencyPreference = Preferences::get('currencyPreference', env('DEFAULT_CURRENCY', 'EUR')); $this->data['currency'] = TransactionCurrency::whereCode($currencyPreference->data)->first(); } diff --git a/app/Http/Controllers/CurrencyController.php b/app/Http/Controllers/CurrencyController.php index b808805255..6c066e5e16 100644 --- a/app/Http/Controllers/CurrencyController.php +++ b/app/Http/Controllers/CurrencyController.php @@ -147,7 +147,7 @@ class CurrencyController extends Controller public function index(CurrencyRepositoryInterface $repository) { $currencies = $repository->get(); - $defaultCurrency = $repository->getCurrencyByPreference(Preferences::get('currencyPreference', 'EUR')); + $defaultCurrency = $repository->getCurrencyByPreference(Preferences::get('currencyPreference', env('DEFAULT_CURRENCY','EUR'))); if (!Auth::user()->hasRole('owner')) { diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 4e8f03a460..50e72c37b3 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -40,7 +40,7 @@ class Amount if ($cache->has()) { return $cache->get(); } else { - $currencyPreference = Prefs::get('currencyPreference', 'EUR'); + $currencyPreference = Prefs::get('currencyPreference', env('DEFAULT_CURRENCY','EUR')); $currency = TransactionCurrency::whereCode($currencyPreference->data)->first(); $cache->store($currency->symbol); @@ -152,7 +152,7 @@ class Amount if ($cache->has()) { return $cache->get(); } else { - $currencyPreference = Prefs::get('currencyPreference', 'EUR'); + $currencyPreference = Prefs::get('currencyPreference', env('DEFAULT_CURRENCY','EUR')); $currency = TransactionCurrency::whereCode($currencyPreference->data)->first(); if ($currency) { @@ -161,9 +161,9 @@ class Amount return $currency->code; } - $cache->store('EUR'); + $cache->store(env('DEFAULT_CURRENCY','EUR')); - return 'EUR'; // @codeCoverageIgnore + return env('DEFAULT_CURRENCY','EUR'); // @codeCoverageIgnore } } From 96836e2d6c890d1d42ca284ee47338ef971951b3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 28 Nov 2015 16:04:30 +0100 Subject: [PATCH 005/135] Update read me. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65a0265eac..c4bb40c407 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ If you're still interested please read [the installation guide](https://github.c and the **[first use guide](https://github.com/JC5/firefly-iii/wiki/First-use)**. If you want to try out Firefly III, you can do so on [this dedicated website](https://geld.nder.be/). -This site always runs the latest version of Firefly III. If you want to use it, please read the [privacy considerations](https://github.com/JC5/firefly-iii/wiki/Privacy-on-demo-site) for this demo-site. Accounts on the demo sites will stop working after one week. +This site always runs the latest version of Firefly III. If you want to use it, please read the [privacy considerations](https://github.com/JC5/firefly-iii/wiki/Privacy-on-demo-site) for this demo-site. Accounts on the demo sites will stop working after one month. It's a trial. ## Credits From de634da513055997d4f7e6180eca8310f46520ae Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 2 Dec 2015 08:22:25 +0100 Subject: [PATCH 006/135] Only get active savings accounts. --- app/Repositories/Account/AccountRepository.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index d911cdea8e..4194aaf9ff 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -273,6 +273,7 @@ class AccountRepository implements AccountRepositoryInterface $accounts = Auth::user()->accounts()->accountTypeIn(['Default account', 'Asset account'])->orderBy('accounts.name', 'ASC') ->leftJoin('account_meta', 'account_meta.account_id', '=', 'accounts.id') ->where('account_meta.name', 'accountRole') + ->where('accounts.active', 1) ->where('account_meta.data', '"savingAsset"') ->get(['accounts.*']); $start = clone Session::get('start', new Carbon); From 7b8c86e1e33af2d36db7576a05e801f938c4f439 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:25:38 +0100 Subject: [PATCH 007/135] Only get active piggy banks. --- app/Repositories/Account/AccountRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 4194aaf9ff..a19cf45840 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -234,7 +234,7 @@ class AccountRepository implements AccountRepositoryInterface $ids = array_unique($ids); if (count($ids) > 0) { - $accounts = Auth::user()->accounts()->whereIn('id', $ids)->get(); + $accounts = Auth::user()->accounts()->whereIn('id', $ids)->where('accounts.active', 1)->get(); } bcscale(2); From 1966d87ce6daa3978fd8f5f45a485f677ff4b5a9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:33:22 +0100 Subject: [PATCH 008/135] Small formatting fixes in reports. --- resources/twig/partials/reports/budgets.twig | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/twig/partials/reports/budgets.twig b/resources/twig/partials/reports/budgets.twig index 3972b4dffe..3fddc8add3 100644 --- a/resources/twig/partials/reports/budgets.twig +++ b/resources/twig/partials/reports/budgets.twig @@ -39,13 +39,15 @@ {% if budgetLine.getSpent != 0 %} + {{ budgetLine.getSpent|formatAmountPlain }} + {% endif %} + + {% if budgetLine.getSpent == 0 %} {{ budgetLine.getSpent|formatAmount }} {% endif %} - {% if budgetLine.getLeft != 0 %} - {{ budgetLine.getLeft|formatAmount }} - {% endif %} + {{ budgetLine.getLeft|formatAmount }} {% if budgetLine.getOverspent != 0 %} From 37e2f097ba1efae598817db6c3ec2e47f86226d7 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:35:15 +0100 Subject: [PATCH 009/135] To make budget report more clear, add spent amount to "spent" column. --- app/Helpers/Report/ReportHelper.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index 0c89f6d854..9419c173aa 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -303,6 +303,7 @@ class ReportHelper implements ReportHelperInterface $noBudget = $repository->getWithoutBudgetSum($start, $end); $budgetLine = new BudgetLine; $budgetLine->setOverspent($noBudget); + $budgetLine->setSpent($noBudget); $object->addOverspent($noBudget); $object->addBudgetLine($budgetLine); From 8bb27de2339af7fe0b2b70ebb11d71fd83dc94e7 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:37:08 +0100 Subject: [PATCH 010/135] More report subtleties. --- resources/twig/partials/reports/budgets.twig | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/twig/partials/reports/budgets.twig b/resources/twig/partials/reports/budgets.twig index 3fddc8add3..8aa53fff0d 100644 --- a/resources/twig/partials/reports/budgets.twig +++ b/resources/twig/partials/reports/budgets.twig @@ -61,7 +61,14 @@ {{ 'sum'|_ }} {{ budgets.getBudgeted|formatAmount }} - {{ budgets.getSpent|formatAmount }} + + {% if budgets.getSpent != 0 %} + {{ budgets.getSpent|formatAmountPlain }} + {% endif %} + {% if budgets.getSpent === 0 %} + {{ budgets.getSpent|formatAmount }} + {% endif %} + {{ budgets.getLeft|formatAmount }} {{ budgets.getOverspent|formatAmountPlain }} From 65ddd8a736a5ac7d2edcc1dd392f9bf4edbb757f Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:37:35 +0100 Subject: [PATCH 011/135] One 'equals' sign too many! --- resources/twig/partials/reports/budgets.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/twig/partials/reports/budgets.twig b/resources/twig/partials/reports/budgets.twig index 8aa53fff0d..a1ba288f03 100644 --- a/resources/twig/partials/reports/budgets.twig +++ b/resources/twig/partials/reports/budgets.twig @@ -65,7 +65,7 @@ {% if budgets.getSpent != 0 %} {{ budgets.getSpent|formatAmountPlain }} {% endif %} - {% if budgets.getSpent === 0 %} + {% if budgets.getSpent == 0 %} {{ budgets.getSpent|formatAmount }} {% endif %} From a8a28f442f39e05286f12379f056c18bd9b3513c Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:38:57 +0100 Subject: [PATCH 012/135] Also show "zero" amounts. --- resources/twig/partials/reports/balance.twig | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/resources/twig/partials/reports/balance.twig b/resources/twig/partials/reports/balance.twig index e431e9a992..2fb091b949 100644 --- a/resources/twig/partials/reports/balance.twig +++ b/resources/twig/partials/reports/balance.twig @@ -43,14 +43,10 @@ {% endfor %} - {% if balanceLine.leftOfRepetition != 0 %} - {{ balanceLine.leftOfRepetition|formatAmount }} - {% endif %} + {{ balanceLine.leftOfRepetition|formatAmount }} - {% if balanceLine.sumOfLeft != 0 %} - {{ balanceLine.sumOfLeft|formatAmount }} - {% endif %} + {{ balanceLine.sumOfLeft|formatAmount }} {% endfor %} From 371bbd9508c9da3cd20e195270b2547b0659fde3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:44:23 +0100 Subject: [PATCH 013/135] Some cosmetic fixes to reports --- app/Helpers/Collection/BalanceLine.php | 2 +- app/Helpers/Report/ReportHelper.php | 1 + resources/twig/partials/reports/balance.twig | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Helpers/Collection/BalanceLine.php b/app/Helpers/Collection/BalanceLine.php index 0c8ca55853..daa2f028a9 100644 --- a/app/Helpers/Collection/BalanceLine.php +++ b/app/Helpers/Collection/BalanceLine.php @@ -113,7 +113,7 @@ class BalanceLine $start = $this->getRepetition() ? $this->getRepetition()->amount : 0; /** @var BalanceEntry $balanceEntry */ foreach ($this->getBalanceEntries() as $balanceEntry) { - $start += $balanceEntry->getSpent(); + $start -= $balanceEntry->getSpent(); } return $start; diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index 9419c173aa..ae9bd4ca1a 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -134,6 +134,7 @@ class ReportHelper implements ReportHelperInterface // get budget amount for current period: $rep = $repository->getCurrentRepetition($budget, $start, $end); + // could be null? $line->setRepetition($rep); // loop accounts: diff --git a/resources/twig/partials/reports/balance.twig b/resources/twig/partials/reports/balance.twig index 2fb091b949..6dd4da9c49 100644 --- a/resources/twig/partials/reports/balance.twig +++ b/resources/twig/partials/reports/balance.twig @@ -35,7 +35,7 @@ {% for balanceEntry in balanceLine.getBalanceEntries %} {% if balanceEntry.getSpent != 0 %} - {{ (balanceEntry.getSpent*-1)|formatAmountPlain }} + {{ (balanceEntry.getSpent)|formatAmountPlain }} {% endif %} {% if balanceEntry.getLeft != 0 %} {{ (balanceEntry.getLeft)|formatAmountPlain }} From d3682a6727eb8d4b1bec70279fe97ba455cff241 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:46:03 +0100 Subject: [PATCH 014/135] Another fix in reports. --- app/Helpers/Report/ReportHelper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index ae9bd4ca1a..f0d660d173 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -154,6 +154,7 @@ class ReportHelper implements ReportHelperInterface // then a new line for without budget. // and one for the tags: + // and one for "left unbalanced". $empty = new BalanceLine; $tags = new BalanceLine; $diffLine = new BalanceLine; @@ -162,7 +163,7 @@ class ReportHelper implements ReportHelperInterface $diffLine->setRole(BalanceLine::ROLE_DIFFROLE); foreach ($accounts as $account) { - $spent = $this->query->spentNoBudget($account, $start, $end); + $spent = $this->query->spentNoBudget($account, $start, $end) * -1; $left = $tagRepository->coveredByBalancingActs($account, $start, $end); bcscale(2); $diff = bcsub($spent, $left); From f2b08346d06345b751b8c049037eb68ccd66b0be Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:50:28 +0100 Subject: [PATCH 015/135] Log. --- app/Repositories/Budget/BudgetRepository.php | 102 ++++++++++--------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 7b9f594a0e..b6126388f9 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -13,6 +13,7 @@ use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Input; +use Log; /** * Class BudgetRepository @@ -87,10 +88,10 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn /** @var Collection $repetitions */ return LimitRepetition:: leftJoin('budget_limits', 'limit_repetitions.budget_limit_id', '=', 'budget_limits.id') - ->where('limit_repetitions.startdate', '<=', $end->format('Y-m-d 00:00:00')) - ->where('limit_repetitions.startdate', '>=', $start->format('Y-m-d 00:00:00')) - ->where('budget_limits.budget_id', $budget->id) - ->get(['limit_repetitions.*']); + ->where('limit_repetitions.startdate', '<=', $end->format('Y-m-d 00:00:00')) + ->where('limit_repetitions.startdate', '>=', $start->format('Y-m-d 00:00:00')) + ->where('budget_limits.budget_id', $budget->id) + ->get(['limit_repetitions.*']); } /** @@ -139,9 +140,10 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn return $cache->get(); // @codeCoverageIgnore } $data = $budget->limitrepetitions() - ->where('limit_repetitions.startdate', $start) - ->where('limit_repetitions.enddate', $end) - ->first(['limit_repetitions.*']); + ->where('limit_repetitions.startdate', $start) + ->where('limit_repetitions.enddate', $end) + ->first(['limit_repetitions.*']); + Log::debug('Looking for limit reps for budget #' . $budget->id . ' start [' . $start . '] and end [' . $end . '].'); $cache->store($data); return $data; @@ -182,9 +184,9 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn /** * Returns all the transaction journals for a limit, possibly limited by a limit repetition. * - * @param Budget $budget + * @param Budget $budget * @param LimitRepetition $repetition - * @param int $take + * @param int $take * * @return LengthAwarePaginator */ @@ -201,11 +203,11 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn return $cache->get(); // @codeCoverageIgnore } - $offset = intval(Input::get('page')) > 0 ? intval(Input::get('page')) * $take : 0; - $setQuery = $budget->transactionJournals()->withRelevantData()->take($take)->offset($offset) - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC'); + $offset = intval(Input::get('page')) > 0 ? intval(Input::get('page')) * $take : 0; + $setQuery = $budget->transactionJournals()->withRelevantData()->take($take)->offset($offset) + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC'); $countQuery = $budget->transactionJournals(); @@ -215,7 +217,7 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn } - $set = $setQuery->get(['transaction_journals.*']); + $set = $setQuery->get(['transaction_journals.*']); $count = $countQuery->count(); @@ -249,9 +251,9 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn public function getLimitAmountOnDate(Budget $budget, Carbon $date) { $repetition = LimitRepetition::leftJoin('budget_limits', 'limit_repetitions.budget_limit_id', '=', 'budget_limits.id') - ->where('limit_repetitions.startdate', $date->format('Y-m-d 00:00:00')) - ->where('budget_limits.budget_id', $budget->id) - ->first(['limit_repetitions.*']); + ->where('limit_repetitions.startdate', $date->format('Y-m-d 00:00:00')) + ->where('budget_limits.budget_id', $budget->id) + ->first(['limit_repetitions.*']); if ($repetition) { return $repetition->amount; @@ -269,15 +271,15 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn public function getWithoutBudget(Carbon $start, Carbon $end) { return Auth::user() - ->transactionjournals() - ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') - ->whereNull('budget_transaction_journal.id') - ->before($end) - ->after($start) - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC') - ->get(['transaction_journals.*']); + ->transactionjournals() + ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') + ->whereNull('budget_transaction_journal.id') + ->before($end) + ->after($start) + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC') + ->get(['transaction_journals.*']); } /** @@ -289,22 +291,22 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn public function getWithoutBudgetSum(Carbon $start, Carbon $end) { $noBudgetSet = Auth::user() - ->transactionjournals() - ->whereNotIn( - 'transaction_journals.id', function (QueryBuilder $query) use ($start, $end) { - $query - ->select('transaction_journals.id') - ->from('transaction_journals') - ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') - ->where('transaction_journals.date', '>=', $start->format('Y-m-d 00:00:00')) - ->where('transaction_journals.date', '<=', $end->format('Y-m-d 00:00:00')) - ->whereNotNull('budget_transaction_journal.budget_id'); - } - ) - ->after($start) - ->before($end) - ->transactionTypes(['Withdrawal']) - ->get(['transaction_journals.*'])->sum('amount'); + ->transactionjournals() + ->whereNotIn( + 'transaction_journals.id', function (QueryBuilder $query) use ($start, $end) { + $query + ->select('transaction_journals.id') + ->from('transaction_journals') + ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') + ->where('transaction_journals.date', '>=', $start->format('Y-m-d 00:00:00')) + ->where('transaction_journals.date', '<=', $end->format('Y-m-d 00:00:00')) + ->whereNotNull('budget_transaction_journal.budget_id'); + } + ) + ->after($start) + ->before($end) + ->transactionTypes(['Withdrawal']) + ->get(['transaction_journals.*'])->sum('amount'); bcscale(2); @@ -315,7 +317,7 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn * @param Budget $budget * @param Carbon $start * @param Carbon $end - * @param bool $shared + * @param bool $shared * * @return string */ @@ -334,7 +336,7 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn $newBudget = new Budget( [ 'user_id' => $data['user'], - 'name' => $data['name'], + 'name' => $data['name'], ] ); $newBudget->save(); @@ -345,14 +347,14 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn /** * @param Budget $budget - * @param array $data + * @param array $data * * @return Budget */ public function update(Budget $budget, array $data) { // update the account: - $budget->name = $data['name']; + $budget->name = $data['name']; $budget->active = $data['active']; $budget->save(); @@ -376,10 +378,10 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn // if not, create one! $limit = new BudgetLimit; $limit->budget()->associate($budget); - $limit->startdate = $date; - $limit->amount = $amount; + $limit->startdate = $date; + $limit->amount = $amount; $limit->repeat_freq = 'monthly'; - $limit->repeats = 0; + $limit->repeats = 0; $limit->save(); // likewise, there should be a limit repetition to match the end date From d87d12a0f52b267b3968fec063532b66eb332a36 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 08:58:40 +0100 Subject: [PATCH 016/135] Better query. See if works. --- app/Repositories/Budget/BudgetRepository.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index b6126388f9..d360d835e0 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -140,10 +140,11 @@ class BudgetRepository extends ComponentRepository implements BudgetRepositoryIn return $cache->get(); // @codeCoverageIgnore } $data = $budget->limitrepetitions() - ->where('limit_repetitions.startdate', $start) - ->where('limit_repetitions.enddate', $end) + ->where('limit_repetitions.startdate', $start->format('Y-m-d 00:00:00')) + ->where('limit_repetitions.enddate', $end->format('Y-m-d 00:00:00')) ->first(['limit_repetitions.*']); - Log::debug('Looking for limit reps for budget #' . $budget->id . ' start [' . $start . '] and end [' . $end . '].'); + //Log::debug('Looking for limit reps for budget #' . $budget->id . ' start [' . $start . '] and end [' . $end . '].'); + //Log::debug(DB::getQueryLog()) $cache->store($data); return $data; From d124de51dbef33ee45d16a31c9201697c5a979d2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 09:00:28 +0100 Subject: [PATCH 017/135] Shouldn't be like this? --- app/Helpers/Collection/BalanceLine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Helpers/Collection/BalanceLine.php b/app/Helpers/Collection/BalanceLine.php index daa2f028a9..28a64d4c5c 100644 --- a/app/Helpers/Collection/BalanceLine.php +++ b/app/Helpers/Collection/BalanceLine.php @@ -163,7 +163,7 @@ class BalanceLine bcscale(2); /** @var BalanceEntry $balanceEntry */ foreach ($this->getBalanceEntries() as $balanceEntry) { - $sum = bcadd($sum, $balanceEntry->getLeft()); + $sum = bcadd($sum, $balanceEntry->getSpent()); } return $sum; From 04f71b3b4319d5a3e3ee5f5948c77842ec5944ee Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 09:01:40 +0100 Subject: [PATCH 018/135] Removed old code. --- app/Helpers/Collection/BalanceLine.php | 20 -------------------- resources/twig/partials/reports/balance.twig | 4 ---- 2 files changed, 24 deletions(-) diff --git a/app/Helpers/Collection/BalanceLine.php b/app/Helpers/Collection/BalanceLine.php index 28a64d4c5c..50b1d6313a 100644 --- a/app/Helpers/Collection/BalanceLine.php +++ b/app/Helpers/Collection/BalanceLine.php @@ -150,24 +150,4 @@ class BalanceLine { $this->balanceEntries = $balanceEntries; } - - /** - * If the BalanceEntries for a BalanceLine have a "left" value, the amount - * of money left in the entire BalanceLine is returned here: - * - * @return float - */ - public function sumOfLeft() - { - $sum = '0'; - bcscale(2); - /** @var BalanceEntry $balanceEntry */ - foreach ($this->getBalanceEntries() as $balanceEntry) { - $sum = bcadd($sum, $balanceEntry->getSpent()); - } - - return $sum; - } - - } diff --git a/resources/twig/partials/reports/balance.twig b/resources/twig/partials/reports/balance.twig index 6dd4da9c49..74cf4804a9 100644 --- a/resources/twig/partials/reports/balance.twig +++ b/resources/twig/partials/reports/balance.twig @@ -14,7 +14,6 @@ {{ 'leftInBudget'|_ }} - {{ 'sum'|_ }} @@ -45,9 +44,6 @@ {{ balanceLine.leftOfRepetition|formatAmount }} - - {{ balanceLine.sumOfLeft|formatAmount }} - {% endfor %} From bd4a8c8397eb21b512c68436be32e9e343dbc158 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 09:03:34 +0100 Subject: [PATCH 019/135] Fixed "under" column --- resources/twig/partials/reports/bills.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/twig/partials/reports/bills.twig b/resources/twig/partials/reports/bills.twig index 84288f6501..266c9b6f5b 100644 --- a/resources/twig/partials/reports/bills.twig +++ b/resources/twig/partials/reports/bills.twig @@ -39,7 +39,7 @@ {% endif %} {% if line.isActive %} - {{ (line.getMax - line.getAmount)|formatAmount }} + {{ (line.getMax + line.getAmount)|formatAmount }} {% endif %} From a96e171cbf6ca2c00363e1bf5aabbaae5a71b0d6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 13:26:58 +0100 Subject: [PATCH 020/135] Update composer. --- composer.lock | 255 +++++++++++++++++++++++++++++--------------------- 1 file changed, 147 insertions(+), 108 deletions(-) diff --git a/composer.lock b/composer.lock index 91e97ac052..633e37790d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "79e0f94d7571803d13e30aa48111b1ab", + "hash": "a45c63de1cfbf08e59cf0a16c105847a", "content-hash": "968497c3098b5a38109e66c170c8becd", "packages": [ { @@ -879,7 +879,7 @@ "name": "Jeremy Lindblom", "email": "jeremeamia@gmail.com", "homepage": "https://github.com/jeremeamia", - "role": "developer" + "role": "Developer" } ], "description": "Serialize Closure objects, including their context and binding", @@ -897,16 +897,16 @@ }, { "name": "laravel/framework", - "version": "v5.1.24", + "version": "v5.1.25", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "875baf2d1645ce23e2ec0bf94fa7bb3e7fbfd6ed" + "reference": "53979acc664debc401bfcb61086c4fc4f196b22d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/875baf2d1645ce23e2ec0bf94fa7bb3e7fbfd6ed", - "reference": "875baf2d1645ce23e2ec0bf94fa7bb3e7fbfd6ed", + "url": "https://api.github.com/repos/laravel/framework/zipball/53979acc664debc401bfcb61086c4fc4f196b22d", + "reference": "53979acc664debc401bfcb61086c4fc4f196b22d", "shasum": "" }, "require": { @@ -971,7 +971,7 @@ "require-dev": { "aws/aws-sdk-php": "~3.0", "iron-io/iron_mq": "~2.0", - "mockery/mockery": "~0.9.1", + "mockery/mockery": "~0.9.2", "pda/pheanstalk": "~3.0", "phpunit/phpunit": "~4.0", "predis/predis": "~1.0" @@ -1022,7 +1022,7 @@ "framework", "laravel" ], - "time": "2015-11-11 22:45:42" + "time": "2015-11-30 19:24:36" }, { "name": "league/commonmark", @@ -1446,16 +1446,16 @@ }, { "name": "paragonie/random_compat", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "19f765b66c6fbb56ee3b11bc16d52e38eebdc295" + "reference": "a208865a5aeffc2dbbef2a5b3409887272d93f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/19f765b66c6fbb56ee3b11bc16d52e38eebdc295", - "reference": "19f765b66c6fbb56ee3b11bc16d52e38eebdc295", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/a208865a5aeffc2dbbef2a5b3409887272d93f32", + "reference": "a208865a5aeffc2dbbef2a5b3409887272d93f32", "shasum": "" }, "require": { @@ -1490,7 +1490,7 @@ "pseudorandom", "random" ], - "time": "2015-11-10 00:45:41" + "time": "2015-12-01 02:52:15" }, { "name": "psr/log", @@ -1604,23 +1604,23 @@ }, { "name": "rcrowe/twigbridge", - "version": "dev-master", + "version": "v0.7.2", "source": { "type": "git", "url": "https://github.com/rcrowe/TwigBridge.git", - "reference": "0e2693d99745eb8bbd01a80e841951c0738e1d15" + "reference": "838d9c4f1c2306dddf7609daeb6ad6429249b242" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/0e2693d99745eb8bbd01a80e841951c0738e1d15", - "reference": "0e2693d99745eb8bbd01a80e841951c0738e1d15", + "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/838d9c4f1c2306dddf7609daeb6ad6429249b242", + "reference": "838d9c4f1c2306dddf7609daeb6ad6429249b242", "shasum": "" }, "require": { "illuminate/support": "5.0.*|5.1.*", "illuminate/view": "5.0.*|5.1.*", "php": ">=5.4.0", - "twig/twig": "~1.15|~2.0" + "twig/twig": "~1.15" }, "require-dev": { "laravel/framework": "5.0.*", @@ -1664,7 +1664,7 @@ "laravel", "twig" ], - "time": "2015-05-21 13:46:00" + "time": "2015-05-17 16:02:25" }, { "name": "swiftmailer/swiftmailer", @@ -1721,16 +1721,16 @@ }, { "name": "symfony/console", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "5efd632294c8320ea52492db22292ff853a43766" + "reference": "16bb1cb86df43c90931df65f529e7ebd79636750" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", - "reference": "5efd632294c8320ea52492db22292ff853a43766", + "url": "https://api.github.com/repos/symfony/console/zipball/16bb1cb86df43c90931df65f529e7ebd79636750", + "reference": "16bb1cb86df43c90931df65f529e7ebd79636750", "shasum": "" }, "require": { @@ -1755,7 +1755,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1773,20 +1776,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-10-20 14:38:46" + "time": "2015-11-18 09:54:26" }, { "name": "symfony/css-selector", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "e1b865b26be4a56d22a8dee398375044a80c865b" + "reference": "abb47717fb88aebd9437da2fc8bb01a50a36679f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b", - "reference": "e1b865b26be4a56d22a8dee398375044a80c865b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/abb47717fb88aebd9437da2fc8bb01a50a36679f", + "reference": "abb47717fb88aebd9437da2fc8bb01a50a36679f", "shasum": "" }, "require": { @@ -1801,7 +1804,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\CssSelector\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1823,20 +1829,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" + "time": "2015-10-30 20:10:21" }, { "name": "symfony/debug", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b" + "reference": "0dbc119596f4afc82d9b2eb2a7e6a4af1ee763fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/fb9e6887db716939f41af0ba8ef38a1582eb501b", - "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b", + "url": "https://api.github.com/repos/symfony/debug/zipball/0dbc119596f4afc82d9b2eb2a7e6a4af1ee763fa", + "reference": "0dbc119596f4afc82d9b2eb2a7e6a4af1ee763fa", "shasum": "" }, "require": { @@ -1859,7 +1865,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\Debug\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1877,20 +1886,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" + "time": "2015-10-30 20:10:21" }, { "name": "symfony/dom-crawler", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612" + "reference": "b33593cbfe1d81b50d48353f338aca76a08658d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5fef7d8b80d8f9992df99d8ee283f420484c9612", - "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b33593cbfe1d81b50d48353f338aca76a08658d8", + "reference": "b33593cbfe1d81b50d48353f338aca76a08658d8", "shasum": "" }, "require": { @@ -1911,7 +1920,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\DomCrawler\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1929,20 +1941,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" + "time": "2015-11-02 20:20:53" }, { "name": "symfony/event-dispatcher", - "version": "v2.7.6", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8" + "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8", - "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a5eb815363c0388e83247e7e9853e5dbc14999cc", + "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc", "shasum": "" }, "require": { @@ -1950,10 +1962,10 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/stopwatch": "~2.3" + "symfony/config": "~2.0,>=2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" }, "suggest": { "symfony/dependency-injection": "", @@ -1962,13 +1974,16 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1986,20 +2001,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" + "time": "2015-10-30 20:15:42" }, { "name": "symfony/finder", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d" + "reference": "a06a0c0ff7db3736a50d530c908cca547bf13da9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", - "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", + "url": "https://api.github.com/repos/symfony/finder/zipball/a06a0c0ff7db3736a50d530c908cca547bf13da9", + "reference": "a06a0c0ff7db3736a50d530c908cca547bf13da9", "shasum": "" }, "require": { @@ -2014,7 +2029,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2032,20 +2050,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" + "time": "2015-10-30 20:10:21" }, { "name": "symfony/http-foundation", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "7598eea151ae3d4134df1f9957364b17809eea75" + "reference": "e83a3d105ddaf5a113e803c904fdec552d1f1c35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7598eea151ae3d4134df1f9957364b17809eea75", - "reference": "7598eea151ae3d4134df1f9957364b17809eea75", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e83a3d105ddaf5a113e803c904fdec552d1f1c35", + "reference": "e83a3d105ddaf5a113e803c904fdec552d1f1c35", "shasum": "" }, "require": { @@ -2066,6 +2084,9 @@ }, "classmap": [ "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2084,20 +2105,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2015-10-23 14:47:27" + "time": "2015-11-20 17:41:18" }, { "name": "symfony/http-kernel", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77" + "reference": "5570de31e8fbc03777a8c61eb24f9b626e5e5941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4260f2273a446a6715063dc9ca89fd0c475c2f77", - "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5570de31e8fbc03777a8c61eb24f9b626e5e5941", + "reference": "5570de31e8fbc03777a8c61eb24f9b626e5e5941", "shasum": "" }, "require": { @@ -2145,7 +2166,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\HttpKernel\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2163,20 +2187,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-10-27 19:07:21" + "time": "2015-11-23 11:57:49" }, { "name": "symfony/process", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7" + "reference": "f6290983c8725d0afa29bdc3e5295879de3e58f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7", - "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7", + "url": "https://api.github.com/repos/symfony/process/zipball/f6290983c8725d0afa29bdc3e5295879de3e58f5", + "reference": "f6290983c8725d0afa29bdc3e5295879de3e58f5", "shasum": "" }, "require": { @@ -2191,7 +2215,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2209,20 +2236,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2015-10-23 14:47:27" + "time": "2015-11-19 16:11:24" }, { "name": "symfony/routing", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "f353e1f588679c3ec987624e6c617646bd01ba38" + "reference": "7450f6196711b124fb8b04a12286d01a0401ddfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/f353e1f588679c3ec987624e6c617646bd01ba38", - "reference": "f353e1f588679c3ec987624e6c617646bd01ba38", + "url": "https://api.github.com/repos/symfony/routing/zipball/7450f6196711b124fb8b04a12286d01a0401ddfe", + "reference": "7450f6196711b124fb8b04a12286d01a0401ddfe", "shasum": "" }, "require": { @@ -2255,7 +2282,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\Routing\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2279,20 +2309,20 @@ "uri", "url" ], - "time": "2015-10-27 15:38:06" + "time": "2015-11-18 13:41:01" }, { "name": "symfony/translation", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8" + "reference": "e4ecb9c3ba1304eaf24de15c2d7a428101c1982f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/6ccd9289ec1c71d01a49d83480de3b5293ce30c8", - "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8", + "url": "https://api.github.com/repos/symfony/translation/zipball/e4ecb9c3ba1304eaf24de15c2d7a428101c1982f", + "reference": "e4ecb9c3ba1304eaf24de15c2d7a428101c1982f", "shasum": "" }, "require": { @@ -2321,7 +2351,10 @@ "autoload": { "psr-4": { "Symfony\\Component\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2339,20 +2372,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2015-10-27 15:38:06" + "time": "2015-11-18 13:41:01" }, { "name": "symfony/var-dumper", - "version": "v2.7.6", + "version": "v2.7.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "eb033050050916b6bfa51be71009ef67b16046c9" + "reference": "72bcb27411780eaee9469729aace73c0d46fb2b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/eb033050050916b6bfa51be71009ef67b16046c9", - "reference": "eb033050050916b6bfa51be71009ef67b16046c9", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72bcb27411780eaee9469729aace73c0d46fb2b8", + "reference": "72bcb27411780eaee9469729aace73c0d46fb2b8", "shasum": "" }, "require": { @@ -2373,7 +2406,10 @@ ], "psr-4": { "Symfony\\Component\\VarDumper\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2395,7 +2431,7 @@ "debug", "dump" ], - "time": "2015-10-25 17:17:38" + "time": "2015-11-18 13:41:01" }, { "name": "twig/twig", @@ -2506,16 +2542,16 @@ }, { "name": "watson/validating", - "version": "1.0.6", + "version": "1.0.7", "source": { "type": "git", "url": "https://github.com/dwightwatson/validating.git", - "reference": "3aa4c6aeb10b64e2a012c6ea4a7254233488d3f9" + "reference": "24b3b0b933180ef997d99e3c342f95955abbbdf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/validating/zipball/3aa4c6aeb10b64e2a012c6ea4a7254233488d3f9", - "reference": "3aa4c6aeb10b64e2a012c6ea4a7254233488d3f9", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/24b3b0b933180ef997d99e3c342f95955abbbdf2", + "reference": "24b3b0b933180ef997d99e3c342f95955abbbdf2", "shasum": "" }, "require": { @@ -2557,7 +2593,7 @@ "laravel", "validation" ], - "time": "2015-10-27 14:41:11" + "time": "2015-11-21 02:31:18" }, { "name": "zizaco/entrust", @@ -2852,34 +2888,37 @@ }, { "name": "symfony/class-loader", - "version": "v2.7.6", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4" + "reference": "51f83451bf0ddfc696e47e4642d6cd10fcfce160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/320f8d2a9cdbcbeb24be602c124aae9d998474a4", - "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/51f83451bf0ddfc696e47e4642d6cd10fcfce160", + "reference": "51f83451bf0ddfc696e47e4642d6cd10fcfce160", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/finder": "~2.0,>=2.0.5" + "symfony/finder": "~2.0,>=2.0.5|~3.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\ClassLoader\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2897,7 +2936,7 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2015-10-23 14:47:27" + "time": "2015-11-26 07:00:59" } ], "aliases": [], From d4e759754d7025d5546fdadd632f93989f9b165b Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Dec 2015 13:28:11 +0100 Subject: [PATCH 021/135] Make password reset impossible for blocked users. --- .../Controllers/Auth/PasswordController.php | 38 ++++++++++++++++++- resources/lang/en/passwords.php | 1 + resources/lang/nl/passwords.php | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php index 8f618f136d..7cb3706ecb 100644 --- a/app/Http/Controllers/Auth/PasswordController.php +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -2,7 +2,12 @@ use FireflyIII\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; - +use FireflyIII\User; +use Illuminate\Http\Request; +use Illuminate\Mail\Message; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Password; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class PasswordController * @@ -41,4 +46,35 @@ class PasswordController extends Controller $this->middleware('guest'); } + /** + * Send a reset link to the given user. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function postEmail(Request $request) + { + $this->validate($request, ['email' => 'required|email']); + + $user = User::whereEmail($request->get('email'))->first(); + + if (!is_null($user) && intval($user->blocked) === 1) { + $response = 'passwords.blocked'; + } else { + $response = Password::sendResetLink($request->only('email'), function (Message $message) { + $message->subject($this->getEmailSubject()); + }); + } + + switch ($response) { + case Password::RESET_LINK_SENT: + return redirect()->back()->with('status', trans($response)); + + case Password::INVALID_USER: + case 'passwords.blocked': + return redirect()->back()->withErrors(['email' => trans($response)]); + + } + } + } diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php index bdbc1cd1d7..f248128198 100644 --- a/resources/lang/en/passwords.php +++ b/resources/lang/en/passwords.php @@ -17,5 +17,6 @@ return [ "token" => "This password reset token is invalid.", "sent" => "We have e-mailed your password reset link!", "reset" => "Your password has been reset!", + 'blocked' => 'Nice try though.' ]; diff --git a/resources/lang/nl/passwords.php b/resources/lang/nl/passwords.php index b3a0582dbf..6b189b754b 100644 --- a/resources/lang/nl/passwords.php +++ b/resources/lang/nl/passwords.php @@ -17,5 +17,6 @@ return [ "token" => "Ongeldig token! Sorry", "sent" => "Je krijgt een mailtje met een linkje om je wachtwoord te herstellen!", "reset" => "Je wachtwoord is hersteld!", + 'blocked' => 'Leuk geprobeerd wel.' ]; From 56c08d8302f7de6eb8dc627e3558d92ac7b9c18c Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2015 11:17:48 +0100 Subject: [PATCH 022/135] Can block certain domains from registering, such as ten-minute-mail services. Two example domains provided in configuration. --- app/Http/Controllers/Auth/AuthController.php | 16 ++++++++++++++-- config/mail.php | 17 +++++++++-------- resources/lang/en/validation.php | 5 +++-- resources/lang/nl/validation.php | 1 + 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index 7caeb6b87d..cd84b74d15 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -14,6 +14,7 @@ use Session; use Twig; use Validator; use Log; +use Config; /** * Class AuthController @@ -88,8 +89,8 @@ class AuthController extends Controller $foundUser = User::where('email', $credentials['email'])->where('blocked', 1)->first(); if (!is_null($foundUser)) { // if it exists, show message: - $code = $foundUser->blocked_code; - if(strlen($code) == 0) { + $code = $foundUser->blocked_code; + if (strlen($code) == 0) { $code = 'general_blocked'; } $message = trans('firefly.' . $code . '_error', ['email' => $credentials['email']]); @@ -160,9 +161,20 @@ class AuthController extends Controller } // @codeCoverageIgnoreEnd + $data = $request->all(); $data['password'] = bcrypt($data['password']); + // is user email domain blocked? + $parts = explode('@', $data['email']); + if (isset($parts[1]) && in_array($parts[1], Config::get('mail.blocked_domains'))) { + + $validator->getMessageBag()->add('email', trans('validation.invalid_domain')); + $this->throwValidationException( + $request, $validator + ); + } + Auth::login($this->create($data)); // get the email address diff --git a/config/mail.php b/config/mail.php index 31c5eaa8a2..be1dda92b8 100644 --- a/config/mail.php +++ b/config/mail.php @@ -15,7 +15,8 @@ return [ | */ - 'driver' => env('EMAIL_DRIVER', 'smtp'), + 'blocked_domains' => ['trbvm.com', 'example.com'], + 'driver' => env('EMAIL_DRIVER', 'smtp'), /* |-------------------------------------------------------------------------- @@ -28,7 +29,7 @@ return [ | */ - 'host' => env('EMAIL_SMTP', 'smtp.mailgun.org'), + 'host' => env('EMAIL_SMTP', 'smtp.mailgun.org'), /* |-------------------------------------------------------------------------- @@ -41,7 +42,7 @@ return [ | */ - 'port' => 587, + 'port' => 587, /* |-------------------------------------------------------------------------- @@ -54,7 +55,7 @@ return [ | */ - 'from' => ['address' => env('EMAIL_USERNAME', null), 'name' => 'Firefly III Mailer'], + 'from' => ['address' => env('EMAIL_USERNAME', null), 'name' => 'Firefly III Mailer'], /* |-------------------------------------------------------------------------- @@ -80,7 +81,7 @@ return [ | */ - 'username' => env('EMAIL_USERNAME', null), + 'username' => env('EMAIL_USERNAME', null), /* |-------------------------------------------------------------------------- @@ -93,7 +94,7 @@ return [ | */ - 'password' => env('EMAIL_PASSWORD', null), + 'password' => env('EMAIL_PASSWORD', null), /* |-------------------------------------------------------------------------- @@ -106,7 +107,7 @@ return [ | */ - 'sendmail' => '/usr/sbin/sendmail -bs', + 'sendmail' => '/usr/sbin/sendmail -bs', /* |-------------------------------------------------------------------------- @@ -119,6 +120,6 @@ return [ | */ - 'pretend' => env('EMAIL_PRETEND', false), + 'pretend' => env('EMAIL_PRETEND', false), ]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 9aede79f7d..af5cb84b1b 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -13,6 +13,7 @@ return [ | */ + 'invalid_domain' => 'Cannot register from this domain.', 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', 'file_attached' => 'Succesfully uploaded file ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', @@ -92,7 +93,7 @@ return [ | */ - 'custom' => [ + 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], @@ -109,6 +110,6 @@ return [ | */ - 'attributes' => [], + 'attributes' => [], ]; diff --git a/resources/lang/nl/validation.php b/resources/lang/nl/validation.php index 8c8a7cfa3c..28c536cba5 100644 --- a/resources/lang/nl/validation.php +++ b/resources/lang/nl/validation.php @@ -13,6 +13,7 @@ return [ | */ + 'invalid_domain' => 'Kan niet registereren vanaf dit domein.', 'file_already_attached' => 'Het geuploade bestand ":name" is al gelinkt aan deze transactie.', 'file_attached' => 'Bestand met naam ":name" is met succes geuploaded.', 'file_invalid_mime' => 'Bestand ":name" is van het type ":mime", en die kan je niet uploaden.', From 66a4042cadbb2628eb43e3e4881f9958fddbfce1 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2015 11:25:12 +0100 Subject: [PATCH 023/135] Updated composer file. --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 633e37790d..810691d797 100644 --- a/composer.lock +++ b/composer.lock @@ -897,16 +897,16 @@ }, { "name": "laravel/framework", - "version": "v5.1.25", + "version": "v5.1.26", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "53979acc664debc401bfcb61086c4fc4f196b22d" + "reference": "be7fbb60376bd61f07e9c637473e5b2cf7eebe5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/53979acc664debc401bfcb61086c4fc4f196b22d", - "reference": "53979acc664debc401bfcb61086c4fc4f196b22d", + "url": "https://api.github.com/repos/laravel/framework/zipball/be7fbb60376bd61f07e9c637473e5b2cf7eebe5c", + "reference": "be7fbb60376bd61f07e9c637473e5b2cf7eebe5c", "shasum": "" }, "require": { @@ -980,7 +980,7 @@ "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", - "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers (~5.3|~6.0).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).", "iron-io/iron_mq": "Required to use the iron queue driver (~2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", @@ -1022,7 +1022,7 @@ "framework", "laravel" ], - "time": "2015-11-30 19:24:36" + "time": "2015-12-02 21:59:57" }, { "name": "league/commonmark", From e3b6057bf84fac3faa7fa816abd8199f85b71986 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2015 11:30:43 +0100 Subject: [PATCH 024/135] Catch Swift exceptions and do a log only (instead of crashing) because the email message isn't actually critical. --- app/Http/Controllers/Auth/AuthController.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index cd84b74d15..ca5ffcefc1 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -182,11 +182,15 @@ class AuthController extends Controller $email = Auth::user()->email; $address = route('index'); // send email. - Mail::send( - ['emails.registered-html', 'emails.registered'], ['address' => $address], function (Message $message) use ($email) { - $message->to($email, $email)->subject('Welcome to Firefly III! '); + try { + Mail::send( + ['emails.registered-html', 'emails.registered'], ['address' => $address], function (Message $message) use ($email) { + $message->to($email, $email)->subject('Welcome to Firefly III! '); + } + ); + } catch(\Swift_TransportException $e) { + Log::error($e->getMessage()); } - ); // set flash message Session::flash('success', 'You have registered successfully!'); From 8d41ff7b7912a86c9dacb26b4262c6d68341fa4b Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2015 11:41:06 +0100 Subject: [PATCH 025/135] Prev should be next. Duh. --- resources/twig/json/tour.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/twig/json/tour.twig b/resources/twig/json/tour.twig index 8b3c415190..6885268ddd 100644 --- a/resources/twig/json/tour.twig +++ b/resources/twig/json/tour.twig @@ -6,7 +6,7 @@
- +
From 1cbbf9baa4e938d92f8390a19642c9a988c2fc10 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2015 11:46:05 +0100 Subject: [PATCH 026/135] Added a missing translation. --- resources/lang/en/firefly.php | 429 +++++++++++++++++----------------- resources/lang/nl/firefly.php | 429 +++++++++++++++++----------------- 2 files changed, 430 insertions(+), 428 deletions(-) diff --git a/resources/lang/en/firefly.php b/resources/lang/en/firefly.php index 2c543fce80..bf6cbbb6d6 100644 --- a/resources/lang/en/firefly.php +++ b/resources/lang/en/firefly.php @@ -251,245 +251,246 @@ return [ 'details_for_revenue' => 'Details for revenue account ":name"', 'details_for_cash' => 'Details for cash account ":name"', - 'store_new_asset_account' => 'Store new asset account', - 'store_new_expense_account' => 'Store new expense account', - 'store_new_revenue_account' => 'Store new revenue account', + 'store_new_asset_account' => 'Store new asset account', + 'store_new_expense_account' => 'Store new expense account', + 'store_new_revenue_account' => 'Store new revenue account', - 'edit_asset_account' => 'Edit asset account ":name"', - 'edit_expense_account' => 'Edit expense account ":name"', - 'edit_revenue_account' => 'Edit revenue account ":name"', + 'edit_asset_account' => 'Edit asset account ":name"', + 'edit_expense_account' => 'Edit expense account ":name"', + 'edit_revenue_account' => 'Edit revenue account ":name"', - 'delete_asset_account' => 'Delete asset account ":name"', - 'delete_expense_account' => 'Delete expense account ":name"', - 'delete_revenue_account' => 'Delete revenue account ":name"', + 'delete_asset_account' => 'Delete asset account ":name"', + 'delete_expense_account' => 'Delete expense account ":name"', + 'delete_revenue_account' => 'Delete revenue account ":name"', - 'asset_deleted' => 'Successfully deleted asset account ":name"', - 'expense_deleted' => 'Successfully deleted expense account ":name"', - 'revenue_deleted' => 'Successfully deleted revenue account ":name"', + 'asset_deleted' => 'Successfully deleted asset account ":name"', + 'expense_deleted' => 'Successfully deleted expense account ":name"', + 'revenue_deleted' => 'Successfully deleted revenue account ":name"', - 'update_asset_account' => 'Update asset account', - 'update_expense_account' => 'Update expense account', - 'update_revenue_account' => 'Update revenue account', + 'update_asset_account' => 'Update asset account', + 'update_expense_account' => 'Update expense account', + 'update_revenue_account' => 'Update revenue account', - 'make_new_asset_account' => 'Create a new asset account', - 'make_new_expense_account' => 'Create a new expense account', - 'make_new_revenue_account' => 'Create a new revenue account', + 'make_new_asset_account' => 'Create a new asset account', + 'make_new_expense_account' => 'Create a new expense account', + 'make_new_revenue_account' => 'Create a new revenue account', - 'asset_accounts' => 'Asset accounts', - 'expense_accounts' => 'Expense accounts', - 'revenue_accounts' => 'Revenue accounts', + 'asset_accounts' => 'Asset accounts', + 'expense_accounts' => 'Expense accounts', + 'revenue_accounts' => 'Revenue accounts', - 'accountExtraHelp_asset' => '', - 'accountExtraHelp_expense' => '', - 'accountExtraHelp_revenue' => '', - 'account_type' => 'Account type', - 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:', + 'accountExtraHelp_asset' => '', + 'accountExtraHelp_expense' => '', + 'accountExtraHelp_revenue' => '', + 'account_type' => 'Account type', + 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:', // categories: - 'new_category' => 'New category', - 'create_new_category' => 'Create a new category', - 'without_category' => 'Without a category', - 'update_category' => 'Wijzig categorie', - 'categories' => 'Categories', - 'edit_category' => 'Edit category ":name"', - 'no_category' => '(no category)', - 'category' => 'Category', - 'delete_category' => 'Delete category ":name"', - 'store_category' => 'Store new category', + 'new_category' => 'New category', + 'create_new_category' => 'Create a new category', + 'without_category' => 'Without a category', + 'update_category' => 'Wijzig categorie', + 'categories' => 'Categories', + 'edit_category' => 'Edit category ":name"', + 'no_category' => '(no category)', + 'category' => 'Category', + 'delete_category' => 'Delete category ":name"', + 'store_category' => 'Store new category', // transactions: - 'update_withdrawal' => 'Update withdrawal', - 'update_deposit' => 'Update deposit', - 'update_transfer' => 'Update transfer', - 'delete_withdrawal' => 'Delete withdrawal ":description"', - 'delete_deposit' => 'Delete deposit ":description"', - 'delete_transfer' => 'Delete transfer ":description"', + 'update_withdrawal' => 'Update withdrawal', + 'update_deposit' => 'Update deposit', + 'update_transfer' => 'Update transfer', + 'delete_withdrawal' => 'Delete withdrawal ":description"', + 'delete_deposit' => 'Delete deposit ":description"', + 'delete_transfer' => 'Delete transfer ":description"', // new user: - 'welcome' => 'Welcome to Firefly!', - 'createNewAsset' => 'Create a new asset account to get started. ' . - 'This will allow you to create transactions and start your financial management', - 'createNewAssetButton' => 'Create new asset account', + 'welcome' => 'Welcome to Firefly!', + 'createNewAsset' => 'Create a new asset account to get started. ' . + 'This will allow you to create transactions and start your financial management', + 'createNewAssetButton' => 'Create new asset account', // home page: - 'yourAccounts' => 'Your accounts', - 'budgetsAndSpending' => 'Budgets and spending', - 'savings' => 'Savings', - 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', - 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', - 'newWithdrawal' => 'New expense', - 'newDeposit' => 'New deposit', - 'newTransfer' => 'New transfer', - 'moneyIn' => 'Money in', - 'moneyOut' => 'Money out', - 'billsToPay' => 'Bills to pay', - 'billsPaid' => 'Bills paid', - 'viewDetails' => 'View details', - 'divided' => 'divided', - 'toDivide' => 'left to divide', + 'yourAccounts' => 'Your accounts', + 'budgetsAndSpending' => 'Budgets and spending', + 'savings' => 'Savings', + 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', + 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', + 'newWithdrawal' => 'New expense', + 'newDeposit' => 'New deposit', + 'newTransfer' => 'New transfer', + 'moneyIn' => 'Money in', + 'moneyOut' => 'Money out', + 'billsToPay' => 'Bills to pay', + 'billsPaid' => 'Bills paid', + 'viewDetails' => 'View details', + 'divided' => 'divided', + 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: - 'toggleNavigation' => 'Toggle navigation', - 'currency' => 'Currency', - 'preferences' => 'Preferences', - 'logout' => 'Logout', - 'searchPlaceholder' => 'Search...', - 'dashboard' => 'Dashboard', - 'currencies' => 'Currencies', - 'accounts' => 'Accounts', - 'Asset account' => 'Asset account', - 'Default account' => 'Asset account', - 'Expense account' => 'Expense account', - 'Revenue account' => 'Revenue account', - 'budgets' => 'Budgets', - 'tags' => 'Tags', - 'reports' => 'Reports', - 'transactions' => 'Transactions', - 'expenses' => 'Expenses', - 'income' => 'Revenue / income', - 'transfers' => 'Transfers', - 'moneyManagement' => 'Money management', - 'piggyBanks' => 'Piggy banks', - 'bills' => 'Bills', - 'createNew' => 'Create new', - 'withdrawal' => 'Withdrawal', - 'deposit' => 'Deposit', - 'account' => 'Account', - 'transfer' => 'Transfer', - 'Withdrawal' => 'Withdrawal', - 'Deposit' => 'Deposit', - 'Transfer' => 'Transfer', - 'bill' => 'Bill', - 'yes' => 'Yes', - 'no' => 'No', - 'amount' => 'Amount', - 'newBalance' => 'New balance', - 'overview' => 'Overview', - 'saveOnAccount' => 'Save on account', - 'unknown' => 'Unknown', - 'daily' => 'Daily', - 'weekly' => 'Weekly', - 'monthly' => 'Monthly', - 'quarterly' => 'Quarterly', - 'half-year' => 'Every six months', - 'yearly' => 'Yearly', - 'profile' => 'Profile', + 'toggleNavigation' => 'Toggle navigation', + 'currency' => 'Currency', + 'preferences' => 'Preferences', + 'logout' => 'Logout', + 'searchPlaceholder' => 'Search...', + 'dashboard' => 'Dashboard', + 'currencies' => 'Currencies', + 'accounts' => 'Accounts', + 'Asset account' => 'Asset account', + 'Default account' => 'Asset account', + 'Expense account' => 'Expense account', + 'Revenue account' => 'Revenue account', + 'Initial balance account' => 'Initial balance account', + 'budgets' => 'Budgets', + 'tags' => 'Tags', + 'reports' => 'Reports', + 'transactions' => 'Transactions', + 'expenses' => 'Expenses', + 'income' => 'Revenue / income', + 'transfers' => 'Transfers', + 'moneyManagement' => 'Money management', + 'piggyBanks' => 'Piggy banks', + 'bills' => 'Bills', + 'createNew' => 'Create new', + 'withdrawal' => 'Withdrawal', + 'deposit' => 'Deposit', + 'account' => 'Account', + 'transfer' => 'Transfer', + 'Withdrawal' => 'Withdrawal', + 'Deposit' => 'Deposit', + 'Transfer' => 'Transfer', + 'bill' => 'Bill', + 'yes' => 'Yes', + 'no' => 'No', + 'amount' => 'Amount', + 'newBalance' => 'New balance', + 'overview' => 'Overview', + 'saveOnAccount' => 'Save on account', + 'unknown' => 'Unknown', + 'daily' => 'Daily', + 'weekly' => 'Weekly', + 'monthly' => 'Monthly', + 'quarterly' => 'Quarterly', + 'half-year' => 'Every six months', + 'yearly' => 'Yearly', + 'profile' => 'Profile', // reports: - 'reportForYear' => 'Yearly report for :year', - 'reportForYearShared' => 'Yearly report for :year (including shared accounts)', - 'reportForMonth' => 'Montly report for :month', - 'reportForMonthShared' => 'Montly report for :month (including shared accounts)', - 'incomeVsExpenses' => 'Income vs. expenses', - 'accountBalances' => 'Account balances', - 'balanceStartOfYear' => 'Balance at start of year', - 'balanceEndOfYear' => 'Balance at end of year', - 'balanceStartOfMonth' => 'Balance at start of month', - 'balanceEndOfMonth' => 'Balance at end of month', - 'balanceStart' => 'Balance at start of period', - 'balanceEnd' => 'Balance at end of period', - 'reportsOwnAccounts' => 'Reports for your own accounts', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', - 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', - 'coveredWithTags' => 'Covered with tags', - 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Expected balance', - 'outsideOfBudgets' => 'Outside of budgets', - 'leftInBudget' => 'Left in budget', - 'sumOfSums' => 'Sum of sums', - 'notCharged' => 'Not charged (yet)', - 'inactive' => 'Inactive', - 'difference' => 'Difference', - 'in' => 'In', - 'out' => 'Out', - 'topX' => 'top :number', - 'showTheRest' => 'Show everything', - 'hideTheRest' => 'Show only the top :number', - 'sum_of_year' => 'Sum of year', - 'average_of_year' => 'Average of year', - 'categories_earned_in_year' => 'Categories (by earnings)', - 'categories_spent_in_year' => 'Categories (by spendings)', + 'reportForYear' => 'Yearly report for :year', + 'reportForYearShared' => 'Yearly report for :year (including shared accounts)', + 'reportForMonth' => 'Montly report for :month', + 'reportForMonthShared' => 'Montly report for :month (including shared accounts)', + 'incomeVsExpenses' => 'Income vs. expenses', + 'accountBalances' => 'Account balances', + 'balanceStartOfYear' => 'Balance at start of year', + 'balanceEndOfYear' => 'Balance at end of year', + 'balanceStartOfMonth' => 'Balance at start of month', + 'balanceEndOfMonth' => 'Balance at end of month', + 'balanceStart' => 'Balance at start of period', + 'balanceEnd' => 'Balance at end of period', + 'reportsOwnAccounts' => 'Reports for your own accounts', + 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', + 'splitByAccount' => 'Split by account', + 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', + 'coveredWithTags' => 'Covered with tags', + 'leftUnbalanced' => 'Left unbalanced', + 'expectedBalance' => 'Expected balance', + 'outsideOfBudgets' => 'Outside of budgets', + 'leftInBudget' => 'Left in budget', + 'sumOfSums' => 'Sum of sums', + 'notCharged' => 'Not charged (yet)', + 'inactive' => 'Inactive', + 'difference' => 'Difference', + 'in' => 'In', + 'out' => 'Out', + 'topX' => 'top :number', + 'showTheRest' => 'Show everything', + 'hideTheRest' => 'Show only the top :number', + 'sum_of_year' => 'Sum of year', + 'average_of_year' => 'Average of year', + 'categories_earned_in_year' => 'Categories (by earnings)', + 'categories_spent_in_year' => 'Categories (by spendings)', // charts: - 'dayOfMonth' => 'Day of the month', - 'month' => 'Month', - 'budget' => 'Budget', - 'spent' => 'Spent', - 'earned' => 'Earned', - 'overspent' => 'Overspent', - 'left' => 'Left', - 'noBudget' => '(no budget)', - 'maxAmount' => 'Maximum amount', - 'minAmount' => 'Minumum amount', - 'billEntry' => 'Current bill entry', - 'name' => 'Name', - 'date' => 'Date', - 'paid' => 'Paid', - 'unpaid' => 'Unpaid', - 'day' => 'Day', - 'budgeted' => 'Budgeted', - 'period' => 'Period', - 'balance' => 'Balance', - 'summary' => 'Summary', - 'sum' => 'Sum', - 'average' => 'Average', - 'balanceFor' => 'Balance for :name', + 'dayOfMonth' => 'Day of the month', + 'month' => 'Month', + 'budget' => 'Budget', + 'spent' => 'Spent', + 'earned' => 'Earned', + 'overspent' => 'Overspent', + 'left' => 'Left', + 'noBudget' => '(no budget)', + 'maxAmount' => 'Maximum amount', + 'minAmount' => 'Minumum amount', + 'billEntry' => 'Current bill entry', + 'name' => 'Name', + 'date' => 'Date', + 'paid' => 'Paid', + 'unpaid' => 'Unpaid', + 'day' => 'Day', + 'budgeted' => 'Budgeted', + 'period' => 'Period', + 'balance' => 'Balance', + 'summary' => 'Summary', + 'sum' => 'Sum', + 'average' => 'Average', + 'balanceFor' => 'Balance for :name', // piggy banks: - 'piggy_bank' => 'Piggy bank', - 'new_piggy_bank' => 'Create new piggy bank', - 'store_piggy_bank' => 'Store new piggy bank', - 'account_status' => 'Account status', - 'left_for_piggy_banks' => 'Left for piggy banks', - 'sum_of_piggy_banks' => 'Sum of piggy banks', - 'saved_so_far' => 'Saved so far', - 'left_to_save' => 'Left to save', - 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', - 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', - 'add' => 'Add', - 'remove' => 'Remove', - 'max_amount_add' => 'The maximum amount you can add is', - 'max_amount_remove' => 'The maximum amount you can remove is', - 'update_piggy_button' => 'Update piggy bank', - 'update_piggy_title' => 'Update piggy bank ":name"', - 'details' => 'Details', - 'events' => 'Events', - 'target_amount' => 'Target amount', - 'start_date' => 'Start date', - 'target_date' => 'Target date', - 'no_target_date' => 'No target date', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - 'delete_piggy_bank' => 'Delete piggy bank ":name"', + 'piggy_bank' => 'Piggy bank', + 'new_piggy_bank' => 'Create new piggy bank', + 'store_piggy_bank' => 'Store new piggy bank', + 'account_status' => 'Account status', + 'left_for_piggy_banks' => 'Left for piggy banks', + 'sum_of_piggy_banks' => 'Sum of piggy banks', + 'saved_so_far' => 'Saved so far', + 'left_to_save' => 'Left to save', + 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', + 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', + 'add' => 'Add', + 'remove' => 'Remove', + 'max_amount_add' => 'The maximum amount you can add is', + 'max_amount_remove' => 'The maximum amount you can remove is', + 'update_piggy_button' => 'Update piggy bank', + 'update_piggy_title' => 'Update piggy bank ":name"', + 'details' => 'Details', + 'events' => 'Events', + 'target_amount' => 'Target amount', + 'start_date' => 'Start date', + 'target_date' => 'Target date', + 'no_target_date' => 'No target date', + 'todo' => 'to do', + 'table' => 'Table', + 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', + 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', + 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', + 'delete_piggy_bank' => 'Delete piggy bank ":name"', // tags - 'regular_tag' => 'Just a regular tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', + 'regular_tag' => 'Just a regular tag.', + 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', + 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', - 'delete_tag' => 'Delete tag ":tag"', - 'new_tag' => 'Make new tag', - 'edit_tag' => 'Edit tag ":tag"', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment tags', - 'tags_introduction' => 'Usually tags are singular words, designed to quickly band items together using things like' . - ' expensive, bill' . - ' or for-party. In Firefly III, tags can have more properties' . - ' such as a date, description and location. This allows you to join transactions together in a more' . - ' meaningful way. For example, you could make a tag called ' . - 'Christmas dinner with friends and add information about the restaurant. Such tags are "singular",' . - ' you would only use them for a single occasion, perhaps with multiple transactions.', - 'tags_group' => 'Tags group transactions together, which makes it possible to store reimbursements (in case you front money' . - ' for others) and other "balancing acts" where expenses are summed up (the payments on your new TV) or where ' . - 'expenses and deposits are cancelling each other out (buying something with saved money). It\'s all up to you.' . - ' Using tags the old-fashioned way is of course always possible. ', - 'tags_start' => 'Create a tag to get started or enter tags when creating new transactions.', + 'delete_tag' => 'Delete tag ":tag"', + 'new_tag' => 'Make new tag', + 'edit_tag' => 'Edit tag ":tag"', + 'no_year' => 'No year set', + 'no_month' => 'No month set', + 'tag_title_nothing' => 'Default tags', + 'tag_title_balancingAct' => 'Balancing act tags', + 'tag_title_advancePayment' => 'Advance payment tags', + 'tags_introduction' => 'Usually tags are singular words, designed to quickly band items together using things like' . + ' expensive, bill' . + ' or for-party. In Firefly III, tags can have more properties' . + ' such as a date, description and location. This allows you to join transactions together in a more' . + ' meaningful way. For example, you could make a tag called ' . + 'Christmas dinner with friends and add information about the restaurant. Such tags are "singular",' . + ' you would only use them for a single occasion, perhaps with multiple transactions.', + 'tags_group' => 'Tags group transactions together, which makes it possible to store reimbursements (in case you front money' . + ' for others) and other "balancing acts" where expenses are summed up (the payments on your new TV) or where ' . + 'expenses and deposits are cancelling each other out (buying something with saved money). It\'s all up to you.' . + ' Using tags the old-fashioned way is of course always possible. ', + 'tags_start' => 'Create a tag to get started or enter tags when creating new transactions.', ]; diff --git a/resources/lang/nl/firefly.php b/resources/lang/nl/firefly.php index f8dbfa977e..c689f0ce22 100644 --- a/resources/lang/nl/firefly.php +++ b/resources/lang/nl/firefly.php @@ -253,249 +253,250 @@ return [ 'details_for_revenue' => 'Overzicht voor debiteur ":name"', 'details_for_cash' => 'Overzicht voor contant geldrekening ":name"', - 'store_new_asset_account' => 'Sla nieuwe betaalrekening op', - 'store_new_expense_account' => 'Sla nieuwe crediteur op', - 'store_new_revenue_account' => 'Sla nieuwe debiteur op', + 'store_new_asset_account' => 'Sla nieuwe betaalrekening op', + 'store_new_expense_account' => 'Sla nieuwe crediteur op', + 'store_new_revenue_account' => 'Sla nieuwe debiteur op', - 'edit_asset_account' => 'Wijzig betaalrekening ":name"', - 'edit_expense_account' => 'Wijzig crediteur ":name"', - 'edit_revenue_account' => 'Wijzig debiteur ":name"', + 'edit_asset_account' => 'Wijzig betaalrekening ":name"', + 'edit_expense_account' => 'Wijzig crediteur ":name"', + 'edit_revenue_account' => 'Wijzig debiteur ":name"', - 'delete_asset_account' => 'Verwijder betaalrekening ":name"', - 'delete_expense_account' => 'Verwijder crediteur ":name"', - 'delete_revenue_account' => 'Verwijder debiteur ":name"', + 'delete_asset_account' => 'Verwijder betaalrekening ":name"', + 'delete_expense_account' => 'Verwijder crediteur ":name"', + 'delete_revenue_account' => 'Verwijder debiteur ":name"', - 'asset_deleted' => 'Betaalrekening ":name" is verwijderd.', - 'expense_deleted' => 'Crediteur ":name" is verwijderd.', - 'revenue_deleted' => 'Debiteur ":name" is verwijderd.', + 'asset_deleted' => 'Betaalrekening ":name" is verwijderd.', + 'expense_deleted' => 'Crediteur ":name" is verwijderd.', + 'revenue_deleted' => 'Debiteur ":name" is verwijderd.', - 'update_asset_account' => 'Wijzig betaalrekening', - 'update_expense_account' => 'Wijzig crediteur', - 'update_revenue_account' => 'Wijzig debiteur', + 'update_asset_account' => 'Wijzig betaalrekening', + 'update_expense_account' => 'Wijzig crediteur', + 'update_revenue_account' => 'Wijzig debiteur', - 'make_new_asset_account' => 'Nieuwe betaalrekening', - 'make_new_expense_account' => 'Nieuwe crediteur', - 'make_new_revenue_account' => 'Nieuwe debiteur', + 'make_new_asset_account' => 'Nieuwe betaalrekening', + 'make_new_expense_account' => 'Nieuwe crediteur', + 'make_new_revenue_account' => 'Nieuwe debiteur', - 'asset_accounts' => 'Betaalrekeningen', - 'expense_accounts' => 'Crediteuren', - 'revenue_accounts' => 'Debiteuren', - 'account_type' => 'Account type', + 'asset_accounts' => 'Betaalrekeningen', + 'expense_accounts' => 'Crediteuren', + 'revenue_accounts' => 'Debiteuren', + 'account_type' => 'Account type', // some extra help: - 'accountExtraHelp_asset' => '', - 'accountExtraHelp_expense' => + 'accountExtraHelp_asset' => '', + 'accountExtraHelp_expense' => 'Een crediteur is een persoon of een bedrijf waar je geld aan moet betalen. Je staat bij ze in het krijt. Een verwarrende' . ' term misschien, maar zo werkt het nou eenmaal. De supermarkt, je huurbaas of de bank zijn crediteuren. Jouw ' . 'geld (krediet) gaat naar hen toe. De term komt uit de wereld van de boekhouding. De uitgaves die je hier ziet zijn ' . 'positief, want je kijkt uit hun perspectief. Zodra jij afrekent in een winkel, komt het geld er bij hen bij (positief).', - 'accountExtraHelp_revenue' => 'Als je geld krijgt van een bedrijf of een persoon is dat een debiteur. ' . - 'Dat kan salaris zijn, of een andere betaling. ' . - ' Ze hebben een schuld (debet) aan jou. De term komt uit de wereld van de boekhouding.' . - ' De inkomsten die je hier ziet zijn negatief, want je kijkt uit hun perspectief. Zodra een debiteur geld naar jou ' . - 'overmaakt gaat het er bij hen af (negatief).', - 'save_transactions_by_moving' => 'Bewaar deze transacties door ze aan een andere rekening te koppelen:', + 'accountExtraHelp_revenue' => 'Als je geld krijgt van een bedrijf of een persoon is dat een debiteur. ' . + 'Dat kan salaris zijn, of een andere betaling. ' . + ' Ze hebben een schuld (debet) aan jou. De term komt uit de wereld van de boekhouding.' . + ' De inkomsten die je hier ziet zijn negatief, want je kijkt uit hun perspectief. Zodra een debiteur geld naar jou ' . + 'overmaakt gaat het er bij hen af (negatief).', + 'save_transactions_by_moving' => 'Bewaar deze transacties door ze aan een andere rekening te koppelen:', // categories: - 'new_category' => 'Nieuwe categorie', - 'create_new_category' => 'Nieuwe categorie', - 'without_category' => 'Zonder categorie', - 'update_category' => 'Wijzig categorie', - 'edit_category' => 'Wijzig categorie ":name"', - 'categories' => 'Categorieën', - 'no_category' => '(geen categorie)', - 'category' => 'Categorie', - 'delete_category' => 'Verwijder categorie ":name"', - 'store_category' => 'Sla nieuwe categorie op', + 'new_category' => 'Nieuwe categorie', + 'create_new_category' => 'Nieuwe categorie', + 'without_category' => 'Zonder categorie', + 'update_category' => 'Wijzig categorie', + 'edit_category' => 'Wijzig categorie ":name"', + 'categories' => 'Categorieën', + 'no_category' => '(geen categorie)', + 'category' => 'Categorie', + 'delete_category' => 'Verwijder categorie ":name"', + 'store_category' => 'Sla nieuwe categorie op', // transactions: - 'update_withdrawal' => 'Wijzig uitgave', - 'update_deposit' => 'Wijzig inkomsten', - 'update_transfer' => 'Wijzig overschrijving', - 'delete_withdrawal' => 'Verwijder uitgave ":description"', - 'delete_deposit' => 'Verwijder inkomsten ":description"', - 'delete_transfer' => 'Verwijder overschrijving ":description"', + 'update_withdrawal' => 'Wijzig uitgave', + 'update_deposit' => 'Wijzig inkomsten', + 'update_transfer' => 'Wijzig overschrijving', + 'delete_withdrawal' => 'Verwijder uitgave ":description"', + 'delete_deposit' => 'Verwijder inkomsten ":description"', + 'delete_transfer' => 'Verwijder overschrijving ":description"', // new user: - 'welcome' => 'Welkom bij Firefly!', - 'createNewAsset' => 'Maak om te beginnen een nieuwe betaalrekening. Dit is je start van je financiële beheer.', - 'createNewAssetButton' => 'Maak een nieuwe betaalrekening', + 'welcome' => 'Welkom bij Firefly!', + 'createNewAsset' => 'Maak om te beginnen een nieuwe betaalrekening. Dit is je start van je financiële beheer.', + 'createNewAssetButton' => 'Maak een nieuwe betaalrekening', // home page: - 'yourAccounts' => 'Je betaalrekeningen', - 'budgetsAndSpending' => 'Budgetten en uitgaven', - 'savings' => 'Sparen', - 'markAsSavingsToContinue' => 'Om hier wat te zien stel je je betaalrekeningen in als "spaarrekening".', - 'createPiggyToContinue' => 'Maak spaarpotjes om hier iets te zien.', - 'newWithdrawal' => 'Nieuwe uitgave', - 'newDeposit' => 'Nieuwe inkomsten', - 'newTransfer' => 'Nieuwe overschrijving', - 'moneyIn' => 'Inkomsten', - 'moneyOut' => 'Uitgaven', - 'billsToPay' => 'Openstaande contracten', - 'billsPaid' => 'Betaalde contracten', - 'viewDetails' => 'Meer info', - 'divided' => 'verdeeld', - 'toDivide' => 'te verdelen', + 'yourAccounts' => 'Je betaalrekeningen', + 'budgetsAndSpending' => 'Budgetten en uitgaven', + 'savings' => 'Sparen', + 'markAsSavingsToContinue' => 'Om hier wat te zien stel je je betaalrekeningen in als "spaarrekening".', + 'createPiggyToContinue' => 'Maak spaarpotjes om hier iets te zien.', + 'newWithdrawal' => 'Nieuwe uitgave', + 'newDeposit' => 'Nieuwe inkomsten', + 'newTransfer' => 'Nieuwe overschrijving', + 'moneyIn' => 'Inkomsten', + 'moneyOut' => 'Uitgaven', + 'billsToPay' => 'Openstaande contracten', + 'billsPaid' => 'Betaalde contracten', + 'viewDetails' => 'Meer info', + 'divided' => 'verdeeld', + 'toDivide' => 'te verdelen', // menu and titles, should be recycled as often as possible: - 'toggleNavigation' => 'Navigatie aan of uit', - 'currency' => 'Valuta', - 'preferences' => 'Voorkeuren', - 'logout' => 'Uitloggen', - 'searchPlaceholder' => 'Zoeken...', - 'dashboard' => 'Dashboard', - 'currencies' => 'Valuta', - 'accounts' => 'Rekeningen', - 'Asset account' => 'Betaalrekening', - 'Default account' => 'Betaalrekening', - 'Expense account' => 'Crediteur', - 'Revenue account' => 'Debiteur', - 'budgets' => 'Budgetten', - 'tags' => 'Tags', - 'reports' => 'Overzichten', - 'transactions' => 'Transacties', - 'expenses' => 'Uitgaven', - 'income' => 'Inkomsten', - 'transfers' => 'Overschrijvingen', - 'moneyManagement' => 'Geldbeheer', - 'piggyBanks' => 'Spaarpotjes', - 'bills' => 'Contracten', - 'createNew' => 'Nieuw', - 'withdrawal' => 'Uitgave', - 'deposit' => 'Inkomsten', - 'account' => 'Rekening', - 'transfer' => 'Overschrijving', - 'Withdrawal' => 'Uitgave', - 'Deposit' => 'Inkomsten', - 'Transfer' => 'Overschrijving', - 'profile' => 'Profiel', - 'bill' => 'Contract', - 'yes' => 'Ja', - 'no' => 'Nee', - 'amount' => 'Bedrag', - 'newBalance' => 'Nieuw saldo', - 'overview' => 'Overzicht', - 'saveOnAccount' => 'Sparen op rekening', - 'unknown' => 'Onbekend', - 'daily' => 'Dagelijks', - 'weekly' => 'Wekelijks', - 'monthly' => 'Maandelijks', - 'quarterly' => 'Elk kwartaal', - 'half-year' => 'Elk half jaar', - 'yearly' => 'Jaarlijks', - 'sum_of_year' => 'Som van jaar', - 'average_of_year' => 'Gemiddelde in jaar', + 'toggleNavigation' => 'Navigatie aan of uit', + 'currency' => 'Valuta', + 'preferences' => 'Voorkeuren', + 'logout' => 'Uitloggen', + 'searchPlaceholder' => 'Zoeken...', + 'dashboard' => 'Dashboard', + 'currencies' => 'Valuta', + 'accounts' => 'Rekeningen', + 'Asset account' => 'Betaalrekening', + 'Default account' => 'Betaalrekening', + 'Expense account' => 'Crediteur', + 'Revenue account' => 'Debiteur', + 'Initial balance account' => 'Startbalansrekening', + 'budgets' => 'Budgetten', + 'tags' => 'Tags', + 'reports' => 'Overzichten', + 'transactions' => 'Transacties', + 'expenses' => 'Uitgaven', + 'income' => 'Inkomsten', + 'transfers' => 'Overschrijvingen', + 'moneyManagement' => 'Geldbeheer', + 'piggyBanks' => 'Spaarpotjes', + 'bills' => 'Contracten', + 'createNew' => 'Nieuw', + 'withdrawal' => 'Uitgave', + 'deposit' => 'Inkomsten', + 'account' => 'Rekening', + 'transfer' => 'Overschrijving', + 'Withdrawal' => 'Uitgave', + 'Deposit' => 'Inkomsten', + 'Transfer' => 'Overschrijving', + 'profile' => 'Profiel', + 'bill' => 'Contract', + 'yes' => 'Ja', + 'no' => 'Nee', + 'amount' => 'Bedrag', + 'newBalance' => 'Nieuw saldo', + 'overview' => 'Overzicht', + 'saveOnAccount' => 'Sparen op rekening', + 'unknown' => 'Onbekend', + 'daily' => 'Dagelijks', + 'weekly' => 'Wekelijks', + 'monthly' => 'Maandelijks', + 'quarterly' => 'Elk kwartaal', + 'half-year' => 'Elk half jaar', + 'yearly' => 'Jaarlijks', + 'sum_of_year' => 'Som van jaar', + 'average_of_year' => 'Gemiddelde in jaar', // reports: - 'reportForYear' => 'Jaaroverzicht :year', - 'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)', - 'reportForMonth' => 'Maandoverzicht voor :month', - 'reportForMonthShared' => 'Maandoverzicht voor :month (inclusief gedeelde rekeningen)', - 'incomeVsExpenses' => 'Inkomsten tegenover uitgaven', - 'accountBalances' => 'Rekeningsaldi', - 'balanceStartOfYear' => 'Saldo aan het begin van het jaar', - 'balanceEndOfYear' => 'Saldo aan het einde van het jaar', - 'balanceStartOfMonth' => 'Saldo aan het begin van de maand', - 'balanceEndOfMonth' => 'Saldo aan het einde van de maand', - 'balanceStart' => 'Saldo aan het begin van de periode', - 'balanceEnd' => 'Saldo aan het einde van de periode', - 'reportsOwnAccounts' => 'Overzichten voor je eigen betaalrekeningen', - 'reportsOwnAccountsAndShared' => 'Overzichten voor je eigen betaalrekeningen en gedeelde rekeningen', - 'splitByAccount' => 'Per betaalrekening', - 'balancedByTransfersAndTags' => 'Gecorrigeerd met overschrijvingen en tags', - 'coveredWithTags' => 'Gecorrigeerd met tags', - 'leftUnbalanced' => 'Ongecorrigeerd', - 'expectedBalance' => 'Verwacht saldo', - 'outsideOfBudgets' => 'Buiten budgetten', - 'leftInBudget' => 'Over van budget', - 'sumOfSums' => 'Alles bij elkaar', - 'notCharged' => '(Nog) niet betaald', - 'inactive' => 'Niet actief', - 'difference' => 'Verschil', - 'in' => 'In', - 'out' => 'Uit', - 'topX' => 'top :number', - 'showTheRest' => 'Laat alles zien', - 'hideTheRest' => 'Laat alleen de top :number zien', - 'categories_earned_in_year' => 'Categorieën (inkomsten)', - 'categories_spent_in_year' => 'Categorieën (uitgaven)', + 'reportForYear' => 'Jaaroverzicht :year', + 'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)', + 'reportForMonth' => 'Maandoverzicht voor :month', + 'reportForMonthShared' => 'Maandoverzicht voor :month (inclusief gedeelde rekeningen)', + 'incomeVsExpenses' => 'Inkomsten tegenover uitgaven', + 'accountBalances' => 'Rekeningsaldi', + 'balanceStartOfYear' => 'Saldo aan het begin van het jaar', + 'balanceEndOfYear' => 'Saldo aan het einde van het jaar', + 'balanceStartOfMonth' => 'Saldo aan het begin van de maand', + 'balanceEndOfMonth' => 'Saldo aan het einde van de maand', + 'balanceStart' => 'Saldo aan het begin van de periode', + 'balanceEnd' => 'Saldo aan het einde van de periode', + 'reportsOwnAccounts' => 'Overzichten voor je eigen betaalrekeningen', + 'reportsOwnAccountsAndShared' => 'Overzichten voor je eigen betaalrekeningen en gedeelde rekeningen', + 'splitByAccount' => 'Per betaalrekening', + 'balancedByTransfersAndTags' => 'Gecorrigeerd met overschrijvingen en tags', + 'coveredWithTags' => 'Gecorrigeerd met tags', + 'leftUnbalanced' => 'Ongecorrigeerd', + 'expectedBalance' => 'Verwacht saldo', + 'outsideOfBudgets' => 'Buiten budgetten', + 'leftInBudget' => 'Over van budget', + 'sumOfSums' => 'Alles bij elkaar', + 'notCharged' => '(Nog) niet betaald', + 'inactive' => 'Niet actief', + 'difference' => 'Verschil', + 'in' => 'In', + 'out' => 'Uit', + 'topX' => 'top :number', + 'showTheRest' => 'Laat alles zien', + 'hideTheRest' => 'Laat alleen de top :number zien', + 'categories_earned_in_year' => 'Categorieën (inkomsten)', + 'categories_spent_in_year' => 'Categorieën (uitgaven)', // charts: - 'dayOfMonth' => 'Dag vd maand', - 'month' => 'Maand', - 'budget' => 'Budget', - 'spent' => 'Uitgegeven', - 'earned' => 'Verdiend', - 'overspent' => 'Teveel uitgegeven', - 'left' => 'Over', - 'noBudget' => '(geen budget)', - 'maxAmount' => 'Maximaal bedrag', - 'minAmount' => 'Minimaal bedrag', - 'billEntry' => 'Bedrag voor dit contract', - 'name' => 'Naam', - 'date' => 'Datum', - 'paid' => 'Betaald', - 'unpaid' => 'Niet betaald', - 'day' => 'Dag', - 'budgeted' => 'Gebudgetteerd', - 'period' => 'Periode', - 'balance' => 'Saldo', - 'summary' => 'Samenvatting', - 'sum' => 'Som', - 'average' => 'Gemiddeld', - 'balanceFor' => 'Saldo op :name', + 'dayOfMonth' => 'Dag vd maand', + 'month' => 'Maand', + 'budget' => 'Budget', + 'spent' => 'Uitgegeven', + 'earned' => 'Verdiend', + 'overspent' => 'Teveel uitgegeven', + 'left' => 'Over', + 'noBudget' => '(geen budget)', + 'maxAmount' => 'Maximaal bedrag', + 'minAmount' => 'Minimaal bedrag', + 'billEntry' => 'Bedrag voor dit contract', + 'name' => 'Naam', + 'date' => 'Datum', + 'paid' => 'Betaald', + 'unpaid' => 'Niet betaald', + 'day' => 'Dag', + 'budgeted' => 'Gebudgetteerd', + 'period' => 'Periode', + 'balance' => 'Saldo', + 'summary' => 'Samenvatting', + 'sum' => 'Som', + 'average' => 'Gemiddeld', + 'balanceFor' => 'Saldo op :name', // piggy banks: - 'piggy_bank' => 'Spaarpotje', - 'new_piggy_bank' => 'Nieuw spaarpotje', - 'store_piggy_bank' => 'Sla spaarpotje op', - 'account_status' => 'Rekeningoverzicht', - 'left_for_piggy_banks' => 'Over voor spaarpotjes', - 'sum_of_piggy_banks' => 'Som van spaarpotjes', - 'saved_so_far' => 'Gespaard', - 'left_to_save' => 'Te sparen', - 'add_money_to_piggy_title' => 'Stop geld in spaarpotje ":name"', - 'remove_money_from_piggy_title' => 'Haal geld uit spaarpotje ":name"', - 'add' => 'Toevoegen', - 'remove' => 'Verwijderen', - 'max_amount_add' => 'Hooguit toe te voegen', - 'max_amount_remove' => 'Hooguit te verwijderen', - 'update_piggy_button' => 'Wijzig spaarpotje', - 'update_piggy_title' => 'Wijzig spaarpotje ":name"', - 'details' => 'Details', - 'events' => 'Gebeurtenissen', - 'target_amount' => 'Doelbedrag', - 'start_date' => 'Startdatum', - 'target_date' => 'Doeldatum', - 'no_target_date' => 'Geen doeldatum', - 'todo' => 'te doen', - 'table' => 'Tabel', - 'piggy_bank_not_exists' => 'Dit spaarpotje bestaat niet meer.', - 'add_any_amount_to_piggy' => 'Stop geld in dit spaarpotje om het doel van :amount te halen.', - 'add_set_amount_to_piggy' => 'Stop voor :date :amount in dit spaarpotje om hem op tijd te vullen.', - 'delete_piggy_bank' => 'Verwijder spaarpotje ":name"', + 'piggy_bank' => 'Spaarpotje', + 'new_piggy_bank' => 'Nieuw spaarpotje', + 'store_piggy_bank' => 'Sla spaarpotje op', + 'account_status' => 'Rekeningoverzicht', + 'left_for_piggy_banks' => 'Over voor spaarpotjes', + 'sum_of_piggy_banks' => 'Som van spaarpotjes', + 'saved_so_far' => 'Gespaard', + 'left_to_save' => 'Te sparen', + 'add_money_to_piggy_title' => 'Stop geld in spaarpotje ":name"', + 'remove_money_from_piggy_title' => 'Haal geld uit spaarpotje ":name"', + 'add' => 'Toevoegen', + 'remove' => 'Verwijderen', + 'max_amount_add' => 'Hooguit toe te voegen', + 'max_amount_remove' => 'Hooguit te verwijderen', + 'update_piggy_button' => 'Wijzig spaarpotje', + 'update_piggy_title' => 'Wijzig spaarpotje ":name"', + 'details' => 'Details', + 'events' => 'Gebeurtenissen', + 'target_amount' => 'Doelbedrag', + 'start_date' => 'Startdatum', + 'target_date' => 'Doeldatum', + 'no_target_date' => 'Geen doeldatum', + 'todo' => 'te doen', + 'table' => 'Tabel', + 'piggy_bank_not_exists' => 'Dit spaarpotje bestaat niet meer.', + 'add_any_amount_to_piggy' => 'Stop geld in dit spaarpotje om het doel van :amount te halen.', + 'add_set_amount_to_piggy' => 'Stop voor :date :amount in dit spaarpotje om hem op tijd te vullen.', + 'delete_piggy_bank' => 'Verwijder spaarpotje ":name"', // tags - 'regular_tag' => 'Een gewone tag.', - 'balancing_act' => 'Er kunnen maar twee transacties worden getagged; een uitgaven en inkomsten. Ze balanceren elkaar.', - 'advance_payment' => 'Je kan een uitgave taggen en zoveel inkomsten om de uitgave (helemaal) te compenseren.', - 'delete_tag' => 'Verwijder tag ":tag"', - 'new_tag' => 'Maak nieuwe tag', - 'edit_tag' => 'Wijzig tag ":tag"', - 'no_year' => 'Zonder jaar', - 'no_month' => 'Zonder maand', - 'tag_title_nothing' => 'Standaard tags', - 'tag_title_balancingAct' => 'Balancerende tags', - 'tag_title_advancePayment' => 'Vooruitbetaalde tags', - 'tags_introduction' => 'Normaal gesproken zijn tags enkele woorden, gebruikt om gerelateerde zaken snel aan elkaar te plakken. ' . - 'dure-aanschaf, rekening, ' . - 'feestje. In Firefly III hebben tags meer betekenis en kan je er een datum' . - ', beschrijving en locatie aan geven. Daarmee kan je je transacties op een wat zinvollere manier aan elkaar ' . - 'koppelen. Je kan bijvoorbeeld een tag Kerstdiner maken en informatie over' . - ' het restaurant meenemen. Zulke tags zijn enkelvoudig; je gebruikt ze maar bij één gelegenheid.', - 'tags_group' => 'Omdat tags transacties groeperen kan je er teruggaves, vergoedingen en andere geldzaken mee aanduiden, zolang' . - ' de transacties elkaar "opheffen". Hoe je dit aanpakt is aan jou. De gewone manier kan natuurlijk ook.', - 'tags_start' => 'Maak hieronder een tag, of voer nieuwe tags in als je nieuwe transacties maakt.', + 'regular_tag' => 'Een gewone tag.', + 'balancing_act' => 'Er kunnen maar twee transacties worden getagged; een uitgaven en inkomsten. Ze balanceren elkaar.', + 'advance_payment' => 'Je kan een uitgave taggen en zoveel inkomsten om de uitgave (helemaal) te compenseren.', + 'delete_tag' => 'Verwijder tag ":tag"', + 'new_tag' => 'Maak nieuwe tag', + 'edit_tag' => 'Wijzig tag ":tag"', + 'no_year' => 'Zonder jaar', + 'no_month' => 'Zonder maand', + 'tag_title_nothing' => 'Standaard tags', + 'tag_title_balancingAct' => 'Balancerende tags', + 'tag_title_advancePayment' => 'Vooruitbetaalde tags', + 'tags_introduction' => 'Normaal gesproken zijn tags enkele woorden, gebruikt om gerelateerde zaken snel aan elkaar te plakken. ' . + 'dure-aanschaf, rekening, ' . + 'feestje. In Firefly III hebben tags meer betekenis en kan je er een datum' . + ', beschrijving en locatie aan geven. Daarmee kan je je transacties op een wat zinvollere manier aan elkaar ' . + 'koppelen. Je kan bijvoorbeeld een tag Kerstdiner maken en informatie over' . + ' het restaurant meenemen. Zulke tags zijn enkelvoudig; je gebruikt ze maar bij één gelegenheid.', + 'tags_group' => 'Omdat tags transacties groeperen kan je er teruggaves, vergoedingen en andere geldzaken mee aanduiden, zolang' . + ' de transacties elkaar "opheffen". Hoe je dit aanpakt is aan jou. De gewone manier kan natuurlijk ook.', + 'tags_start' => 'Maak hieronder een tag, of voer nieuwe tags in als je nieuwe transacties maakt.', ]; From 0b382426e9287420406fbcf40e436887ce363e41 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 3 Dec 2015 14:52:10 +0100 Subject: [PATCH 027/135] First experimental report generator / choice thing. --- app/Http/Controllers/ReportController.php | 2 +- public/js/reports.js | 28 +++++---- resources/twig/reports/index.twig | 75 ++++++++++++++++++++++- 3 files changed, 90 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 4d1ca65470..ed9b003817 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -56,7 +56,7 @@ class ReportController extends Controller } - return view('reports.index', compact('months', 'hasShared')); + return view('reports.index', compact('months','accounts', 'hasShared','start')); } /** diff --git a/public/js/reports.js b/public/js/reports.js index b123497481..8de6096c12 100644 --- a/public/js/reports.js +++ b/public/js/reports.js @@ -3,6 +3,21 @@ $(function () { "use strict"; drawChart(); + + $('#inputDateRange').daterangepicker( + { + minDate: minDate, + drops: 'up', + } + ); + + $('.openModal').on('click', openModal); + + + // click open the top X income list: + $('#showIncomes').click(showIncomes); + // click open the top X expense list: + $('#showExpenses').click(showExpenses); }); @@ -79,15 +94,4 @@ function showExpenses() { } return false; -} - -$(function () { - "use strict"; - $('.openModal').on('click', openModal); - - - // click open the top X income list: - $('#showIncomes').click(showIncomes); - // click open the top X expense list: - $('#showExpenses').click(showExpenses); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/resources/twig/reports/index.twig b/resources/twig/reports/index.twig index 064b17ed58..c978055589 100644 --- a/resources/twig/reports/index.twig +++ b/resources/twig/reports/index.twig @@ -17,7 +17,9 @@

{{ year }}

{% endfor %} @@ -35,7 +37,9 @@

{{ year }}

{% endfor %} @@ -43,8 +47,75 @@
+ + +
+
+
+
+

Some new reports.

+
+
+ +
+
+ + +
+ +
+
+
+ + +
+ {% for account in accounts %} +
+ +
+ {% endfor %} + +

+ In all cases, transfers to shared accounts count as expenses, and transfers + from shared accounts count as income. +

+
+
+ + +
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+ {% endblock %} {% block scripts %} + + {% endblock %} From cbbe5295720f8db1ca2a1fec051464333a69ca48 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:16:19 +0100 Subject: [PATCH 028/135] Show bill if one is connected. --- resources/twig/transactions/show.twig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/resources/twig/transactions/show.twig b/resources/twig/transactions/show.twig index c87273dd1b..b6cd21498b 100644 --- a/resources/twig/transactions/show.twig +++ b/resources/twig/transactions/show.twig @@ -43,6 +43,12 @@ {{ category.name }} {% endfor %} + {% if journal.bill %} + + {{ 'bill'|_ }} + {{ journal.bill.name }} + + {% endif %} {% if journal.tags|length > 0 %} {{ 'tags'|_ }} From 23cdb4d32608a803b3d1cd79eb485e9a61c79498 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:55:54 +0100 Subject: [PATCH 029/135] Expand month list for new reports. --- app/Helpers/Report/ReportHelper.php | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index f0d660d173..800caca03b 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -281,7 +281,7 @@ class ReportHelper implements ReportHelperInterface $budgetLine->setBudget($budget); $budgetLine->setRepetition($repetition); $expenses = $repository->balanceInPeriod($budget, $repetition->startdate, $repetition->enddate, $shared); - $expenses = $expenses * -1; + $expenses = $expenses * -1; $left = $expenses < $repetition->amount ? bcsub($repetition->amount, $expenses) : 0; $spent = $expenses > $repetition->amount ? 0 : $expenses; $overspent = $expenses > $repetition->amount ? bcsub($expenses, $repetition->amount) : 0; @@ -331,7 +331,7 @@ class ReportHelper implements ReportHelperInterface $repository = app('FireflyIII\Repositories\Category\CategoryRepositoryInterface'); $set = $repository->getCategories(); foreach ($set as $category) { - $spent = $repository->balanceInPeriod($category, $start, $end, $shared); + $spent = $repository->balanceInPeriod($category, $start, $end, $shared); $category->spent = $spent; $object->addCategory($category); $object->addTotal($spent); @@ -394,9 +394,22 @@ class ReportHelper implements ReportHelperInterface $end = Carbon::now(); $months = []; while ($start <= $end) { - $year = $start->year; - $months[$year][] = [ + $year = $start->year; + + if (!isset($months[$year])) { + $months[$year] = [ + 'start' => Carbon::createFromDate($year, 1, 1)->format('Y-m-d'), + 'end' => Carbon::createFromDate($year, 12, 31)->format('Y-m-d'), + 'months' => [], + ]; + } + + $currentEnd = clone $start; + $currentEnd->endOfMonth(); + $months[$year]['months'][] = [ 'formatted' => $start->formatLocalized('%B %Y'), + 'start' => $start->format('Y-m-d'), + 'end' => $currentEnd->format('Y-m-d'), 'month' => $start->month, 'year' => $year, ]; From 170cf7fd77e39abd924e369e97de6084b47017b8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:56:03 +0100 Subject: [PATCH 030/135] New routes for new reports. --- app/Http/routes.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Http/routes.php b/app/Http/routes.php index 8032412afd..4920086e13 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -385,6 +385,8 @@ Route::group( * Report Controller */ Route::get('/reports', ['uses' => 'ReportController@index', 'as' => 'reports.index']); + Route::post('/reports/select', ['uses' => 'ReportController@select', 'as' => 'reports.select']); + Route::get('/reports/report/{url}', ['uses' => 'ReportController@report', 'as' => 'reports.report']); Route::get('/reports/{year}/{shared?}', ['uses' => 'ReportController@year', 'as' => 'reports.year'])->where(['year' => '[0-9]{4}', 'shared' => 'shared']); Route::get('/reports/{year}/{month}/{shared?}', ['uses' => 'ReportController@month', 'as' => 'reports.month'])->where( ['year' => '[0-9]{4}', 'month' => '[0-9]{1,2}', 'shared' => 'shared'] From a17b7025f1afda3f5ea15195e97194251913d9c6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:56:35 +0100 Subject: [PATCH 031/135] New function to build URL report. --- app/Http/Controllers/ReportController.php | 56 ++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index ed9b003817..af025677ca 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -4,6 +4,8 @@ use Carbon\Carbon; use FireflyIII\Helpers\Report\ReportHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use Input; +use Redirect; use Session; use View; @@ -56,7 +58,59 @@ class ReportController extends Controller } - return view('reports.index', compact('months','accounts', 'hasShared','start')); + return view('reports.index', compact('months', 'accounts', 'hasShared', 'start')); + } + + /** + * TODO needs a custom validator for ease of use. + * + * @param AccountRepositoryInterface $repository + * + * @return \Illuminate\Http\RedirectResponse + */ + public function select(AccountRepositoryInterface $repository) + { + // process post data, give error, otherwise send redirect. + $report = Input::get('report_type'); + $parts = [$report]; + + // date + $ranges = explode(' - ', Input::get('daterange')); + $start = clone Session::get('start'); + $end = clone Session::get('end'); + + // kind of primitive but OK for now. + if (count($ranges) == 2 && strlen($ranges[0]) == 10 && strlen($ranges[1]) == 10) { + $start = new Carbon($ranges[0]); + $end = new Carbon($ranges[1]); + } + if ($end <= $start) { + Session::flash('error', 'Messed up the date!'); + + return Redirect::route('reports.index'); + } + $parts[] = $start->format('Ymd'); + $parts[] = $end->format('Ymd'); + + if (is_array(Input::get('accounts'))) { + foreach (Input::get('accounts') as $accountId) { + $account = $repository->find($accountId); + if ($account) { + $parts[] = $account->id; + } + } + } + if (count($parts) == 3) { + Session::flash('error', 'Select some accounts!'); + + return Redirect::route('reports.index'); + } + + + $url = join(';', $parts); + + return Redirect::route('reports.report', [$url]); + } /** From 55be17403735d1437be53bef534459ec81bffd9c Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:56:45 +0100 Subject: [PATCH 032/135] Method to find an account. --- app/Repositories/Account/AccountRepository.php | 10 ++++++++++ .../Account/AccountRepositoryInterface.php | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index a19cf45840..b0c921b214 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -643,4 +643,14 @@ class AccountRepository implements AccountRepositoryInterface return $journal; } + + /** + * @param $accountId + * + * @return Account + */ + public function find($accountId) + { + return Auth::user()->accounts()->findOrNew($accountId); + } } diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index 86dcb2e616..a3bdd05ec7 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -24,6 +24,13 @@ interface AccountRepositoryInterface */ public function countAccounts(array $types); + /** + * @param $accountId + * + * @return Account + */ + public function find($accountId); + /** * @param Account $account * @param Account $moveTo From 0b5c5b2ae9f0ce67be3c25bf89860de7c5a242fd Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:56:59 +0100 Subject: [PATCH 033/135] Some mediocre Javascript for report thing. --- public/js/reports.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/public/js/reports.js b/public/js/reports.js index 8de6096c12..51cbcb1b8f 100644 --- a/public/js/reports.js +++ b/public/js/reports.js @@ -1,11 +1,16 @@ -/* globals google, expenseRestShow:true, incomeRestShow:true, year, shared, month, hideTheRest, showTheRest, showTheRestExpense, hideTheRestExpense, columnChart, lineChart, stackedColumnChart */ +/* globals google, picker:true, minDate, expenseRestShow:true, incomeRestShow:true, year, shared, month, hideTheRest, showTheRest, showTheRestExpense, hideTheRestExpense, columnChart, lineChart, stackedColumnChart */ + $(function () { "use strict"; drawChart(); - $('#inputDateRange').daterangepicker( + picker = $('#inputDateRange').daterangepicker( { + locale: { + format: 'YYYY-MM-DD', + firstDay: 1, + }, minDate: minDate, drops: 'up', } @@ -13,6 +18,8 @@ $(function () { $('.openModal').on('click', openModal); + $('.date-select').on('click',preSelectDate); + // click open the top X income list: $('#showIncomes').click(showIncomes); @@ -20,6 +27,15 @@ $(function () { $('#showExpenses').click(showExpenses); }); +function preSelectDate(e) { + "use strict"; + var link = $(e.target); + var picker = $('#inputDateRange').data('daterangepicker'); + picker.setStartDate(link.data('start')); + picker.setEndDate(link.data('end')); + return false; + +} function drawChart() { "use strict"; From 46131ad39d083262078358def7a9e404c3a96a2b Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 4 Dec 2015 06:57:08 +0100 Subject: [PATCH 034/135] Updated view for new reports. --- resources/twig/reports/index.twig | 34 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/resources/twig/reports/index.twig b/resources/twig/reports/index.twig index c978055589..16a4390809 100644 --- a/resources/twig/reports/index.twig +++ b/resources/twig/reports/index.twig @@ -12,11 +12,10 @@

{{ 'reportsOwnAccounts'|_ }}

- - {% for year, entries in months %} + {% for year, data in months %}

{{ year }}

    - {% for month in entries %} + {% for month in data.months %}
  • {{ month.formatted }}
  • @@ -32,11 +31,10 @@

    {{ 'reportsOwnAccountsAndShared'|_ }}

- - {% for year, entries in months %} + {% for year, data in months %}

{{ year }}

-
+ +
@@ -93,11 +92,29 @@
+
+ value="{{ Session.get('start').format('Y-m-d') }} - {{ Session.get('end').format('Y-m-d') }}">
+
+ + +
+ {% for year, data in months %} + {{ year }} + + {% endfor %} +
+
+
@@ -115,6 +132,7 @@ {% block scripts %} From 1fd375b8758745f9a6d4f8b89e07e75f0c670f2c Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 5 Dec 2015 17:45:33 +0100 Subject: [PATCH 035/135] Better redirect after logout. --- app/Http/Controllers/Auth/AuthController.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index ca5ffcefc1..b3b41ab783 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -33,9 +33,8 @@ class AuthController extends Controller public function getLogout() { Auth::logout(); - Log::debug('Logout and redirect to root.'); - return redirect('/login'); + return redirect('/auth/login'); } /** From 16bfbc8a12f17c19f0d7de0bf5eb9c9ecae6c7d9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 6 Dec 2015 08:42:04 +0100 Subject: [PATCH 036/135] Some JS to process the report form beforehand. --- public/js/reports.js | 91 ++++++++++++++++++++++++++++++- resources/twig/reports/index.twig | 5 +- 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/public/js/reports.js b/public/js/reports.js index 51cbcb1b8f..3eba2fcff4 100644 --- a/public/js/reports.js +++ b/public/js/reports.js @@ -16,9 +16,34 @@ $(function () { } ); + // set values from cookies, if any: + if (readCookie('report-type') !== null) { + $('select[name="report_type"]').val(readCookie('report-type')); + } + + if ((readCookie('report-accounts') !== null)) { + var arr = readCookie('report-accounts').split(','); + arr.forEach(function (val) { + $('input[type="checkbox"][value="' + val + '"]').prop('checked', true); + }); + } + + // set date: + var startStr = readCookie('report-start'); + var endStr = readCookie('report-end'); + if (startStr !== null && endStr !== null && startStr.length == 8 && endStr.length == 8) { + var startDate = moment(startStr, "YYYYMMDD"); + var endDate = moment(endStr, "YYYYMMDD"); + var datePicker = $('#inputDateRange').data('daterangepicker'); + datePicker.setStartDate(startDate); + datePicker.setEndDate(endDate); + } + $('.openModal').on('click', openModal); - $('.date-select').on('click',preSelectDate); + $('.date-select').on('click', preSelectDate); + + $('#report-form').on('submit', catchSubmit); // click open the top X income list: @@ -27,6 +52,42 @@ $(function () { $('#showExpenses').click(showExpenses); }); +function catchSubmit() { + "use strict"; + // default;20141201;20141231;4;5 + // report name: + var url = '' + $('select[name="report_type"]').val() + ';'; + + // date, processed: + var picker = $('#inputDateRange').data('daterangepicker'); + url += moment(picker.startDate).format("YYYYMMDD") + ';'; + url += moment(picker.endDate).format("YYYYMMDD"); + + // all account ids: + var count = 0; + var accounts = []; + $.each($('.account-checkbox'), function (i, v) { + var c = $(v); + if (c.prop('checked')) { + url += ';' + c.val(); + accounts.push(c.val()); + count++; + } + }); + if (count > 0) { + // set cookie to remember choices. + createCookie('report-type', $('select[name="report_type"]').val(), 365); + createCookie('report-accounts', accounts, 365); + createCookie('report-start', moment(picker.startDate).format("YYYYMMDD"), 365); + createCookie('report-end', moment(picker.endDate).format("YYYYMMDD"), 365); + + window.location.replace(reportURL + "/" + url); + } + //console.log(url); + + return false; +} + function preSelectDate(e) { "use strict"; var link = $(e.target); @@ -110,4 +171,32 @@ function showExpenses() { } return false; +} + +function createCookie(name, value, days) { + var expires; + + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = "; expires=" + date.toGMTString(); + } else { + expires = ""; + } + document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + expires + "; path=/"; +} + +function readCookie(name) { + var nameEQ = encodeURIComponent(name) + "="; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length)); + } + return null; +} + +function eraseCookie(name) { + createCookie(name, "", -1); } \ No newline at end of file diff --git a/resources/twig/reports/index.twig b/resources/twig/reports/index.twig index 16a4390809..dc77cffdd7 100644 --- a/resources/twig/reports/index.twig +++ b/resources/twig/reports/index.twig @@ -55,7 +55,7 @@
- +
@@ -73,7 +73,7 @@ {% for account in accounts %}
From fdad96e2bc450f6437b99fa32fcd5db05bad641c Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 14 Dec 2015 21:14:34 +0100 Subject: [PATCH 116/135] Replaced route. --- resources/twig/reports/index.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/twig/reports/index.twig b/resources/twig/reports/index.twig index 353c5cdce7..591f30cdec 100644 --- a/resources/twig/reports/index.twig +++ b/resources/twig/reports/index.twig @@ -13,7 +13,7 @@
- +
From 289e5a5442f6301babcd398afb2f5de9fd724c81 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 15 Dec 2015 08:19:07 +0100 Subject: [PATCH 117/135] Add new blocked domain. --- config/mail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/mail.php b/config/mail.php index be1dda92b8..6a63081d1a 100644 --- a/config/mail.php +++ b/config/mail.php @@ -15,7 +15,7 @@ return [ | */ - 'blocked_domains' => ['trbvm.com', 'example.com'], + 'blocked_domains' => ['trbvm.com', 'example.com','mailinator.com'], 'driver' => env('EMAIL_DRIVER', 'smtp'), /* From ba722e8ed56eb0d47a8cdcf7151800b9850ff7c5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 15 Dec 2015 08:19:16 +0100 Subject: [PATCH 118/135] Expanded error message. --- resources/lang/en/validation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index be3fe8f8b2..5003a85297 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -13,7 +13,7 @@ return [ | */ - 'invalid_domain' => 'Cannot register from this domain.', + 'invalid_domain' => 'Due to security constraints, you cannot register from this domain.', 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', 'file_attached' => 'Succesfully uploaded file ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', From 0303b45707c952213c396f6cdc13501821646d4b Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 15 Dec 2015 12:37:55 +0100 Subject: [PATCH 119/135] First code for multi year budget chart. --- .../Controllers/Chart/BudgetController.php | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 55cc8ef56d..3288fa4525 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -35,6 +35,35 @@ class BudgetController extends Controller $this->generator = app('FireflyIII\Generator\Chart\Budget\BudgetChartGenerator'); } + /** + * @param BudgetRepositoryInterface $repository + * @param $report_type + * @param Carbon $start + * @param Carbon $end + * @param Collection $accounts + * @param Collection $budgets + */ + public function multiYear(BudgetRepositoryInterface $repository, $report_type, Carbon $start, Carbon $end, Collection $accounts, Collection $budgets) + { + $currentStart = clone $start; + + while($currentStart < $end) { + $currentEnd = clone $currentStart; + $currentEnd->endOfYear(); + + //echo 'now for '.$currentStart->format('Ymd').' to '.$currentEnd->format('Ymd').'
'; + //epository->balanceInPeriod() + + // do something for all budgets. + + // jump to next year. + $currentStart = clone $currentEnd; + $currentStart->addDay(); + + } + + } + /** * @param BudgetRepositoryInterface $repository * @param Budget $budget From 301528e2d267984174231e673a1946d79630adaa Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 15 Dec 2015 12:38:18 +0100 Subject: [PATCH 120/135] Quick links. --- app/Http/Controllers/ReportController.php | 6 +-- app/Http/routes.php | 24 ++++++++++-- public/js/reports/default/multi-year.js | 25 +++++++++++-- public/js/reports/index.js | 2 +- resources/lang/en/firefly.php | 12 +++++- .../twig/reports/default/multi-year.twig | 5 ++- resources/twig/reports/index.twig | 37 +++++++++++++++++++ 7 files changed, 98 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 49cd67a7d1..e74c7c0e56 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -87,7 +87,7 @@ class ReportController extends Controller foreach ($accounts as $account) { $accountIds[] = $account->id; } - $accountIds = join(';', $accountIds); + $accountIds = join(',', $accountIds); return view( 'reports.default.year', @@ -127,7 +127,7 @@ class ReportController extends Controller foreach ($accounts as $account) { $accountIds[] = $account->id; } - $accountIds = join(';', $accountIds); + $accountIds = join(',', $accountIds); // continue! return view( @@ -159,7 +159,7 @@ class ReportController extends Controller foreach ($accounts as $account) { $accountIds[] = $account->id; } - $accountIds = join(';', $accountIds); + $accountIds = join(',', $accountIds); return view( 'reports.default.multi-year', compact('budgets', 'accounts', 'categories', 'start', 'end', 'accountIds', 'report_type') diff --git a/app/Http/routes.php b/app/Http/routes.php index 966b7bdaab..4599887047 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -35,7 +35,7 @@ Route::bind( 'accountList', function ($value) { if (Auth::check()) { - $ids = explode(';', $value); + $ids = explode(',', $value); /** @var \Illuminate\Support\Collection $object */ $object = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') ->where('account_types.editable', 1) @@ -49,6 +49,24 @@ Route::bind( throw new NotFoundHttpException; } ); +// budget list +Route::bind( + 'budgetList', + function ($value) { + if (Auth::check()) { + $ids = explode(',', $value); + /** @var \Illuminate\Support\Collection $object */ + $object = Budget::where('budgets.active', 1) + ->whereIn('budgets.id', $ids) + ->where('budgets.user_id', Auth::user()->id) + ->get(['budgets.*']); + if ($object->count() > 0) { + return $object; + } + } + throw new NotFoundHttpException; + } +); // Date Route::bind( @@ -357,8 +375,8 @@ Route::group( Route::get('/chart/budget/frontpage', ['uses' => 'Chart\BudgetController@frontpage']); // this chart is used in reports: - Route::get('/chart/budget/year/{report_type}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\BudgetController@year'])->where(['year' => '[0-9]{4}', 'shared' => 'shared']); - + Route::get('/chart/budget/year/{report_type}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\BudgetController@year']); + Route::get('/chart/budget/multi-year/{report_type}/{start_date}/{end_date}/{accountList}/{budgetList}', ['uses' => 'Chart\BudgetController@multiYear']); Route::get('/chart/budget/{budget}/{limitrepetition}', ['uses' => 'Chart\BudgetController@budgetLimit']); Route::get('/chart/budget/{budget}', ['uses' => 'Chart\BudgetController@budget']); diff --git a/public/js/reports/default/multi-year.js b/public/js/reports/default/multi-year.js index 95cff4f05e..904982dd4e 100644 --- a/public/js/reports/default/multi-year.js +++ b/public/js/reports/default/multi-year.js @@ -8,7 +8,6 @@ $(function () { }); - function drawChart() { "use strict"; @@ -17,10 +16,30 @@ function drawChart() { columnChart('chart/report/in-out-sum/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'income-expenses-sum-chart'); - $.each($('.account-chart'), function(i,v) { + $.each($('.account-chart'), function (i, v) { var holder = $(v); - console.log(holder.data('id')); + console.log('Will draw chart for account #' + holder.data('id')); }); + // draw budget chart based on selected budgets: + $('.budget-checkbox').on('change', updateBudgetChart); + + +} + +function updateBudgetChart(e) { + console.log('will update budget chart.'); + // get all budget ids: + var budgets = []; + $.each($('.budget-checkbox'), function (i, v) { + var current = $(v); + if (current.prop('checked')) { + budgets.push(current.val()); + } + }); + var budgetIds = budgets.join(','); + + // draw chart. Redraw when exists? Not sure if we support that. + columnChart('chart/budget/multi-year/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds + '/' + budgetIds, 'budgets-chart'); } \ No newline at end of file diff --git a/public/js/reports/index.js b/public/js/reports/index.js index 685ee559c9..6a961bd77a 100644 --- a/public/js/reports/index.js +++ b/public/js/reports/index.js @@ -64,7 +64,7 @@ function catchSubmit() { $.each($('.account-checkbox'), function (i, v) { var c = $(v); if (c.prop('checked')) { - url += c.val() + ';'; + url += c.val() + ','; accounts.push(c.val()); count++; } diff --git a/resources/lang/en/firefly.php b/resources/lang/en/firefly.php index 7f3b0510f3..2382b55a20 100644 --- a/resources/lang/en/firefly.php +++ b/resources/lang/en/firefly.php @@ -374,8 +374,16 @@ return [ // 'reportForMonth' => 'Montly report for :month', // 'reportForMonthShared' => 'Montly report for :month (including shared accounts)', - 'report_default' => 'Default financial report for :start until :end', - + 'report_default' => 'Default financial report for :start until :end', + 'quick_link_reports' => 'Quick links', + 'quick_link_default_report' => 'Default financial report', + 'report_this_month_shared' => 'Current month, all shared accounts', + 'report_this_month_non_shared' => 'Current month, all not-shared accounts', + 'report_this_year_shared' => 'Current year, all shared accounts', + 'report_this_year_non_shared' => 'Current year, all not-shared accounts', + 'report_all_time_shared' => 'All-time, all shared accounts', + 'report_all_time_non_shared' => 'All-time, all not-shared accounts', + 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', 'incomeVsExpenses' => 'Income vs. expenses', 'accountBalances' => 'Account balances', 'balanceStartOfYear' => 'Balance at start of year', diff --git a/resources/twig/reports/default/multi-year.twig b/resources/twig/reports/default/multi-year.twig index 5a7939b048..491713e802 100644 --- a/resources/twig/reports/default/multi-year.twig +++ b/resources/twig/reports/default/multi-year.twig @@ -58,9 +58,12 @@
+ {% for budget in budgets %} {% endfor %}
diff --git a/resources/twig/reports/index.twig b/resources/twig/reports/index.twig index 591f30cdec..90abeff21f 100644 --- a/resources/twig/reports/index.twig +++ b/resources/twig/reports/index.twig @@ -82,6 +82,43 @@
+
+
+
+

{{ 'quick_link_reports'|_ }}

+
+ +
+
{% endblock %} From 36d7a02994d875adaf5ec3f34ff9963aa864cac6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 15 Dec 2015 12:46:40 +0100 Subject: [PATCH 121/135] Some refactoring. --- app/Http/Controllers/BudgetController.php | 11 +++++++---- .../Controllers/Chart/BudgetController.php | 18 +++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 7269b0ba31..74876933e4 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -6,6 +6,7 @@ use Carbon\Carbon; use FireflyIII\Http\Requests\BudgetFormRequest; use FireflyIII\Models\Budget; use FireflyIII\Models\LimitRepetition; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use Input; use Navigation; @@ -135,7 +136,7 @@ class BudgetController extends Controller * * @return \Illuminate\View\View */ - public function index(BudgetRepositoryInterface $repository) + public function index(BudgetRepositoryInterface $repository, AccountRepositoryInterface $accountRepository) { $budgets = $repository->getActiveBudgets(); $inactive = $repository->getInactiveBudgets(); @@ -147,6 +148,8 @@ class BudgetController extends Controller $key = 'budgetIncomeTotal' . $start->format('Ymd') . $end->format('Ymd'); $budgetIncomeTotal = Preferences::get($key, 1000)->data; $period = Navigation::periodShow($start, $range); + $accounts = $accountRepository->getAccounts(['Default account', 'Asset account', 'Cash account']); + bcscale(2); /** * Do some cleanup: @@ -156,7 +159,7 @@ class BudgetController extends Controller // loop the budgets: /** @var Budget $budget */ foreach ($budgets as $budget) { - $budget->spent = $repository->balanceInPeriod($budget, $start, $end); + $budget->spent = $repository->balanceInPeriodForList($budget, $start, $end, $accounts); $budget->currentRep = $repository->getCurrentRepetition($budget, $start, $end); if ($budget->currentRep) { $budgeted = bcadd($budgeted, $budget->currentRep->amount); @@ -170,7 +173,7 @@ class BudgetController extends Controller $defaultCurrency = Amount::getDefaultCurrency(); return view( - 'budgets.index', compact('budgetMaximum','period', 'range', 'budgetIncomeTotal', 'defaultCurrency', 'inactive', 'budgets', 'spent', 'budgeted') + 'budgets.index', compact('budgetMaximum', 'period', 'range', 'budgetIncomeTotal', 'defaultCurrency', 'inactive', 'budgets', 'spent', 'budgeted') ); } @@ -279,7 +282,7 @@ class BudgetController extends Controller { $budgetData = [ 'name' => $request->input('name'), - 'active' => intval($request->input('active')) == 1 + 'active' => intval($request->input('active')) == 1, ]; $repository->update($budget, $budgetData); diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 3288fa4525..864e910cc4 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -6,6 +6,7 @@ use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Budget; use FireflyIII\Models\LimitRepetition; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; @@ -47,7 +48,7 @@ class BudgetController extends Controller { $currentStart = clone $start; - while($currentStart < $end) { + while ($currentStart < $end) { $currentEnd = clone $currentStart; $currentEnd->endOfYear(); @@ -70,7 +71,7 @@ class BudgetController extends Controller * * @return \Symfony\Component\HttpFoundation\Response */ - public function budget(BudgetRepositoryInterface $repository, Budget $budget) + public function budget(BudgetRepositoryInterface $repository, AccountRepositoryInterface $accountRepository, Budget $budget) { // dates and times @@ -79,7 +80,9 @@ class BudgetController extends Controller $last = Session::get('end', new Carbon); $final = clone $last; $final->addYears(2); - $last = Navigation::endOfX($last, $range, $final); + $last = Navigation::endOfX($last, $range, $final); + $accounts = $accountRepository->getAccounts(['Default account', 'Asset account', 'Cash account']); + // chart properties for cache: $cache = new CacheProperties(); @@ -97,7 +100,7 @@ class BudgetController extends Controller $end->subDay(); $chartDate = clone $end; $chartDate->startOfMonth(); - $spent = $repository->balanceInPeriod($budget, $first, $end) * -1; + $spent = $repository->balanceInPeriodForList($budget, $first, $end, $accounts) * -1; $entries->push([$chartDate, $spent]); $first = Navigation::addPeriod($first, $range, 0); } @@ -162,12 +165,13 @@ class BudgetController extends Controller * * @return \Symfony\Component\HttpFoundation\Response */ - public function frontpage(BudgetRepositoryInterface $repository) + public function frontpage(BudgetRepositoryInterface $repository, AccountRepositoryInterface $accountRepository) { $budgets = $repository->getBudgets(); $start = Session::get('start', Carbon::now()->startOfMonth()); $end = Session::get('end', Carbon::now()->endOfMonth()); $allEntries = new Collection; + $accounts = $accountRepository->getAccounts(['Default account', 'Asset account', 'Cash account']); // chart properties for cache: $cache = new CacheProperties(); @@ -185,13 +189,13 @@ class BudgetController extends Controller foreach ($budgets as $budget) { $repetitions = $repository->getBudgetLimitRepetitions($budget, $start, $end); if ($repetitions->count() == 0) { - $expenses = $repository->balanceInPeriod($budget, $start, $end, true) * -1; + $expenses = $repository->balanceInPeriodForList($budget, $start, $end, $accounts) * -1; $allEntries->push([$budget->name, 0, 0, $expenses, 0, 0]); continue; } /** @var LimitRepetition $repetition */ foreach ($repetitions as $repetition) { - $expenses = $repository->balanceInPeriod($budget, $repetition->startdate, $repetition->enddate, true) * -1; + $expenses = $repository->balanceInPeriodForList($budget, $repetition->startdate, $repetition->enddate, $accounts) * -1; // $left can be less than zero. // $overspent can be more than zero ( = overspending) From 69553b138b0032ba903b5e639b636ac043fe0b32 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 15 Dec 2015 12:52:42 +0100 Subject: [PATCH 122/135] First calculations for multi-year budget chart. --- app/Http/Controllers/Chart/BudgetController.php | 15 +++++++++++++-- app/Http/routes.php | 6 ++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 864e910cc4..2cdba30b4e 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -47,14 +47,25 @@ class BudgetController extends Controller public function multiYear(BudgetRepositoryInterface $repository, $report_type, Carbon $start, Carbon $end, Collection $accounts, Collection $budgets) { $currentStart = clone $start; + $collection = new Collection; while ($currentStart < $end) { $currentEnd = clone $currentStart; $currentEnd->endOfYear(); - //echo 'now for '.$currentStart->format('Ymd').' to '.$currentEnd->format('Ymd').'
'; - //epository->balanceInPeriod() + echo 'now for ' . $currentStart->format('Ymd') . ' to ' . $currentEnd->format('Ymd') . '
'; + /** @var Budget $budget */ + foreach ($budgets as $budget) { + if (is_null($budget->id)) { + $name = trans('firefly.noBudget'); + $sum = $repository->getWithoutBudgetSum($currentStart, $currentEnd); + } else { + $name = $budget->name; + $sum = $repository->balanceInPeriodForList($budget, $currentStart, $currentEnd, $accounts); + } + echo $name.': '.$sum.'
'; + } // do something for all budgets. // jump to next year. diff --git a/app/Http/routes.php b/app/Http/routes.php index 4599887047..1e3f4c109a 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -60,6 +60,12 @@ Route::bind( ->whereIn('budgets.id', $ids) ->where('budgets.user_id', Auth::user()->id) ->get(['budgets.*']); + + // add empty budget if applicable. + if(in_array('0', $ids)) { + $object->push(new Budget); + } + if ($object->count() > 0) { return $object; } From 838330b90919a8bc47f12b1255077ecbf0440c70 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 16 Dec 2015 10:17:15 +0100 Subject: [PATCH 123/135] First attempt at multi-year budget chart. --- .../Chart/Budget/BudgetChartGenerator.php | 7 ++++ .../Budget/ChartJsBudgetChartGenerator.php | 39 +++++++++++++++++++ .../Controllers/Chart/BudgetController.php | 24 +++++++++++- public/js/reports/default/multi-year.js | 3 ++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/app/Generator/Chart/Budget/BudgetChartGenerator.php b/app/Generator/Chart/Budget/BudgetChartGenerator.php index 552a8b2933..c7aa64a863 100644 --- a/app/Generator/Chart/Budget/BudgetChartGenerator.php +++ b/app/Generator/Chart/Budget/BudgetChartGenerator.php @@ -18,6 +18,13 @@ interface BudgetChartGenerator */ public function budget(Collection $entries); + /** + * @param Collection $entries + * + * @return array + */ + public function multiYear(Collection $entries); + /** * @param Collection $entries * diff --git a/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php b/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php index d91a293286..420501ac1a 100644 --- a/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php +++ b/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php @@ -141,4 +141,43 @@ class ChartJsBudgetChartGenerator implements BudgetChartGenerator return $data; } + + /** + * @param Collection $entries + * + * @return array + */ + public function multiYear(Collection $entries) + { + //var_dump($entries); + $data = [ + 'count' => 0, + 'labels' => [], + 'datasets' => [], + ]; + // labels: for each budget. + // dataset: for each year? + foreach($entries as $entry) { + $year = $entry['date']->year; + if(!in_array($year, $data['labels'])) { + $data['labels'][] = $entry['date']->year; + } + } + // can be joined? + $set = []; + foreach($entries as $entry) { + $name = $entry['budget']; + $set[$name] = isset($set[$name]) ? $set[$name] : []; + $set[$name][] = ($entry['sum'] * -1); + } + foreach($set as $name => $values) { + $data['datasets'][] = ['label' => $name, 'data' => $values]; + } + $data['count'] = count($data['datasets']); + +return $data; + //var_dump($data); + //exit; + + } } diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 2cdba30b4e..49b0f6ab2c 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -46,6 +46,19 @@ class BudgetController extends Controller */ public function multiYear(BudgetRepositoryInterface $repository, $report_type, Carbon $start, Carbon $end, Collection $accounts, Collection $budgets) { + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($report_type); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty($accounts); + $cache->addProperty($budgets); + $cache->addProperty('multiYearBudget'); + + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $currentStart = clone $start; $collection = new Collection; @@ -53,7 +66,7 @@ class BudgetController extends Controller $currentEnd = clone $currentStart; $currentEnd->endOfYear(); - echo 'now for ' . $currentStart->format('Ymd') . ' to ' . $currentEnd->format('Ymd') . '
'; + //echo 'now for ' . $currentStart->format('Ymd') . ' to ' . $currentEnd->format('Ymd') . '
'; /** @var Budget $budget */ foreach ($budgets as $budget) { @@ -64,7 +77,8 @@ class BudgetController extends Controller $name = $budget->name; $sum = $repository->balanceInPeriodForList($budget, $currentStart, $currentEnd, $accounts); } - echo $name.': '.$sum.'
'; + $collection->push(['budget' => $name, 'sum' => $sum,'date' => $currentStart]); + //echo $name . ': ' . $sum . '
'; } // do something for all budgets. @@ -74,6 +88,12 @@ class BudgetController extends Controller } + $data = $this->generator->multiYear($collection); + + //$cache->store($data); + + return Response::json($data); + } /** diff --git a/public/js/reports/default/multi-year.js b/public/js/reports/default/multi-year.js index 904982dd4e..9b3448b489 100644 --- a/public/js/reports/default/multi-year.js +++ b/public/js/reports/default/multi-year.js @@ -39,6 +39,9 @@ function updateBudgetChart(e) { }); var budgetIds = budgets.join(','); + // remove old chart: + $('#budgets-chart').replaceWith(''); + // draw chart. Redraw when exists? Not sure if we support that. columnChart('chart/budget/multi-year/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds + '/' + budgetIds, 'budgets-chart'); From 56715556ed2f8a62b8cb70ce6483a99a5554579c Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 16 Dec 2015 10:54:56 +0100 Subject: [PATCH 124/135] Second attempt. --- .../Budget/ChartJsBudgetChartGenerator.php | 34 ++++------ .../Controllers/Chart/BudgetController.php | 65 +++++++++++-------- public/js/reports/default/multi-year.js | 23 +++++-- .../twig/reports/default/multi-year.twig | 5 +- 4 files changed, 75 insertions(+), 52 deletions(-) diff --git a/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php b/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php index 420501ac1a..d54c849f2c 100644 --- a/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php +++ b/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php @@ -149,35 +149,29 @@ class ChartJsBudgetChartGenerator implements BudgetChartGenerator */ public function multiYear(Collection $entries) { - //var_dump($entries); + // dataset: $data = [ 'count' => 0, 'labels' => [], 'datasets' => [], ]; - // labels: for each budget. - // dataset: for each year? - foreach($entries as $entry) { - $year = $entry['date']->year; - if(!in_array($year, $data['labels'])) { - $data['labels'][] = $entry['date']->year; - } + // get labels from one of the budgets (assuming there's at least one): + $first = $entries->first(); + foreach ($first['budgeted'] as $year => $noInterest) { + $data['labels'][] = strval($year); } - // can be joined? - $set = []; - foreach($entries as $entry) { - $name = $entry['budget']; - $set[$name] = isset($set[$name]) ? $set[$name] : []; - $set[$name][] = ($entry['sum'] * -1); - } - foreach($set as $name => $values) { - $data['datasets'][] = ['label' => $name, 'data' => $values]; + + // then, loop all entries and create datasets: + foreach ($entries as $entry) { + $name = $entry['name']; + $spent = $entry['spent']; + $budgeted = $entry['budgeted']; + $data['datasets'][] = ['label' => 'Spent on ' . $name, 'data' => $spent]; + $data['datasets'][] = ['label' => 'Budgeted for ' . $name, 'data' => $budgeted]; } $data['count'] = count($data['datasets']); -return $data; - //var_dump($data); - //exit; + return $data; } } diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 49b0f6ab2c..c2279c923a 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -56,41 +56,54 @@ class BudgetController extends Controller $cache->addProperty('multiYearBudget'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + // return Response::json($cache->get()); // @codeCoverageIgnore } - $currentStart = clone $start; - $collection = new Collection; + /** + * budget + * year: + * spent: x + * budgeted: x + * year + * spent: x + * budgeted: x + */ + $entries = new Collection; + // go by budget, not by year. + foreach ($budgets as $budget) { + $entry = ['name' => '', 'spent' => [], 'budgeted' => []]; - while ($currentStart < $end) { - $currentEnd = clone $currentStart; - $currentEnd->endOfYear(); + $currentStart = clone $start; + while ($currentStart < $end) { + // fix the date: + $currentEnd = clone $currentStart; + $currentEnd->endOfYear(); - //echo 'now for ' . $currentStart->format('Ymd') . ' to ' . $currentEnd->format('Ymd') . '
'; - - /** @var Budget $budget */ - foreach ($budgets as $budget) { + // get data: if (is_null($budget->id)) { - $name = trans('firefly.noBudget'); - $sum = $repository->getWithoutBudgetSum($currentStart, $currentEnd); + $name = trans('firefly.noBudget'); + $sum = $repository->getWithoutBudgetSum($currentStart, $currentEnd); + $budgeted = 0; } else { - $name = $budget->name; - $sum = $repository->balanceInPeriodForList($budget, $currentStart, $currentEnd, $accounts); + $name = $budget->name; + $sum = $repository->balanceInPeriodForList($budget, $currentStart, $currentEnd, $accounts); + $budgeted = $repository->getBudgetLimitRepetitions($budget, $currentStart, $currentEnd)->sum('amount'); } - $collection->push(['budget' => $name, 'sum' => $sum,'date' => $currentStart]); - //echo $name . ': ' . $sum . '
'; + + // save to array: + $year = $currentStart->year; + $entry['name'] = $name; + $entry['spent'][$year] = ($sum * -1); + $entry['budgeted'][$year] = $budgeted; + + // jump to next year. + $currentStart = clone $currentEnd; + $currentStart->addDay(); } - // do something for all budgets. - - // jump to next year. - $currentStart = clone $currentEnd; - $currentStart->addDay(); - + $entries->push($entry); } - - $data = $this->generator->multiYear($collection); - - //$cache->store($data); + // generate chart with data: + $data = $this->generator->multiYear($entries); return Response::json($data); diff --git a/public/js/reports/default/multi-year.js b/public/js/reports/default/multi-year.js index 9b3448b489..bf18c64a91 100644 --- a/public/js/reports/default/multi-year.js +++ b/public/js/reports/default/multi-year.js @@ -23,6 +23,7 @@ function drawChart() { // draw budget chart based on selected budgets: $('.budget-checkbox').on('change', updateBudgetChart); + updateBudgetChart(); } @@ -37,12 +38,24 @@ function updateBudgetChart(e) { budgets.push(current.val()); } }); - var budgetIds = budgets.join(','); - // remove old chart: - $('#budgets-chart').replaceWith(''); + if(budgets.length > 0) { - // draw chart. Redraw when exists? Not sure if we support that. - columnChart('chart/budget/multi-year/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds + '/' + budgetIds, 'budgets-chart'); + var budgetIds = budgets.join(','); + + // remove old chart: + $('#budgets-chart').replaceWith(''); + + // hide message: + $('#budgets-chart-message').hide(); + + // draw chart. Redraw when exists? Not sure if we support that. + columnChart('chart/budget/multi-year/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds + '/' + budgetIds, 'budgets-chart'); + } else { + // hide canvas, show message: + $('#budgets-chart-message').show(); + $('#budgets-chart').hide(); + + } } \ No newline at end of file diff --git a/resources/twig/reports/default/multi-year.twig b/resources/twig/reports/default/multi-year.twig index 491713e802..5ab297f952 100644 --- a/resources/twig/reports/default/multi-year.twig +++ b/resources/twig/reports/default/multi-year.twig @@ -30,7 +30,7 @@
{% for account in accounts %} -
+