diff --git a/app/Console/Commands/VerifyDatabase.php b/app/Console/Commands/VerifyDatabase.php index 6a13b74dd6..8db87ad4dc 100644 --- a/app/Console/Commands/VerifyDatabase.php +++ b/app/Console/Commands/VerifyDatabase.php @@ -87,12 +87,13 @@ class VerifyDatabase extends Command $this->createLinkTypes(); $this->createAccessTokens(); $this->fixDoubleAmounts(); + $this->fixBadMeta(); } /** * Create user access tokens, if not present already. */ - private function createAccessTokens() + private function createAccessTokens(): void { $count = 0; $users = User::get(); @@ -114,7 +115,7 @@ class VerifyDatabase extends Command /** * Create default link types if necessary. */ - private function createLinkTypes() + private function createLinkTypes(): void { $count = 0; $set = [ @@ -140,7 +141,69 @@ class VerifyDatabase extends Command } } - private function fixDoubleAmounts() + /** + * Fix the situation where the matching transactions + * of a journal somehow have non-matching categories + * or budgets + */ + private function fixBadMeta(): void + { + // categories + $set = Transaction + ::leftJoin('category_transaction', 'category_transaction.transaction_id', '=', 'transactions.id') + ->whereNull('transactions.deleted_at') + ->get(['transactions.id', 'transaction_journal_id', 'identifier', 'category_transaction.category_id', 'category_transaction.id as ct_id']); + $results = []; + foreach ($set as $obj) { + $key = $obj->transaction_journal_id . '-' . $obj->identifier; + $category = (int)$obj->category_id; + + // value exists and is not category: + if (isset($results[$key]) && $results[$key] !== $category) { + $this->error( + sprintf( + 'Transaction #%d referred to the wrong category. Was category #%d but is fixed to be category #%d.', $obj->transaction_journal_id, $category, $results[$key] + ) + ); + DB::table('category_transaction')->where('id', $obj->ct_id)->update(['category_id' => $results[$key]]); + + } + + // value does not exist: + if ($category > 0 && !isset($results[$key])) { + $results[$key] = $category; + } + } + + // budgets + $set = Transaction + ::leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'transactions.id') + ->whereNull('transactions.deleted_at') + ->get(['transactions.id', 'transaction_journal_id', 'identifier', 'budget_transaction.budget_id', 'budget_transaction.id as ct_id']); + $results = []; + foreach ($set as $obj) { + $key = $obj->transaction_journal_id . '-' . $obj->identifier; + $budget = (int)$obj->budget_id; + + // value exists and is not budget: + if (isset($results[$key]) && $results[$key] !== $budget) { + $this->error( + sprintf( + 'Transaction #%d referred to the wrong budget. Was budget #%d but is fixed to be budget #%d.', $obj->transaction_journal_id, $budget, $results[$key] + ) + ); + DB::table('budget_transaction')->where('id', $obj->ct_id)->update(['budget_id' => $results[$key]]); + + } + + // value does not exist: + if ($budget > 0 && !isset($results[$key])) { + $results[$key] = $budget; + } + } + } + + private function fixDoubleAmounts(): void { $count = 0; // get invalid journals @@ -186,8 +249,6 @@ class VerifyDatabase extends Command if (0 === $count) { $this->info('Amount integrity OK!'); } - - return; } /** @@ -217,8 +278,6 @@ class VerifyDatabase extends Command return true; } ); - - return; } /** @@ -246,7 +305,7 @@ class VerifyDatabase extends Command /** * Reports on budgets with no budget limits (which makes them pointless). */ - private function reportBudgetLimits() + private function reportBudgetLimits(): void { $set = Budget::leftJoin('budget_limits', 'budget_limits.budget_id', '=', 'budgets.id') ->leftJoin('users', 'budgets.user_id', '=', 'users.id') @@ -270,7 +329,7 @@ class VerifyDatabase extends Command /** * Reports on deleted accounts that still have not deleted transactions or journals attached to them. */ - private function reportDeletedAccounts() + private function reportDeletedAccounts(): void { $set = Account::leftJoin('transactions', 'transactions.account_id', '=', 'accounts.id') ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') @@ -300,7 +359,7 @@ class VerifyDatabase extends Command /** * Report on journals with bad account types linked to them. */ - private function reportIncorrectJournals() + private function reportIncorrectJournals(): void { $configuration = [ // a withdrawal can not have revenue account: @@ -342,7 +401,7 @@ class VerifyDatabase extends Command /** * Any deleted transaction journals that have transactions that are NOT deleted:. */ - private function reportJournals() + private function reportJournals(): void { $count = 0; $set = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') @@ -373,7 +432,7 @@ class VerifyDatabase extends Command /** * Report on journals without transactions. */ - private function reportNoTransactions() + private function reportNoTransactions(): void { $count = 0; $set = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') @@ -397,7 +456,7 @@ class VerifyDatabase extends Command * * @param string $name */ - private function reportObject(string $name) + private function reportObject(string $name): void { $plural = str_plural($name); $class = sprintf('FireflyIII\Models\%s', ucfirst($name)); @@ -433,7 +492,7 @@ class VerifyDatabase extends Command /** * Reports for each user when the sum of their transactions is not zero. */ - private function reportSum() + private function reportSum(): void { /** @var UserRepositoryInterface $userRepository */ $userRepository = app(UserRepositoryInterface::class); @@ -452,7 +511,7 @@ class VerifyDatabase extends Command /** * Reports on deleted transactions that are connected to a not deleted journal. */ - private function reportTransactions() + private function reportTransactions(): void { $set = Transaction::leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') ->whereNotNull('transactions.deleted_at') diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 3f020a4e27..395cdd4738 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -28,10 +28,10 @@ use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Requests\BillFormRequest; use FireflyIII\Models\Bill; use FireflyIII\Models\Note; -use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; +use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\Transformers\BillTransformer; use Illuminate\Http\Request; use Illuminate\Support\Collection; @@ -220,6 +220,7 @@ class BillController extends Controller * @param Bill $bill * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \FireflyIII\Exceptions\FireflyException */ public function rescan(Request $request, BillRepositoryInterface $repository, Bill $bill) { @@ -228,14 +229,22 @@ class BillController extends Controller return redirect(URL::previous()); } - - $journals = $repository->getPossiblyRelatedJournals($bill); - /** @var TransactionJournal $journal */ - foreach ($journals as $journal) { - $repository->scan($bill, $journal); + $set = $repository->getRulesForBill($bill); + $total = 0; + foreach ($set as $rule) { + // simply fire off all rules? + /** @var TransactionMatcher $matcher */ + $matcher = app(TransactionMatcher::class); + $matcher->setLimit(100000); // large upper limit + $matcher->setRange(100000); // large upper limit + $matcher->setRule($rule); + $matchingTransactions = $matcher->findTransactionsByRule(); + $total += $matchingTransactions->count(); + $repository->linkCollectionToBill($bill, $matchingTransactions); } - $request->session()->flash('success', (string)trans('firefly.rescanned_bill')); + + $request->session()->flash('success', (string)trans('firefly.rescanned_bill', ['total' => $total])); Preferences::mark(); return redirect(URL::previous()); @@ -250,6 +259,8 @@ class BillController extends Controller */ public function show(Request $request, BillRepositoryInterface $repository, Bill $bill) { + // add info about rules: + $rules = $repository->getRulesForBill($bill); $subTitle = $bill->name; $start = session('start'); $end = session('end'); @@ -278,7 +289,7 @@ class BillController extends Controller $transactions->setPath(route('bills.show', [$bill->id])); - return view('bills.show', compact('transactions', 'yearAverage', 'overallAverage', 'year', 'object', 'bill', 'subTitle')); + return view('bills.show', compact('transactions', 'rules', 'yearAverage', 'overallAverage', 'year', 'object', 'bill', 'subTitle')); } /** diff --git a/app/Http/Controllers/RuleController.php b/app/Http/Controllers/RuleController.php index 87be71d5d0..2f7ee11312 100644 --- a/app/Http/Controllers/RuleController.php +++ b/app/Http/Controllers/RuleController.php @@ -79,6 +79,8 @@ class RuleController extends Controller */ public function create(Request $request, RuleGroupRepositoryInterface $ruleGroupRepository, BillRepositoryInterface $billRepository, RuleGroup $ruleGroup) { + $this->createDefaultRuleGroup(); + $this->createDefaultRule(); $bill = null; $billId = (int)$request->get('fromBill'); $preFilled = []; @@ -443,8 +445,8 @@ class RuleController extends Controller * @param Rule $rule * * @return \Illuminate\Http\JsonResponse - * - + * @throws Throwable + * @throws \FireflyIII\Exceptions\FireflyException */ public function testTriggersByRule(Rule $rule) { @@ -466,10 +468,10 @@ class RuleController extends Controller // Warn the user if only a subset of transactions is returned $warning = ''; - if (count($matchingTransactions) === $limit) { + if (\count($matchingTransactions) === $limit) { $warning = trans('firefly.warning_transaction_subset', ['max_num_transactions' => $limit]); // @codeCoverageIgnore } - if (0 === count($matchingTransactions)) { + if (0 === \count($matchingTransactions)) { $warning = trans('firefly.warning_no_matching_transactions', ['num_transactions' => $range]); // @codeCoverageIgnore } diff --git a/app/Import/FileProcessor/CsvProcessor.php b/app/Import/FileProcessor/CsvProcessor.php index 84915aa160..140783adc1 100644 --- a/app/Import/FileProcessor/CsvProcessor.php +++ b/app/Import/FileProcessor/CsvProcessor.php @@ -339,6 +339,7 @@ class CsvProcessor implements FileProcessorInterface { $hash = $this->getRowHash($array); $count = $this->repository->countByHash($hash); + Log::debug(sprintf('Hash is %s and count is %d', $hash, $count)); return $count > 0; } diff --git a/app/Import/Object/ImportAccount.php b/app/Import/Object/ImportAccount.php index 34da909602..5babe8e471 100644 --- a/app/Import/Object/ImportAccount.php +++ b/app/Import/Object/ImportAccount.php @@ -446,11 +446,24 @@ class ImportAccount // 5: then maybe, create one: Log::debug(sprintf('Found no account of type %s so must create one ourselves.', $this->expectedType)); + // make sure name field is sensible. + $name = '(no name)'; + if (isset($this->accountNumber['value'])) { + $name = $this->accountNumber['value']; + } + if (isset($this->accountIban['value'])) { + $name = $this->accountIban['value']; + } + if (isset($this->accountName['value'])) { + $name = $this->accountName['value']; + } + $data = [ 'accountType' => config('firefly.shortNamesByFullName.' . $this->expectedType), - 'name' => $this->accountName['value'] ?? '(no name)', + 'name' => $name, 'iban' => $this->accountIban['value'] ?? null, 'active' => true, + 'accountNumber' => $this->accountNumber['value'] ?? null, 'virtualBalance' => '0', 'account_type_id' => null, 'BIC' => $this->accountBic['value'] ?? null, diff --git a/app/Import/Storage/ImportStorage.php b/app/Import/Storage/ImportStorage.php index 9c3f941505..aee0bdbc6a 100644 --- a/app/Import/Storage/ImportStorage.php +++ b/app/Import/Storage/ImportStorage.php @@ -256,6 +256,7 @@ class ImportStorage 'sepa-country' => $importJournal->getMetaString('sepa-country'), 'sepa-ep' => $importJournal->getMetaString('sepa-ep'), 'sepa-ci' => $importJournal->getMetaString('sepa-ci'), + 'importHash' => $importJournal->hash, 'transactions' => [ // single transaction: [ diff --git a/app/Models/Preference.php b/app/Models/Preference.php index 38f86409ed..16a092a18c 100644 --- a/app/Models/Preference.php +++ b/app/Models/Preference.php @@ -28,6 +28,7 @@ use FireflyIII\Exceptions\FireflyException; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Database\Eloquent\Model; use Log; +use FireflyIII\User; /** * Class Preference. @@ -71,9 +72,8 @@ class Preference extends Model $serialized = true; try { unserialize($data, ['allowed_classes' => false]); - } catch (Exception $e) { + } /** @noinspection BadExceptionsProcessingInspection */ catch (Exception $e) { $serialized = false; - Log::debug(sprintf('Could not unserialise preference #%d ("%s"). This is good. %s', $this->id, $this->name, $e->getMessage())); } if (!$serialized) { $result = json_decode($data, true); @@ -103,6 +103,6 @@ class Preference extends Model */ public function user() { - return $this->belongsTo('FireflyIII\User'); + return $this->belongsTo(User::class); } } diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index 14fb2f4bf8..6401d05819 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -367,6 +367,22 @@ class BillRepository implements BillRepositoryInterface return $journals; } + /** + * Return all rules for one bill + * + * @param Bill $bill + * + * @return Collection + */ + public function getRulesForBill(Bill $bill): Collection + { + return $this->user->rules() + ->leftJoin('rule_actions', 'rule_actions.rule_id', '=', 'rules.id') + ->where('rule_actions.action_type', 'link_to_bill') + ->where('rule_actions.action_value', $bill->name) + ->get(['rules.*']); + } + /** * Return all rules related to the bills in the collection, in an associative array: * 5= billid @@ -426,6 +442,21 @@ class BillRepository implements BillRepositoryInterface return $avg; } + /** + * Link a set of journals to a bill. + * + * @param Bill $bill + * @param Collection $journals + */ + public function linkCollectionToBill(Bill $bill, Collection $journals): void + { + $ids = $journals->pluck('id')->toArray(); + DB::table('transaction_journals') + ->where('user_id', $this->user->id) + ->whereIn('id', $ids) + ->update(['bill_id' => $bill->id]); + } + /** * Given a bill and a date, this method will tell you at which moment this bill expects its next * transaction. Whether or not it is there already, is not relevant. diff --git a/app/Repositories/Bill/BillRepositoryInterface.php b/app/Repositories/Bill/BillRepositoryInterface.php index 19cd785ace..d6cea63eea 100644 --- a/app/Repositories/Bill/BillRepositoryInterface.php +++ b/app/Repositories/Bill/BillRepositoryInterface.php @@ -140,6 +140,15 @@ interface BillRepositoryInterface */ public function getPossiblyRelatedJournals(Bill $bill): Collection; + /** + * Return all rules for one bill + * + * @param Bill $bill + * + * @return Collection + */ + public function getRulesForBill(Bill $bill): Collection; + /** * Return all rules related to the bills in the collection, in an associative array: * 5= billid @@ -160,6 +169,14 @@ interface BillRepositoryInterface */ public function getYearAverage(Bill $bill, Carbon $date): string; + /** + * Link a set of journals to a bill. + * + * @param Bill $bill + * @param Collection $journals + */ + public function linkCollectionToBill(Bill $bill, Collection $journals): void; + /** * Given a bill and a date, this method will tell you at which moment this bill expects its next * transaction. Whether or not it is there already, is not relevant. diff --git a/app/TransactionRules/TransactionMatcher.php b/app/TransactionRules/TransactionMatcher.php index 3ad8033ec5..83fc9c268b 100644 --- a/app/TransactionRules/TransactionMatcher.php +++ b/app/TransactionRules/TransactionMatcher.php @@ -54,7 +54,7 @@ class TransactionMatcher * @return Collection * @throws \FireflyIII\Exceptions\FireflyException */ - public function findTransactionsByRule() + public function findTransactionsByRule(): Collection { if (0 === count($this->rule->ruleTriggers)) { return new Collection; @@ -202,6 +202,10 @@ class TransactionMatcher $collector = app(JournalCollectorInterface::class); $collector->setUser(auth()->user()); $collector->setAllAssetAccounts()->setLimit($pageSize)->setPage($page)->setTypes($this->transactionTypes); + + + + $set = $collector->getPaginatedJournals(); Log::debug(sprintf('Found %d journals to check. ', $set->count())); diff --git a/composer.json b/composer.json index 49c1ecdd6f..ba48c44044 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ "twig/twig": "1.*" }, "require-dev": { - "barryvdh/laravel-debugbar": "3.*", + "roave/security-advisories": "dev-master", "barryvdh/laravel-ide-helper": "2.*", "filp/whoops": "2.*", "fzaninotto/faker": "1.*", diff --git a/composer.lock b/composer.lock index 4b66b09356..4d7f9be2ae 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" ], - "content-hash": "3de47eba99b9bbd1bfb0f129fbf3494a", + "content-hash": "b8f72583ba830928cfc33001fdd96409", "packages": [ { "name": "bacon/bacon-qr-code", @@ -458,16 +458,16 @@ }, { "name": "doctrine/dbal", - "version": "v2.6.3", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13" + "reference": "11037b4352c008373561dc6fc836834eed80c3b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13", - "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/11037b4352c008373561dc6fc836834eed80c3b5", + "reference": "11037b4352c008373561dc6fc836834eed80c3b5", "shasum": "" }, "require": { @@ -476,9 +476,11 @@ "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^5.4.6", + "doctrine/coding-standard": "^4.0", + "phpunit/phpunit": "^7.0", "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", - "symfony/console": "2.*||^3.0" + "symfony/console": "^2.0.5||^3.0", + "symfony/phpunit-bridge": "^3.4.5|^4.0.5" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -489,7 +491,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "2.7.x-dev" } }, "autoload": { @@ -527,7 +529,7 @@ "persistence", "queryobject" ], - "time": "2017-11-19T13:38:54+00:00" + "time": "2018-04-07T18:44:18+00:00" }, { "name": "doctrine/inflector", @@ -652,23 +654,23 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v2.0.0", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "8a84aee649c3a3ba03a721c1fb080e08dfbcd68b" + "reference": "3f00985deec8df53d4cc1e5c33619bda1ee309a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8a84aee649c3a3ba03a721c1fb080e08dfbcd68b", - "reference": "8a84aee649c3a3ba03a721c1fb080e08dfbcd68b", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/3f00985deec8df53d4cc1e5c33619bda1ee309a5", + "reference": "3f00985deec8df53d4cc1e5c33619bda1ee309a5", "shasum": "" }, "require": { "php": ">=7.0.0" }, "require-dev": { - "phpunit/phpunit": "~5.7" + "phpunit/phpunit": "~6.4" }, "type": "library", "autoload": { @@ -697,7 +699,7 @@ "cron", "schedule" ], - "time": "2017-10-12T15:59:13+00:00" + "time": "2018-04-06T15:51:55+00:00" }, { "name": "egulias/email-validator", @@ -1085,16 +1087,16 @@ }, { "name": "laravel/framework", - "version": "v5.6.15", + "version": "v5.6.16", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "baa42cf6bdd942523fafece21ec16a1843c6db0f" + "reference": "fcdbc791bc3e113ada38ab0a1147141fb9ec2b16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/baa42cf6bdd942523fafece21ec16a1843c6db0f", - "reference": "baa42cf6bdd942523fafece21ec16a1843c6db0f", + "url": "https://api.github.com/repos/laravel/framework/zipball/fcdbc791bc3e113ada38ab0a1147141fb9ec2b16", + "reference": "fcdbc791bc3e113ada38ab0a1147141fb9ec2b16", "shasum": "" }, "require": { @@ -1159,6 +1161,7 @@ "aws/aws-sdk-php": "~3.0", "doctrine/dbal": "~2.6", "filp/whoops": "^2.1.4", + "league/flysystem-cached-adapter": "~1.0", "mockery/mockery": "~1.0", "moontoast/math": "^1.1", "orchestra/testbench-core": "3.6.*", @@ -1177,7 +1180,7 @@ "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", "laravel/tinker": "Required to use the tinker console command (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).", @@ -1219,7 +1222,7 @@ "framework", "laravel" ], - "time": "2018-03-30T13:29:58+00:00" + "time": "2018-04-09T16:07:04+00:00" }, { "name": "laravel/passport", @@ -1292,16 +1295,16 @@ }, { "name": "laravelcollective/html", - "version": "v5.6.5", + "version": "v5.6.6", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "623a150c91e2d3f92eeee9f9eda58a841e3cb548" + "reference": "b3a10245c791a211e5f8ec37117f4549cd22aabe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/623a150c91e2d3f92eeee9f9eda58a841e3cb548", - "reference": "623a150c91e2d3f92eeee9f9eda58a841e3cb548", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/b3a10245c791a211e5f8ec37117f4549cd22aabe", + "reference": "b3a10245c791a211e5f8ec37117f4549cd22aabe", "shasum": "" }, "require": { @@ -1356,7 +1359,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "https://laravelcollective.com", - "time": "2018-03-16T16:57:31+00:00" + "time": "2018-04-09T14:09:32+00:00" }, { "name": "lcobucci/jwt", @@ -1406,7 +1409,7 @@ { "name": "Luís Otávio Cobucci Oblonczyk", "email": "lcobucci@gmail.com", - "role": "Developer" + "role": "developer" } ], "description": "A simple library to work with JSON Web Token and JSON Web Signature", @@ -1604,16 +1607,16 @@ }, { "name": "league/flysystem", - "version": "1.0.43", + "version": "1.0.44", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1ce7cc142d906ba58dc54c82915d355a9191c8a8" + "reference": "168dbe519737221dc87d17385cde33073881fd02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1ce7cc142d906ba58dc54c82915d355a9191c8a8", - "reference": "1ce7cc142d906ba58dc54c82915d355a9191c8a8", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/168dbe519737221dc87d17385cde33073881fd02", + "reference": "168dbe519737221dc87d17385cde33073881fd02", "shasum": "" }, "require": { @@ -1684,7 +1687,7 @@ "sftp", "storage" ], - "time": "2018-03-01T10:27:04+00:00" + "time": "2018-04-06T09:58:14+00:00" }, { "name": "league/fractal", @@ -2013,16 +2016,16 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.11", + "version": "v2.0.12", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" + "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", "shasum": "" }, "require": { @@ -2057,7 +2060,7 @@ "pseudorandom", "random" ], - "time": "2017-09-27T21:40:39+00:00" + "time": "2018-04-04T21:24:14+00:00" }, { "name": "phpseclib/phpseclib", @@ -2735,16 +2738,16 @@ }, { "name": "symfony/console", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "555c8dbe0ae9e561740451eabdbed2cc554b6a51" + "reference": "aad9a6fe47319f22748fd764f52d3a7ca6fa6b64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/555c8dbe0ae9e561740451eabdbed2cc554b6a51", - "reference": "555c8dbe0ae9e561740451eabdbed2cc554b6a51", + "url": "https://api.github.com/repos/symfony/console/zipball/aad9a6fe47319f22748fd764f52d3a7ca6fa6b64", + "reference": "aad9a6fe47319f22748fd764f52d3a7ca6fa6b64", "shasum": "" }, "require": { @@ -2799,20 +2802,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-02-26T15:55:47+00:00" + "time": "2018-04-03T05:24:00+00:00" }, { "name": "symfony/css-selector", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "c69f1e93aa898fd9fec627ebef467188151c8dc2" + "reference": "03f965583147957f1ecbad7ea1c9d6fd5e525ec2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/c69f1e93aa898fd9fec627ebef467188151c8dc2", - "reference": "c69f1e93aa898fd9fec627ebef467188151c8dc2", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/03f965583147957f1ecbad7ea1c9d6fd5e525ec2", + "reference": "03f965583147957f1ecbad7ea1c9d6fd5e525ec2", "shasum": "" }, "require": { @@ -2852,20 +2855,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-02-03T14:58:37+00:00" + "time": "2018-03-19T22:35:49+00:00" }, { "name": "symfony/debug", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "1721e4e7effb23480966690cdcdc7d2a4152d489" + "reference": "5961d02d48828671f5d8a7805e06579d692f6ede" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/1721e4e7effb23480966690cdcdc7d2a4152d489", - "reference": "1721e4e7effb23480966690cdcdc7d2a4152d489", + "url": "https://api.github.com/repos/symfony/debug/zipball/5961d02d48828671f5d8a7805e06579d692f6ede", + "reference": "5961d02d48828671f5d8a7805e06579d692f6ede", "shasum": "" }, "require": { @@ -2908,20 +2911,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-02-28T21:50:02+00:00" + "time": "2018-04-03T05:24:00+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "85eaf6a8ec915487abac52e133efc4a268204428" + "reference": "63353a71073faf08f62caab4e6889b06a787f07b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/85eaf6a8ec915487abac52e133efc4a268204428", - "reference": "85eaf6a8ec915487abac52e133efc4a268204428", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/63353a71073faf08f62caab4e6889b06a787f07b", + "reference": "63353a71073faf08f62caab4e6889b06a787f07b", "shasum": "" }, "require": { @@ -2971,20 +2974,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-02-14T14:11:10+00:00" + "time": "2018-04-06T07:35:43+00:00" }, { "name": "symfony/finder", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "44a796d2ecc2a16a5fc8f2956a34ee617934d55f" + "reference": "ca27c02b7a3fef4828c998c2ff9ba7aae1641c49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/44a796d2ecc2a16a5fc8f2956a34ee617934d55f", - "reference": "44a796d2ecc2a16a5fc8f2956a34ee617934d55f", + "url": "https://api.github.com/repos/symfony/finder/zipball/ca27c02b7a3fef4828c998c2ff9ba7aae1641c49", + "reference": "ca27c02b7a3fef4828c998c2ff9ba7aae1641c49", "shasum": "" }, "require": { @@ -3020,20 +3023,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-03-05T18:28:26+00:00" + "time": "2018-04-04T05:10:37+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6c181e81a3a9a7996c62ebd7803592536e729c5a" + "reference": "d0864a82e5891ab61d31eecbaa48bed5a09b8e6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6c181e81a3a9a7996c62ebd7803592536e729c5a", - "reference": "6c181e81a3a9a7996c62ebd7803592536e729c5a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0864a82e5891ab61d31eecbaa48bed5a09b8e6c", + "reference": "d0864a82e5891ab61d31eecbaa48bed5a09b8e6c", "shasum": "" }, "require": { @@ -3073,20 +3076,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-03-05T16:01:10+00:00" + "time": "2018-04-03T05:24:00+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "2a1ebfe8c37240500befcb17bceb3893adacffa3" + "reference": "6dd620d96d64456075536ffe3c6c4658dd689021" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2a1ebfe8c37240500befcb17bceb3893adacffa3", - "reference": "2a1ebfe8c37240500befcb17bceb3893adacffa3", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6dd620d96d64456075536ffe3c6c4658dd689021", + "reference": "6dd620d96d64456075536ffe3c6c4658dd689021", "shasum": "" }, "require": { @@ -3159,7 +3162,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-03-05T22:27:01+00:00" + "time": "2018-04-06T16:25:03+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -3385,16 +3388,16 @@ }, { "name": "symfony/process", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6ed08502a7c9559da8e60ea343bdbd19c3350b3e" + "reference": "d7dc1ee5dfe9f732cb1bba7310f5b99f2b7a6d25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6ed08502a7c9559da8e60ea343bdbd19c3350b3e", - "reference": "6ed08502a7c9559da8e60ea343bdbd19c3350b3e", + "url": "https://api.github.com/repos/symfony/process/zipball/d7dc1ee5dfe9f732cb1bba7310f5b99f2b7a6d25", + "reference": "d7dc1ee5dfe9f732cb1bba7310f5b99f2b7a6d25", "shasum": "" }, "require": { @@ -3430,7 +3433,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-02-19T12:18:43+00:00" + "time": "2018-04-03T05:24:00+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -3494,16 +3497,16 @@ }, { "name": "symfony/routing", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9c6268c1970c7e507bedc8946bece32a7db23515" + "reference": "0663036dd57dbfd4e9ff29f75bbd5dd3253ebe71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9c6268c1970c7e507bedc8946bece32a7db23515", - "reference": "9c6268c1970c7e507bedc8946bece32a7db23515", + "url": "https://api.github.com/repos/symfony/routing/zipball/0663036dd57dbfd4e9ff29f75bbd5dd3253ebe71", + "reference": "0663036dd57dbfd4e9ff29f75bbd5dd3253ebe71", "shasum": "" }, "require": { @@ -3568,11 +3571,11 @@ "uri", "url" ], - "time": "2018-02-28T21:50:02+00:00" + "time": "2018-04-04T13:50:32+00:00" }, { "name": "symfony/translation", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", @@ -3640,16 +3643,16 @@ }, { "name": "symfony/var-dumper", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c7d89044ed6ed3b7d8b558d509cca0666b947e58" + "reference": "e1b4d008100f4d203cc38b0d793ad6252d8d8af0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c7d89044ed6ed3b7d8b558d509cca0666b947e58", - "reference": "c7d89044ed6ed3b7d8b558d509cca0666b947e58", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e1b4d008100f4d203cc38b0d793ad6252d8d8af0", + "reference": "e1b4d008100f4d203cc38b0d793ad6252d8d8af0", "shasum": "" }, "require": { @@ -3705,7 +3708,7 @@ "debug", "dump" ], - "time": "2018-02-26T15:55:47+00:00" + "time": "2018-04-04T05:10:37+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -3923,74 +3926,6 @@ } ], "packages-dev": [ - { - "name": "barryvdh/laravel-debugbar", - "version": "v3.1.4", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "7a91480cc6e597caed5117a3c5d685f06d35c5a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/7a91480cc6e597caed5117a3c5d685f06d35c5a1", - "reference": "7a91480cc6e597caed5117a3c5d685f06d35c5a1", - "shasum": "" - }, - "require": { - "illuminate/routing": "5.5.x|5.6.x", - "illuminate/session": "5.5.x|5.6.x", - "illuminate/support": "5.5.x|5.6.x", - "maximebf/debugbar": "~1.15.0", - "php": ">=7.0", - "symfony/debug": "^3|^4", - "symfony/finder": "^3|^4" - }, - "require-dev": { - "illuminate/framework": "5.5.x" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ], - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facade" - } - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "PHP Debugbar integration for Laravel", - "keywords": [ - "debug", - "debugbar", - "laravel", - "profiler", - "webprofiler" - ], - "time": "2018-03-06T08:35:31+00:00" - }, { "name": "barryvdh/laravel-ide-helper", "version": "v2.4.3", @@ -4326,67 +4261,6 @@ ], "time": "2016-01-20T08:20:44+00:00" }, - { - "name": "maximebf/debugbar", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "30e7d60937ee5f1320975ca9bc7bcdd44d500f07" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30e7d60937ee5f1320975ca9bc7bcdd44d500f07", - "reference": "30e7d60937ee5f1320975ca9bc7bcdd44d500f07", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3.0|^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0|^5.0" - }, - "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.14-dev" - } - }, - "autoload": { - "psr-4": { - "DebugBar\\": "src/DebugBar/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maxime Bouroumeau-Fuseau", - "email": "maxime.bouroumeau@gmail.com", - "homepage": "http://maximebf.com" - }, - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Debug bar in the browser for php application", - "homepage": "https://github.com/maximebf/php-debugbar", - "keywords": [ - "debug", - "debugbar" - ], - "time": "2017-12-15T11:13:46+00:00" - }, { "name": "mockery/mockery", "version": "1.0", @@ -4899,16 +4773,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.0.1", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f8ca4b604baf23dab89d87773c28cc07405189ba" + "reference": "774a82c0c5da4c1c7701790c262035d235ab7856" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f8ca4b604baf23dab89d87773c28cc07405189ba", - "reference": "f8ca4b604baf23dab89d87773c28cc07405189ba", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/774a82c0c5da4c1c7701790c262035d235ab7856", + "reference": "774a82c0c5da4c1c7701790c262035d235ab7856", "shasum": "" }, "require": { @@ -4919,7 +4793,7 @@ "phpunit/php-text-template": "^1.2.1", "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", + "sebastian/environment": "^3.1", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, @@ -4958,7 +4832,7 @@ "testing", "xunit" ], - "time": "2018-02-02T07:01:41+00:00" + "time": "2018-04-06T15:39:20+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5148,16 +5022,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.0.3", + "version": "7.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "536f4d853c12d8189963435088e8ff7c0daeab2e" + "reference": "6a17c170fb92845896e1b3b00fcb462cd4b3c017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/536f4d853c12d8189963435088e8ff7c0daeab2e", - "reference": "536f4d853c12d8189963435088e8ff7c0daeab2e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6a17c170fb92845896e1b3b00fcb462cd4b3c017", + "reference": "6a17c170fb92845896e1b3b00fcb462cd4b3c017", "shasum": "" }, "require": { @@ -5175,7 +5049,7 @@ "phpunit/php-file-iterator": "^1.4.3", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^2.0", - "phpunit/phpunit-mock-objects": "^6.0", + "phpunit/phpunit-mock-objects": "^6.1", "sebastian/comparator": "^2.1", "sebastian/diff": "^3.0", "sebastian/environment": "^3.1", @@ -5198,7 +5072,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-master": "7.1-dev" } }, "autoload": { @@ -5224,20 +5098,20 @@ "testing", "xunit" ], - "time": "2018-03-26T07:36:48+00:00" + "time": "2018-04-10T11:40:22+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "e3249dedc2d99259ccae6affbc2684eac37c2e53" + "reference": "3f5ca97eee66a07951d018f6726017629c85c86d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/e3249dedc2d99259ccae6affbc2684eac37c2e53", - "reference": "e3249dedc2d99259ccae6affbc2684eac37c2e53", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3f5ca97eee66a07951d018f6726017629c85c86d", + "reference": "3f5ca97eee66a07951d018f6726017629c85c86d", "shasum": "" }, "require": { @@ -5255,7 +5129,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0.x-dev" + "dev-master": "6.1-dev" } }, "autoload": { @@ -5280,7 +5154,167 @@ "mock", "xunit" ], - "time": "2018-02-15T05:27:38+00:00" + "time": "2018-04-06T08:14:40+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "c83f6aa0ed08f680c012656d411d1b7c94003012" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c83f6aa0ed08f680c012656d411d1b7c94003012", + "reference": "c83f6aa0ed08f680c012656d411d1b7c94003012", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.6", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.0.15|>=3.1,<3.1.4", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1.0.0-alpha11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.32", + "contao/core-bundle": ">=4,<4.4.8", + "contao/listing-bundle": ">=4,<4.4.8", + "contao/newsletter-bundle": ">=4,<4.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.58|>=8,<8.4.6|>=8.5,<8.5.1", + "drupal/drupal": ">=7,<7.58|>=8,<8.4.6|>=8.5,<8.5.1", + "erusev/parsedown": "<1.7", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.3|>=5.4,<5.4.11.3|>=2017.8,<2017.8.1.1|>=2017.12,<2017.12.2.1", + "firebase/php-jwt": "<2", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=6,<6.2.1|>=4.0.0-rc2,<4.2.4|>=5,<5.3.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "joomla/session": "<1.3.1", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "magento/magento1ce": ">=1.5.0.1,<1.9.3.2", + "magento/magento1ee": ">=1.9,<1.14.3.2", + "magento/magento2ce": ">=2,<2.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "onelogin/php-saml": "<2.10.4", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "phpmailer/phpmailer": ">=5,<5.2.24", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpxmlrpc/extras": "<0.6.1", + "propel/propel": ">=2.0.0-alpha1,<=2.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "shopware/shopware": "<5.3.7", + "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": ">=3,<3.3", + "silverstripe/userforms": "<3", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.15.2", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "socalnick/scn-social-auth": "<1.15.2", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "stormpath/sdk": ">=0,<9.9.99", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "symfony/dependency-injection": ">=2,<2.0.17", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2", + "symfony/http-foundation": ">=2,<2.3.27|>=2.4,<2.5.11|>=2.6,<2.6.6", + "symfony/http-kernel": ">=2,<2.3.29|>=2.4,<2.5.12|>=2.6,<2.6.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.0.25|>=2.1,<2.1.13|>=2.2,<2.2.9|>=2.3,<2.3.37|>=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8.23,<2.8.25|>=3.2.10,<3.2.12|>=3.3.3,<3.3.5", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.6|>=2.8.23,<2.8.25|>=3,<3.0.6|>=3.2.10,<3.2.12|>=3.3.3,<3.3.5", + "symfony/security-csrf": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.3.41|>=2.4,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1.0-beta1,<2.1.3|>=2.1,<2.1.2", + "titon/framework": ">=0,<9.9.99", + "twig/twig": "<1.20", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.22|>=8,<8.7.5", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "willdurand/js-translation-bundle": "<2.1.1", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-diactoros": ">=1,<1.0.4", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.3,<2.3.8|>=2.4,<2.4.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": ">=2,<2.4.11|>=2.5,<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "time": "2018-04-02T06:47:13+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -5847,7 +5881,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.6", + "version": "v3.4.8", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -5903,16 +5937,16 @@ }, { "name": "symfony/config", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "289eadd3771f7682ea2540e4925861c18ec5b4d0" + "reference": "7c19370ab04e9ac05b74a504198e165f5ccf6dd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/289eadd3771f7682ea2540e4925861c18ec5b4d0", - "reference": "289eadd3771f7682ea2540e4925861c18ec5b4d0", + "url": "https://api.github.com/repos/symfony/config/zipball/7c19370ab04e9ac05b74a504198e165f5ccf6dd8", + "reference": "7c19370ab04e9ac05b74a504198e165f5ccf6dd8", "shasum": "" }, "require": { @@ -5961,11 +5995,11 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-02-04T16:43:51+00:00" + "time": "2018-03-19T22:35:49+00:00" }, { "name": "symfony/filesystem", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -6014,7 +6048,7 @@ }, { "name": "symfony/stopwatch", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -6063,16 +6097,16 @@ }, { "name": "symfony/yaml", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "de5f125ea39de846b90b313b2cfb031a0152d223" + "reference": "8b34ebb5989df61cbd77eff29a02c4db9ac1069c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/de5f125ea39de846b90b313b2cfb031a0152d223", - "reference": "de5f125ea39de846b90b313b2cfb031a0152d223", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8b34ebb5989df61cbd77eff29a02c4db9ac1069c", + "reference": "8b34ebb5989df61cbd77eff29a02c4db9ac1069c", "shasum": "" }, "require": { @@ -6117,7 +6151,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-02-19T20:08:53+00:00" + "time": "2018-04-03T05:24:00+00:00" }, { "name": "theseer/tokenizer", @@ -6212,7 +6246,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/config/firefly.php b/config/firefly.php index 7d0f8c530d..b4376d888c 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -88,8 +88,8 @@ return [ 'is_demo_site' => false, ], 'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true, - 'version' => '4.7.2.2', - 'api_version' => '0.1', + 'version' => '4.7.3', + 'api_version' => '0.2', 'db_version' => 3, 'maxUploadSize' => 15242880, 'allowedMimes' => [ diff --git a/config/import.php b/config/import.php index b6a05b62dc..5ea6abe6da 100644 --- a/config/import.php +++ b/config/import.php @@ -69,7 +69,7 @@ return [ ], ], 'bunq' => [ - 'server' => 'api.bunq.com', + 'server' => 'sandbox.public.api.bunq.com', // sandbox.public.api.bunq.com - api.bunq.com 'version' => 'v1', ], ], diff --git a/config/intro.php b/config/intro.php index 7dcdac2289..b1d4eb7515 100644 --- a/config/intro.php +++ b/config/intro.php @@ -124,6 +124,7 @@ return [ // bills: index, create, show 'bills_index' => [ + 'rules' => ['element' => '.rules'], 'paid_in_period' => ['element' => '.paid_in_period'], 'expected_in_period' => ['element' => '.expected_in_period'], ], diff --git a/public/js/ff/rules/create-edit.js b/public/js/ff/rules/create-edit.js index ef859e255c..a2d5b89451 100644 --- a/public/js/ff/rules/create-edit.js +++ b/public/js/ff/rules/create-edit.js @@ -310,6 +310,13 @@ function createAutoComplete(input, URI) { function testRuleTriggers() { "use strict"; + // find the button: + var button = $('.test_rule_triggers'); + + // replace with spinner. fa-spin fa-spinner + button.html(' ' + testRuleTriggersText); + button.attr('disabled', 'disabled'); + // Serialize all trigger data var triggerData = $(".rule-trigger-tbody").find("input[type=text], input[type=checkbox], select").serializeArray(); @@ -319,7 +326,7 @@ function testRuleTriggers() { // Set title and body modal.find(".transactions-list").html(data.html); - + button.attr('disabled', ''); // Show warning if appropriate if (data.warning) { modal.find(".transaction-warning .warning-contents").text(data.warning); @@ -327,7 +334,8 @@ function testRuleTriggers() { } else { modal.find(".transaction-warning").hide(); } - + button.removeAttr('disabled'); + button.html(' ' + testRuleTriggersText); // Show the modal dialog modal.modal(); }).fail(function () { diff --git a/resources/views/bills/show.twig b/resources/views/bills/show.twig index accc2fee36..14cb9384a0 100644 --- a/resources/views/bills/show.twig +++ b/resources/views/bills/show.twig @@ -27,11 +27,7 @@ @@ -60,8 +56,8 @@ @@ -79,21 +75,19 @@
-
+
-

{{ 'more'|_ }}

+

{{ 'bill_related_rules'|_ }}

-
- {% if object.data.notes|length > 0 %} -
- {{ 'matching_on'|_ }} - {% for word in object.data.match %} - {{ word }} - {% endfor %} - {{ trans('firefly.between_amounts', {low: object.data.amount_min|formatAmount, high: object.data.amount_max|formatAmount })|raw }} + {{ trans('firefly.match_between_amounts', {low: object.data.amount_min|formatAmount, high: object.data.amount_max|formatAmount })|raw }} {{ 'repeats'|_ }} {{ trans('firefly.repeat_freq_' ~object.data.repeat_freq) }}. {{ 'next_expected_match'|_ }} {% if object.data.next_expected_match|length > 0 %} - {{ formatDate(object.data.next_expected_match, monthAndDayFormat) }} - {% else %} + {{ formatDate(object.data.next_expected_match, monthAndDayFormat) }} + {% else %} {{ 'unknown'|_ }} {% endif %}
- - - - -
{{ trans('list.notes') }}{{ object.data.notes|markdown }}
+
+ {% if rules.count > 0 %} + {% endif %}
- diff --git a/resources/views/list/bills.twig b/resources/views/list/bills.twig index cdb320ac7b..f56763283d 100644 --- a/resources/views/list/bills.twig +++ b/resources/views/list/bills.twig @@ -42,7 +42,7 @@ {% endif %} - + {% if entry.rules|length > 0 %} diff --git a/resources/views/rules/rule/create.twig b/resources/views/rules/rule/create.twig index 1fddf8f2af..aadaff7a4e 100644 --- a/resources/views/rules/rule/create.twig +++ b/resources/views/rules/rule/create.twig @@ -82,7 +82,7 @@


- {{ 'test_rule_triggers'|_ }} + {{ 'test_rule_triggers'|_ }}

@@ -148,6 +148,7 @@ diff --git a/resources/views/rules/rule/edit.twig b/resources/views/rules/rule/edit.twig index 2b28a6e21e..e45e47e92f 100644 --- a/resources/views/rules/rule/edit.twig +++ b/resources/views/rules/rule/edit.twig @@ -128,6 +128,7 @@ diff --git a/routes/web.php b/routes/web.php index a7c91ce196..897e64e490 100755 --- a/routes/web.php +++ b/routes/web.php @@ -713,7 +713,7 @@ Route::group( ['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers', 'prefix' => 'rules', 'as' => 'rules.'], function () { Route::get('', ['uses' => 'RuleController@index', 'as' => 'index']); - Route::get('create/{ruleGroup}', ['uses' => 'RuleController@create', 'as' => 'create']); + Route::get('create/{ruleGroup?}', ['uses' => 'RuleController@create', 'as' => 'create']); Route::get('up/{rule}', ['uses' => 'RuleController@up', 'as' => 'up']); Route::get('down/{rule}', ['uses' => 'RuleController@down', 'as' => 'down']); Route::get('edit/{rule}', ['uses' => 'RuleController@edit', 'as' => 'edit']);