diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 8486eef106..e36d2f3684 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -2,4 +2,4 @@ tools: external_code_coverage: timeout: 1800 # Timeout in seconds. - runs: 2 \ No newline at end of file + runs: 2 diff --git a/.travis.yml b/.travis.yml index a0ca8e95fe..150aeec78c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,4 +19,4 @@ after_script: - CODECLIMATE_REPO_TOKEN=26489f9e854fcdf7e7660ba29c1455694685465b1f90329a79f7d2bf448acb61 ./vendor/bin/test-reporter --stdout > codeclimate.json - "curl -X POST -d @codeclimate.json -H 'Content-Type: application/json' -H 'User-Agent: Code Climate (PHP Test Reporter v0.1.1)' https://codeclimate.com/test_reports" - wget https://scrutinizer-ci.com/ocular.phar - - php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml \ No newline at end of file + - php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml diff --git a/README.md b/README.md index 47d7dac02e..f105242ea2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Firefly III (v3.4.3) +# Firefly III (v3.4.4) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/JC5/firefly-iii/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/JC5/firefly-iii/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/JC5/firefly-iii/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/JC5/firefly-iii/?branch=master) diff --git a/app/Handlers/Events/ConnectJournalToPiggyBank.php b/app/Handlers/Events/ConnectJournalToPiggyBank.php index f33e283fa1..701daa11c7 100644 --- a/app/Handlers/Events/ConnectJournalToPiggyBank.php +++ b/app/Handlers/Events/ConnectJournalToPiggyBank.php @@ -4,7 +4,6 @@ use Auth; use FireflyIII\Events\JournalCreated; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankEvent; -use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; /** @@ -53,17 +52,9 @@ class ConnectJournalToPiggyBank return false; } - $amount = $journal->amount; - /** @var Transaction $transaction */ - foreach ($journal->transactions()->get() as $transaction) { - if ($transaction->account_id == $piggyBank->account_id) { - if ($transaction->amount < 0) { - $amount = $transaction->amount * -1; - } - } - } - - $repetition->currentamount += $amount; + $amount = $journal->correct_amount; + bcscale(2); + $repetition->currentamount = bcadd($repetition->currentamount, $amount); $repetition->save(); PiggyBankEvent::create(['piggy_bank_id' => $piggyBank->id, 'transaction_journal_id' => $journal->id, 'date' => $journal->date, 'amount' => $amount]); diff --git a/app/Helpers/Collection/BalanceLine.php b/app/Helpers/Collection/BalanceLine.php index de82b6814d..d491f32959 100644 --- a/app/Helpers/Collection/BalanceLine.php +++ b/app/Helpers/Collection/BalanceLine.php @@ -64,6 +64,7 @@ class BalanceLine if ($this->getRole() == self::ROLE_DIFFROLE) { return trans('firefly.leftUnbalanced'); } + return ''; } diff --git a/app/Helpers/Collection/Bill.php b/app/Helpers/Collection/Bill.php index de5b86fc97..34b3205c6b 100644 --- a/app/Helpers/Collection/Bill.php +++ b/app/Helpers/Collection/Bill.php @@ -41,7 +41,7 @@ class Bill public function getBills() { $this->bills->sortBy( - function(BillLine $bill) { + function (BillLine $bill) { $active = intval($bill->getBill()->active) == 0 ? 1 : 0; $name = $bill->getBill()->name; diff --git a/app/Helpers/Collection/Category.php b/app/Helpers/Collection/Category.php index 71af3c2607..84f426487a 100644 --- a/app/Helpers/Collection/Category.php +++ b/app/Helpers/Collection/Category.php @@ -55,7 +55,7 @@ class Category public function getCategories() { $this->categories->sortByDesc( - function(CategoryModel $category) { + function (CategoryModel $category) { return $category->spent; } ); diff --git a/app/Helpers/Collection/Expense.php b/app/Helpers/Collection/Expense.php index f328bfd42a..a66c1ef86d 100644 --- a/app/Helpers/Collection/Expense.php +++ b/app/Helpers/Collection/Expense.php @@ -67,7 +67,7 @@ class Expense public function getExpenses() { $this->expenses->sortByDesc( - function(stdClass $object) { + function (stdClass $object) { return $object->amount; } ); diff --git a/app/Helpers/Collection/Income.php b/app/Helpers/Collection/Income.php index 2b635f8aa4..c3caf9eba7 100644 --- a/app/Helpers/Collection/Income.php +++ b/app/Helpers/Collection/Income.php @@ -68,7 +68,7 @@ class Income public function getIncomes() { $this->incomes->sortByDesc( - function(stdClass $object) { + function (stdClass $object) { return $object->amount; } ); diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index a1e337531a..4790b1d81c 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -66,10 +66,11 @@ class ReportHelper implements ReportHelperInterface // remove cash account, if any: $accounts = $accounts->filter( - function(Account $account) { + function (Account $account) { if ($account->accountType->type != 'Cash account') { return $account; } + return null; } ); diff --git a/app/Helpers/Report/ReportHelperInterface.php b/app/Helpers/Report/ReportHelperInterface.php index e1e0a3df1a..75ffbdfd0c 100644 --- a/app/Helpers/Report/ReportHelperInterface.php +++ b/app/Helpers/Report/ReportHelperInterface.php @@ -5,9 +5,9 @@ namespace FireflyIII\Helpers\Report; use Carbon\Carbon; use FireflyIII\Helpers\Collection\Account as AccountCollection; use FireflyIII\Helpers\Collection\Balance; +use FireflyIII\Helpers\Collection\Bill as BillCollection; use FireflyIII\Helpers\Collection\Budget as BudgetCollection; use FireflyIII\Helpers\Collection\Category as CategoryCollection; -use FireflyIII\Helpers\Collection\Bill as BillCollection; use FireflyIII\Helpers\Collection\Expense; use FireflyIII\Helpers\Collection\Income; diff --git a/app/Helpers/Report/ReportQuery.php b/app/Helpers/Report/ReportQuery.php index 5bcf09f9d8..2e720e0653 100644 --- a/app/Helpers/Report/ReportQuery.php +++ b/app/Helpers/Report/ReportQuery.php @@ -35,15 +35,15 @@ class ReportQuery implements ReportQueryInterface $query = $this->queryJournalsWithTransactions($start, $end); if ($includeShared === false) { $query->where( - function(Builder $query) { + function (Builder $query) { $query->where( - function(Builder $q) { // only get withdrawals not from a shared account + function (Builder $q) { // only get withdrawals not from a shared account $q->where('transaction_types.type', 'Withdrawal'); $q->where('acm_from.data', '!=', '"sharedAsset"'); } ); $query->orWhere( - function(Builder $q) { // and transfers from a shared account. + function (Builder $q) { // and transfers from a shared account. $q->where('transaction_types.type', 'Transfer'); $q->where('acm_to.data', '=', '"sharedAsset"'); } @@ -61,17 +61,18 @@ class ReportQuery implements ReportQueryInterface ); $data->each( - function(TransactionJournal $journal) { + function (TransactionJournal $journal) { if (intval($journal->account_encrypted) == 1) { $journal->name = Crypt::decrypt($journal->name); } } ); $data = $data->filter( - function(TransactionJournal $journal) { + function (TransactionJournal $journal) { if ($journal->amount != 0) { return $journal; } + return null; } ); @@ -91,26 +92,26 @@ class ReportQuery implements ReportQueryInterface public function getAllAccounts(Carbon $start, Carbon $end, $includeShared = false) { $query = Auth::user()->accounts()->orderBy('accounts.name', 'ASC') - ->accountTypeIn(['Default account', 'Asset account', 'Cash account']); + ->accountTypeIn(['Default account', 'Asset account', 'Cash account']); if ($includeShared === false) { $query->leftJoin( - 'account_meta', function(JoinClause $join) { + 'account_meta', function (JoinClause $join) { $join->on('account_meta.account_id', '=', 'accounts.id')->where('account_meta.name', '=', 'accountRole'); } ) - ->orderBy('accounts.name', 'ASC') - ->where( - function(Builder $query) { + ->orderBy('accounts.name', 'ASC') + ->where( + function (Builder $query) { - $query->where('account_meta.data', '!=', '"sharedAsset"'); - $query->orWhereNull('account_meta.data'); + $query->where('account_meta.data', '!=', '"sharedAsset"'); + $query->orWhereNull('account_meta.data'); - } - ); + } + ); } $set = $query->get(['accounts.*']); $set->each( - function(Account $account) use ($start, $end) { + function (Account $account) use ($start, $end) { /** * The balance for today always incorporates transactions * made on today. So to get todays "start" balance, we sub one @@ -151,15 +152,15 @@ class ReportQuery implements ReportQueryInterface // only get deposits not to a shared account // and transfers to a shared account. $query->where( - function(Builder $query) { + function (Builder $query) { $query->where( - function(Builder $q) { + function (Builder $q) { $q->where('transaction_types.type', 'Deposit'); $q->where('acm_to.data', '!=', '"sharedAsset"'); } ); $query->orWhere( - function(Builder $q) { + function (Builder $q) { $q->where('transaction_types.type', 'Transfer'); $q->where('acm_from.data', '=', '"sharedAsset"'); } @@ -178,17 +179,18 @@ class ReportQuery implements ReportQueryInterface ); $data->each( - function(TransactionJournal $journal) { + function (TransactionJournal $journal) { if (intval($journal->account_encrypted) == 1) { $journal->name = Crypt::decrypt($journal->name); } } ); $data = $data->filter( - function(TransactionJournal $journal) { + function (TransactionJournal $journal) { if ($journal->amount != 0) { return $journal; } + return null; } ); @@ -210,16 +212,16 @@ class ReportQuery implements ReportQueryInterface { return floatval( - Auth::user()->transactionjournals() - ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') - ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') - ->transactionTypes(['Withdrawal']) - ->where('transactions.account_id', $account->id) - ->before($end) - ->after($start) - ->where('budget_transaction_journal.budget_id', $budget->id) - ->get(['transaction_journals.*'])->sum('amount') - ) * -1; + Auth::user()->transactionjournals() + ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') + ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') + ->transactionTypes(['Withdrawal']) + ->where('transactions.account_id', $account->id) + ->before($end) + ->after($start) + ->where('budget_transaction_journal.budget_id', $budget->id) + ->get(['transaction_journals.*'])->sum('amount') + ) * -1; } /** @@ -254,28 +256,28 @@ class ReportQuery implements ReportQueryInterface { $query = TransactionJournal:: leftJoin( - 'transactions as t_from', function(JoinClause $join) { + 'transactions as t_from', function (JoinClause $join) { $join->on('t_from.transaction_journal_id', '=', 'transaction_journals.id')->where('t_from.amount', '<', 0); } ) - ->leftJoin('accounts as ac_from', 't_from.account_id', '=', 'ac_from.id') - ->leftJoin( - 'account_meta as acm_from', function(JoinClause $join) { - $join->on('ac_from.id', '=', 'acm_from.account_id')->where('acm_from.name', '=', 'accountRole'); - } - ) - ->leftJoin( - 'transactions as t_to', function(JoinClause $join) { - $join->on('t_to.transaction_journal_id', '=', 'transaction_journals.id')->where('t_to.amount', '>', 0); - } - ) - ->leftJoin('accounts as ac_to', 't_to.account_id', '=', 'ac_to.id') - ->leftJoin( - 'account_meta as acm_to', function(JoinClause $join) { - $join->on('ac_to.id', '=', 'acm_to.account_id')->where('acm_to.name', '=', 'accountRole'); - } - ) - ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id'); + ->leftJoin('accounts as ac_from', 't_from.account_id', '=', 'ac_from.id') + ->leftJoin( + 'account_meta as acm_from', function (JoinClause $join) { + $join->on('ac_from.id', '=', 'acm_from.account_id')->where('acm_from.name', '=', 'accountRole'); + } + ) + ->leftJoin( + 'transactions as t_to', function (JoinClause $join) { + $join->on('t_to.transaction_journal_id', '=', 'transaction_journals.id')->where('t_to.amount', '>', 0); + } + ) + ->leftJoin('accounts as ac_to', 't_to.account_id', '=', 'ac_to.id') + ->leftJoin( + 'account_meta as acm_to', function (JoinClause $join) { + $join->on('ac_to.id', '=', 'acm_to.account_id')->where('acm_to.name', '=', 'accountRole'); + } + ) + ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id'); $query->before($end)->after($start)->where('transaction_journals.user_id', Auth::user()->id); return $query; diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index bddabbd04b..be1a8545c8 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -7,6 +7,7 @@ use FireflyIII\Http\Requests\AccountFormRequest; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use Input; +use Preferences; use Redirect; use Session; use Steam; @@ -86,6 +87,7 @@ class AccountController extends Controller $repository->destroy($account); Session::flash('success', trans('firefly.' . $typeName . '_deleted', ['name' => $name])); + Preferences::mark(); return Redirect::to(Session::get('accounts.delete.url')); } @@ -154,7 +156,7 @@ class AccountController extends Controller $start = clone Session::get('start', Carbon::now()->startOfMonth()); $start->subDay(); $accounts->each( - function(Account $account) use ($start, $repository) { + function (Account $account) use ($start, $repository) { $account->lastActivityDate = $repository->getLastActivity($account); $account->startBalance = Steam::balance($account, $start); $account->endBalance = Steam::balance($account, clone Session::get('end', Carbon::now()->endOfMonth())); @@ -199,13 +201,14 @@ class AccountController extends Controller 'user' => Auth::user()->id, 'accountRole' => $request->input('accountRole'), 'openingBalance' => floatval($request->input('openingBalance')), - 'openingBalanceDate' => new Carbon((string) $request->input('openingBalanceDate')), + 'openingBalanceDate' => new Carbon((string)$request->input('openingBalanceDate')), 'openingBalanceCurrency' => intval($request->input('balance_currency_id')), ]; - $account = $repository->store($accountData); + $account = $repository->store($accountData); Session::flash('success', 'New account "' . $account->name . '" stored!'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { // set value so create routine will not overwrite URL: @@ -237,7 +240,7 @@ class AccountController extends Controller 'accountRole' => $request->input('accountRole'), 'virtualBalance' => floatval($request->input('virtualBalance')), 'openingBalance' => floatval($request->input('openingBalance')), - 'openingBalanceDate' => new Carbon((string) $request->input('openingBalanceDate')), + 'openingBalanceDate' => new Carbon((string)$request->input('openingBalanceDate')), 'openingBalanceCurrency' => intval($request->input('balance_currency_id')), 'ccType' => $request->input('ccType'), 'ccMonthlyPaymentDate' => $request->input('ccMonthlyPaymentDate'), @@ -246,6 +249,7 @@ class AccountController extends Controller $repository->update($account, $accountData); Session::flash('success', 'Account "' . $account->name . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { // set value so edit routine will not overwrite URL: diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index a44ab81cbc..4330203b5c 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -109,7 +109,6 @@ class AuthController extends Controller if (User::count() == 1) { $admin = Role::where('name', 'owner')->first(); $this->auth->user()->attachRole($admin); -// $this->auth->user()->roles()->save($admin); } diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 80bc497336..045b242b97 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -6,6 +6,7 @@ use FireflyIII\Models\Bill; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use Input; +use Preferences; use Redirect; use Session; use URL; @@ -75,6 +76,7 @@ class BillController extends Controller $repository->destroy($bill); Session::flash('success', 'The bill was deleted.'); + Preferences::mark(); return Redirect::to(Session::get('bills.delete.url')); @@ -110,7 +112,7 @@ class BillController extends Controller { $bills = $repository->getBills(); $bills->each( - function(Bill $bill) use ($repository) { + function (Bill $bill) use ($repository) { $bill->nextExpectedMatch = $repository->nextExpectedMatch($bill); $bill->lastFoundMatch = $repository->lastFoundMatch($bill); } @@ -141,6 +143,7 @@ class BillController extends Controller Session::flash('success', 'Rescanned everything.'); + Preferences::mark(); return Redirect::to(URL::previous()); } @@ -172,6 +175,7 @@ class BillController extends Controller $billData = $request->getBillData(); $bill = $repository->store($billData); Session::flash('success', 'Bill "' . e($bill->name) . '" stored.'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { // set value so create routine will not overwrite URL: @@ -198,6 +202,7 @@ class BillController extends Controller $bill = $repository->update($bill, $billData); Session::flash('success', 'Bill "' . e($bill->name) . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { // set value so edit routine will not overwrite URL: diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index b4d0cca20e..a58248e9fc 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -49,6 +49,7 @@ class BudgetController extends Controller if ($amount == 0) { $limitRepetition = null; } + Preferences::mark(); return Response::json(['name' => $budget->name, 'repetition' => $limitRepetition ? $limitRepetition->id : 0]); @@ -102,6 +103,7 @@ class BudgetController extends Controller Session::flash('success', 'The budget "' . e($name) . '" was deleted.'); + Preferences::mark(); return Redirect::to(Session::get('budgets.delete.url')); @@ -196,6 +198,7 @@ class BudgetController extends Controller $date = Session::get('start', Carbon::now()->startOfMonth())->format('FY'); Preferences::set('budgetIncomeTotal' . $date, intval(Input::get('amount'))); + Preferences::mark(); return Redirect::route('budgets.index'); } @@ -216,12 +219,15 @@ class BudgetController extends Controller } $journals = $repository->getJournals($budget, $repetition); - $limits = !is_null($repetition->id) ? [$repetition->budgetLimit] : $repository->getBudgetLimits($budget); - $subTitle = !is_null($repetition->id) - ? - trans('firefly.budget_in_month', ['name' => $budget->name, 'month' => $repetition->startdate->formatLocalized($this->monthFormat)]) - : - e($budget->name); + + if (is_null($repetition->id)) { + $limits = $repository->getBudgetLimits($budget); + $subTitle = e($budget->name); + } else { + $limits = [$repetition->budgetLimit]; + $subTitle = trans('firefly.budget_in_month', ['name' => $budget->name, 'month' => $repetition->startdate->formatLocalized($this->monthFormat)]); + } + $journals->setPath('/budgets/show/' . $budget->id); return view('budgets.show', compact('limits', 'budget', 'repetition', 'journals', 'subTitle')); @@ -239,9 +245,10 @@ class BudgetController extends Controller 'name' => $request->input('name'), 'user' => Auth::user()->id, ]; - $budget = $repository->store($budgetData); + $budget = $repository->store($budgetData); Session::flash('success', 'New budget "' . $budget->name . '" stored!'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { // set value so create routine will not overwrite URL: @@ -272,6 +279,7 @@ class BudgetController extends Controller $repository->update($budget, $budgetData); Session::flash('success', 'Budget "' . $budget->name . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { // set value so edit routine will not overwrite URL: diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 92f027ab26..b6f016f272 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -7,6 +7,7 @@ use FireflyIII\Models\Category; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use Illuminate\Pagination\LengthAwarePaginator; use Input; +use Preferences; use Redirect; use Session; use URL; @@ -77,6 +78,7 @@ class CategoryController extends Controller $repository->destroy($category); Session::flash('success', 'The category "' . e($name) . '" was deleted.'); + Preferences::mark(); return Redirect::to(Session::get('categories.delete.url')); } @@ -112,7 +114,7 @@ class CategoryController extends Controller $categories = $repository->getCategories(); $categories->each( - function(Category $category) use ($repository) { + function (Category $category) use ($repository) { $category->lastActivity = $repository->getLatestActivity($category); } ); @@ -165,9 +167,10 @@ class CategoryController extends Controller 'name' => $request->input('name'), 'user' => Auth::user()->id, ]; - $category = $repository->store($categoryData); + $category = $repository->store($categoryData); Session::flash('success', 'New category "' . $category->name . '" stored!'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { Session::put('categories.create.fromStore', true); @@ -195,6 +198,7 @@ class CategoryController extends Controller $repository->update($category, $categoryData); Session::flash('success', 'Category "' . $category->name . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { Session::put('categories.edit.fromUpdate', true); diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php index 5c9e11e3c1..2c5d4f7a6e 100644 --- a/app/Http/Controllers/Chart/AccountController.php +++ b/app/Http/Controllers/Chart/AccountController.php @@ -6,6 +6,7 @@ use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Illuminate\Support\Collection; use Preferences; @@ -37,6 +38,18 @@ class AccountController extends Controller $start = new Carbon($year . '-' . $month . '-01'); $end = clone $start; $end->endOfMonth(); + + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('all'); + $cache->addProperty('accounts'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + $chart->addColumn(trans('firefly.dayOfMonth'), 'date'); /** @var Collection $accounts */ @@ -50,6 +63,7 @@ class AccountController extends Controller } } + // $index = 1; /** @var Account $account */ @@ -73,7 +87,10 @@ class AccountController extends Controller } $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } /** @@ -93,6 +110,17 @@ class AccountController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); $accounts = $repository->getFrontpageAccounts($frontPage); + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('frontpage'); + $cache->addProperty('accounts'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + $index = 1; /** @var Account $account */ foreach ($accounts as $account) { @@ -115,7 +143,10 @@ class AccountController extends Controller } $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } @@ -138,6 +169,17 @@ class AccountController extends Controller $current = clone $start; $today = new Carbon; + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('frontpage'); + $cache->addProperty('single'); + $cache->addProperty($account->id); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + while ($end >= $current) { $certain = $current < $today; $chart->addRow(clone $current, Steam::balance($account, $current), $certain); @@ -147,6 +189,9 @@ class AccountController extends Controller $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } } diff --git a/app/Http/Controllers/Chart/BillController.php b/app/Http/Controllers/Chart/BillController.php index 9ba00ee2fc..7a4c2670bb 100644 --- a/app/Http/Controllers/Chart/BillController.php +++ b/app/Http/Controllers/Chart/BillController.php @@ -8,6 +8,7 @@ use FireflyIII\Models\Bill; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Illuminate\Support\Collection; use Response; @@ -38,6 +39,14 @@ class BillController extends Controller $chart->addColumn(trans('firefly.minAmount'), 'number'); $chart->addColumn(trans('firefly.billEntry'), 'number'); + $cache = new CacheProperties; + $cache->addProperty('single'); + $cache->addProperty('bill'); + $cache->addProperty($bill->id); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + // get first transaction or today for start: $results = $repository->getJournals($bill); /** @var TransactionJournal $result */ @@ -47,8 +56,10 @@ class BillController extends Controller $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + return Response::json($data); } /** @@ -66,8 +77,20 @@ class BillController extends Controller $chart->addColumn(trans('firefly.name'), 'string'); $chart->addColumn(trans('firefly.amount'), 'number'); - $start = Session::get('start', Carbon::now()->startOfMonth()); - $end = Session::get('end', Carbon::now()->endOfMonth()); + $start = Session::get('start', Carbon::now()->startOfMonth()); + $end = Session::get('end', Carbon::now()->endOfMonth()); + + + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('bills'); + $cache->addProperty('frontpage'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $bills = $repository->getActiveBills(); $paid = new Collection; // journals. $unpaid = new Collection; // bills @@ -133,8 +156,12 @@ class BillController extends Controller $chart->addRow(trans('firefly.unpaid') . ': ' . join(', ', $unpaidDescriptions), $unpaidAmount); $chart->addRow(trans('firefly.paid') . ': ' . join(', ', $paidDescriptions), $paidAmount); + $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } } diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 12c1f9e476..517f9e56f9 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -7,6 +7,7 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Budget; use FireflyIII\Models\LimitRepetition; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Illuminate\Support\Collection; use Navigation; @@ -41,19 +42,41 @@ class BudgetController extends Controller $final->addYears(2); $last = Navigation::endOfX($last, $range, $final); + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($first); + $cache->addProperty($last); + $cache->addProperty('budget'); + $cache->addProperty('budget'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + while ($first < $last) { $end = Navigation::addPeriod($first, $range, 0); + $end->subDay(); + + // start date for chart. + $chartDate = clone $end; + $chartDate->startOfMonth(); $spent = $repository->spentInPeriodCorrected($budget, $first, $end); - $chart->addRow($end, $spent); - + $chart->addRow($chartDate, $spent); $first = Navigation::addPeriod($first, $range, 0); + + } $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + + + $cache->store($data); + + return Response::json($data); } /** @@ -71,6 +94,18 @@ class BudgetController extends Controller $start = clone $repetition->startdate; $end = $repetition->enddate; + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('budget'); + $cache->addProperty('limit'); + $cache->addProperty($budget->id); + $cache->addProperty($repetition->id); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $chart->addColumn(trans('firefly.day'), 'date'); $chart->addColumn(trans('firefly.left'), 'number'); @@ -88,7 +123,10 @@ class BudgetController extends Controller } $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } @@ -112,6 +150,18 @@ class BudgetController extends Controller $end = Session::get('end', Carbon::now()->endOfMonth()); $allEntries = new Collection; + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('budget'); + $cache->addProperty('all'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + + /** @var Budget $budget */ foreach ($budgets as $budget) { $repetitions = $repository->getBudgetLimitRepetitions($budget, $start, $end); if ($repetitions->count() == 0) { @@ -127,9 +177,9 @@ class BudgetController extends Controller $overspent = $expenses > floatval($repetition->amount) ? $expenses - floatval($repetition->amount) : 0; $allEntries->push( [$budget->name . ' (' . $repetition->startdate->formatLocalized($this->monthAndDayFormat) . ')', - $left, - $spent, - $overspent + $left, + $spent, + $overspent ] ); } @@ -146,7 +196,10 @@ class BudgetController extends Controller $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } @@ -167,6 +220,16 @@ class BudgetController extends Controller $shared = $shared == 'shared' ? true : false; $budgets = $repository->getBudgets(); + // chart properties for cache: + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('budget'); + $cache->addProperty('year'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + // add columns: $chart->addColumn(trans('firefly.month'), 'date'); foreach ($budgets as $budget) { @@ -187,11 +250,14 @@ class BudgetController extends Controller } $chart->addRowArray($row); - $start->addMonth(); + $start->endOfMonth()->addDay(); } $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } } diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index c6f42cad5b..b7c4bdb800 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -7,6 +7,7 @@ use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Category; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Grumpydictator\Gchart\GChart; use Navigation; use Preferences; @@ -75,12 +76,23 @@ class CategoryController extends Controller $start = Session::get('start', Carbon::now()->startOfMonth()); $end = Session::get('end', Carbon::now()->endOfMonth()); - $set = $repository->getCategoriesAndExpensesCorrected($start, $end); + + // chart properties for cache: + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('category'); + $cache->addProperty('frontpage'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + $set = $repository->getCategoriesAndExpensesCorrected($start, $end); // sort by callback: uasort( $set, - function($left, $right) { + function ($left, $right) { if ($left['sum'] == $right['sum']) { return 0; } @@ -99,7 +111,10 @@ class CategoryController extends Controller $chart->generate(); - return Response::json($chart->getData()); + $data = $chart->getData(); + $cache->store($data); + + return Response::json($data); } diff --git a/app/Http/Controllers/CurrencyController.php b/app/Http/Controllers/CurrencyController.php index 6f57851cb9..8f34c5422d 100644 --- a/app/Http/Controllers/CurrencyController.php +++ b/app/Http/Controllers/CurrencyController.php @@ -59,6 +59,7 @@ class CurrencyController extends Controller { Preferences::set('currencyPreference', $currency->code); + Preferences::mark(); Session::flash('success', $currency->name . ' is now the default currency.'); Cache::forget('FFCURRENCYSYMBOL'); @@ -170,6 +171,7 @@ class CurrencyController extends Controller if (Auth::user()->hasRole('owner')) { $currency = $repository->store($data); Session::flash('success', 'Currency "' . $currency->name . '" created'); + } if (intval(Input::get('create_another')) === 1) { @@ -198,6 +200,7 @@ class CurrencyController extends Controller $currency = $repository->update($currency, $data); } Session::flash('success', 'Currency "' . e($currency->name) . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 3b09b9f96c..6db95ea8ef 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -6,7 +6,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use Input; use Preferences; use Redirect; -use Route; use Session; use Steam; @@ -46,40 +45,52 @@ class HomeController extends Controller /** * @param AccountRepositoryInterface $repository * - * @return \Illuminate\View\View + * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View */ public function index(AccountRepositoryInterface $repository) { - $types = Config::get('firefly.accountTypesByIdentifier.asset'); - $count = $repository->countAccounts($types); - $title = 'Firefly'; - $subTitle = trans('firefly.welcomeBack'); - $mainTitleIcon = 'fa-fire'; - $transactions = []; - $frontPage = Preferences::get('frontPageAccounts', []); - $start = Session::get('start', Carbon::now()->startOfMonth()); - $end = Session::get('end', Carbon::now()->endOfMonth()); - $accounts = $repository->getFrontpageAccounts($frontPage); - $savings = $repository->getSavingsAccounts(); + + $types = Config::get('firefly.accountTypesByIdentifier.asset'); + $count = $repository->countAccounts($types); + + + if ($count == 0) { + return Redirect::route('new-user.index'); + } + + $title = 'Firefly'; + $subTitle = trans('firefly.welcomeBack'); + $mainTitleIcon = 'fa-fire'; + $transactions = []; + $frontPage = Preferences::get('frontPageAccounts', []); + $start = Session::get('start', Carbon::now()->startOfMonth()); + $end = Session::get('end', Carbon::now()->endOfMonth()); + + $accounts = $repository->getFrontpageAccounts($frontPage); + $savings = $repository->getSavingsAccounts(); + $piggyBankAccounts = $repository->getPiggyBankAccounts(); + $savingsTotal = 0; foreach ($savings as $savingAccount) { $savingsTotal += Steam::balance($savingAccount, $end); } $sum = $repository->sumOfEverything(); + if ($sum != 0) { Session::flash( 'error', 'Your transactions are unbalanced. This means a' - . ' withdrawal, deposit or transfer was not stored properly. ' - . 'Please check your accounts and transactions for errors.' + . ' withdrawal, deposit or transfer was not stored properly. ' + . 'Please check your accounts and transactions for errors.' ); } foreach ($accounts as $account) { $set = $repository->getFrontpageTransactions($account, $start, $end); + if (count($set) > 0) { $transactions[] = [$set, $account]; } @@ -87,79 +98,4 @@ class HomeController extends Controller return view('index', compact('count', 'title', 'savings', 'subTitle', 'mainTitleIcon', 'transactions', 'savingsTotal', 'piggyBankAccounts')); } - - /** - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - public function routes() - { - $directory = '/vagrant_data/Sites/firefly-iii-help'; - $languages = array_keys(Config::get('firefly.lang')); - $routes = []; - $ignored = [ - 'debugbar.openhandler', 'debugbar.assets.css', 'debugbar.assets.js', 'register', 'routes', 'daterange', - 'flush', 'delete-account-post', 'change-password-post', 'logout', 'login', 'tags.hideTagHelp', - 'budgets.postIncome', 'flush' - ]; - - $ignoreMatch = ['.store', '.update', '.destroy', 'json.']; - - $routeCollection = Route::getRoutes(); - /** @var \Illuminate\Routing\Route $object */ - foreach ($routeCollection as $object) { - // get name: - $name = $object->getName(); - // has name and not in ignore list? - if (strlen($name) > 0 && !in_array($name, $ignored)) { - - // not in ignoreMatch? - $continue = true; - foreach ($ignoreMatch as $ignore) { - $match = strpos($name, $ignore); - if (!($match === false)) { - $continue = false; - } - } - unset($ignore, $match); - - if ($continue) { - - $routes[] = $name; - - // check all languages: - foreach ($languages as $lang) { - $file = $directory . '/' . $lang . '/' . $name . '.md'; - if (!file_exists($file)) { - touch($file); - echo $name . '
'; - } - } - } - - - } - - } - - // loop directories with language file. - // tag the ones not in the list of approved routes. - foreach ($languages as $lang) { - $dir = $directory . '/' . $lang; - $set = scandir($dir); - foreach ($set as $entry) { - if ($entry != '.' && $entry != '..') { - $name = str_replace('.md', '', $entry); - if (!in_array($name, $routes)) { - $file = $dir . '/' . $entry; - unlink($file); - } - } - } - } - echo 'Done!'; - } - - } diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index b88dc0e0b3..6dafae3266 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -10,6 +10,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; +use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; use Response; use Session; @@ -33,10 +34,21 @@ class JsonController extends Controller */ public function boxBillsPaid(BillRepositoryInterface $repository, AccountRepositoryInterface $accountRepository) { - $start = Session::get('start', Carbon::now()->startOfMonth()); - $end = Session::get('end', Carbon::now()->endOfMonth()); + $start = Session::get('start', Carbon::now()->startOfMonth()); + $end = Session::get('end', Carbon::now()->endOfMonth()); + + // works for json too! + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('box-bills-paid'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $amount = 0; + // these two functions are the same as the chart $bills = $repository->getActiveBills(); @@ -60,8 +72,11 @@ class JsonController extends Controller $amount += $accountRepository->getTransfersInRange($creditCard, $start, $end)->sum('amount'); } } + $data = ['box' => 'bills-paid', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; + $cache->store($data); - return Response::json(['box' => 'bills-paid', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]); + + return Response::json($data); } /** @@ -75,6 +90,16 @@ class JsonController extends Controller $amount = 0; $start = Session::get('start', Carbon::now()->startOfMonth()); $end = Session::get('end', Carbon::now()->endOfMonth()); + + // works for json too! + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('box-bills-unpaid'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $bills = $repository->getActiveBills(); $unpaid = new Collection; // bills @@ -109,7 +134,10 @@ class JsonController extends Controller $amount += $current; } - return Response::json(['box' => 'bills-unpaid', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]); + $data = ['box' => 'bills-unpaid', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; + $cache->store($data); + + return Response::json($data); } /** @@ -119,11 +147,24 @@ class JsonController extends Controller */ public function boxIn(ReportQueryInterface $reportQuery) { - $start = Session::get('start', Carbon::now()->startOfMonth()); - $end = Session::get('end', Carbon::now()->endOfMonth()); + $start = Session::get('start', Carbon::now()->startOfMonth()); + $end = Session::get('end', Carbon::now()->endOfMonth()); + + // works for json too! + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('box-in'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $amount = $reportQuery->incomeInPeriodCorrected($start, $end, true)->sum('amount'); - return Response::json(['box' => 'in', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]); + $data = ['box' => 'in', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; + $cache->store($data); + + return Response::json($data); } /** @@ -133,11 +174,25 @@ class JsonController extends Controller */ public function boxOut(ReportQueryInterface $reportQuery) { - $start = Session::get('start', Carbon::now()->startOfMonth()); - $end = Session::get('end', Carbon::now()->endOfMonth()); + $start = Session::get('start', Carbon::now()->startOfMonth()); + $end = Session::get('end', Carbon::now()->endOfMonth()); + + + // works for json too! + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('box-out'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $amount = $reportQuery->expenseInPeriodCorrected($start, $end, true)->sum('amount'); - return Response::json(['box' => 'out', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]); + $data = ['box' => 'out', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; + $cache->store($data); + + return Response::json($data); } /** diff --git a/app/Http/Controllers/NewUserController.php b/app/Http/Controllers/NewUserController.php new file mode 100644 index 0000000000..563bf81e28 --- /dev/null +++ b/app/Http/Controllers/NewUserController.php @@ -0,0 +1,111 @@ +countAccounts($types); + + if ($count > 0) { + return Redirect::route('index'); + + } + + return view('new-user.index'); + } + + /** + * @param NewUserFormRequest $request + * @param AccountRepositoryInterface $repository + * + * @return \Illuminate\Http\RedirectResponse + */ + public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository) + { + + // create normal asset account: + $assetAccount = [ + 'name' => $request->get('bank_name'), + 'accountType' => 'asset', + 'virtualBalance' => 0, + 'active' => true, + 'user' => Auth::user()->id, + 'accountRole' => 'defaultAsset', + 'openingBalance' => floatval($request->input('bank_balance')), + 'openingBalanceDate' => new Carbon, + 'openingBalanceCurrency' => intval($request->input('balance_currency_id')), + ]; + + $repository->store($assetAccount); + + // create savings account + if (strlen($request->get('savings_balance') > 0)) { + $savingsAccount = [ + 'name' => $request->get('bank_name') . ' savings account', + 'accountType' => 'asset', + 'virtualBalance' => 0, + 'active' => true, + 'user' => Auth::user()->id, + 'accountRole' => 'savingAsset', + 'openingBalance' => floatval($request->input('savings_balance')), + 'openingBalanceDate' => new Carbon, + 'openingBalanceCurrency' => intval($request->input('balance_currency_id')), + ]; + $repository->store($savingsAccount); + } + + + // create credit card. + if (strlen($request->get('credit_card_limit') > 0)) { + $creditAccount = [ + 'name' => 'Credit card', + 'accountType' => 'asset', + 'virtualBalance' => floatval($request->get('credit_card_limit')), + 'active' => true, + 'user' => Auth::user()->id, + 'accountRole' => 'ccAsset', + 'openingBalance' => null, + 'openingBalanceDate' => null, + 'openingBalanceCurrency' => intval($request->input('balance_currency_id')), + ]; + $creditCard = $repository->store($creditAccount); + + // store meta for CC: + AccountMeta::create(['name' => 'ccType', 'data' => 'monthlyFull', 'account_id' => $creditCard->id,]); + AccountMeta::create(['name' => 'ccMonthlyPaymentDate', 'data' => Carbon::now()->year . '-01-01', 'account_id' => $creditCard->id,]); + + } + Session::flash('success', 'New account(s) created!'); + Preferences::mark(); + + return Redirect::route('index'); + } +} diff --git a/app/Http/Controllers/PiggyBankController.php b/app/Http/Controllers/PiggyBankController.php index 6961b5787b..381f1c544c 100644 --- a/app/Http/Controllers/PiggyBankController.php +++ b/app/Http/Controllers/PiggyBankController.php @@ -10,6 +10,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use Illuminate\Support\Collection; use Input; +use Preferences; use Redirect; use Session; use Steam; @@ -108,6 +109,7 @@ class PiggyBankController extends Controller Session::flash('success', 'Piggy bank "' . e($piggyBank->name) . '" deleted.'); + Preferences::mark(); $repository->destroy($piggyBank); return Redirect::to(Session::get('piggy-banks.delete.url')); @@ -137,11 +139,11 @@ class PiggyBankController extends Controller $targetDate = $targetDate->format('Y-m-d'); } $preFilled = ['name' => $piggyBank->name, - 'account_id' => $piggyBank->account_id, - 'targetamount' => $piggyBank->targetamount, - 'targetdate' => $targetDate, - 'reminder' => $piggyBank->reminder, - 'remind_me' => intval($piggyBank->remind_me) == 1 && !is_null($piggyBank->reminder) ? true : false + 'account_id' => $piggyBank->account_id, + 'targetamount' => $piggyBank->targetamount, + 'targetdate' => $targetDate, + 'reminder' => $piggyBank->reminder, + 'remind_me' => intval($piggyBank->remind_me) == 1 && !is_null($piggyBank->reminder) ? true : false ]; Session::flash('preFilled', $preFilled); Session::flash('gaEventCategory', 'piggy-banks'); @@ -208,6 +210,7 @@ class PiggyBankController extends Controller // set all users piggy banks to zero: $repository->reset(); + if (is_array($data)) { foreach ($data as $order => $id) { $repository->setOrder(intval($id), (intval($order) + 1)); @@ -240,6 +243,7 @@ class PiggyBankController extends Controller $repository->createEvent($piggyBank, $amount); Session::flash('success', 'Added ' . Amount::format($amount, false) . ' to "' . e($piggyBank->name) . '".'); + Preferences::mark(); } else { Session::flash('error', 'Could not add ' . Amount::format($amount, false) . ' to "' . e($piggyBank->name) . '".'); } @@ -268,6 +272,7 @@ class PiggyBankController extends Controller $repository->createEvent($piggyBank, $amount * -1); Session::flash('success', 'Removed ' . Amount::format($amount, false) . ' from "' . e($piggyBank->name) . '".'); + Preferences::mark(); } else { Session::flash('error', 'Could not remove ' . Amount::format($amount, false) . ' from "' . e($piggyBank->name) . '".'); } @@ -328,6 +333,7 @@ class PiggyBankController extends Controller $piggyBank = $repository->store($piggyBankData); Session::flash('success', 'Stored piggy bank "' . e($piggyBank->name) . '".'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { Session::put('piggy-banks.create.fromStore', true); @@ -362,6 +368,7 @@ class PiggyBankController extends Controller $piggyBank = $repository->update($piggyBank, $piggyBankData); Session::flash('success', 'Updated piggy bank "' . e($piggyBank->name) . '".'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { Session::put('piggy-banks.edit.fromUpdate', true); diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 0848155a01..5fd6e4fd24 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -77,6 +77,7 @@ class PreferencesController extends Controller Session::flash('success', 'Preferences saved!'); + Preferences::mark(); return Redirect::route('preferences'); } diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index d776a58e1a..f806cd0328 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -141,18 +141,9 @@ class ReportController extends Controller Session::flash('gaEventAction', 'year'); Session::flash('gaEventLabel', $start->format('Y')); - return view( 'reports.year', - compact( - 'start', // the date for this report. - 'shared', // is a shared report? - 'accounts', // all accounts - 'incomes', 'expenses', // expenses and incomes. - 'subTitle', 'subTitleIcon', // subtitle and subtitle icon. - 'incomeTopLength', // length of income top X - 'expenseTopLength' // length of expense top X. - ) + compact('start', 'shared', 'accounts', 'incomes', 'expenses', 'subTitle', 'subTitleIcon', 'incomeTopLength', 'expenseTopLength') ); } diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 8473f1d5e3..6b000256b7 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -106,6 +106,7 @@ class TagController extends Controller $repository->destroy($tag); Session::flash('success', 'Tag "' . e($tagName) . '" was deleted.'); + Preferences::mark(); return Redirect::to(route('tags.index')); } @@ -226,6 +227,7 @@ class TagController extends Controller $repository->store($data); Session::flash('success', 'The tag has been created!'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { // set value so create routine will not overwrite URL: @@ -268,9 +270,11 @@ class TagController extends Controller 'tagMode' => $request->get('tagMode'), ]; + $repository->update($tag, $data); Session::flash('success', 'Tag "' . e($data['tag']) . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { // set value so edit routine will not overwrite URL: diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 223dab527a..6eee693adf 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -11,6 +11,7 @@ use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Input; +use Preferences; use Redirect; use Response; use Session; @@ -79,15 +80,15 @@ class TransactionController extends Controller */ public function delete(TransactionJournal $journal) { - $type = strtolower($journal->transactionType->type); - $subTitle = trans('firefly.delete_' . $type, ['description' => $journal->description]); + $what = strtolower($journal->transactionType->type); + $subTitle = trans('firefly.delete_' . $what, ['description' => $journal->description]); // put previous url in session Session::put('transactions.delete.url', URL::previous()); Session::flash('gaEventCategory', 'transactions'); - Session::flash('gaEventAction', 'delete-' . $type); + Session::flash('gaEventAction', 'delete-' . $what); - return view('transactions.delete', compact('journal', 'subTitle')); + return view('transactions.delete', compact('journal', 'subTitle','what')); } @@ -104,6 +105,8 @@ class TransactionController extends Controller $repository->delete($transactionJournal); + Preferences::mark(); + // redirect to previous URL: return Redirect::to(Session::get('transactions.delete.url')); } @@ -154,7 +157,7 @@ class TransactionController extends Controller } $preFilled['amount'] = $journal->actual_amount; - $preFilled['account_id'] = $journal->asset_account->id; + $preFilled['account_id'] = $journal->destination_account->id; $preFilled['expense_account'] = $transactions[0]->account->name; $preFilled['revenue_account'] = $transactions[1]->account->name; $preFilled['account_from_id'] = $transactions[1]->account->id; @@ -235,6 +238,7 @@ class TransactionController extends Controller } } } + Preferences::mark(); return Response::json([true]); @@ -249,14 +253,15 @@ class TransactionController extends Controller public function show(JournalRepositoryInterface $repository, TransactionJournal $journal) { $journal->transactions->each( - function(Transaction $t) use ($journal, $repository) { + function (Transaction $t) use ($journal, $repository) { $t->before = $repository->getAmountBefore($journal, $t); $t->after = $t->before + $t->amount; } ); + $what = strtolower($journal->transactionType->type); $subTitle = trans('firefly.' . $journal->transactionType->type) . ' "' . e($journal->description) . '"'; - return view('transactions.show', compact('journal', 'subTitle')); + return view('transactions.show', compact('journal', 'subTitle','what')); } /** @@ -281,6 +286,7 @@ class TransactionController extends Controller $repository->deactivateReminder($request->get('reminder_id')); Session::flash('success', 'New transaction "' . $journal->description . '" stored!'); + Preferences::mark(); if (intval(Input::get('create_another')) === 1) { // set value so create routine will not overwrite URL: @@ -312,6 +318,7 @@ class TransactionController extends Controller // update, get events by date and sort DESC Session::flash('success', 'Transaction "' . e($journalData['description']) . '" updated.'); + Preferences::mark(); if (intval(Input::get('return_to_edit')) === 1) { // set value so edit routine will not overwrite URL: diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index f0aac457a4..30bdc71e89 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -37,7 +37,6 @@ class Kernel extends HttpKernel 'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', 'guest' => 'FireflyIII\Http\Middleware\RedirectIfAuthenticated', 'range' => 'FireflyIII\Http\Middleware\Range', - 'cleanup' => 'FireflyIII\Http\Middleware\Cleanup', 'reminders' => 'FireflyIII\Http\Middleware\Reminders', ]; diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index d447376e03..e83a32aefb 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -1,12 +1,13 @@ auth = $auth; - } - - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * - * @return mixed - */ - public function handle(Request $request, Closure $next) - { - if ($this->auth->guest()) { - return response('Unauthorized.', 401); - } - $count = -1; - - bcscale(0); - - if (env('RUNCLEANUP') == 'true') { - $count = 0; - $count = bcadd($count, $this->encryptAccountAndBills()); - $count = bcadd($count, $this->encryptBudgetsAndCategories()); - $count = bcadd($count, $this->encryptPiggiesAndJournals()); - $count = bcadd($count, $this->encryptRemindersAndPreferences()); - - } - if ($count == 0) { - Session::flash('warning', 'Please open the .env file and change RUNCLEANUP=true to RUNCLEANUP=false'); - } - - return $next($request); - - } - - /** - * @return int - */ - protected function encryptAccountAndBills() - { - $count = 0; - // encrypt account name - $set = Account::where('encrypted', 0)->take(5)->get(); - /** @var Account $entry */ - foreach ($set as $entry) { - $count++; - $name = $entry->name; - $entry->name = $name; - $entry->save(); - } - unset($set, $entry, $name); - - // encrypt bill name - $set = Bill::where('name_encrypted', 0)->take(5)->get(); - /** @var Bill $entry */ - foreach ($set as $entry) { - $count++; - $name = $entry->name; - $entry->name = $name; - $entry->save(); - } - unset($set, $entry, $name); - - // encrypt bill match - $set = Bill::where('match_encrypted', 0)->take(5)->get(); - /** @var Bill $entry */ - foreach ($set as $entry) { - $match = $entry->match; - $entry->match = $match; - $entry->save(); - } - unset($set, $entry, $match); - - - return $count; - - } - - /** - * @return int - */ - protected function encryptBudgetsAndCategories() - { - $count = 0; - // encrypt budget name - $set = Budget::where('encrypted', 0)->take(5)->get(); - /** @var Budget $entry */ - foreach ($set as $entry) { - $count++; - $name = $entry->name; - $entry->name = $name; - $entry->save(); - } - unset($set, $entry, $name); - - // encrypt category name - $set = Category::where('encrypted', 0)->take(5)->get(); - /** @var Category $entry */ - foreach ($set as $entry) { - $count++; - $name = $entry->name; - $entry->name = $name; - $entry->save(); - } - unset($set, $entry, $name); - - return $count; - } - - /** - * @return int - */ - protected function encryptPiggiesAndJournals() - { - $count = 0; - // encrypt piggy bank name - $set = PiggyBank::where('encrypted', 0)->take(5)->get(); - /** @var PiggyBank $entry */ - foreach ($set as $entry) { - $count++; - $name = $entry->name; - $entry->name = $name; - $entry->save(); - } - unset($set, $entry, $name); - - // encrypt transaction journal description - $set = TransactionJournal::where('encrypted', 0)->take(5)->get(); - /** @var TransactionJournal $entry */ - foreach ($set as $entry) { - $count++; - $description = $entry->description; - $entry->description = $description; - $entry->save(); - } - unset($set, $entry, $description); - - return $count; - } - - /** - * @return int - */ - protected function encryptRemindersAndPreferences() - { - $count = 0; - // encrypt reminder metadata - $set = Reminder::where('encrypted', 0)->take(5)->get(); - /** @var Reminder $entry */ - foreach ($set as $entry) { - $count++; - $metadata = $entry->metadata; - $entry->metadata = $metadata; - $entry->save(); - } - unset($set, $entry, $metadata); - - //encrypt preference name - $set = Preference::whereNull('name_encrypted')->take(5)->get(); - /** @var Preference $entry */ - foreach ($set as $entry) { - $count++; - $name = $entry->name; - $entry->name = $name; - $entry->save(); - } - unset($set, $entry, $name); - - //encrypt preference data - $set = Preference::whereNull('data_encrypted')->take(5)->get(); - /** @var Preference $entry */ - foreach ($set as $entry) { - $count++; - $data = $entry->data; - $entry->data = $data; - $entry->save(); - } - unset($set, $entry, $data); - - return $count; - } - -} diff --git a/app/Http/Middleware/Reminders.php b/app/Http/Middleware/Reminders.php index 9814e448d0..0be752e89e 100644 --- a/app/Http/Middleware/Reminders.php +++ b/app/Http/Middleware/Reminders.php @@ -7,6 +7,7 @@ use Carbon\Carbon; use Closure; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\Reminder; +use FireflyIII\Support\CacheProperties; use FireflyIII\User; use Illuminate\Contracts\Auth\Guard; use Illuminate\Http\Request; @@ -47,35 +48,46 @@ class Reminders */ public function handle(Request $request, Closure $next) { - if ($this->auth->check() && !$request->isXmlHttpRequest()) { + + + $user = $this->auth->user(); + if ($this->auth->check() && !$request->isXmlHttpRequest() && $user instanceof User) { // do reminders stuff. - $reminders = []; - if ($this->auth->user() instanceof User) { - $piggyBanks = $this->auth->user()->piggyBanks()->where('remind_me', 1)->get(); - /** @var \FireflyIII\Helpers\Reminders\ReminderHelperInterface $helper */ - $helper = App::make('FireflyIII\Helpers\Reminders\ReminderHelperInterface'); - /** @var PiggyBank $piggyBank */ - foreach ($piggyBanks as $piggyBank) { - $helper->createReminders($piggyBank, new Carbon); - } - // delete invalid reminders - // this is a construction SQLITE cannot handle :( - if (env('DB_CONNECTION') != 'sqlite') { - Reminder::whereUserId($this->auth->user()->id) - ->leftJoin('piggy_banks', 'piggy_banks.id', '=', 'remindersable_id') - ->whereNull('piggy_banks.id') - ->delete(); - } + // abuse CacheProperties to find out if we need to do this: + $cache = new CacheProperties; - // get and list active reminders: - $reminders = $this->auth->user()->reminders()->today()->get(); - $reminders->each( - function (Reminder $reminder) use ($helper) { - $reminder->description = $helper->getReminderText($reminder); - } - ); + $cache->addProperty('reminders'); + if ($cache->has()) { + $reminders = $cache->get(); + View::share('reminders', $reminders); + + return $next($request); } + + $piggyBanks = $user->piggyBanks()->where('remind_me', 1)->get(); + + /** @var \FireflyIII\Helpers\Reminders\ReminderHelperInterface $helper */ + $helper = App::make('FireflyIII\Helpers\Reminders\ReminderHelperInterface'); + + /** @var PiggyBank $piggyBank */ + foreach ($piggyBanks as $piggyBank) { + $helper->createReminders($piggyBank, new Carbon); + } + // delete invalid reminders + // this is a construction SQLITE cannot handle :( + if (env('DB_CONNECTION') != 'sqlite') { + Reminder::whereUserId($user->id)->leftJoin('piggy_banks', 'piggy_banks.id', '=', 'remindersable_id')->whereNull('piggy_banks.id')->delete(); + } + + // get and list active reminders: + $reminders = $user->reminders()->today()->get(); + $reminders->each( + function (Reminder $reminder) use ($helper) { + $reminder->description = $helper->getReminderText($reminder); + } + ); + $cache->store($reminders); View::share('reminders', $reminders); } diff --git a/app/Http/Requests/BillFormRequest.php b/app/Http/Requests/BillFormRequest.php index 452e5a1e7a..3a360f4874 100644 --- a/app/Http/Requests/BillFormRequest.php +++ b/app/Http/Requests/BillFormRequest.php @@ -48,8 +48,8 @@ class BillFormRequest extends Request */ public function rules() { - $nameRule = 'required|between:1,255|uniqueObjectForUser:bills,name,name_encrypted'; - $matchRule = 'required|between:1,255|uniqueObjectForUser:bills,match,match_encrypted'; + $nameRule = 'required|between:1,255|uniqueObjectForUser:bills,name'; + $matchRule = 'required|between:1,255|uniqueObjectForUser:bills,match'; if (intval(Input::get('id')) > 0) { $nameRule .= ',' . intval(Input::get('id')); $matchRule .= ',' . intval(Input::get('id')); diff --git a/app/Http/Requests/BudgetFormRequest.php b/app/Http/Requests/BudgetFormRequest.php index ad871cd07b..38814f1d2d 100644 --- a/app/Http/Requests/BudgetFormRequest.php +++ b/app/Http/Requests/BudgetFormRequest.php @@ -29,9 +29,9 @@ class BudgetFormRequest extends Request public function rules() { - $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,name,encrypted'; + $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,name'; if (Budget::find(Input::get('id'))) { - $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,name,encrypted,' . intval(Input::get('id')); + $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,' . intval(Input::get('id')); } return [ diff --git a/app/Http/Requests/CategoryFormRequest.php b/app/Http/Requests/CategoryFormRequest.php index 7c32b3329c..04a16ce9b6 100644 --- a/app/Http/Requests/CategoryFormRequest.php +++ b/app/Http/Requests/CategoryFormRequest.php @@ -29,9 +29,9 @@ class CategoryFormRequest extends Request public function rules() { - $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name,encrypted'; + $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name'; if (Category::find(Input::get('id'))) { - $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name,encrypted,' . intval(Input::get('id')); + $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name,' . intval(Input::get('id')); } return [ diff --git a/app/Http/Requests/NewUserFormRequest.php b/app/Http/Requests/NewUserFormRequest.php new file mode 100644 index 0000000000..b500ce6b02 --- /dev/null +++ b/app/Http/Requests/NewUserFormRequest.php @@ -0,0 +1,37 @@ + 'required|between:1,200', + 'bank_balance' => 'required|numeric', + 'savings_balance' => 'numeric', + 'credit_card_limit' => 'numeric', + 'balance_currency_id' => 'exists:transaction_currencies,id', + ]; + } +} diff --git a/app/Http/Requests/TagFormRequest.php b/app/Http/Requests/TagFormRequest.php index 1b2885453d..28773c874c 100644 --- a/app/Http/Requests/TagFormRequest.php +++ b/app/Http/Requests/TagFormRequest.php @@ -28,10 +28,10 @@ class TagFormRequest extends Request public function rules() { $idRule = ''; - $tagRule = 'required|min:1|uniqueObjectForUser:tags,tag,TRUE'; + $tagRule = 'required|min:1|uniqueObjectForUser:tags,tag'; if (Tag::find(Input::get('id'))) { $idRule = 'belongsToUser:tags'; - $tagRule = 'required|min:1|uniqueObjectForUser:tags,tag,TRUE,' . Input::get('id'); + $tagRule = 'required|min:1|uniqueObjectForUser:tags,tag,' . Input::get('id'); } return [ diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index 80aa857876..fd8e5a146f 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -17,7 +17,7 @@ use FireflyIII\Models\TransactionJournal; */ Breadcrumbs::register( 'home', - function(Generator $breadcrumbs) { + function (Generator $breadcrumbs) { $breadcrumbs->push(trans('breadcrumbs.home'), route('index')); } @@ -25,7 +25,7 @@ Breadcrumbs::register( Breadcrumbs::register( 'index', - function(Generator $breadcrumbs) { + function (Generator $breadcrumbs) { $breadcrumbs->push(trans('breadcrumbs.home'), route('index')); } @@ -34,21 +34,21 @@ Breadcrumbs::register( // accounts Breadcrumbs::register( - 'accounts.index', function(Generator $breadcrumbs, $what) { + 'accounts.index', function (Generator $breadcrumbs, $what) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.' . strtolower(e($what)) . '_accounts'), route('accounts.index', [$what])); } ); Breadcrumbs::register( - 'accounts.create', function(Generator $breadcrumbs, $what) { + 'accounts.create', function (Generator $breadcrumbs, $what) { $breadcrumbs->parent('accounts.index', $what); $breadcrumbs->push(trans('breadcrumbs.new_' . strtolower(e($what)) . '_account'), route('accounts.create', [$what])); } ); Breadcrumbs::register( - 'accounts.show', function(Generator $breadcrumbs, Account $account) { + 'accounts.show', function (Generator $breadcrumbs, Account $account) { $what = Config::get('firefly.shortNamesByFullName.' . $account->accountType->type); @@ -58,7 +58,7 @@ Breadcrumbs::register( } ); Breadcrumbs::register( - 'accounts.delete', function(Generator $breadcrumbs, Account $account) { + 'accounts.delete', function (Generator $breadcrumbs, Account $account) { $breadcrumbs->parent('accounts.show', $account); $breadcrumbs->push(trans('breadcrumbs.delete_account', ['name' => e($account->name)]), route('accounts.delete', [$account->id])); } @@ -66,7 +66,7 @@ Breadcrumbs::register( Breadcrumbs::register( - 'accounts.edit', function(Generator $breadcrumbs, Account $account) { + 'accounts.edit', function (Generator $breadcrumbs, Account $account) { $breadcrumbs->parent('accounts.show', $account); $what = Config::get('firefly.shortNamesByFullName.' . $account->accountType->type); @@ -76,40 +76,40 @@ Breadcrumbs::register( // budgets. Breadcrumbs::register( - 'budgets.index', function(Generator $breadcrumbs) { + 'budgets.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.budgets'), route('budgets.index')); } ); Breadcrumbs::register( - 'budgets.create', function(Generator $breadcrumbs) { + 'budgets.create', function (Generator $breadcrumbs) { $breadcrumbs->parent('budgets.index'); $breadcrumbs->push(trans('breadcrumbs.newBudget'), route('budgets.create')); } ); Breadcrumbs::register( - 'budgets.edit', function(Generator $breadcrumbs, Budget $budget) { + 'budgets.edit', function (Generator $breadcrumbs, Budget $budget) { $breadcrumbs->parent('budgets.show', $budget); $breadcrumbs->push(trans('breadcrumbs.edit_budget', ['name' => e($budget->name)]), route('budgets.edit', [$budget->id])); } ); Breadcrumbs::register( - 'budgets.delete', function(Generator $breadcrumbs, Budget $budget) { + 'budgets.delete', function (Generator $breadcrumbs, Budget $budget) { $breadcrumbs->parent('budgets.show', $budget); $breadcrumbs->push(trans('breadcrumbs.delete_budget', ['name' => e($budget->name)]), route('budgets.delete', [$budget->id])); } ); Breadcrumbs::register( - 'budgets.noBudget', function(Generator $breadcrumbs, $subTitle) { + 'budgets.noBudget', function (Generator $breadcrumbs, $subTitle) { $breadcrumbs->parent('budgets.index'); $breadcrumbs->push($subTitle, route('budgets.noBudget')); } ); Breadcrumbs::register( - 'budgets.show', function(Generator $breadcrumbs, Budget $budget, LimitRepetition $repetition = null) { + 'budgets.show', function (Generator $breadcrumbs, Budget $budget, LimitRepetition $repetition = null) { $breadcrumbs->parent('budgets.index'); $breadcrumbs->push(e($budget->name), route('budgets.show', [$budget->id])); if (!is_null($repetition) && !is_null($repetition->id)) { @@ -122,33 +122,33 @@ Breadcrumbs::register( // categories Breadcrumbs::register( - 'categories.index', function(Generator $breadcrumbs) { + 'categories.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.categories'), route('categories.index')); } ); Breadcrumbs::register( - 'categories.create', function(Generator $breadcrumbs) { + 'categories.create', function (Generator $breadcrumbs) { $breadcrumbs->parent('categories.index'); $breadcrumbs->push(trans('breadcrumbs.newCategory'), route('categories.create')); } ); Breadcrumbs::register( - 'categories.edit', function(Generator $breadcrumbs, Category $category) { + 'categories.edit', function (Generator $breadcrumbs, Category $category) { $breadcrumbs->parent('categories.show', $category); $breadcrumbs->push(trans('breadcrumbs.edit_category', ['name' => e($category->name)]), route('categories.edit', [$category->id])); } ); Breadcrumbs::register( - 'categories.delete', function(Generator $breadcrumbs, Category $category) { + 'categories.delete', function (Generator $breadcrumbs, Category $category) { $breadcrumbs->parent('categories.show', $category); $breadcrumbs->push(trans('breadcrumbs.delete_category', ['name' => e($category->name)]), route('categories.delete', [$category->id])); } ); Breadcrumbs::register( - 'categories.show', function(Generator $breadcrumbs, Category $category) { + 'categories.show', function (Generator $breadcrumbs, Category $category) { $breadcrumbs->parent('categories.index'); $breadcrumbs->push(e($category->name), route('categories.show', [$category->id])); @@ -156,7 +156,7 @@ Breadcrumbs::register( ); Breadcrumbs::register( - 'categories.noCategory', function(Generator $breadcrumbs, $subTitle) { + 'categories.noCategory', function (Generator $breadcrumbs, $subTitle) { $breadcrumbs->parent('categories.index'); $breadcrumbs->push($subTitle, route('categories.noCategory')); } @@ -164,20 +164,20 @@ Breadcrumbs::register( // currencies. Breadcrumbs::register( - 'currency.index', function(Generator $breadcrumbs) { + 'currency.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.currencies'), route('currency.index')); } ); Breadcrumbs::register( - 'currency.edit', function(Generator $breadcrumbs, TransactionCurrency $currency) { + 'currency.edit', function (Generator $breadcrumbs, TransactionCurrency $currency) { $breadcrumbs->parent('currency.index'); $breadcrumbs->push(trans('breadcrumbs.edit_currency', ['name' => e($currency->name)]), route('currency.edit', [$currency->id])); } ); Breadcrumbs::register( - 'currency.delete', function(Generator $breadcrumbs, TransactionCurrency $currency) { + 'currency.delete', function (Generator $breadcrumbs, TransactionCurrency $currency) { $breadcrumbs->parent('currency.index'); $breadcrumbs->push(trans('breadcrumbs.delete_currency', ['name' => e($currency->name)]), route('currency.delete', [$currency->id])); } @@ -186,33 +186,33 @@ Breadcrumbs::register( // piggy banks Breadcrumbs::register( - 'piggy-banks.index', function(Generator $breadcrumbs) { + 'piggy-banks.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.piggyBanks'), route('piggy-banks.index')); } ); Breadcrumbs::register( - 'piggy-banks.create', function(Generator $breadcrumbs) { + 'piggy-banks.create', function (Generator $breadcrumbs) { $breadcrumbs->parent('piggy-banks.index'); $breadcrumbs->push(trans('breadcrumbs.newPiggyBank'), route('piggy-banks.create')); } ); Breadcrumbs::register( - 'piggy-banks.edit', function(Generator $breadcrumbs, PiggyBank $piggyBank) { + 'piggy-banks.edit', function (Generator $breadcrumbs, PiggyBank $piggyBank) { $breadcrumbs->parent('piggy-banks.show', $piggyBank); $breadcrumbs->push(trans('breadcrumbs.edit_piggyBank', ['name' => e($piggyBank->name)]), route('piggy-banks.edit', [$piggyBank->id])); } ); Breadcrumbs::register( - 'piggy-banks.delete', function(Generator $breadcrumbs, PiggyBank $piggyBank) { + 'piggy-banks.delete', function (Generator $breadcrumbs, PiggyBank $piggyBank) { $breadcrumbs->parent('piggy-banks.show', $piggyBank); $breadcrumbs->push(trans('breadcrumbs.delete_piggyBank', ['name' => e($piggyBank->name)]), route('piggy-banks.delete', [$piggyBank->id])); } ); Breadcrumbs::register( - 'piggy-banks.show', function(Generator $breadcrumbs, PiggyBank $piggyBank) { + 'piggy-banks.show', function (Generator $breadcrumbs, PiggyBank $piggyBank) { $breadcrumbs->parent('piggy-banks.index'); $breadcrumbs->push(e($piggyBank->name), route('piggy-banks.show', [$piggyBank->id])); @@ -221,7 +221,7 @@ Breadcrumbs::register( // preferences Breadcrumbs::register( - 'preferences', function(Generator $breadcrumbs) { + 'preferences', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.preferences'), route('preferences')); @@ -230,14 +230,14 @@ Breadcrumbs::register( // profile Breadcrumbs::register( - 'profile', function(Generator $breadcrumbs) { + 'profile', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.profile'), route('profile')); } ); Breadcrumbs::register( - 'change-password', function(Generator $breadcrumbs) { + 'change-password', function (Generator $breadcrumbs) { $breadcrumbs->parent('profile'); $breadcrumbs->push(trans('breadcrumbs.changePassword'), route('change-password')); @@ -246,33 +246,33 @@ Breadcrumbs::register( // bills Breadcrumbs::register( - 'bills.index', function(Generator $breadcrumbs) { + 'bills.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.bills'), route('bills.index')); } ); Breadcrumbs::register( - 'bills.create', function(Generator $breadcrumbs) { + 'bills.create', function (Generator $breadcrumbs) { $breadcrumbs->parent('bills.index'); $breadcrumbs->push(trans('breadcrumbs.newBill'), route('bills.create')); } ); Breadcrumbs::register( - 'bills.edit', function(Generator $breadcrumbs, Bill $bill) { + 'bills.edit', function (Generator $breadcrumbs, Bill $bill) { $breadcrumbs->parent('bills.show', $bill); $breadcrumbs->push(trans('breadcrumbs.edit_bill', ['name' => e($bill->name)]), route('bills.edit', [$bill->id])); } ); Breadcrumbs::register( - 'bills.delete', function(Generator $breadcrumbs, Bill $bill) { + 'bills.delete', function (Generator $breadcrumbs, Bill $bill) { $breadcrumbs->parent('bills.show', $bill); $breadcrumbs->push(trans('breadcrumbs.delete_bill', ['name' => e($bill->name)]), route('bills.delete', [$bill->id])); } ); Breadcrumbs::register( - 'bills.show', function(Generator $breadcrumbs, Bill $bill) { + 'bills.show', function (Generator $breadcrumbs, Bill $bill) { $breadcrumbs->parent('bills.index'); $breadcrumbs->push(e($bill->name), route('bills.show', [$bill->id])); @@ -281,7 +281,7 @@ Breadcrumbs::register( // reminders Breadcrumbs::register( - 'reminders.index', function(Generator $breadcrumbs) { + 'reminders.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.reminders'), route('reminders.index')); @@ -290,7 +290,7 @@ Breadcrumbs::register( // reminders Breadcrumbs::register( - 'reminders.show', function(Generator $breadcrumbs, Reminder $reminder) { + 'reminders.show', function (Generator $breadcrumbs, Reminder $reminder) { $breadcrumbs->parent('reminders.index'); $breadcrumbs->push(trans('breadcrumbs.reminder', ['id' => e($reminder->id)]), route('reminders.show', [$reminder->id])); @@ -300,14 +300,14 @@ Breadcrumbs::register( // reports Breadcrumbs::register( - 'reports.index', function(Generator $breadcrumbs) { + 'reports.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.reports'), route('reports.index')); } ); Breadcrumbs::register( - 'reports.year', function(Generator $breadcrumbs, Carbon $date, $shared) { + 'reports.year', function (Generator $breadcrumbs, Carbon $date, $shared) { $breadcrumbs->parent('reports.index'); if ($shared) { $title = trans('breadcrumbs.yearly_report_shared', ['date' => $date->year]); @@ -319,7 +319,7 @@ Breadcrumbs::register( ); Breadcrumbs::register( - 'reports.month', function(Generator $breadcrumbs, Carbon $date, $shared) { + 'reports.month', function (Generator $breadcrumbs, Carbon $date, $shared) { $breadcrumbs->parent('reports.year', $date, $shared); if ($shared) { @@ -334,7 +334,7 @@ Breadcrumbs::register( // search Breadcrumbs::register( - 'search', function(Generator $breadcrumbs, $query) { + 'search', function (Generator $breadcrumbs, $query) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.searchResult', ['query' => e($query)]), route('search')); } @@ -342,33 +342,33 @@ Breadcrumbs::register( // transactions Breadcrumbs::register( - 'transactions.index', function(Generator $breadcrumbs, $what) { + 'transactions.index', function (Generator $breadcrumbs, $what) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.' . $what . '_list'), route('transactions.index', [$what])); } ); Breadcrumbs::register( - 'transactions.create', function(Generator $breadcrumbs, $what) { + 'transactions.create', function (Generator $breadcrumbs, $what) { $breadcrumbs->parent('transactions.index', $what); $breadcrumbs->push(trans('breadcrumbs.create_' . e($what)), route('transactions.create', [$what])); } ); Breadcrumbs::register( - 'transactions.edit', function(Generator $breadcrumbs, TransactionJournal $journal) { + 'transactions.edit', function (Generator $breadcrumbs, TransactionJournal $journal) { $breadcrumbs->parent('transactions.show', $journal); $breadcrumbs->push(trans('breadcrumbs.edit_journal', ['description' => $journal->description]), route('transactions.edit', [$journal->id])); } ); Breadcrumbs::register( - 'transactions.delete', function(Generator $breadcrumbs, TransactionJournal $journal) { + 'transactions.delete', function (Generator $breadcrumbs, TransactionJournal $journal) { $breadcrumbs->parent('transactions.show', $journal); $breadcrumbs->push(trans('breadcrumbs.delete_journal', ['description' => e($journal->description)]), route('transactions.delete', [$journal->id])); } ); Breadcrumbs::register( - 'transactions.show', function(Generator $breadcrumbs, TransactionJournal $journal) { + 'transactions.show', function (Generator $breadcrumbs, TransactionJournal $journal) { $breadcrumbs->parent('transactions.index', strtolower($journal->transactionType->type)); $breadcrumbs->push($journal->description, route('transactions.show', [$journal->id])); @@ -378,28 +378,28 @@ Breadcrumbs::register( // tags Breadcrumbs::register( - 'tags.index', function(Generator $breadcrumbs) { + 'tags.index', function (Generator $breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push(trans('breadcrumbs.tags'), route('tags.index')); } ); Breadcrumbs::register( - 'tags.create', function(Generator $breadcrumbs) { + 'tags.create', function (Generator $breadcrumbs) { $breadcrumbs->parent('tags.index'); $breadcrumbs->push(trans('breadcrumbs.createTag'), route('tags.create')); } ); Breadcrumbs::register( - 'tags.edit', function(Generator $breadcrumbs, Tag $tag) { + 'tags.edit', function (Generator $breadcrumbs, Tag $tag) { $breadcrumbs->parent('tags.show', $tag); $breadcrumbs->push(trans('breadcrumbs.edit_tag', ['tag' => e($tag->tag)]), route('tags.edit', [$tag->id])); } ); Breadcrumbs::register( - 'tags.delete', function(Generator $breadcrumbs, Tag $tag) { + 'tags.delete', function (Generator $breadcrumbs, Tag $tag) { $breadcrumbs->parent('tags.show', $tag); $breadcrumbs->push(trans('breadcrumbs.delete_tag', ['tag' => e($tag->tag)]), route('tags.delete', [$tag->id])); } @@ -407,7 +407,7 @@ Breadcrumbs::register( Breadcrumbs::register( - 'tags.show', function(Generator $breadcrumbs, Tag $tag) { + 'tags.show', function (Generator $breadcrumbs, Tag $tag) { $breadcrumbs->parent('tags.index'); $breadcrumbs->push(e($tag->tag), route('tags.show', [$tag->id])); } diff --git a/app/Http/routes.php b/app/Http/routes.php index 750d9a7b3b..2b66dac023 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -15,13 +15,13 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; // models Route::bind( 'account', - function($value) { + function ($value) { if (Auth::check()) { $object = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') - ->where('account_types.editable', 1) - ->where('accounts.id', $value) - ->where('user_id', Auth::user()->id) - ->first(['accounts.*']); + ->where('account_types.editable', 1) + ->where('accounts.id', $value) + ->where('user_id', Auth::user()->id) + ->first(['accounts.*']); if ($object) { return $object; } @@ -31,7 +31,7 @@ Route::bind( ); Route::bind( - 'tj', function($value) { + 'tj', function ($value) { if (Auth::check()) { $object = TransactionJournal::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { @@ -44,7 +44,7 @@ Route::bind( ); Route::bind( - 'currency', function($value) { + 'currency', function ($value) { if (Auth::check()) { $object = TransactionCurrency::find($value); if ($object) { @@ -56,7 +56,7 @@ Route::bind( ); Route::bind( - 'bill', function($value) { + 'bill', function ($value) { if (Auth::check()) { $object = Bill::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { @@ -69,7 +69,7 @@ Route::bind( ); Route::bind( - 'budget', function($value) { + 'budget', function ($value) { if (Auth::check()) { $object = Budget::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { @@ -82,7 +82,7 @@ Route::bind( ); Route::bind( - 'reminder', function($value) { + 'reminder', function ($value) { if (Auth::check()) { $object = Reminder::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { @@ -95,13 +95,13 @@ Route::bind( ); Route::bind( - 'limitrepetition', function($value) { + 'limitrepetition', function ($value) { if (Auth::check()) { $object = LimitRepetition::where('limit_repetitions.id', $value) - ->leftjoin('budget_limits', 'budget_limits.id', '=', 'limit_repetitions.budget_limit_id') - ->leftJoin('budgets', 'budgets.id', '=', 'budget_limits.budget_id') - ->where('budgets.user_id', Auth::user()->id) - ->first(['limit_repetitions.*']); + ->leftjoin('budget_limits', 'budget_limits.id', '=', 'limit_repetitions.budget_limit_id') + ->leftJoin('budgets', 'budgets.id', '=', 'budget_limits.budget_id') + ->where('budgets.user_id', Auth::user()->id) + ->first(['limit_repetitions.*']); if ($object) { return $object; } @@ -112,12 +112,12 @@ Route::bind( ); Route::bind( - 'piggyBank', function($value) { + 'piggyBank', function ($value) { if (Auth::check()) { $object = PiggyBank::where('piggy_banks.id', $value) - ->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id') - ->where('accounts.user_id', Auth::user()->id) - ->first(['piggy_banks.*']); + ->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id') + ->where('accounts.user_id', Auth::user()->id) + ->first(['piggy_banks.*']); if ($object) { return $object; } @@ -128,7 +128,7 @@ Route::bind( ); Route::bind( - 'category', function($value) { + 'category', function ($value) { if (Auth::check()) { $object = Category::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { @@ -142,7 +142,7 @@ Route::bind( /** @noinspection PhpUnusedParameterInspection */ Route::bind( - 'reminder', function($value) { + 'reminder', function ($value) { if (Auth::check()) { /** @var \FireflyIII\Models\Reminder $object */ $object = Reminder::find($value); @@ -158,7 +158,7 @@ Route::bind( ); Route::bind( - 'tag', function($value) { + 'tag', function ($value) { if (Auth::check()) { $object = Tag::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { @@ -183,14 +183,12 @@ Route::controllers( ] ); -Route::get('/routes', ['uses' => 'HomeController@routes', 'as' => 'routes']); - /** * Home Controller */ Route::group( - ['middleware' => ['auth', 'range', 'reminders']], function() { - Route::get('/', ['uses' => 'HomeController@index', 'as' => 'index', 'middleware' => 'cleanup']); + ['middleware' => ['auth', 'range', 'reminders']], function () { + Route::get('/', ['uses' => 'HomeController@index', 'as' => 'index']); Route::get('/home', ['uses' => 'HomeController@index', 'as' => 'home']); Route::post('/daterange', ['uses' => 'HomeController@dateRange', 'as' => 'daterange']); Route::get('/flush', ['uses' => 'HomeController@flush', 'as' => 'flush']); @@ -317,6 +315,12 @@ Route::group( Route::get('/json/box/bills-paid', ['uses' => 'JsonController@boxBillsPaid', 'as' => 'json.box.unpaid']); Route::get('/json/transaction-journals/{what}', 'JsonController@transactionJournals'); + /** + * New user Controller + */ + Route::get('/new-user', ['uses' => 'NewUserController@index', 'as' => 'new-user.index']); + Route::post('/new-user/submit', ['uses' => 'NewUserController@submit', 'as' => 'new-user.submit']); + /** * Piggy Bank Controller */ diff --git a/app/Models/Account.php b/app/Models/Account.php index c621afca8e..8a9f1f80fd 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -11,22 +11,22 @@ use Watson\Validating\ValidatingTrait; * Class Account * * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property integer $user_id - * @property integer $account_type_id - * @property string $name - * @property boolean $active - * @property boolean $encrypted - * @property float $virtual_balance - * @property string $virtual_balance_encrypted + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property integer $user_id + * @property integer $account_type_id + * @property string $name + * @property boolean $active + * @property boolean $encrypted + * @property float $virtual_balance + * @property string $virtual_balance_encrypted * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\AccountMeta[] $accountMeta - * @property-read \FireflyIII\Models\AccountType $accountType - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[] $piggyBanks + * @property-read \FireflyIII\Models\AccountType $accountType + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[] $piggyBanks * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Transaction[] $transactions - * @property-read \FireflyIII\User $user + * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereUpdatedAt($value) @@ -40,14 +40,13 @@ use Watson\Validating\ValidatingTrait; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereVirtualBalanceEncrypted($value) * @method static \FireflyIII\Models\Account accountTypeIn($types) * @method static \FireflyIII\Models\Account hasMetaValue($name, $value) - * @property boolean joinedAccountTypes - * @property mixed startBalance - * @property mixed endBalance - * @property mixed lastActivityDate - * @property mixed piggyBalance - * @property mixed difference - * @propery mixed percentage - * + * @property boolean joinedAccountTypes + * @property mixed startBalance + * @property mixed endBalance + * @property mixed lastActivityDate + * @property mixed piggyBalance + * @property mixed difference + * @property mixed percentage */ class Account extends Model { @@ -216,7 +215,7 @@ class Account extends Model { $joinName = str_replace('.', '_', $name); $query->leftJoin( - 'account_meta as ' . $joinName, function(JoinClause $join) use ($joinName, $name) { + 'account_meta as ' . $joinName, function (JoinClause $join) use ($joinName, $name) { $join->on($joinName . '.account_id', '=', 'accounts.id')->where($joinName . '.name', '=', $name); } ); diff --git a/app/Models/AccountMeta.php b/app/Models/AccountMeta.php index f3ec8dfb60..279fe60765 100644 --- a/app/Models/AccountMeta.php +++ b/app/Models/AccountMeta.php @@ -6,14 +6,14 @@ use Watson\Validating\ValidatingTrait; /** * Class AccountMeta * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $account_id - * @property string $name - * @property string $data + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $account_id + * @property string $name + * @property string $data * @property-read \FireflyIII\Models\Account $account * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountMeta whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountMeta whereCreatedAt($value) @@ -33,7 +33,7 @@ class AccountMeta extends Model 'name' => 'required|between:1,100', 'data' => 'required' ]; - protected $table = 'account_meta'; + protected $table = 'account_meta'; /** * diff --git a/app/Models/AccountType.php b/app/Models/AccountType.php index 10c10a1ef4..2148b9e961 100644 --- a/app/Models/AccountType.php +++ b/app/Models/AccountType.php @@ -5,13 +5,13 @@ use Illuminate\Database\Eloquent\Model; /** * Class AccountType * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property string $type - * @property boolean $editable + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property string $type + * @property boolean $editable * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Account[] $accounts * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountType whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountType whereCreatedAt($value) diff --git a/app/Models/Bill.php b/app/Models/Bill.php index 70fab19668..76ce0b66ad 100644 --- a/app/Models/Bill.php +++ b/app/Models/Bill.php @@ -7,26 +7,26 @@ use Illuminate\Database\Eloquent\Model; * FireflyIII\Models\Bill * * @codeCoverageIgnore Class Bill - * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $user_id - * @property string $name - * @property string $match - * @property float $amount_min - * @property string $amount_min_encrypted - * @property float $amount_max - * @property string $amount_max_encrypted - * @property \Carbon\Carbon $date - * @property boolean $active - * @property boolean $automatch - * @property string $repeat_freq - * @property integer $skip - * @property boolean $name_encrypted - * @property boolean $match_encrypted + * @package FireflyIII\Models + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $user_id + * @property string $name + * @property string $match + * @property float $amount_min + * @property string $amount_min_encrypted + * @property float $amount_max + * @property string $amount_max_encrypted + * @property \Carbon\Carbon $date + * @property boolean $active + * @property boolean $automatch + * @property string $repeat_freq + * @property integer $skip + * @property boolean $name_encrypted + * @property boolean $match_encrypted * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals - * @property-read \FireflyIII\User $user + * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereUpdatedAt($value) @@ -44,17 +44,18 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereSkip($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereNameEncrypted($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereMatchEncrypted($value) - * @property mixed nextExpectedMatch - * @property mixed lastFoundMatch + * @property mixed nextExpectedMatch + * @property mixed lastFoundMatch */ class Bill extends Model { protected $fillable - = ['name', 'match', 'amount_min', 'match_encrypted', 'name_encrypted', 'user_id', 'amount_max', 'date', 'repeat_freq', 'skip', 'automatch', 'active', ]; + = ['name', 'match', 'amount_min', 'match_encrypted', 'name_encrypted', 'user_id', 'amount_max', 'date', 'repeat_freq', 'skip', 'automatch', 'active',]; protected $hidden = ['amount_min_encrypted', 'amount_max_encrypted', 'name_encrypted', 'match_encrypted']; + /** * @return array */ diff --git a/app/Models/Budget.php b/app/Models/Budget.php index 7de89a558e..02f1e46808 100644 --- a/app/Models/Budget.php +++ b/app/Models/Budget.php @@ -7,19 +7,19 @@ use Illuminate\Database\Eloquent\SoftDeletes; /** * Class Budget * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property string $name - * @property integer $user_id - * @property boolean $active - * @property boolean $encrypted - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\BudgetLimit[] $budgetlimits + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property string $name + * @property integer $user_id + * @property boolean $active + * @property boolean $encrypted + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\BudgetLimit[] $budgetlimits * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals - * @property-read \FireflyIII\User $user + * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Budget whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Budget whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Budget whereUpdatedAt($value) diff --git a/app/Models/BudgetLimit.php b/app/Models/BudgetLimit.php index 921f37d9db..42e72dc502 100644 --- a/app/Models/BudgetLimit.php +++ b/app/Models/BudgetLimit.php @@ -5,18 +5,18 @@ use Illuminate\Database\Eloquent\Model; /** * Class BudgetLimit * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $budget_id - * @property \Carbon\Carbon $startdate - * @property float $amount - * @property string $amount_encrypted - * @property boolean $repeats - * @property string $repeat_freq - * @property-read \FireflyIII\Models\Budget $budget + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $budget_id + * @property \Carbon\Carbon $startdate + * @property float $amount + * @property string $amount_encrypted + * @property boolean $repeats + * @property string $repeat_freq + * @property-read \FireflyIII\Models\Budget $budget * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\LimitRepetition[] $limitrepetitions * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereCreatedAt($value) diff --git a/app/Models/Category.php b/app/Models/Category.php index 3497fd9dc6..dc4f7cbbff 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -8,15 +8,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; * Class Category * * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property string $name - * @property integer $user_id - * @property boolean $encrypted + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property string $name + * @property integer $user_id + * @property boolean $encrypted * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals - * @property-read \FireflyIII\User $user + * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereUpdatedAt($value) @@ -24,8 +24,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereName($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereUserId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereEncrypted($value) - * @property mixed spent - * @property mixed lastActivity + * @property mixed spent + * @property mixed lastActivity */ class Category extends Model { diff --git a/app/Models/Component.php b/app/Models/Component.php index ac43425ad7..84686751be 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -6,15 +6,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; /** * Class Component * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id + * @property integer $id * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at * @property \Carbon\Carbon $deleted_at - * @property string $name - * @property integer $user_id - * @property string $class + * @property string $name + * @property integer $user_id + * @property string $class * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Component whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Component whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Component whereUpdatedAt($value) diff --git a/app/Models/LimitRepetition.php b/app/Models/LimitRepetition.php index 1adffb5e18..d5fd692dae 100644 --- a/app/Models/LimitRepetition.php +++ b/app/Models/LimitRepetition.php @@ -5,16 +5,16 @@ use Illuminate\Database\Eloquent\Model; /** * Class LimitRepetition * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $budget_limit_id - * @property \Carbon\Carbon $startdate - * @property \Carbon\Carbon $enddate - * @property float $amount - * @property string $amount_encrypted + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $budget_limit_id + * @property \Carbon\Carbon $startdate + * @property \Carbon\Carbon $enddate + * @property float $amount + * @property string $amount_encrypted * @property-read \FireflyIII\Models\BudgetLimit $budgetLimit * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\LimitRepetition whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\LimitRepetition whereCreatedAt($value) diff --git a/app/Models/Permission.php b/app/Models/Permission.php index a075f74e01..3e87ce4207 100644 --- a/app/Models/Permission.php +++ b/app/Models/Permission.php @@ -8,7 +8,20 @@ use Zizaco\Entrust\EntrustPermission; * Class Permission * * @package FireflyIII\Models + * @property integer $id + * @property string $name + * @property string $display_name + * @property string $description + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection|\Config::get('entrust.role')[] $roles + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Permission whereId($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Permission whereName($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Permission whereDisplayName($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Permission whereDescription($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Permission whereCreatedAt($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Permission whereUpdatedAt($value) */ class Permission extends EntrustPermission { -} \ No newline at end of file +} diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index a08241d1a1..44c05fa63b 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -7,27 +7,27 @@ use Illuminate\Database\Eloquent\SoftDeletes; /** * Class PiggyBank * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property integer $account_id - * @property string $name - * @property float $targetamount - * @property string $targetamount_encrypted - * @property \Carbon\Carbon $startdate - * @property \Carbon\Carbon $targetdate - * @property string $reminder - * @property integer $reminder_skip - * @property boolean $remind_me - * @property integer $order - * @property boolean $encrypted - * @property-read \FireflyIII\Models\Account $account + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property integer $account_id + * @property string $name + * @property float $targetamount + * @property string $targetamount_encrypted + * @property \Carbon\Carbon $startdate + * @property \Carbon\Carbon $targetdate + * @property string $reminder + * @property integer $reminder_skip + * @property boolean $remind_me + * @property integer $order + * @property boolean $encrypted + * @property-read \FireflyIII\Models\Account $account * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBankRepetition[] $piggyBankRepetitions - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBankEvent[] $piggyBankEvents - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Reminder[] $reminders + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBankEvent[] $piggyBankEvents + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Reminder[] $reminders * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBank whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBank whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBank whereUpdatedAt($value) @@ -43,14 +43,14 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBank whereRemindMe($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBank whereOrder($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBank whereEncrypted($value) - * @property PiggyBankRepetition currentRep + * @property PiggyBankRepetition currentRep */ class PiggyBank extends Model { use SoftDeletes; protected $fillable - = ['name', 'account_id', 'order', 'reminder_skip', 'targetamount', 'startdate', 'targetdate', 'reminder', 'remind_me']; + = ['name', 'account_id', 'order', 'reminder_skip', 'targetamount', 'startdate', 'targetdate', 'reminder', 'remind_me']; protected $hidden = ['targetamount_encrypted', 'encrypted']; /** diff --git a/app/Models/PiggyBankEvent.php b/app/Models/PiggyBankEvent.php index 2c03dadace..6b9bdceda1 100644 --- a/app/Models/PiggyBankEvent.php +++ b/app/Models/PiggyBankEvent.php @@ -5,17 +5,17 @@ use Illuminate\Database\Eloquent\Model; /** * Class PiggyBankEvent * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $piggy_bank_id - * @property integer $transaction_journal_id - * @property \Carbon\Carbon $date - * @property float $amount - * @property string $amount_encrypted - * @property-read \FireflyIII\Models\PiggyBank $piggyBank + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $piggy_bank_id + * @property integer $transaction_journal_id + * @property \Carbon\Carbon $date + * @property float $amount + * @property string $amount_encrypted + * @property-read \FireflyIII\Models\PiggyBank $piggyBank * @property-read \FireflyIII\Models\TransactionJournal $transactionJournal * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBankEvent whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBankEvent whereCreatedAt($value) diff --git a/app/Models/PiggyBankRepetition.php b/app/Models/PiggyBankRepetition.php index 699b712c25..a24066f2ee 100644 --- a/app/Models/PiggyBankRepetition.php +++ b/app/Models/PiggyBankRepetition.php @@ -7,16 +7,16 @@ use Illuminate\Database\Eloquent\Model; /** * Class PiggyBankRepetition * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $piggy_bank_id - * @property \Carbon\Carbon $startdate - * @property \Carbon\Carbon $targetdate - * @property float $currentamount - * @property string $currentamount_encrypted + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $piggy_bank_id + * @property \Carbon\Carbon $startdate + * @property \Carbon\Carbon $targetdate + * @property float $currentamount + * @property string $currentamount_encrypted * @property-read \FireflyIII\Models\PiggyBank $piggyBank * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBankRepetition whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\PiggyBankRepetition whereCreatedAt($value) @@ -77,13 +77,13 @@ class PiggyBankRepetition extends Model $q->orWhereNull('startdate'); } ) - ->where( - function (EloquentBuilder $q) use ($date) { + ->where( + function (EloquentBuilder $q) use ($date) { - $q->where('targetdate', '>=', $date->format('Y-m-d 00:00:00')); - $q->orWhereNull('targetdate'); - } - ); + $q->where('targetdate', '>=', $date->format('Y-m-d 00:00:00')); + $q->orWhereNull('targetdate'); + } + ); } /** diff --git a/app/Models/Preference.php b/app/Models/Preference.php index a25fd850e6..56bc6f7cfd 100644 --- a/app/Models/Preference.php +++ b/app/Models/Preference.php @@ -6,16 +6,16 @@ use Illuminate\Database\Eloquent\Model; /** * Class Preference * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $user_id - * @property string $name - * @property string $name_encrypted - * @property string $data - * @property string $data_encrypted + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $user_id + * @property string $name + * @property string $name_encrypted + * @property string $data + * @property string $data_encrypted * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Preference whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Preference whereCreatedAt($value) @@ -55,21 +55,6 @@ class Preference extends Model return ['created_at', 'updated_at']; } - /** - * @param $value - * - * @return float|int - */ - public function getNameAttribute($value) - { - if (is_null($this->name_encrypted)) { - return $value; - } - $value = Crypt::decrypt($this->name_encrypted); - - return $value; - } - /** * @param $value */ @@ -79,15 +64,6 @@ class Preference extends Model $this->attributes['data_encrypted'] = Crypt::encrypt(json_encode($value)); } - /** - * @param $value - */ - public function setNameAttribute($value) - { - $this->attributes['name_encrypted'] = Crypt::encrypt($value); - $this->attributes['name'] = $value; - } - /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ diff --git a/app/Models/Reminder.php b/app/Models/Reminder.php index 99baf19835..b4797dae8d 100644 --- a/app/Models/Reminder.php +++ b/app/Models/Reminder.php @@ -8,21 +8,21 @@ use Illuminate\Database\Eloquent\Model; /** * Class Reminder * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property integer $user_id - * @property \Carbon\Carbon $startdate - * @property \Carbon\Carbon $enddate - * @property boolean $active - * @property boolean $notnow - * @property integer $remindersable_id - * @property string $remindersable_type - * @property string $metadata - * @property boolean $encrypted - * @property-read \ $remindersable + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property integer $user_id + * @property \Carbon\Carbon $startdate + * @property \Carbon\Carbon $enddate + * @property boolean $active + * @property boolean $notnow + * @property integer $remindersable_id + * @property string $remindersable_type + * @property string $metadata + * @property boolean $encrypted + * @property-read \ $remindersable * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Reminder whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Reminder whereCreatedAt($value) @@ -38,13 +38,13 @@ use Illuminate\Database\Eloquent\Model; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Reminder whereEncrypted($value) * @method static \FireflyIII\Models\Reminder onDates($start, $end) * @method static \FireflyIII\Models\Reminder today() - * @property string description + * @property string description */ class Reminder extends Model { - protected $fillable = ['user_id', 'startdate', 'metadata', 'enddate', 'active', 'notnow', 'remindersable_id', 'remindersable_type', ]; + protected $fillable = ['user_id', 'startdate', 'metadata', 'enddate', 'active', 'notnow', 'remindersable_id', 'remindersable_type',]; protected $hidden = ['encrypted']; /** @@ -124,7 +124,7 @@ class Reminder extends Model $today = new Carbon; return $query->where('startdate', '<=', $today->format('Y-m-d 00:00:00'))->where('enddate', '>=', $today->format('Y-m-d 00:00:00'))->where('active', 1) - ->where('notnow', 0); + ->where('notnow', 0); } /** diff --git a/app/Models/Role.php b/app/Models/Role.php index d7df217c7f..90d89caff6 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -8,7 +8,21 @@ use Zizaco\Entrust\EntrustRole; * Class Role * * @package FireflyIII\Models + * @property integer $id + * @property string $name + * @property string $display_name + * @property string $description + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection|\Config::get('auth.model')[] $users + * @property-read \Illuminate\Database\Eloquent\Collection|\Config::get('entrust.permission')[] $perms + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Role whereId($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Role whereName($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Role whereDisplayName($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Role whereDescription($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Role whereCreatedAt($value) + * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Role whereUpdatedAt($value) */ class Role extends EntrustRole { -} \ No newline at end of file +} diff --git a/app/Models/Tag.php b/app/Models/Tag.php index 0fb6a9c876..86e03e0ccf 100644 --- a/app/Models/Tag.php +++ b/app/Models/Tag.php @@ -10,20 +10,20 @@ use Watson\Validating\ValidatingTrait; * Class Tag * * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property string $deleted_at - * @property integer $user_id - * @property string $tag - * @property string $tagMode - * @property \Carbon\Carbon $date - * @property string $description - * @property float $latitude - * @property float $longitude - * @property integer $zoomLevel + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property string $deleted_at + * @property integer $user_id + * @property string $tag + * @property string $tagMode + * @property \Carbon\Carbon $date + * @property string $description + * @property float $latitude + * @property float $longitude + * @property integer $zoomLevel * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals - * @property-read \FireflyIII\User $user + * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Tag whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Tag whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Tag whereUpdatedAt($value) @@ -44,7 +44,7 @@ class Tag extends Model protected $fillable = ['user_id', 'tag', 'date', 'description', 'longitude', 'latitude', 'zoomLevel', 'tagMode']; protected $rules = [ - 'tag' => 'required|min:1|uniqueObjectForUser:tags,tag,TRUE', + 'tag' => 'required|min:1', 'description' => 'min:1', 'date' => 'date', 'latitude' => 'numeric|min:-90|max:90', diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 827f6958e3..26ca48ef45 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -9,18 +9,18 @@ use Watson\Validating\ValidatingTrait; /** * Class Transaction * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property integer $account_id - * @property integer $transaction_journal_id - * @property string $description - * @property float $amount - * @property string $amount_encrypted - * @property-read \FireflyIII\Models\Account $account + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property integer $account_id + * @property integer $transaction_journal_id + * @property string $description + * @property float $amount + * @property string $amount_encrypted + * @property-read \FireflyIII\Models\Account $account * @property-read \FireflyIII\Models\TransactionJournal $transactionJournal * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Transaction whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Transaction whereCreatedAt($value) @@ -33,8 +33,8 @@ use Watson\Validating\ValidatingTrait; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Transaction whereAmountEncrypted($value) * @method static \FireflyIII\Models\Transaction after($date) * @method static \FireflyIII\Models\Transaction before($date) - * @property mixed before - * @property mixed after + * @property mixed before + * @property mixed after */ class Transaction extends Model { diff --git a/app/Models/TransactionCurrency.php b/app/Models/TransactionCurrency.php index edc8797aca..27b21f36c3 100644 --- a/app/Models/TransactionCurrency.php +++ b/app/Models/TransactionCurrency.php @@ -6,15 +6,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; /** * Class TransactionCurrency * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property string $code - * @property string $name - * @property string $symbol + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property string $code + * @property string $name + * @property string $symbol * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionJournals * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionCurrency whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionCurrency whereCreatedAt($value) diff --git a/app/Models/TransactionGroup.php b/app/Models/TransactionGroup.php index 9ef702872c..bb41749ca2 100644 --- a/app/Models/TransactionGroup.php +++ b/app/Models/TransactionGroup.php @@ -6,16 +6,16 @@ use Illuminate\Database\Eloquent\SoftDeletes; /** * Class TransactionGroup * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property integer $user_id - * @property string $relation + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property integer $user_id + * @property string $relation * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals - * @property-read \FireflyIII\User $user + * @property-read \FireflyIII\User $user * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionGroup whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionGroup whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionGroup whereUpdatedAt($value) diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 8aedbd44d2..5b78595ec5 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -2,6 +2,7 @@ use Carbon\Carbon; use Crypt; +use FireflyIII\Support\CacheProperties; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -60,13 +61,17 @@ use Watson\Validating\ValidatingTrait; * @method static \FireflyIII\Models\TransactionJournal onDate($date) * @method static \FireflyIII\Models\TransactionJournal transactionTypes($types) * @method static \FireflyIII\Models\TransactionJournal withRelevantData() - * @property-read mixed $expense_account - * @property string account_encrypted - * @property bool joinedTransactions - * @property bool joinedTransactionTypes - * @property mixed account_id - * @property mixed name - * @property mixed symbol + * @property-read mixed $expense_account + * @property string account_encrypted + * @property bool joinedTransactions + * @property bool joinedTransactionTypes + * @property mixed account_id + * @property mixed name + * @property mixed symbol + * @property-read mixed $correct_amount + * @method static \FireflyIII\Models\TransactionJournal orderBy + * @method static \FireflyIII\Models\TransactionJournal|null first + * @property-read mixed $source_account */ class TransactionJournal extends Model { @@ -134,6 +139,13 @@ class TransactionJournal extends Model */ public function getAmountAttribute() { + $cache = new CacheProperties(); + $cache->addProperty($this->id); + $cache->addProperty('amount'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $amount = '0'; bcscale(2); /** @var Transaction $t */ @@ -142,51 +154,61 @@ class TransactionJournal extends Model $amount = $t->amount; } } + $count = $this->tags->count(); - /* - * If the journal has tags, it gets complicated. - */ - if ($this->tags->count() == 0) { - return $amount; + if ($count === 1) { + // get amount for single tag: + $amount = $this->amountByTag($this->tags()->first(), $amount); } - // if journal is part of advancePayment AND journal is a withdrawal, - // then journal is being repaid by other journals, so the actual amount will lower: - /** @var Tag $advancePayment */ - $advancePayment = $this->tags()->where('tagMode', 'advancePayment')->first(); - if ($advancePayment && $this->transactionType->type == 'Withdrawal') { - // loop other deposits, remove from our amount. - $others = $advancePayment->transactionJournals()->transactionTypes(['Deposit'])->get(); - foreach ($others as $other) { - $amount = bcsub($amount, $other->actual_amount); - } + if ($count > 1) { + // get amount for either tag. + $amount = $this->amountByTags($amount); - return $amount; } + $cache->store($amount); - // if this journal is part of an advancePayment AND the journal is a deposit, - // then the journal amount is correcting a withdrawal, and the amount is zero: - if ($advancePayment && $this->transactionType->type == 'Deposit') { - return '0'; - } + return $amount; + } - // is balancing act? - $balancingAct = $this->tags()->where('tagMode', 'balancingAct')->first(); - - if ($balancingAct) { - // this is the expense: + /** + * Assuming the journal has only one tag. Parameter amount is used as fallback. + * + * @param Tag $tag + * @param string $amount + * + * @return string + */ + protected function amountByTag(Tag $tag, $amount) + { + if ($tag->tagMode == 'advancePayment') { if ($this->transactionType->type == 'Withdrawal') { - $transfer = $balancingAct->transactionJournals()->transactionTypes(['Transfer'])->first(); + $others = $tag->transactionJournals()->transactionTypes(['Deposit'])->get(); + foreach ($others as $other) { + $amount = bcsub($amount, $other->actual_amount); + } + + return $amount; + } + if ($this->transactionType->type == 'Deposit') { + return '0'; + } + } + + if ($tag->tagMode == 'balancingAct') { + if ($this->transactionType->type == 'Withdrawal') { + $transfer = $tag->transactionJournals()->transactionTypes(['Transfer'])->first(); if ($transfer) { $amount = bcsub($amount, $transfer->actual_amount); return $amount; } - } // @codeCoverageIgnore - } // @codeCoverageIgnore + } + } return $amount; + } /** @@ -199,24 +221,39 @@ class TransactionJournal extends Model } /** - * @return Account + * @param string $amount + * + * @return string */ - public function getAssetAccountAttribute() + public function amountByTags($amount) + { + $firstBalancingAct = $this->tags()->where('tagMode', 'balancingAct')->first(); + if ($firstBalancingAct) { + return $this->amountByTag($firstBalancingAct, $amount); + } + + $firstAdvancePayment = $this->tags()->where('tagMode', 'advancePayment')->first(); + if ($firstAdvancePayment) { + return $this->amountByTag($firstAdvancePayment, $amount); + } + + return $amount; + } + + /** + * @return string + */ + public function getCorrectAmountAttribute() { - // if it's a deposit, it's the one thats positive - // if it's a withdrawal, it's the one thats negative - // otherwise, it's either (return first one): switch ($this->transactionType->type) { case 'Deposit': - return $this->transactions()->where('amount', '>', 0)->first()->account; + return $this->transactions()->where('amount', '>', 0)->first()->amount; case 'Withdrawal': - return $this->transactions()->where('amount', '<', 0)->first()->account; - + return $this->transactions()->where('amount', '<', 0)->first()->amount; } - return $this->transactions()->first()->account; - + return $this->transactions()->where('amount', '>', 0)->first()->amount; } /** @@ -258,35 +295,35 @@ class TransactionJournal extends Model */ public function getDestinationAccountAttribute() { - /** @var Transaction $transaction */ - foreach ($this->transactions()->get() as $transaction) { - if (floatval($transaction->amount) > 0) { - return $transaction->account; - } - } + $cache = new CacheProperties; + $cache->addProperty($this->id); + $cache->addProperty('destinationAccount'); - return $this->transactions()->first()->account; + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $account = $this->transactions()->where('amount', '>', 0)->first()->account; + $cache->store($account); + + return $account; } /** * @return Account */ - public function getExpenseAccountAttribute() + public function getSourceAccountAttribute() { - // if it's a deposit, it's the one thats negative - // if it's a withdrawal, it's the one thats positive - // otherwise, it's either (return first one): - - switch ($this->transactionType->type) { - case 'Deposit': - return $this->transactions()->where('amount', '<', 0)->first()->account; - case 'Withdrawal': - return $this->transactions()->where('amount', '>', 0)->first()->account; - + $cache = new CacheProperties; + $cache->addProperty($this->id); + $cache->addProperty('destinationAccount'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore } + $account = $this->transactions()->where('amount', '<', 0)->first()->account; - return $this->transactions()->first()->account; + $cache->store($account); + return $account; } /** @@ -379,7 +416,7 @@ class TransactionJournal extends Model public function scopeWithRelevantData(EloquentBuilder $query) { $query->with( - ['transactions' => function(HasMany $q) { + ['transactions' => function (HasMany $q) { $q->orderBy('amount', 'ASC'); }, 'transactiontype', 'transactioncurrency', 'budgets', 'categories', 'transactions.account.accounttype', 'bill', 'budgets', 'categories'] ); diff --git a/app/Models/TransactionRelation.php b/app/Models/TransactionRelation.php index 056d61fdd8..aa4d3810af 100644 --- a/app/Models/TransactionRelation.php +++ b/app/Models/TransactionRelation.php @@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Model; /** * Class TransactionRelation * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models */ class TransactionRelation extends Model diff --git a/app/Models/TransactionType.php b/app/Models/TransactionType.php index 697b0e8432..098d5bcfc7 100644 --- a/app/Models/TransactionType.php +++ b/app/Models/TransactionType.php @@ -6,13 +6,13 @@ use Illuminate\Database\Eloquent\SoftDeletes; /** * Class TransactionType * - * @codeCoverageIgnore + * @codeCoverageIgnore * @package FireflyIII\Models - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \Carbon\Carbon $deleted_at - * @property string $type + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property \Carbon\Carbon $deleted_at + * @property string $type * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionJournals * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionType whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\TransactionType whereCreatedAt($value) diff --git a/app/Providers/BusServiceProvider.php b/app/Providers/BusServiceProvider.php index 1eef3684d7..dc2e86ac21 100644 --- a/app/Providers/BusServiceProvider.php +++ b/app/Providers/BusServiceProvider.php @@ -23,7 +23,7 @@ class BusServiceProvider extends ServiceProvider public function boot(Dispatcher $dispatcher) { $dispatcher->mapUsing( - function($command) { + function ($command) { return Dispatcher::simpleMapping( $command, 'FireflyIII\Commands', 'FireflyIII\Handlers\Commands' ); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 3e01105bd5..697f7df767 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -52,12 +52,15 @@ class EventServiceProvider extends ServiceProvider $this->registerDeleteEvents(); $this->registerCreateEvents(); BudgetLimit::saved( - function(BudgetLimit $budgetLimit) { + function (BudgetLimit $budgetLimit) { + Log::debug('Saved!'); $end = Navigation::addPeriod(clone $budgetLimit->startdate, $budgetLimit->repeat_freq, 0); $end->subDay(); - $set = $budgetLimit->limitrepetitions()->where('startdate', $budgetLimit->startdate->format('Y-m-d'))->where('enddate', $end->format('Y-m-d')) - ->get(); + $set = $budgetLimit->limitrepetitions() + ->where('startdate', $budgetLimit->startdate->format('Y-m-d 00:00:00')) + ->where('enddate', $end->format('Y-m-d 00:00:00')) + ->get(); if ($set->count() == 0) { $repetition = new LimitRepetition; $repetition->startdate = $budgetLimit->startdate; @@ -68,8 +71,7 @@ class EventServiceProvider extends ServiceProvider try { $repetition->save(); } catch (QueryException $e) { - Log::error('Trying to save new LimitRepetition failed!'); - Log::error($e->getMessage()); + Log::error('Trying to save new LimitRepetition failed: ' . $e->getMessage()); // @codeCoverageIgnore } } else { if ($set->count() == 1) { @@ -91,7 +93,7 @@ class EventServiceProvider extends ServiceProvider protected function registerDeleteEvents() { TransactionJournal::deleted( - function(TransactionJournal $journal) { + function (TransactionJournal $journal) { /** @var Transaction $transaction */ foreach ($journal->transactions()->get() as $transaction) { @@ -100,7 +102,7 @@ class EventServiceProvider extends ServiceProvider } ); PiggyBank::deleting( - function(PiggyBank $piggyBank) { + function (PiggyBank $piggyBank) { $reminders = $piggyBank->reminders()->get(); /** @var Reminder $reminder */ foreach ($reminders as $reminder) { @@ -110,7 +112,7 @@ class EventServiceProvider extends ServiceProvider ); Account::deleted( - function(Account $account) { + function (Account $account) { /** @var Transaction $transaction */ foreach ($account->transactions()->get() as $transaction) { @@ -131,7 +133,7 @@ class EventServiceProvider extends ServiceProvider // move this routine to a filter // in case of repeated piggy banks and/or other problems. PiggyBank::created( - function(PiggyBank $piggyBank) { + function (PiggyBank $piggyBank) { $repetition = new PiggyBankRepetition; $repetition->piggyBank()->associate($piggyBank); $repetition->startdate = is_null($piggyBank->startdate) ? null : $piggyBank->startdate; diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index ab5d1be9e5..eff456ea08 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -30,7 +30,7 @@ class FireflyServiceProvider extends ServiceProvider public function boot() { Validator::resolver( - function($translator, $data, $rules, $messages) { + function ($translator, $data, $rules, $messages) { return new FireflyValidator($translator, $data, $rules, $messages); } ); @@ -55,28 +55,28 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind( - 'preferences', function() { + 'preferences', function () { return new Preferences; } ); $this->app->bind( - 'navigation', function() { + 'navigation', function () { return new Navigation; } ); $this->app->bind( - 'amount', function() { + 'amount', function () { return new Amount; } ); $this->app->bind( - 'steam', function() { + 'steam', function () { return new Steam; } ); $this->app->bind( - 'expandedform', function() { + 'expandedform', function () { return new ExpandedForm; } ); diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index b95fa98635..4e40f5bec8 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -44,7 +44,7 @@ class RouteServiceProvider extends ServiceProvider public function map(Router $router) { $router->group( - ['namespace' => $this->namespace], function($router) { + ['namespace' => $this->namespace], function ($router) { /** @noinspection PhpIncludeInspection */ require app_path('Http/routes.php'); } diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index e5900e802b..dd413a236e 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -15,6 +15,7 @@ use FireflyIII\Models\Preference; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use FireflyIII\Support\CacheProperties; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Query\Builder; use Illuminate\Pagination\LengthAwarePaginator; @@ -64,7 +65,7 @@ class AccountRepository implements AccountRepositoryInterface public function getAccounts(array $types) { $result = Auth::user()->accounts()->with( - ['accountmeta' => function(HasMany $query) { + ['accountmeta' => function (HasMany $query) { $query->where('name', 'accountRole'); }] )->accountTypeIn($types)->orderBy('accounts.name', 'ASC')->get(['accounts.*'])->sortBy('name'); @@ -79,15 +80,15 @@ class AccountRepository implements AccountRepositoryInterface public function getCreditCards() { return Auth::user()->accounts() - ->hasMetaValue('accountRole', 'ccAsset') - ->hasMetaValue('ccType', 'monthlyFull') - ->get( - [ - 'accounts.*', - 'ccType.data as ccType', - 'accountRole.data as accountRole' - ] - ); + ->hasMetaValue('accountRole', 'ccAsset') + ->hasMetaValue('ccType', 'monthlyFull') + ->get( + [ + 'accounts.*', + 'ccType.data as ccType', + 'accountRole.data as accountRole' + ] + ); } /** @@ -109,12 +110,22 @@ class AccountRepository implements AccountRepositoryInterface */ public function getFrontpageAccounts(Preference $preference) { + $cache = new CacheProperties(); + $cache->addProperty($preference->data); + $cache->addProperty('frontPageaccounts'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + if ($preference->data == []) { $accounts = Auth::user()->accounts()->accountTypeIn(['Default account', 'Asset account'])->orderBy('accounts.name', 'ASC')->get(['accounts.*']); } else { $accounts = Auth::user()->accounts()->whereIn('id', $preference->data)->orderBy('accounts.name', 'ASC')->get(['accounts.*']); } + $cache->store($accounts); + return $accounts; } @@ -131,19 +142,30 @@ class AccountRepository implements AccountRepositoryInterface */ public function getFrontpageTransactions(Account $account, Carbon $start, Carbon $end) { - return Auth::user() - ->transactionjournals() - ->with(['transactions']) - ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id')->where('accounts.id', $account->id) - ->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transaction_journals.transaction_currency_id') - ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') - ->before($end) - ->after($start) - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.id', 'DESC') - ->take(10) - ->get(['transaction_journals.*', 'transaction_currencies.symbol', 'transaction_types.type']); + $cache = new CacheProperties(); + $cache->addProperty($account->id); + $cache->addProperty($start); + $cache->addProperty($end); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $set = Auth::user() + ->transactionjournals() + ->with(['transactions']) + ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') + ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id')->where('accounts.id', $account->id) + ->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transaction_journals.transaction_currency_id') + ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->before($end) + ->after($start) + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.id', 'DESC') + ->take(10) + ->get(['transaction_journals.*', 'transaction_currencies.symbol', 'transaction_types.type']); + $cache->store($set); + + return $set; } /** @@ -156,13 +178,13 @@ class AccountRepository implements AccountRepositoryInterface { $offset = ($page - 1) * 50; $query = Auth::user() - ->transactionJournals() - ->withRelevantData() - ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') - ->where('transactions.account_id', $account->id) - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC'); + ->transactionJournals() + ->withRelevantData() + ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') + ->where('transactions.account_id', $account->id) + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC'); $count = $query->count(); $set = $query->take(50)->offset($offset)->get(['transaction_journals.*']); @@ -207,13 +229,20 @@ class AccountRepository implements AccountRepositoryInterface $ids[] = intval($id->account_id); } + $cache = new CacheProperties; + $cache->addProperty($ids); + $cache->addProperty('piggyAccounts'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $ids = array_unique($ids); if (count($ids) > 0) { $accounts = Auth::user()->accounts()->whereIn('id', $ids)->get(); } $accounts->each( - function(Account $account) use ($start, $end) { + function (Account $account) use ($start, $end) { $account->startBalance = Steam::balance($account, $start, true); $account->endBalance = Steam::balance($account, $end, true); $account->piggyBalance = 0; @@ -231,6 +260,8 @@ class AccountRepository implements AccountRepositoryInterface } ); + $cache->store($accounts); + return $accounts; } @@ -251,7 +282,7 @@ class AccountRepository implements AccountRepositoryInterface $end = clone Session::get('end', new Carbon); $accounts->each( - function(Account $account) use ($start, $end) { + function (Account $account) use ($start, $end) { $account->startBalance = Steam::balance($account, $start); $account->endBalance = Steam::balance($account, $end); @@ -289,25 +320,26 @@ class AccountRepository implements AccountRepositoryInterface */ public function getTransfersInRange(Account $account, Carbon $start, Carbon $end) { - $set = TransactionJournal::whereIn( - 'id', function(Builder $q) use ($account, $start, $end) { + $set = TransactionJournal::whereIn( + 'id', function (Builder $q) use ($account, $start, $end) { $q->select('transaction_journals.id') - ->from('transactions') - ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') - ->where('transactions.account_id', $account->id) - ->where('transaction_journals.user_id', Auth::user()->id) - ->where('transaction_journals.date', '>=', $start->format('Y-m-d')) - ->where('transaction_journals.date', '<=', $end->format('Y-m-d')) - ->where('transaction_types.type', 'Transfer'); + ->from('transactions') + ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') + ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->where('transactions.account_id', $account->id) + ->where('transaction_journals.user_id', Auth::user()->id) + ->where('transaction_journals.date', '>=', $start->format('Y-m-d')) + ->where('transaction_journals.date', '<=', $end->format('Y-m-d')) + ->where('transaction_types.type', 'Transfer'); } )->get(); $filtered = $set->filter( - function(TransactionJournal $journal) use ($account) { + function (TransactionJournal $journal) use ($account) { if ($journal->destination_account->id == $account->id) { return $journal; } + return null; } ); @@ -341,10 +373,11 @@ class AccountRepository implements AccountRepositoryInterface */ public function openingBalanceTransaction(Account $account) { - return TransactionJournal::accountIs($account) - ->orderBy('transaction_journals.date', 'ASC') - ->orderBy('created_at', 'ASC') - ->first(['transaction_journals.*']); + return TransactionJournal + ::orderBy('transaction_journals.date', 'ASC') + ->accountIs($account) + ->orderBy('created_at', 'ASC') + ->first(['transaction_journals.*']); } /** @@ -362,13 +395,13 @@ class AccountRepository implements AccountRepositoryInterface if ($data['openingBalance'] != 0) { $type = $data['openingBalance'] < 0 ? 'expense' : 'revenue'; $opposingData = [ - 'user' => $data['user'], - 'accountType' => $type, - 'virtual_balance' => $data['virtualBalance'], - 'name' => $data['name'] . ' initial balance', - 'active' => false, + 'user' => $data['user'], + 'accountType' => $type, + 'virtualBalance' => 0, + 'name' => $data['name'] . ' initial balance', + 'active' => false, ]; - $opposing = $this->storeAccount($opposingData); + $opposing = $this->storeAccount($opposingData); $this->storeInitialBalance($newAccount, $opposing, $data); } @@ -413,12 +446,13 @@ class AccountRepository implements AccountRepositoryInterface // create new opening balance. $type = $data['openingBalance'] < 0 ? 'expense' : 'revenue'; $opposingData = [ - 'user' => $data['user'], - 'accountType' => $type, - 'name' => $data['name'] . ' initial balance', - 'active' => false, + 'user' => $data['user'], + 'accountType' => $type, + 'name' => $data['name'] . ' initial balance', + 'active' => false, + 'virtualBalance' => 0, ]; - $opposing = $this->storeAccount($opposingData); + $opposing = $this->storeAccount($opposingData); $this->storeInitialBalance($account, $opposing, $data); } @@ -445,15 +479,17 @@ class AccountRepository implements AccountRepositoryInterface 'user_id' => $data['user'], 'account_type_id' => $accountType->id, 'name' => $data['name'], + 'virtual_balance' => $data['virtualBalance'], 'active' => $data['active'] === true ? true : false, ] ); if (!$newAccount->isValid()) { // does the account already exist? - $searchData = [ + $searchData = [ 'user_id' => $data['user'], 'account_type_id' => $accountType->id, + 'virtual_balance' => $data['virtualBalance'], 'name' => $data['name'] ]; $existingAccount = Account::firstOrNullEncrypted($searchData); diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index 54ee071c66..cf2c8d2860 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -262,27 +262,10 @@ class BillRepository implements BillRepositoryInterface */ public function scan(Bill $bill, TransactionJournal $journal) { - $amountMatch = false; - $wordMatch = false; $matches = explode(',', $bill->match); - $description = strtolower($journal->description) . ' ' . strtolower($journal->expense_account->name); - $count = 0; - foreach ($matches as $word) { - if (!(strpos($description, strtolower($word)) === false)) { - $count++; - } - } - if ($count >= count($matches)) { - $wordMatch = true; - } - - - /* - * Match amount. - */ - if ($journal->amount >= $bill->amount_min && $journal->amount <= $bill->amount_max) { - $amountMatch = true; - } + $description = strtolower($journal->description) . ' ' . strtolower($journal->destination_account->name); + $wordMatch = $this->doWordMatch($matches, $description); + $amountMatch = $this->doAmountMatch($journal->amount, $bill->amount_min, $bill->amount_max); /* * If both, update! @@ -290,13 +273,17 @@ class BillRepository implements BillRepositoryInterface if ($wordMatch && $amountMatch) { $journal->bill()->associate($bill); $journal->save(); - } else { - if ($bill->id == $journal->bill_id) { - // if no match, but bill used to match, remove it: - $journal->bill_id = null; - $journal->save(); - } + + return true; } + if ($bill->id == $journal->bill_id) { + // if no match, but bill used to match, remove it: + $journal->bill_id = null; + $journal->save(); + + return true; + } + } /** @@ -350,4 +337,42 @@ class BillRepository implements BillRepositoryInterface return $bill; } + + /** + * @param array $matches + * @param $description + * + * @return bool + */ + protected function doWordMatch(array $matches, $description) + { + $wordMatch = false; + $count = 0; + foreach ($matches as $word) { + if (!(strpos($description, strtolower($word)) === false)) { + $count++; + } + } + if ($count >= count($matches)) { + $wordMatch = true; + } + + return $wordMatch; + } + + /** + * @param float $amount + * @param float $min + * @param float $max + * + * @return bool + */ + protected function doAmountMatch($amount, $min, $max) + { + if ($amount >= $min && $amount <= $max) { + return true; + } + + return false; + } } diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index efe12c2eab..a4a9bda75f 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -7,8 +7,9 @@ use Carbon\Carbon; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\LimitRepetition; +use FireflyIII\Repositories\Shared\ComponentRepository; +use FireflyIII\Support\CacheProperties; use Illuminate\Database\Query\Builder as QueryBuilder; -use Illuminate\Database\Query\JoinClause; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Input; @@ -18,7 +19,7 @@ use Input; * * @package FireflyIII\Repositories\Budget */ -class BudgetRepository implements BudgetRepositoryInterface +class BudgetRepository extends ComponentRepository implements BudgetRepositoryInterface { /** @@ -79,10 +80,10 @@ class BudgetRepository implements BudgetRepositoryInterface /** @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.*']); } /** @@ -113,7 +114,17 @@ class BudgetRepository implements BudgetRepositoryInterface */ public function getCurrentRepetition(Budget $budget, Carbon $date) { - return $budget->limitrepetitions()->where('limit_repetitions.startdate', $date)->first(['limit_repetitions.*']); + $cache = new CacheProperties; + $cache->addProperty($budget->id); + $cache->addProperty($date); + $cache->addProperty('getCurrentRepetition'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $data = $budget->limitrepetitions()->where('limit_repetitions.startdate', $date)->first(['limit_repetitions.*']); + $cache->store($data); + + return $data; } /** @@ -150,13 +161,22 @@ class BudgetRepository implements BudgetRepositoryInterface */ public function getJournals(Budget $budget, LimitRepetition $repetition = null, $take = 50) { - $offset = intval(Input::get('page')) > 0 ? intval(Input::get('page')) * $take : 0; - + $cache = new CacheProperties; + $cache->addProperty($budget->id); + if ($repetition) { + $cache->addProperty($repetition->id); + } + $cache->addProperty($take); + $cache->addProperty('getJournals'); + if ($cache->has()) { + 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'); + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC'); $countQuery = $budget->transactionJournals(); @@ -169,7 +189,11 @@ class BudgetRepository implements BudgetRepositoryInterface $set = $setQuery->get(['transaction_journals.*']); $count = $countQuery->count(); - return new LengthAwarePaginator($set, $count, $take, $offset); + + $paginator = new LengthAwarePaginator($set, $count, $take, $offset); + $cache->store($paginator); + + return $paginator; } /** @@ -196,9 +220,9 @@ class BudgetRepository implements BudgetRepositoryInterface 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 floatval($repetition->amount); @@ -216,15 +240,15 @@ class BudgetRepository implements BudgetRepositoryInterface 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.*']); } /** @@ -236,22 +260,22 @@ class BudgetRepository implements BudgetRepositoryInterface 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'); return floatval($noBudgetSet) * -1; } @@ -262,32 +286,11 @@ class BudgetRepository implements BudgetRepositoryInterface * @param Carbon $end * @param bool $shared * - * @return float + * @return string */ public function spentInPeriodCorrected(Budget $budget, Carbon $start, Carbon $end, $shared = true) { - if ($shared === true) { - // get everything: - $sum = floatval($budget->transactionjournals()->before($end)->after($start)->get(['transaction_journals.*'])->sum('amount')); - } else { - // get all journals in this month where the asset account is NOT shared. - $sum = $budget->transactionjournals() - ->before($end) - ->after($start) - ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin( - 'account_meta', function (JoinClause $join) { - $join->on('account_meta.account_id', '=', 'accounts.id')->where('account_meta.name', '=', 'accountRole'); - } - ) - ->where('account_meta.data', '!=', '"sharedAsset"') - ->get(['transaction_journals.*']) - ->sum('amount'); - $sum = floatval($sum); - } - - return $sum; + return $this->spentInPeriod($budget, $start, $end, $shared); } /** diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 0a035bea35..12d3d01b93 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -134,7 +134,7 @@ interface BudgetRepositoryInterface * @param Carbon $end * @param boolean $shared * - * @return float + * @return string */ public function spentInPeriodCorrected(Budget $budget, Carbon $start, Carbon $end, $shared = true); diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php index 5bf3dfd1b1..f2cc4bc3a6 100644 --- a/app/Repositories/Category/CategoryRepository.php +++ b/app/Repositories/Category/CategoryRepository.php @@ -7,7 +7,7 @@ use Carbon\Carbon; use Crypt; use FireflyIII\Models\Category; use FireflyIII\Models\TransactionJournal; -use Illuminate\Database\Query\JoinClause; +use FireflyIII\Repositories\Shared\ComponentRepository; use Illuminate\Support\Collection; /** @@ -15,7 +15,7 @@ use Illuminate\Support\Collection; * * @package FireflyIII\Repositories\Category */ -class CategoryRepository implements CategoryRepositoryInterface +class CategoryRepository extends ComponentRepository implements CategoryRepositoryInterface { /** @@ -49,7 +49,7 @@ class CategoryRepository implements CategoryRepositoryInterface /** @var Collection $set */ $set = Auth::user()->categories()->orderBy('name', 'ASC')->get(); $set->sortBy( - function(Category $category) { + function (Category $category) { return $category->name; } ); @@ -67,22 +67,22 @@ class CategoryRepository implements CategoryRepositoryInterface public function getCategoriesAndExpensesCorrected($start, $end) { $set = Auth::user()->transactionjournals() - ->leftJoin( - 'category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id' - ) - ->leftJoin('categories', 'categories.id', '=', 'category_transaction_journal.category_id') - ->before($end) - ->where('categories.user_id', Auth::user()->id) - ->after($start) - ->transactionTypes(['Withdrawal']) - ->groupBy('categories.id') - ->get(['categories.id as category_id', 'categories.encrypted as category_encrypted', 'categories.name', 'transaction_journals.*']); + ->leftJoin( + 'category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id' + ) + ->leftJoin('categories', 'categories.id', '=', 'category_transaction_journal.category_id') + ->before($end) + ->where('categories.user_id', Auth::user()->id) + ->after($start) + ->transactionTypes(['Withdrawal']) + ->get(['categories.id as category_id', 'categories.encrypted as category_encrypted', 'categories.name', 'transaction_journals.*']); $result = []; foreach ($set as $entry) { $categoryId = intval($entry->category_id); if (isset($result[$categoryId])) { - $result[$categoryId]['sum'] += floatval($entry->amount); + bcscale(2); + $result[$categoryId]['sum'] = bcadd($result[$categoryId]['sum'], $entry->amount); } else { $isEncrypted = intval($entry->category_encrypted) == 1 ? true : false; $name = strlen($entry->name) == 0 ? trans('firefly.no_category') : $entry->name; @@ -143,10 +143,10 @@ class CategoryRepository implements CategoryRepositoryInterface public function getLatestActivity(Category $category) { $latest = $category->transactionjournals() - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC') - ->first(); + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC') + ->first(); if ($latest) { return $latest->date; } @@ -163,15 +163,15 @@ class CategoryRepository implements CategoryRepositoryInterface public function getWithoutCategory(Carbon $start, Carbon $end) { return Auth::user() - ->transactionjournals() - ->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') - ->whereNull('category_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('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') + ->whereNull('category_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.*']); } /** @@ -181,39 +181,11 @@ class CategoryRepository implements CategoryRepositoryInterface * * @param bool $shared * - * @return float + * @return string */ public function spentInPeriodCorrected(Category $category, Carbon $start, Carbon $end, $shared = false) { - if ($shared === true) { - // shared is true. - // always ignore transfers between accounts! - $sum = floatval( - $category->transactionjournals() - ->transactionTypes(['Withdrawal']) - ->before($end)->after($start)->get(['transaction_journals.*'])->sum('amount') - ); - - } else { - // do something else, SEE budgets. - // get all journals in this month where the asset account is NOT shared. - $sum = $category->transactionjournals() - ->before($end) - ->after($start) - ->transactionTypes(['Withdrawal']) - ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin( - 'account_meta', function(JoinClause $join) { - $join->on('account_meta.account_id', '=', 'accounts.id')->where('account_meta.name', '=', 'accountRole'); - } - ) - ->where('account_meta.data', '!=', '"sharedAsset"') - ->get(['transaction_journals.*'])->sum('amount'); - $sum = floatval($sum); - } - - return $sum; + return $this->spentInPeriod($category, $start, $end, $shared); } /** diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php index cfe3f93c50..a24dfb6efe 100644 --- a/app/Repositories/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -81,7 +81,7 @@ interface CategoryRepositoryInterface * * @param bool $shared * - * @return float + * @return string */ public function spentInPeriodCorrected(Category $category, Carbon $start, Carbon $end, $shared = false); diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index a7fb12f50a..6713821bb9 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -48,11 +48,6 @@ class JournalRepository implements JournalRepositoryInterface */ public function delete(TransactionJournal $journal) { - // delete transactions first: - /** @var Transaction $transaction */ - foreach ($journal->transactions()->get() as $transaction) { - $transaction->delete(); - } $journal->delete(); return true; @@ -111,7 +106,7 @@ class JournalRepository implements JournalRepositoryInterface */ public function getJournalsOfTypes(array $types, $offset, $page) { - $set = Auth::user()->transactionJournals()->transactionTypes($types)->withRelevantData()->take(50)->offset($offset) + $set = Auth::user()->transactionJournals()->transactionTypes($types)->withRelevantData()->take(50)->offset($offset) ->orderBy('date', 'DESC') ->orderBy('order', 'ASC') ->orderBy('id', 'DESC') diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 3db4693284..78c8d80b2d 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -102,7 +102,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface public function setOrder($id, $order) { $piggyBank = PiggyBank::leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')->where('accounts.user_id', Auth::user()->id) - ->where('piggy_banks.id', $id)->first(['piggy_banks.*']); + ->where('piggy_banks.id', $id)->first(['piggy_banks.*']); if ($piggyBank) { $piggyBank->order = $order; $piggyBank->save(); diff --git a/app/Repositories/Reminder/ReminderRepository.php b/app/Repositories/Reminder/ReminderRepository.php index ae04c59c66..8db6d0ada0 100644 --- a/app/Repositories/Reminder/ReminderRepository.php +++ b/app/Repositories/Reminder/ReminderRepository.php @@ -36,14 +36,14 @@ class ReminderRepository implements ReminderRepositoryInterface $today = new Carbon; // active reminders: $active = Auth::user()->reminders() - ->where('notnow', 0) - ->where('active', 1) - ->where('startdate', '<=', $today->format('Y-m-d 00:00:00')) - ->where('enddate', '>=', $today->format('Y-m-d 00:00:00')) - ->get(); + ->where('notnow', 0) + ->where('active', 1) + ->where('startdate', '<=', $today->format('Y-m-d 00:00:00')) + ->where('enddate', '>=', $today->format('Y-m-d 00:00:00')) + ->get(); $active->each( - function(Reminder $reminder) { + function (Reminder $reminder) { $reminder->description = $this->helper->getReminderText($reminder); } ); @@ -58,11 +58,11 @@ class ReminderRepository implements ReminderRepositoryInterface public function getDismissedReminders() { $dismissed = Auth::user()->reminders() - ->where('notnow', 1) - ->get(); + ->where('notnow', 1) + ->get(); $dismissed->each( - function(Reminder $reminder) { + function (Reminder $reminder) { $reminder->description = $this->helper->getReminderText($reminder); } ); @@ -77,18 +77,18 @@ class ReminderRepository implements ReminderRepositoryInterface { $expired = Auth::user()->reminders() - ->where('notnow', 0) - ->where('active', 1) - ->where( - function (Builder $q) { - $today = new Carbon; - $q->where('startdate', '>', $today->format('Y-m-d 00:00:00')); - $q->orWhere('enddate', '<', $today->format('Y-m-d 00:00:00')); - } - )->get(); + ->where('notnow', 0) + ->where('active', 1) + ->where( + function (Builder $q) { + $today = new Carbon; + $q->where('startdate', '>', $today->format('Y-m-d 00:00:00')); + $q->orWhere('enddate', '<', $today->format('Y-m-d 00:00:00')); + } + )->get(); $expired->each( - function(Reminder $reminder) { + function (Reminder $reminder) { $reminder->description = $this->helper->getReminderText($reminder); } ); @@ -106,7 +106,7 @@ class ReminderRepository implements ReminderRepositoryInterface ->get(); $inactive->each( - function(Reminder $reminder) { + function (Reminder $reminder) { $reminder->description = $this->helper->getReminderText($reminder); } ); diff --git a/app/Repositories/Shared/ComponentRepository.php b/app/Repositories/Shared/ComponentRepository.php new file mode 100644 index 0000000000..e4187f9e58 --- /dev/null +++ b/app/Repositories/Shared/ComponentRepository.php @@ -0,0 +1,74 @@ +addProperty($object->id); + $cache->addProperty(get_class($object)); + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty($shared); + $cache->addProperty('spentInPeriod'); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + + if ($shared === true) { + // shared is true. + // always ignore transfers between accounts! + $sum + = $object->transactionjournals() + ->transactionTypes(['Withdrawal']) + ->before($end)->after($start)->get(['transaction_journals.*'])->sum('amount'); + + } else { + // do something else, SEE budgets. + // get all journals in this month where the asset account is NOT shared. + $sum = $object->transactionjournals() + ->before($end) + ->after($start) + ->transactionTypes(['Withdrawal']) + ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') + ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') + ->leftJoin( + 'account_meta', function (JoinClause $join) { + $join->on('account_meta.account_id', '=', 'accounts.id')->where('account_meta.name', '=', 'accountRole'); + } + ) + ->where('account_meta.data', '!=', '"sharedAsset"') + ->get(['transaction_journals.*'])->sum('amount'); + } + + $cache->store($sum); + + return $sum; + } +} diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index 358eeac892..935c2967fa 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -64,14 +64,15 @@ class TagRepository implements TagRepositoryInterface * @param Carbon $start * @param Carbon $end * - * @return integer + * @return string */ public function coveredByBalancingActs(Account $account, Carbon $start, Carbon $end) { // the quickest way to do this is by scanning all balancingAct tags // because there will be less of them any way. $tags = Auth::user()->tags()->where('tagMode', 'balancingAct')->get(); - $amount = 0; + $amount = '0'; + bcscale(2); /** @var Tag $tag */ foreach ($tags as $tag) { @@ -80,7 +81,7 @@ class TagRepository implements TagRepositoryInterface /** @var TransactionJournal $journal */ foreach ($journals as $journal) { if ($journal->destination_account->id == $account->id) { - $amount += $journal->amount; + $amount = bcadd($amount, $journal->amount); } } } @@ -109,7 +110,7 @@ class TagRepository implements TagRepositoryInterface /** @var Collection $tags */ $tags = Auth::user()->tags()->get(); $tags->sortBy( - function(Tag $tag) { + function (Tag $tag) { return $tag->tag; } ); @@ -198,16 +199,11 @@ class TagRepository implements TagRepositoryInterface /* * If any transaction is a deposit, cannot become a balancing act. */ - $count = 0; foreach ($tag->transactionjournals as $journal) { if ($journal->transactionType->type == 'Deposit') { - $count++; + return false; } } - if ($count > 0) { - return false; - } - return true; } @@ -308,7 +304,8 @@ class TagRepository implements TagRepositoryInterface return $this->matchAll($journal, $tag); } - return false; + // this statement is unreachable. + return false; // @codeCoverageIgnore } @@ -323,7 +320,7 @@ class TagRepository implements TagRepositoryInterface $match = true; /** @var TransactionJournal $check */ foreach ($tag->transactionjournals as $check) { - if ($check->asset_account->id != $journal->asset_account->id) { + if ($check->source_account->id != $journal->source_account->id) { $match = false; } } diff --git a/app/Repositories/Tag/TagRepositoryInterface.php b/app/Repositories/Tag/TagRepositoryInterface.php index 463e0979d2..7d76fa30e8 100644 --- a/app/Repositories/Tag/TagRepositoryInterface.php +++ b/app/Repositories/Tag/TagRepositoryInterface.php @@ -38,7 +38,7 @@ interface TagRepositoryInterface * @param Carbon $start * @param Carbon $end * - * @return float + * @return string */ public function coveredByBalancingActs(Account $account, Carbon $start, Carbon $end); diff --git a/app/Services/Registrar.php b/app/Services/Registrar.php index 6f9ffa729a..5f69c7ba24 100644 --- a/app/Services/Registrar.php +++ b/app/Services/Registrar.php @@ -41,9 +41,9 @@ class Registrar implements RegistrarContract { return Validator::make( $data, [ - 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|confirmed|min:6', - ] + 'email' => 'required|email|max:255|unique:users', + 'password' => 'required|confirmed|min:6', + ] ); } diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 8a1916e9ca..c823d7736a 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -35,15 +35,8 @@ class Amount */ public function getCurrencySymbol() { - if (defined('FFCURRENCYSYMBOL')) { - return FFCURRENCYSYMBOL; - } - $currencyPreference = Prefs::get('currencyPreference', 'EUR'); $currency = TransactionCurrency::whereCode($currencyPreference->data)->first(); - - define('FFCURRENCYSYMBOL', $currency->symbol); - return $currency->symbol; } @@ -84,6 +77,15 @@ class Amount */ public function formatJournal(TransactionJournal $journal, $coloured = true) { + $cache = new CacheProperties; + $cache->addProperty($journal->id); + $cache->addProperty('formatJournal'); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + if (is_null($journal->symbol)) { $symbol = $journal->transactionCurrency->symbol; } else { @@ -94,13 +96,22 @@ class Amount $amount = $amount * -1; } if ($journal->transactionType->type == 'Transfer' && $coloured) { - return '' . $this->formatWithSymbol($symbol, $amount, false) . ''; + $txt = '' . $this->formatWithSymbol($symbol, $amount, false) . ''; + $cache->store($txt); + + return $txt; } if ($journal->transactionType->type == 'Transfer' && !$coloured) { - return $this->formatWithSymbol($symbol, $amount, false); + $txt = $this->formatWithSymbol($symbol, $amount, false); + $cache->store($txt); + + return $txt; } - return $this->formatWithSymbol($symbol, $amount, $coloured); + $txt = $this->formatWithSymbol($symbol, $amount, $coloured); + $cache->store($txt); + + return $txt; } /** @@ -130,22 +141,16 @@ class Amount */ public function getCurrencyCode() { - if (defined('FFCURRENCYCODE')) { - return FFCURRENCYCODE; - } - $currencyPreference = Prefs::get('currencyPreference', 'EUR'); $currency = TransactionCurrency::whereCode($currencyPreference->data)->first(); if ($currency) { - define('FFCURRENCYCODE', $currency->code); - return $currency->code; } - return 'EUR'; + return 'EUR'; // @codeCoverageIgnore } /** diff --git a/app/Support/CacheProperties.php b/app/Support/CacheProperties.php new file mode 100644 index 0000000000..ba2d654b3d --- /dev/null +++ b/app/Support/CacheProperties.php @@ -0,0 +1,106 @@ +properties = new Collection; + $this->addProperty(Auth::user()->id); + $this->addProperty(Prefs::lastActivity()); + } + + /** + * @param $property + */ + public function addProperty($property) + { + $this->properties->push($property); + } + + /** + * @return mixed + */ + public function get() + { + return Cache::get($this->md5); + } + + /** + * @return string + */ + public function getMd5() + { + return $this->md5; + } + + /** + * @return bool + */ + public function has() + { + if (getenv('APP_ENV') == 'testing') { + return false; + } + $this->md5(); + + return Cache::has($this->md5); + } + + /** + * @return void + */ + private function md5() + { + foreach ($this->properties as $property) { + + if ($property instanceof Collection || $property instanceof EloquentCollection) { + $this->md5 .= json_encode($property->toArray()); + continue; + } + if ($property instanceof Carbon) { + $this->md5 .= $property->toRfc3339String(); + continue; + } + if (is_object($property)) { + $this->md5 .= $property->__toString(); + } + + $this->md5 .= json_encode($property); + } + + $this->md5 = md5($this->md5); + } + + /** + * @param $data + */ + public function store($data) + { + Cache::forever($this->md5, $data); + } +} diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php index bac40078a4..1e65ebf1aa 100644 --- a/app/Support/ExpandedForm.php +++ b/app/Support/ExpandedForm.php @@ -7,6 +7,7 @@ use Eloquent; use Illuminate\Support\Collection; use Illuminate\Support\MessageBag; use Input; +use RuntimeException; use Session; use View; @@ -109,10 +110,17 @@ class ExpandedForm $preFilled = Session::get('preFilled'); $value = isset($preFilled[$name]) && is_null($value) ? $preFilled[$name] : $value; } - if (!is_null(Input::old($name))) { - $value = Input::old($name); + // @codeCoverageIgnoreStart + try { + if (!is_null(Input::old($name))) { + $value = Input::old($name); + } + } catch (RuntimeException $e) { + // don't care about session errors. } + // @codeCoverageIgnoreEnd + return $value; } @@ -249,24 +257,6 @@ class ExpandedForm return $selectList; } - /** - * @param $name - * @param null $value - * @param array $options - * - * @return string - */ - public function month($name, $value = null, array $options = []) - { - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - $value = $this->fillFieldValue($name, $value); - $html = View::make('form.month', compact('classes', 'name', 'label', 'value', 'options'))->render(); - - return $html; - } - /** * @param $name * @param array $list @@ -274,7 +264,6 @@ class ExpandedForm * @param array $options * * @return string - * @internal param null $value */ public function multiRadio($name, array $list = [], $selected = null, array $options = []) { @@ -297,7 +286,16 @@ class ExpandedForm */ public function optionsList($type, $name) { - $previousValue = Input::old('post_submit_action'); + $previousValue = null; + + // @codeCoverageIgnoreStart + try { + $previousValue = Input::old('post_submit_action'); + } catch (RuntimeException $e) { + // don't care + } + // @codeCoverageIgnoreEnd + $previousValue = is_null($previousValue) ? 'store' : $previousValue; $html = View::make('form.options', compact('type', 'name', 'previousValue'))->render(); diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index f2dd884673..2c3f564a61 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -41,6 +41,7 @@ class Navigation '6M' => 6, 'half-year' => 6, ]; + if (!isset($functionMap[$repeatFreq])) { throw new FireflyException('Cannot do addPeriod for $repeat_freq "' . $repeatFreq . '"'); } @@ -118,7 +119,7 @@ class Navigation 'year' => 'endOfYear', 'yearly' => 'endOfYear', ]; - $specials = ['mont', 'monthly']; + $specials = ['mont', 'monthly']; $currentEnd = clone $theCurrentEnd; @@ -270,7 +271,7 @@ class Navigation '3M' => 'lastOfQuarter', '1Y' => 'endOfYear', ]; - $end = clone $start; + $end = clone $start; if (isset($functionMap[$range])) { $function = $functionMap[$range]; diff --git a/app/Support/Preferences.php b/app/Support/Preferences.php index 3d53d9c16a..e705f9cb55 100644 --- a/app/Support/Preferences.php +++ b/app/Support/Preferences.php @@ -3,6 +3,7 @@ namespace FireflyIII\Support; use Auth; +use Cache; use FireflyIII\Models\Preference; /** @@ -13,20 +14,34 @@ use FireflyIII\Models\Preference; class Preferences { /** - * @param $name - * @param null $default + * @return string + */ + public function lastActivity() + { + $preference = $this->get('lastActivity', microtime())->data; + + return md5($preference); + } + + /** + * @param string $name + * @param string $default * * @return null|\FireflyIII\Models\Preference */ public function get($name, $default = null) { - $preferences = Preference::where('user_id', Auth::user()->id)->get(); + $fullName = 'preference' . Auth::user()->id . $name; + if (Cache::has($fullName)) { + return Cache::get($fullName); + } - /** @var Preference $preference */ - foreach ($preferences as $preference) { - if ($preference->name == $name) { - return $preference; - } + $preference = Preference::where('user_id', Auth::user()->id)->where('name', $name)->first(['id', 'name', 'data_encrypted']); + + if ($preference) { + Cache::forever($fullName, $preference); + + return $preference; } // no preference found and default is null: if (is_null($default)) { @@ -39,33 +54,40 @@ class Preferences } /** - * @param $name - * @param $value + * @param $name + * @param string $value * * @return Preference */ public function set($name, $value) { - $preferences = Preference::where('user_id', Auth::user()->id)->get(); - /** @var Preference $preference */ - foreach ($preferences as $preference) { - if ($preference->name == $name) { - $preference->data = $value; - $preference->save(); - - return $preference; - } - } - $pref = new Preference; - $pref->name = $name; - $pref->data = $value; - - if (!is_null(Auth::user()->id)) { + $fullName = 'preference' . Auth::user()->id . $name; + Cache::forget($fullName); + $pref = Preference::where('user_id', Auth::user()->id)->where('name', $name)->first(['id', 'name', 'data_encrypted']); + if ($pref) { + $pref->data = $value; + } else { + $pref = new Preference; + $pref->name = $name; + $pref->data = $value; $pref->user()->associate(Auth::user()); - $pref->save(); + } + $pref->save(); + + Cache::forever($fullName, $pref); return $pref; } + + /** + * @return bool + */ + public function mark() + { + $this->set('lastActivity', microtime()); + + return true; + } } diff --git a/app/Support/Search/Search.php b/app/Support/Search/Search.php index 7b1e0f42b5..a493ad0741 100644 --- a/app/Support/Search/Search.php +++ b/app/Support/Search/Search.php @@ -25,7 +25,7 @@ class Search implements SearchInterface public function searchAccounts(array $words) { return Auth::user()->accounts()->with('accounttype')->where( - function(EloquentBuilder $q) use ($words) { + function (EloquentBuilder $q) use ($words) { foreach ($words as $word) { $q->orWhere('name', 'LIKE', '%' . e($word) . '%'); } @@ -43,7 +43,7 @@ class Search implements SearchInterface /** @var Collection $set */ $set = Auth::user()->budgets()->get(); $newSet = $set->filter( - function(Budget $b) use ($words) { + function (Budget $b) use ($words) { $found = 0; foreach ($words as $word) { if (!(strpos(strtolower($b->name), strtolower($word)) === false)) { @@ -68,7 +68,7 @@ class Search implements SearchInterface /** @var Collection $set */ $set = Auth::user()->categories()->get(); $newSet = $set->filter( - function(Category $c) use ($words) { + function (Category $c) use ($words) { $found = 0; foreach ($words as $word) { if (!(strpos(strtolower($c->name), strtolower($word)) === false)) { @@ -103,7 +103,7 @@ class Search implements SearchInterface { // decrypted transaction journals: $decrypted = Auth::user()->transactionjournals()->withRelevantData()->where('encrypted', 0)->where( - function(EloquentBuilder $q) use ($words) { + function (EloquentBuilder $q) use ($words) { foreach ($words as $word) { $q->orWhere('description', 'LIKE', '%' . e($word) . '%'); } @@ -113,7 +113,7 @@ class Search implements SearchInterface // encrypted $all = Auth::user()->transactionjournals()->withRelevantData()->where('encrypted', 1)->get(); $set = $all->filter( - function(TransactionJournal $journal) use ($words) { + function (TransactionJournal $journal) use ($words) { foreach ($words as $word) { $haystack = strtolower($journal->description); $word = strtolower($word); @@ -129,7 +129,7 @@ class Search implements SearchInterface $filtered = $set->merge($decrypted); $filtered->sortBy( - function(TransactionJournal $journal) { + function (TransactionJournal $journal) { return intval($journal->date->format('U')); } ); diff --git a/app/Support/Steam.php b/app/Support/Steam.php index a04e3ee002..627faba6d9 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -4,8 +4,6 @@ namespace FireflyIII\Support; use Carbon\Carbon; use FireflyIII\Models\Account; -use FireflyIII\Models\PiggyBank; -use FireflyIII\Models\PiggyBankRepetition; /** * Class Steam @@ -24,6 +22,18 @@ class Steam */ public function balance(Account $account, Carbon $date, $ignoreVirtualBalance = false) { + + // abuse chart properties: + $cache = new CacheProperties; + $cache->addProperty($account->id); + $cache->addProperty('balance'); + $cache->addProperty($date); + $cache->addProperty($ignoreVirtualBalance); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + // find the first known transaction on this account: $firstDateObject = $account ->transactions() @@ -45,6 +55,7 @@ class Steam if (!$ignoreVirtualBalance) { $balance = bcadd($balance, $account->virtual_balance); } + $cache->store(round($balance, 2)); return round($balance, 2); } diff --git a/app/Support/Twig/Budget.php b/app/Support/Twig/Budget.php index 2424f8b0c8..278f6b0448 100644 --- a/app/Support/Twig/Budget.php +++ b/app/Support/Twig/Budget.php @@ -4,6 +4,7 @@ namespace FireflyIII\Support\Twig; use Auth; use FireflyIII\Models\LimitRepetition; +use FireflyIII\Support\CacheProperties; use Twig_Extension; use Twig_SimpleFunction; @@ -19,20 +20,27 @@ class Budget extends Twig_Extension */ public function getFunctions() { - $functions = []; + $functions = []; $functions[] = new Twig_SimpleFunction( - 'spentInRepetitionCorrected', function(LimitRepetition $repetition) { + 'spentInRepetitionCorrected', function (LimitRepetition $repetition) { + $cache = new CacheProperties; + $cache->addProperty($repetition->id); + $cache->addProperty('spentInRepetitionCorrected'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } $sum = Auth::user()->transactionjournals() - ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') - ->leftJoin('budget_limits', 'budget_limits.budget_id', '=', 'budget_transaction_journal.budget_id') - ->leftJoin('limit_repetitions', 'limit_repetitions.budget_limit_id', '=', 'budget_limits.id') - ->before($repetition->enddate) - ->after($repetition->startdate) - ->where('limit_repetitions.id', '=', $repetition->id) - ->get(['transaction_journals.*'])->sum('amount'); + ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') + ->leftJoin('budget_limits', 'budget_limits.budget_id', '=', 'budget_transaction_journal.budget_id') + ->leftJoin('limit_repetitions', 'limit_repetitions.budget_limit_id', '=', 'budget_limits.id') + ->before($repetition->enddate) + ->after($repetition->startdate) + ->where('limit_repetitions.id', '=', $repetition->id) + ->get(['transaction_journals.*'])->sum('amount'); + $cache->store($sum); - return floatval($sum); + return $sum; } ); diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index 81ea504928..4f79622995 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -28,51 +28,15 @@ class General extends Twig_Extension */ public function getFilters() { - $filters = []; + return [ + $this->formatAmount(), + $this->formatTransaction(), + $this->formatAmountPlain(), + $this->formatJournal(), + $this->balance(), + $this->getAccountRole() + ]; - $filters[] = new Twig_SimpleFilter( - 'formatAmount', function($string) { - return App::make('amount')->format($string); - }, ['is_safe' => ['html']] - ); - - $filters[] = new Twig_SimpleFilter( - 'formatTransaction', function(Transaction $transaction) { - return App::make('amount')->formatTransaction($transaction); - }, ['is_safe' => ['html']] - ); - - $filters[] = new Twig_SimpleFilter( - 'formatAmountPlain', function($string) { - return App::make('amount')->format($string, false); - }, ['is_safe' => ['html']] - ); - - $filters[] = new Twig_SimpleFilter( - 'formatJournal', function($journal) { - return App::make('amount')->formatJournal($journal); - }, ['is_safe' => ['html']] - ); - - $filters[] = new Twig_SimpleFilter( - 'balance', function(Account $account = null) { - if (is_null($account)) { - return 'NULL'; - } - $date = Session::get('end', Carbon::now()->endOfMonth()); - - return App::make('steam')->balance($account, $date); - } - ); - - // should be a function but OK - $filters[] = new Twig_SimpleFilter( - 'getAccountRole', function($name) { - return Config::get('firefly.accountRoles.' . $name); - } - ); - - return $filters; } /** @@ -80,62 +44,16 @@ class General extends Twig_Extension */ public function getFunctions() { - $functions = []; - - $functions[] = new Twig_SimpleFunction( - 'getCurrencyCode', function() { - return App::make('amount')->getCurrencyCode(); - } - ); - - $functions[] = new Twig_SimpleFunction( - 'getCurrencySymbol', function() { - return App::make('amount')->getCurrencySymbol(); - } - ); - - $functions[] = new Twig_SimpleFunction( - 'phpdate', function($str) { - return date($str); - } - ); - - - $functions[] = new Twig_SimpleFunction( - 'env', function($name, $default) { - return env($name, $default); - } - ); - - $functions[] = new Twig_SimpleFunction( - 'activeRoute', function($context) { - $args = func_get_args(); - $route = $args[1]; - $what = isset($args[2]) ? $args[2] : false; - $strict = isset($args[3]) ? $args[3] : false; - $activeWhat = isset($context['what']) ? $context['what'] : false; - - // activeRoute - if (!($what === false)) { - if ($what == $activeWhat && Route::getCurrentRoute()->getName() == $route) { - return 'active because-active-what'; - } - } else { - if (!$strict && !(strpos(Route::getCurrentRoute()->getName(), $route) === false)) { - return 'active because-route-matches-non-strict'; - } else { - if ($strict && Route::getCurrentRoute()->getName() == $route) { - return 'active because-route-matches-strict'; - } - } - } - - return 'not-xxx-at-all'; - }, ['needs_context' => true] - ); - - return $functions; + return [ + $this->getCurrencyCode(), + $this->getCurrencySymbol(), + $this->phpdate(), + $this->env(), + $this->activeRouteStrict(), + $this->activeRoutePartial(), + $this->activeRoutePartialWhat(), + ]; } @@ -147,4 +65,196 @@ class General extends Twig_Extension return 'FireflyIII\Support\Twig\General'; } + /** + * @return Twig_SimpleFilter + */ + protected function formatAmount() + { + return new Twig_SimpleFilter( + 'formatAmount', function ($string) { + return App::make('amount')->format($string); + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFilter + */ + protected function formatTransaction() + { + return new Twig_SimpleFilter( + 'formatTransaction', function (Transaction $transaction) { + return App::make('amount')->formatTransaction($transaction); + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFilter + */ + protected function formatAmountPlain() + { + return new Twig_SimpleFilter( + 'formatAmountPlain', function ($string) { + return App::make('amount')->format($string, false); + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFilter + */ + protected function formatJournal() + { + return new Twig_SimpleFilter( + 'formatJournal', function ($journal) { + return App::make('amount')->formatJournal($journal); + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFilter + */ + protected function balance() + { + return new Twig_SimpleFilter( + 'balance', function (Account $account = null) { + if (is_null($account)) { + return 'NULL'; + } + $date = Session::get('end', Carbon::now()->endOfMonth()); + + return App::make('steam')->balance($account, $date); + } + ); + } + + /** + * @return Twig_SimpleFilter + */ + protected function getAccountRole() + { + return new Twig_SimpleFilter( + 'getAccountRole', function ($name) { + return Config::get('firefly.accountRoles.' . $name); + } + ); + } + + /** + * @return Twig_SimpleFunction + */ + protected function getCurrencyCode() + { + return new Twig_SimpleFunction( + 'getCurrencyCode', function () { + return App::make('amount')->getCurrencyCode(); + } + ); + } + + /** + * @return Twig_SimpleFunction + */ + protected function getCurrencySymbol() + { + return new Twig_SimpleFunction( + 'getCurrencySymbol', function () { + return App::make('amount')->getCurrencySymbol(); + } + ); + } + + /** + * @return Twig_SimpleFunction + */ + protected function phpdate() + { + return new Twig_SimpleFunction( + 'phpdate', function ($str) { + return date($str); + } + ); + } + + /** + * @return Twig_SimpleFunction + */ + protected function env() + { + return new Twig_SimpleFunction( + 'env', function ($name, $default) { + return env($name, $default); + } + ); + } + + /** + * Will return "active" when the current route matches the given argument + * exactly. + * + * @return Twig_SimpleFunction + */ + protected function activeRouteStrict() + { + return new Twig_SimpleFunction( + 'activeRouteStrict', function () { + $args = func_get_args(); + $route = $args[0]; // name of the route. + + if (Route::getCurrentRoute()->getName() == $route) { + return 'active because-route-matches-strict'; + } + + return 'not-xxx-at-all'; + } + ); + } + + /** + * Will return "active" when a part of the route matches the argument. + * ie. "accounts" will match "accounts.index". + * + * @return Twig_SimpleFunction + */ + protected function activeRoutePartial() + { + return new Twig_SimpleFunction( + 'activeRoutePartial', function () { + $args = func_get_args(); + $route = $args[0]; // name of the route. + if (!(strpos(Route::getCurrentRoute()->getName(), $route) === false)) { + return 'active because-route-matches-non-strict'; + } + + return 'not-xxx-at-all'; + } + ); + } + + /** + * This function will return "active" when the current route matches the first argument (even partly) + * but, the variable $what has been set and matches the second argument. + * + * @return Twig_SimpleFunction + */ + protected function activeRoutePartialWhat() + { + return new Twig_SimpleFunction( + 'activeRoutePartialWhat', function ($context) { + $args = func_get_args(); + $route = $args[1]; // name of the route. + $what = $args[2]; // name of the route. + $activeWhat = isset($context['what']) ? $context['what'] : false; + + if ($what == $activeWhat && !(strpos(Route::getCurrentRoute()->getName(), $route) === false)) { + return 'active because-route-matches-non-strict-what'; + } + + return 'not-xxx-at-all'; + }, ['needs_context' => true] + ); + } + } diff --git a/app/Support/Twig/Journal.php b/app/Support/Twig/Journal.php index beaafae668..f1e327e6be 100644 --- a/app/Support/Twig/Journal.php +++ b/app/Support/Twig/Journal.php @@ -4,7 +4,9 @@ namespace FireflyIII\Support\Twig; use App; +use FireflyIII\Models\Tag; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Support\CacheProperties; use Twig_Extension; use Twig_SimpleFilter; use Twig_SimpleFunction; @@ -18,103 +20,24 @@ class Journal extends Twig_Extension { /** - * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @return array */ public function getFilters() { - $filters = []; - - $filters[] = new Twig_SimpleFilter( - 'typeIcon', function(TransactionJournal $journal) { - $type = $journal->transactionType->type; - - switch ($type) { - case 'Withdrawal': - return ''; - case 'Deposit': - return ''; - case 'Transfer': - return ''; - case 'Opening balance': - return ''; - default: - return ''; - } - - - }, ['is_safe' => ['html']] - ); + $filters = [$this->typeIcon()]; return $filters; } /** - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * * @return array */ public function getFunctions() { - $functions = []; - - $functions[] = new Twig_SimpleFunction( - 'invalidJournal', function(TransactionJournal $journal) { - if (!isset($journal->transactions[1]) || !isset($journal->transactions[0])) { - return true; - } - - return false; - } - ); - - $functions[] = new Twig_SimpleFunction( - 'relevantTags', function(TransactionJournal $journal) { - if ($journal->tags->count() == 0) { - return App::make('amount')->formatJournal($journal); - } - - - foreach ($journal->tags as $tag) { - if ($tag->tagMode == 'balancingAct') { - // return tag formatted for a "balancing act", even if other - // tags are present. - $amount = App::make('amount')->format($journal->actual_amount, false); - - return ' ' . $tag->tag . ''; - } - - /* - * AdvancePayment with a deposit will show the tag instead of the amount: - */ - if ($tag->tagMode == 'advancePayment' && $journal->transactionType->type == 'Deposit') { - $amount = App::make('amount')->formatJournal($journal, false); - - return ' ' . $tag->tag . ''; - } - /* - * AdvancePayment with a withdrawal will show the amount with a link to - * the tag. The TransactionJournal should properly calculate the amount. - */ - if ($tag->tagMode == 'advancePayment' && $journal->transactionType->type == 'Withdrawal') { - $amount = App::make('amount')->formatJournal($journal); - - return '' . $amount . ''; - } - - - if ($tag->tagMode == 'nothing') { - // return the amount: - return App::make('amount')->formatJournal($journal); - } - } - - - return 'TODO: ' . $journal->amount; - } - ); + $functions = [ + $this->invalidJournal(), + $this->relevantTags() + ]; return $functions; } @@ -128,4 +51,192 @@ class Journal extends Twig_Extension { return 'FireflyIII\Support\Twig\Journals'; } + + /** + * @return Twig_SimpleFilter + */ + protected function typeIcon() + { + return new Twig_SimpleFilter( + 'typeIcon', function (TransactionJournal $journal) { + + $cache = new CacheProperties(); + $cache->addProperty($journal->id); + $cache->addProperty('typeIcon'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $type = $journal->transactionType->type; + + switch ($type) { + case 'Withdrawal': + $txt = ''; + break; + case 'Deposit': + $txt = ''; + break; + case 'Transfer': + $txt = ''; + break; + case 'Opening balance': + $txt = ''; + break; + default: + $txt = ''; + break; + } + $cache->store($txt); + + return $txt; + + + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFunction + */ + protected function invalidJournal() + { + return new Twig_SimpleFunction( + 'invalidJournal', function (TransactionJournal $journal) { + if (!isset($journal->transactions[1]) || !isset($journal->transactions[0])) { + return true; + } + + return false; + } + ); + } + + /** + * @return Twig_SimpleFunction + */ + protected function relevantTags() + { + return new Twig_SimpleFunction( + 'relevantTags', function (TransactionJournal $journal) { + $cache = new CacheProperties; + $cache->addProperty('relevantTags'); + $cache->addProperty($journal->id); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $count = $journal->tags->count(); + $string = ''; + + if ($count === 0) { + $string = $this->relevantTagsNoTags($journal); + } + + if ($count === 1) { + $string = $this->relevantTagsSingle($journal); + } + + if ($count > 1) { + $string = $this->relevantTagsMulti($journal); + } + + $cache->store($string); + + return $string; + } + ); + } + + /** + * @param TransactionJournal $journal + * + * @return string + */ + protected function relevantTagsNoTags(TransactionJournal $journal) + { + return App::make('amount')->formatJournal($journal); + } + + /** + * @param TransactionJournal $journal + * + * @return string + */ + protected function relevantTagsSingle(TransactionJournal $journal) + { + $tag = $journal->tags()->first(); + + return $this->formatJournalByTag($journal, $tag); + } + + /** + * @param TransactionJournal $journal + * @param Tag $tag + * + * @return string + */ + protected function formatJournalByTag(TransactionJournal $journal, Tag $tag) + { + if ($tag->tagMode == 'balancingAct') { + // return tag formatted for a "balancing act", even if other + // tags are present. + $amount = App::make('amount')->format($journal->actual_amount, false); + $string = ' ' . $tag->tag . ''; + + return $string; + } + + if ($tag->tagMode == 'advancePayment') { + if ($journal->transactionType->type == 'Deposit') { + $amount = App::make('amount')->formatJournal($journal, false); + $string = ' ' . $tag->tag . ''; + + return $string; + } + + /* + * AdvancePayment with a withdrawal will show the amount with a link to + * the tag. The TransactionJournal should properly calculate the amount. + */ + if ($journal->transactionType->type == 'Withdrawal') { + $amount = App::make('amount')->formatJournal($journal); + + $string = '' . $amount . ''; + + return $string; + } + } + + + return $this->relevantTagsNoTags($journal); + } + + /** + * If a transaction journal has multiple tags, we'll have to gamble. FF3 + * does not yet block adding multiple 'special' tags so we must wing it. + * + * We grab the first special tag (for advancePayment and for balancingAct + * and try to format those. If they're not present (it's all normal tags), + * we can format like any other journal. + * + * @param TransactionJournal $journal + * + * @return string + */ + protected function relevantTagsMulti(TransactionJournal $journal) + { + $firstBalancingAct = $journal->tags()->where('tagMode', 'balancingAct')->first(); + if ($firstBalancingAct) { + return $this->formatJournalByTag($journal, $firstBalancingAct); + } + + $firstAdvancePayment = $journal->tags()->where('tagMode', 'advancePayment')->first(); + if ($firstAdvancePayment) { + return $this->formatJournalByTag($journal, $firstAdvancePayment); + } + + return $this->relevantTagsNoTags($journal); + } } diff --git a/app/Support/Twig/PiggyBank.php b/app/Support/Twig/PiggyBank.php index f178aa6316..6ff4aafe90 100644 --- a/app/Support/Twig/PiggyBank.php +++ b/app/Support/Twig/PiggyBank.php @@ -22,7 +22,7 @@ class PiggyBank extends Twig_Extension $functions = []; $functions[] = new Twig_SimpleFunction( - 'currentRelevantRepAmount', function(PB $piggyBank) { + 'currentRelevantRepAmount', function (PB $piggyBank) { return $piggyBank->currentRelevantRep()->currentamount; } ); diff --git a/app/Support/Twig/Translation.php b/app/Support/Twig/Translation.php index d91c1816e6..1cb3314cf2 100644 --- a/app/Support/Twig/Translation.php +++ b/app/Support/Twig/Translation.php @@ -21,7 +21,7 @@ class Translation extends Twig_Extension $filters = []; $filters[] = new Twig_SimpleFilter( - '_', function($name) { + '_', function ($name) { return trans('firefly.' . $name); diff --git a/app/User.php b/app/User.php index 0207cc0fad..8264621ea1 100644 --- a/app/User.php +++ b/app/User.php @@ -11,20 +11,20 @@ use Zizaco\Entrust\Traits\EntrustUserTrait; * Class User * * @package FireflyIII - * @property integer $id - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property string $email - * @property string $password - * @property string $reset - * @property string $remember_token - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Account[] $accounts - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Tag[] $tags - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Bill[] $bills - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Budget[] $budgets - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Category[] $categories - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Preference[] $preferences - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Reminder[] $reminders + * @property integer $id + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at + * @property string $email + * @property string $password + * @property string $reset + * @property string $remember_token + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Account[] $accounts + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Tag[] $tags + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Bill[] $bills + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Budget[] $budgets + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Category[] $categories + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Preference[] $preferences + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Reminder[] $reminders * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals * @method static \Illuminate\Database\Query\Builder|\FireflyIII\User whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\User whereCreatedAt($value) @@ -33,6 +33,7 @@ use Zizaco\Entrust\Traits\EntrustUserTrait; * @method static \Illuminate\Database\Query\Builder|\FireflyIII\User wherePassword($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\User whereReset($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\User whereRememberToken($value) + * @property-read \Illuminate\Database\Eloquent\Collection|\Config::get('entrust.role')[] $roles */ class User extends Model implements AuthenticatableContract, CanResetPasswordContract { diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index 59de869bd8..120b757542 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -9,9 +9,9 @@ use Crypt; use DB; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\User; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Validation\Validator; -use Log; use Navigation; use Symfony\Component\Translation\TranslatorInterface; @@ -93,54 +93,99 @@ class FireflyValidator extends Validator */ public function validateUniqueAccountForUser($attribute, $value, $parameters) { - $type = null; - - /** - * Switch on different cases on which this method can respond: - */ - $hasWhat = isset($this->data['what']); - $hasAccountTypeId = isset($this->data['account_type_id']) && isset($this->data['name']); - $hasAccountId = isset($this->data['id']); - $ignoreId = 0; - - - if ($hasWhat) { - $search = Config::get('firefly.accountTypeByIdentifier.' . $this->data['what']); - $type = AccountType::whereType($search)->first(); - // this field can be used to find the exact type, and continue. + // because a user does not have to be logged in (tests and what-not). + if (!Auth::check()) { + return $this->validateAccountAnonymously(); } - if ($hasAccountTypeId) { - $type = AccountType::find($this->data['account_type_id']); + if (isset($this->data['what'])) { + return $this->validateByAccountTypeString($value, $parameters); } - if ($hasAccountId) { - /** @var Account $account */ - $account = Account::find($this->data['id']); - $ignoreId = intval($this->data['id']); - $type = AccountType::find($account->account_type_id); - unset($account); + if (isset($this->data['account_type_id'])) { + return $this->validateByAccountTypeId($value, $parameters); } - /** - * Try to decrypt data just in case: - */ - try { - $value = Crypt::decrypt($value); - } catch (DecryptException $e) { - // if it fails, probably not encrypted. - } - - - if (is_null($type)) { - Log::error('Could not determine type of account to validate.'); + return false; + } + /** + * @return bool + */ + protected function validateAccountAnonymously() + { + if (!isset($this->data['user_id'])) { return false; } - // get all accounts with this type, and find the name. - $userId = Auth::check() ? Auth::user()->id : 0; - $set = Account::where('account_type_id', $type->id)->where('id', '!=', $ignoreId)->where('user_id', $userId)->get(); + $user = User::find($this->data['user_id']); + $type = AccountType::find($this->data['account_type_id'])->first(); + $value = $this->tryDecrypt($this->data['name']); + + + $set = $user->accounts()->where('account_type_id', $type->id)->get(); + /** @var Account $entry */ + foreach ($set as $entry) { + if ($entry->name == $value) { + return false; + } + } + + return true; + } + + /** + * @param $value + * + * @return mixed + */ + protected function tryDecrypt($value) + { + try { + $value = Crypt::decrypt($value); + } catch (DecryptException $e) { + // do not care. + } + + return $value; + } + + /** + * @param $value + * @param $parameters + * + * @return bool + */ + protected function validateByAccountTypeString($value, $parameters) + { + $search = Config::get('firefly.accountTypeByIdentifier.' . $this->data['what']); + $type = AccountType::whereType($search)->first(); + $ignore = isset($parameters[0]) ? intval($parameters[0]) : 0; + + $set = Auth::user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore)->get(); + /** @var Account $entry */ + foreach ($set as $entry) { + if ($entry->name == $value) { + return false; + } + } + + return true; + } + + /** + * @param $value + * @param $parameters + * + * @return bool + */ + protected function validateByAccountTypeId($value, $parameters) + { + $type = AccountType::find($this->data['account_type_id'])->first(); + $ignore = isset($parameters[0]) ? intval($parameters[0]) : 0; + $value = $this->tryDecrypt($value); + + $set = Auth::user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore)->get(); /** @var Account $entry */ foreach ($set as $entry) { if ($entry->name == $value) { @@ -180,8 +225,7 @@ class FireflyValidator extends Validator * * parameter 0: the table * parameter 1: the field - * parameter 2: the encrypted / not encrypted boolean. Defaults to "encrypted". - * parameter 3: an id to ignore (when editing) + * parameter 2: an id to ignore (when editing) * * @param $attribute * @param $value @@ -191,37 +235,19 @@ class FireflyValidator extends Validator */ public function validateUniqueObjectForUser($attribute, $value, $parameters) { - $table = $parameters[0]; - $field = $parameters[1]; - $encrypted = isset($parameters[2]) ? $parameters[2] : 'encrypted'; - $exclude = isset($parameters[3]) ? $parameters[3] : null; - $alwaysEncrypted = false; - if ($encrypted == 'TRUE') { - $alwaysEncrypted = true; - } + $value = $this->tryDecrypt($value); + // exclude? + $table = $parameters[0]; + $field = $parameters[1]; + $exclude = isset($parameters[2]) ? intval($parameters[2]) : 0; - if (is_null(Auth::user())) { - // user is not logged in.. weird. - return true; - } else { - $query = DB::table($table)->where('user_id', Auth::user()->id); - } + // get entries from table + $set = DB::table($table)->where('user_id', Auth::user()->id)->where('id', '!=', $exclude)->get([$field]); - - if (!is_null($exclude)) { - $query->where('id', '!=', $exclude); - } - - - $set = $query->get(); foreach ($set as $entry) { - if (!$alwaysEncrypted) { - $isEncrypted = intval($entry->$encrypted) == 1 ? true : false; - } else { - $isEncrypted = true; - } - $checkValue = $isEncrypted ? Crypt::decrypt($entry->$field) : $entry->$field; - if ($checkValue == $value) { + $fieldValue = $this->tryDecrypt($entry->$field); + + if ($fieldValue === $value) { return false; } } @@ -248,9 +274,8 @@ class FireflyValidator extends Validator $set = $query->get(['piggy_banks.*']); foreach ($set as $entry) { - $isEncrypted = intval($entry->encrypted) == 1 ? true : false; - $checkValue = $isEncrypted ? Crypt::decrypt($entry->name) : $entry->name; - if ($checkValue == $value) { + $fieldValue = $this->tryDecrypt($entry->name); + if ($fieldValue == $value) { return false; } } diff --git a/composer.json b/composer.json index 48d5895bfe..f123bbe2b4 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,6 @@ "illuminate/html": "~5.0", "league/commonmark": "0.7.*", "rcrowe/twigbridge": "0.7.x@dev", - "twig/extensions": "~1.2", "zizaco/entrust": "dev-laravel-5" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 09cf164f3e..20b62cda5d 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": "a0c92aa0223617ca2730500921bdd82c", + "hash": "077d2b2548df62c8ef92871c6e52c856", "packages": [ { "name": "classpreloader/classpreloader", @@ -943,16 +943,16 @@ }, { "name": "laravel/framework", - "version": "v5.0.31", + "version": "v5.0.32", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "db0a7400465df159ba8c6eaa954f97f50bc19687" + "reference": "85f12207cf45cc288e9e6b9b5d184aad5f08e2ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/db0a7400465df159ba8c6eaa954f97f50bc19687", - "reference": "db0a7400465df159ba8c6eaa954f97f50bc19687", + "url": "https://api.github.com/repos/laravel/framework/zipball/85f12207cf45cc288e9e6b9b5d184aad5f08e2ca", + "reference": "85f12207cf45cc288e9e6b9b5d184aad5f08e2ca", "shasum": "" }, "require": { @@ -1065,7 +1065,7 @@ "framework", "laravel" ], - "time": "2015-05-11 22:15:00" + "time": "2015-05-29 18:56:49" }, { "name": "league/commonmark", @@ -1645,17 +1645,17 @@ }, { "name": "symfony/console", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "2343f6d8026306bd330e0c987e4c102483c213e7" + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/2343f6d8026306bd330e0c987e4c102483c213e7", - "reference": "2343f6d8026306bd330e0c987e4c102483c213e7", + "url": "https://api.github.com/repos/symfony/Console/zipball/b5ec0c11a204718f2b656357f5505a8e578f30dd", + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd", "shasum": "" }, "require": { @@ -1699,11 +1699,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-05-22 14:53:08" + "time": "2015-05-29 14:42:58" }, { "name": "symfony/debug", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Debug", "source": { "type": "git", @@ -1764,21 +1764,20 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.6.8", - "target-dir": "Symfony/Component/EventDispatcher", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02" + "reference": "687039686d0e923429ba6e958d0baa920cd5d458" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/672593bc4b0043a0acf91903bb75a1c82d8f2e02", - "reference": "672593bc4b0043a0acf91903bb75a1c82d8f2e02", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/687039686d0e923429ba6e958d0baa920cd5d458", + "reference": "687039686d0e923429ba6e958d0baa920cd5d458", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "psr/log": "~1.0", @@ -1795,11 +1794,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" } }, @@ -1819,25 +1818,24 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:18:45" + "time": "2015-05-02 15:21:08" }, { "name": "symfony/filesystem", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Filesystem", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "1f8429f72a5bfa58b33fd96824bea146fc4b3f49" + "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/1f8429f72a5bfa58b33fd96824bea146fc4b3f49", - "reference": "1f8429f72a5bfa58b33fd96824bea146fc4b3f49", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", + "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" @@ -1845,11 +1843,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Filesystem\\": "" } }, @@ -1869,11 +1867,11 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:32:45" + "time": "2015-05-15 13:33:16" }, { "name": "symfony/finder", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Finder", "source": { "type": "git", @@ -1923,7 +1921,7 @@ }, { "name": "symfony/http-foundation", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", @@ -1977,17 +1975,17 @@ }, { "name": "symfony/http-kernel", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/HttpKernel", "source": { "type": "git", "url": "https://github.com/symfony/HttpKernel.git", - "reference": "a9a6f595941fce8dddd64f4e9bf47747cf1515fc" + "reference": "7c883eb1a5d8b52b1fa6d4134b82304c6bb7007f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/a9a6f595941fce8dddd64f4e9bf47747cf1515fc", - "reference": "a9a6f595941fce8dddd64f4e9bf47747cf1515fc", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/7c883eb1a5d8b52b1fa6d4134b82304c6bb7007f", + "reference": "7c883eb1a5d8b52b1fa6d4134b82304c6bb7007f", "shasum": "" }, "require": { @@ -2051,11 +2049,11 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-05-27 00:17:10" + "time": "2015-05-29 22:55:07" }, { "name": "symfony/process", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Process", "source": { "type": "git", @@ -2105,7 +2103,7 @@ }, { "name": "symfony/routing", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Routing", "source": { "type": "git", @@ -2174,7 +2172,7 @@ }, { "name": "symfony/security-core", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Security/Core", "source": { "type": "git", @@ -2238,17 +2236,17 @@ }, { "name": "symfony/translation", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/Translation", "source": { "type": "git", "url": "https://github.com/symfony/Translation.git", - "reference": "d030b3d8d9699795dbf8c59e915ef879007a4483" + "reference": "89cdf3c43bc24c85dd8173dfcf5a979a95e5bd9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/d030b3d8d9699795dbf8c59e915ef879007a4483", - "reference": "d030b3d8d9699795dbf8c59e915ef879007a4483", + "url": "https://api.github.com/repos/symfony/Translation/zipball/89cdf3c43bc24c85dd8173dfcf5a979a95e5bd9c", + "reference": "89cdf3c43bc24c85dd8173dfcf5a979a95e5bd9c", "shasum": "" }, "require": { @@ -2293,11 +2291,11 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2015-05-22 14:37:51" + "time": "2015-05-29 14:42:58" }, { "name": "symfony/var-dumper", - "version": "v2.6.8", + "version": "v2.6.9", "target-dir": "Symfony/Component/VarDumper", "source": { "type": "git", @@ -2355,58 +2353,6 @@ ], "time": "2015-05-01 14:14:24" }, - { - "name": "twig/extensions", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig-extensions.git", - "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", - "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", - "shasum": "" - }, - "require": { - "twig/twig": "~1.12" - }, - "require-dev": { - "symfony/translation": "~2.3" - }, - "suggest": { - "symfony/translation": "Allow the time_diff output to be translated" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_Extensions_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Common additional features for Twig that do not directly belong in core", - "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html", - "keywords": [ - "i18n", - "text" - ], - "time": "2014-10-30 14:30:03" - }, { "name": "twig/twig", "version": "v1.18.1", @@ -2466,16 +2412,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "732d2adb7d916c9593b9d58c3b0d9ebefead07aa" + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/732d2adb7d916c9593b9d58c3b0d9ebefead07aa", - "reference": "732d2adb7d916c9593b9d58c3b0d9ebefead07aa", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", "shasum": "" }, "require": { @@ -2485,11 +2431,6 @@ "phpunit/phpunit": "~4.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-0": { "Dotenv": "src/" @@ -2513,20 +2454,20 @@ "env", "environment" ], - "time": "2014-12-05 15:19:21" + "time": "2015-05-30 15:59:26" }, { "name": "watson/validating", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/dwightwatson/validating.git", - "reference": "47320813a45cc35384e72364484d54fe44dcd3fb" + "reference": "c32912f760b456c043657951683ed6c468ab83e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/validating/zipball/47320813a45cc35384e72364484d54fe44dcd3fb", - "reference": "47320813a45cc35384e72364484d54fe44dcd3fb", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/c32912f760b456c043657951683ed6c468ab83e7", + "reference": "c32912f760b456c043657951683ed6c468ab83e7", "shasum": "" }, "require": { @@ -2568,7 +2509,7 @@ "laravel", "validation" ], - "time": "2015-05-23 00:03:54" + "time": "2015-06-03 02:25:38" }, { "name": "zizaco/entrust", @@ -3322,16 +3263,16 @@ }, { "name": "phpspec/phpspec", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/phpspec/phpspec.git", - "reference": "9727d75919a00455433e867565bc022f0b985a39" + "reference": "e9a40577323e67f1de2e214abf32976a0352d8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/9727d75919a00455433e867565bc022f0b985a39", - "reference": "9727d75919a00455433e867565bc022f0b985a39", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/e9a40577323e67f1de2e214abf32976a0352d8f8", + "reference": "e9a40577323e67f1de2e214abf32976a0352d8f8", "shasum": "" }, "require": { @@ -3396,7 +3337,7 @@ "testing", "tests" ], - "time": "2015-04-18 16:22:51" + "time": "2015-05-30 15:21:40" }, { "name": "phpspec/prophecy", @@ -3460,16 +3401,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "2.0.17", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3" + "reference": "28a6b34e91d789b2608072ab3c82eaae7cdb973c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c4e8e7725e351184a76544634855b8a9c405a6e3", - "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/28a6b34e91d789b2608072ab3c82eaae7cdb973c", + "reference": "28a6b34e91d789b2608072ab3c82eaae7cdb973c", "shasum": "" }, "require": { @@ -3492,7 +3433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -3518,7 +3459,7 @@ "testing", "xunit" ], - "time": "2015-05-25 05:11:59" + "time": "2015-06-03 07:01:01" }, { "name": "phpunit/php-file-iterator", @@ -3706,16 +3647,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.6.7", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "57bf06dd4eebe2a5ced79a8de71509e7d5c18b25" + "reference": "c2241b8d3381be3e4c6125ae347687d59f286784" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/57bf06dd4eebe2a5ced79a8de71509e7d5c18b25", - "reference": "57bf06dd4eebe2a5ced79a8de71509e7d5c18b25", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c2241b8d3381be3e4c6125ae347687d59f286784", + "reference": "c2241b8d3381be3e4c6125ae347687d59f286784", "shasum": "" }, "require": { @@ -3726,7 +3667,7 @@ "ext-spl": "*", "php": ">=5.3.3", "phpspec/prophecy": "~1.3,>=1.3.1", - "phpunit/php-code-coverage": "~2.0,>=2.0.11", + "phpunit/php-code-coverage": "~2.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "~1.0", @@ -3748,7 +3689,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.6.x-dev" + "dev-master": "4.7.x-dev" } }, "autoload": { @@ -3774,20 +3715,20 @@ "testing", "xunit" ], - "time": "2015-05-25 05:18:18" + "time": "2015-06-05 04:14:02" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.1", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "74ffb87f527f24616f72460e54b595f508dccb5c" + "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/74ffb87f527f24616f72460e54b595f508dccb5c", - "reference": "74ffb87f527f24616f72460e54b595f508dccb5c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7", + "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7", "shasum": "" }, "require": { @@ -3829,7 +3770,7 @@ "mock", "xunit" ], - "time": "2015-04-02 05:36:41" + "time": "2015-05-29 05:19:18" }, { "name": "satooshi/php-coveralls", @@ -4272,21 +4213,20 @@ }, { "name": "symfony/class-loader", - "version": "v2.6.8", - "target-dir": "Symfony/Component/ClassLoader", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/ClassLoader.git", - "reference": "abf5632a31402ae6ac19cd00683faf603046440a" + "reference": "fa19598cb708b92d983b34aae313f57c217f9386" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/abf5632a31402ae6ac19cd00683faf603046440a", - "reference": "abf5632a31402ae6ac19cd00683faf603046440a", + "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/fa19598cb708b92d983b34aae313f57c217f9386", + "reference": "fa19598cb708b92d983b34aae313f57c217f9386", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/finder": "~2.0,>=2.0.5", @@ -4295,11 +4235,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\ClassLoader\\": "" } }, @@ -4319,25 +4259,24 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:32:45" + "time": "2015-05-15 13:33:16" }, { "name": "symfony/config", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Config", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "2696c5bc7c31485a482c10865d713de9fcc7aa31" + "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/2696c5bc7c31485a482c10865d713de9fcc7aa31", - "reference": "2696c5bc7c31485a482c10865d713de9fcc7aa31", + "url": "https://api.github.com/repos/symfony/Config/zipball/537e9912063e66aa70cbcddd7d6e6e8db61d98e4", + "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4", "shasum": "" }, "require": { - "php": ">=5.3.3", + "php": ">=5.3.9", "symfony/filesystem": "~2.3" }, "require-dev": { @@ -4346,11 +4285,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Config\\": "" } }, @@ -4370,25 +4309,24 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:32:45" + "time": "2015-05-15 13:33:16" }, { "name": "symfony/stopwatch", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Stopwatch", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Stopwatch.git", - "reference": "b470f87c69837cb71115f1fa720388bb19b63635" + "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/b470f87c69837cb71115f1fa720388bb19b63635", - "reference": "b470f87c69837cb71115f1fa720388bb19b63635", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/7702945bceddc0e1f744519abb8a2baeb94bd5ce", + "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" @@ -4396,11 +4334,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Stopwatch\\": "" } }, @@ -4420,25 +4358,24 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:18:45" + "time": "2015-05-02 15:21:08" }, { "name": "symfony/yaml", - "version": "v2.6.8", - "target-dir": "Symfony/Component/Yaml", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2" + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/f157ab074e453ecd4c0fa775f721f6e67a99d9e2", - "reference": "f157ab074e453ecd4c0fa775f721f6e67a99d9e2", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" @@ -4446,11 +4383,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Yaml\\": "" } }, @@ -4470,7 +4407,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:18:45" + "time": "2015-05-02 15:21:08" } ], "aliases": [], diff --git a/config/app.php b/config/app.php index 7c8c30c9c3..c23a78eb01 100644 --- a/config/app.php +++ b/config/app.php @@ -115,7 +115,7 @@ return [ */ 'Illuminate\Foundation\Providers\ArtisanServiceProvider', 'Illuminate\Auth\AuthServiceProvider', - 'Illuminate\Bus\BusServiceProvider', + //'Illuminate\Bus\BusServiceProvider', 'Illuminate\Cache\CacheServiceProvider', 'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider', 'Illuminate\Routing\ControllerServiceProvider', @@ -139,16 +139,16 @@ return [ 'TwigBridge\ServiceProvider', 'DaveJamesMiller\Breadcrumbs\ServiceProvider', -// 'Barryvdh\Debugbar\ServiceProvider', -// 'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', + //'Barryvdh\Debugbar\ServiceProvider', + //'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', 'Zizaco\Entrust\EntrustServiceProvider', /* * Application Service Providers... */ 'FireflyIII\Providers\AppServiceProvider', - 'FireflyIII\Providers\BusServiceProvider', - 'FireflyIII\Providers\ConfigServiceProvider', + //'FireflyIII\Providers\BusServiceProvider', + //'FireflyIII\Providers\ConfigServiceProvider', 'FireflyIII\Providers\EventServiceProvider', 'FireflyIII\Providers\RouteServiceProvider', 'FireflyIII\Providers\FireflyServiceProvider', diff --git a/public/css/firefly.css b/public/css/firefly.css index 09359d29db..bb147ee849 100644 --- a/public/css/firefly.css +++ b/public/css/firefly.css @@ -10,4 +10,10 @@ height: 100%; margin: 0px; padding: 0px -} \ No newline at end of file +} +.medium { + font-size: 16px; +} + +a.panel-link {color:#fff;text-decoration: none;} +a.panel-link:hover {color:#fff;text-decoration: none;} \ No newline at end of file diff --git a/public/js/budgets.js b/public/js/budgets.js index 52e80dff01..ee4ecceb21 100644 --- a/public/js/budgets.js +++ b/public/js/budgets.js @@ -2,43 +2,47 @@ function drawSpentBar() { "use strict"; + if ($('.spentBar').length > 0) { + var overspent = spent > budgeted; + var pct; - var overspent = spent > budgeted; - var pct; - - if (overspent) { - // draw overspent bar - pct = (budgeted / spent) * 100; - $('.spentBar .progress-bar-warning').css('width', pct + '%'); - $('.spentBar .progress-bar-danger').css('width', (100 - pct) + '%'); - } else { - // draw normal bar: - pct = (spent / budgeted) * 100; - $('.spentBar .progress-bar-info').css('width', pct + '%'); + if (overspent) { + // draw overspent bar + pct = (budgeted / spent) * 100; + $('.spentBar .progress-bar-warning').css('width', pct + '%'); + $('.spentBar .progress-bar-danger').css('width', (100 - pct) + '%'); + } else { + // draw normal bar: + pct = (spent / budgeted) * 100; + $('.spentBar .progress-bar-info').css('width', pct + '%'); + } } } function drawBudgetedBar() { "use strict"; - var budgetedMuch = budgeted > budgetIncomeTotal; - // recalculate percentage: + if ($('.budgetedBar').length > 0) { + var budgetedMuch = budgeted > budgetIncomeTotal; - var pct; - if (budgetedMuch) { - // budgeted too much. - pct = (budgetIncomeTotal / budgeted) * 100; - $('.budgetedBar .progress-bar-warning').css('width', pct + '%'); - $('.budgetedBar .progress-bar-danger').css('width', (100 - pct) + '%'); - $('.budgetedBar .progress-bar-info').css('width', 0); - } else { - pct = (budgeted / budgetIncomeTotal) * 100; - $('.budgetedBar .progress-bar-warning').css('width', 0); - $('.budgetedBar .progress-bar-danger').css('width', 0); - $('.budgetedBar .progress-bar-info').css('width', pct + '%'); + // recalculate percentage: + + var pct; + if (budgetedMuch) { + // budgeted too much. + pct = (budgetIncomeTotal / budgeted) * 100; + $('.budgetedBar .progress-bar-warning').css('width', pct + '%'); + $('.budgetedBar .progress-bar-danger').css('width', (100 - pct) + '%'); + $('.budgetedBar .progress-bar-info').css('width', 0); + } else { + pct = (budgeted / budgetIncomeTotal) * 100; + $('.budgetedBar .progress-bar-warning').css('width', 0); + $('.budgetedBar .progress-bar-danger').css('width', 0); + $('.budgetedBar .progress-bar-info').css('width', pct + '%'); + } + + $('#budgetedAmount').html(currencySymbol + ' ' + budgeted.toFixed(2)); } - - $('#budgetedAmount').html(currencySymbol + ' ' + budgeted.toFixed(2)); } function updateBudgetedAmounts(e) { diff --git a/public/js/transactions.js b/public/js/transactions.js index b9cee1ded4..bb70ee82c8 100644 --- a/public/js/transactions.js +++ b/public/js/transactions.js @@ -1,4 +1,4 @@ -/* globals what, $ */ +/* globals what:true, $, doSwitch, txt, middleCrumbName, title,button, middleCrumbUrl, piggiesLength, breadcrumbs */ $(document).ready(function () { "use strict"; if ($('input[name="expense_account"]').length > 0) { @@ -38,4 +38,104 @@ $(document).ready(function () { }); } -}); \ No newline at end of file + // respond to switch buttons: + if (doSwitch) { + updateButtons(); + updateForm(); + updateLayout(); + } + + +}); + +function updateLayout() { + "use strict"; + $('#subTitle').text(title[what]); + $('.breadcrumb .active').text(breadcrumbs[what]); + $('.breadcrumb li:nth-child(2)').html('' + middleCrumbName[what] + ''); + $('#transaction-btn').html(' ' + button[what]); +} + +function updateForm() { + "use strict"; + + $('input[name="what"]').val(what); + + switch (what) { + case 'withdrawal': + $('#account_id_holder').show(); + $('#expense_account_holder').show(); + $('#revenue_account_holder').hide(); + $('#account_from_id_holder').hide(); + $('#account_to_id_holder').hide(); + $('#budget_id_holder').show(); + $('#piggy_bank_id_holder').hide(); + + + if ($('#ffInput_revenue_account').val().length > 0) { + $('#ffInput_expense_account').val($('#ffInput_revenue_account').val()); + } + + break; + case 'deposit': + $('#account_id_holder').show(); + $('#expense_account_holder').hide(); + $('#revenue_account_holder').show(); + $('#account_from_id_holder').hide(); + $('#account_to_id_holder').hide(); + $('#budget_id_holder').hide(); + $('#piggy_bank_id_holder').hide(); + + if ($('#ffInput_expense_account').val().length > 0) { + $('#ffInput_revenue_account').val($('#ffInput_expense_account').val()); + } + + break; + case 'transfer': + $('#account_id_holder').hide(); + $('#expense_account_holder').hide(); + $('#revenue_account_holder').hide(); + $('#account_from_id_holder').show(); + $('#account_to_id_holder').show(); + $('#budget_id_holder').hide(); + if (piggiesLength === 0) { + $('#piggy_bank_id_holder').hide(); + } else { + $('#piggy_bank_id_holder').show(); + } + break; + } +} + + +function updateButtons() { + "use strict"; + $('.switch').each(function (i, v) { + var button = $(v); + + // remove click event: + button.unbind('click'); + // new click event: + button.bind('click', clickButton); + + if (button.data('what') == what) { + button.removeClass('btn-default').addClass('btn-info').html(' ' + txt[button.data('what')]); + console.log('Now displaying form for ' + what); + } else { + button.removeClass('btn-info').addClass('btn-default').text(txt[button.data('what')]); + } + }); +} + +function clickButton(e) { + "use strict"; + var button = $(e.target); + var newWhat = button.data('what'); + if (newWhat != what) { + what = newWhat; + updateButtons(); + updateForm(); + updateLayout(); + } + return false; +} \ No newline at end of file diff --git a/resources/lang/en/firefly.php b/resources/lang/en/firefly.php index 9f99552a15..28970efa4f 100644 --- a/resources/lang/en/firefly.php +++ b/resources/lang/en/firefly.php @@ -18,6 +18,13 @@ return [ 'showEverything' => 'Show everything', 'never' => 'Never', + // new user: + 'submit' => 'Submit', + 'getting_started' => 'Getting started', + 'to_get_started' => 'To get started with Firefly, please enter your current bank\'s name, and the balance of your checking account:', + 'savings_balance_text' => 'If you have a savings account, please enter the current balance of your savings account:', + 'cc_balance_text' => 'If you have a credit card, please enter your credit card\'s limit.', + // forms: 'mandatoryFields' => 'Mandatory fields', 'optionalFields' => 'Optional fields', @@ -142,7 +149,7 @@ return [ 'transactions' => 'Transactions', 'expenses' => 'Expenses', 'income' => 'Revenue / income', - 'transfers' => 'Transfer', + 'transfers' => 'Transfers', 'moneyManagement' => 'Money management', 'piggyBanks' => 'Piggy banks', 'bills' => 'Bills', @@ -226,6 +233,7 @@ return [ 'balanceFor' => 'Balance for :name', // piggy banks: + 'piggy_bank' => 'Piggy bank', 'new_piggy_bank' => 'Create new piggy bank', 'account_status' => 'Account status', 'left_for_piggy_banks' => 'Left for piggy banks', diff --git a/resources/lang/en/form.php b/resources/lang/en/form.php index aeacd0ebfd..b88dd2d972 100644 --- a/resources/lang/en/form.php +++ b/resources/lang/en/form.php @@ -1,5 +1,12 @@ 'Bank name', + 'bank_balance' => 'Balance', + 'savings_balance' => 'Savings balance', + 'credit_card_limit' => 'Credit card limit', + 'name' => 'Name', 'active' => 'Active', 'amount_min' => 'Minimum amount', diff --git a/resources/lang/nl/breadcrumbs.php b/resources/lang/nl/breadcrumbs.php index 18e12fe0c5..bfed39b02a 100644 --- a/resources/lang/nl/breadcrumbs.php +++ b/resources/lang/nl/breadcrumbs.php @@ -45,10 +45,10 @@ return [ 'changePassword' => 'Verander je wachtwoord', // bills - 'bills' => 'Rekeningen', - 'newBill' => 'Nieuwe rekening', - 'edit_bill' => 'Wijzig rekening ":name"', - 'delete_bill' => 'Verwijder rekening ":name"', + 'bills' => 'Contracten', + 'newBill' => 'Nieuw contract', + 'edit_bill' => 'Wijzig contract ":name"', + 'delete_bill' => 'Verwijder contract ":name"', // reminders 'reminders' => 'Herinneringen', diff --git a/resources/lang/nl/firefly.php b/resources/lang/nl/firefly.php index 28f289d678..9b36c7f94e 100644 --- a/resources/lang/nl/firefly.php +++ b/resources/lang/nl/firefly.php @@ -18,6 +18,13 @@ return [ 'showEverything' => 'Laat alles zien', 'never' => 'Nooit', + // new user: + 'submit' => 'Invoeren', + 'getting_started' => 'Aan de start!', + 'to_get_started' => 'Begin met de naam van de bank waar je je betaalrekening hebt, en het saldo van die rekening.', + 'savings_balance_text' => 'Voer ook het saldo van je spaarrekening in, als je die hebt.', + 'cc_balance_text' => 'Als je een credit card hebt, vul dan hier je credit cardlimiet in.', + // forms: 'mandatoryFields' => 'Verplichte velden', 'optionalFields' => 'Optionele velden', @@ -38,7 +45,7 @@ return [ 'update_amount' => 'Bedrag bijwerken', // bills: - 'delete_bill' => 'Verwijder rekening ":name"', + 'delete_bill' => 'Verwijder contract ":name"', // accounts: 'details_for_asset' => 'Overzicht voor betaalrekening ":name"', @@ -121,8 +128,8 @@ return [ 'newTransfer' => 'Nieuwe overschrijving', 'moneyIn' => 'Inkomsten', 'moneyOut' => 'Uitgaven', - 'billsToPay' => 'Openstaande rekeningen', - 'billsPaid' => 'Betaalde rekeningen', + 'billsToPay' => 'Openstaande contracten', + 'billsPaid' => 'Betaalde contracten', 'viewDetails' => 'Meer info', 'divided' => 'verdeeld', 'toDivide' => 'te verdelen', @@ -154,7 +161,7 @@ return [ 'transfers' => 'Overschrijvingen', 'moneyManagement' => 'Geldbeheer', 'piggyBanks' => 'Spaarpotjes', - 'bills' => 'Rekeningen', + 'bills' => 'Contracten', 'createNew' => 'Nieuw', 'withdrawal' => 'Uitgave', 'deposit' => 'Inkomsten', @@ -163,7 +170,7 @@ return [ 'Withdrawal' => 'Uitgave', 'Deposit' => 'Inkomsten', 'Transfer' => 'Overschrijving', - 'bill' => 'Rekening', + 'bill' => 'Contract', 'yes' => 'Ja', 'no' => 'Nee', 'amount' => 'Bedrag', @@ -220,7 +227,7 @@ return [ 'noBudget' => '(geen budget)', 'maxAmount' => 'Maximaal bedrag', 'minAmount' => 'Minimaal bedrag', - 'billEntry' => 'Bedrag voor deze rekening', + 'billEntry' => 'Bedrag voor dit contract', 'name' => 'Naam', 'date' => 'Datum', 'paid' => 'Betaald', @@ -235,6 +242,7 @@ return [ 'balanceFor' => 'Saldo op :name', // piggy banks: + 'piggy_bank' => 'Spaarpotje', 'new_piggy_bank' => 'Nieuw spaarpotje', 'account_status' => 'Rekeningoverzicht', 'left_for_piggy_banks' => 'Over voor spaarpotjes', diff --git a/resources/lang/nl/form.php b/resources/lang/nl/form.php index 239641c082..bcb086d5c2 100644 --- a/resources/lang/nl/form.php +++ b/resources/lang/nl/form.php @@ -1,5 +1,12 @@ 'Banknaam', + 'bank_balance' => 'Saldo', + 'savings_balance' => 'Saldo van spaarrekening', + 'credit_card_limit' => 'Credit card limiet', + 'name' => 'Naam', 'active' => 'Actief', 'amount_min' => 'Minimumbedrag', @@ -51,7 +58,7 @@ return [ 'noBudget' => '(geen budget)', 'delete_account' => 'Verwijder rekening ":name"', - 'delete_bill' => 'Verwijder rekening ":name"', + 'delete_bill' => 'Verwijder contract ":name"', 'delete_budget' => 'Verwijder budget ":name"', 'delete_category' => 'Verwijder categorie ":name"', 'delete_currency' => 'Verwijder munteenheid ":name"', @@ -59,7 +66,7 @@ return [ 'delete_journal' => 'Verwijder transactie met omschrijving ":description"', 'account_areYouSure' => 'Weet je zeker dat je de rekening met naam ":name" wilt verwijderen?', - 'bill_areYouSure' => 'Weet je zeker dat je de rekening met naam ":name" wilt verwijderen?', + 'bill_areYouSure' => 'Weet je zeker dat je het contract met naam ":name" wilt verwijderen?', 'budget_areYouSure' => 'Weet je zeker dat je het budget met naam ":name" wilt verwijderen?', 'category_areYouSure' => 'Weet je zeker dat je het category met naam ":name" wilt verwijderen?', 'currency_areYouSure' => 'Weet je zeker dat je de munteenheid met naam ":name" wilt verwijderen?', @@ -71,8 +78,8 @@ return [ '|Ook alle :count transacties verbonden aan deze rekening worden verwijderd.', 'also_delete_piggyBanks' => 'Ook het spaarpotje verbonden aan deze rekening wordt verwijderd.' . '|Ook alle :count spaarpotjes verbonden aan deze rekening worden verwijderd.', - 'bill_keep_transactions' => 'De transactie verbonden aan deze rekening blijft bewaard.' . - '|De :count transacties verbonden aan deze rekening blijven bewaard.', + 'bill_keep_transactions' => 'De transactie verbonden aan dit contract blijft bewaard.' . + '|De :count transacties verbonden aan dit contract blijven bewaard.', 'budget_keep_transactions' => 'De transactie verbonden aan dit budget blijft bewaard.' . '|De :count transacties verbonden aan dit budget blijven bewaard.', 'category_keep_transactions' => 'De transactie verbonden aan deze categorie blijft bewaard.' . diff --git a/resources/lang/nl/list.php b/resources/lang/nl/list.php index 7ade859e8c..a9a8a30b02 100644 --- a/resources/lang/nl/list.php +++ b/resources/lang/nl/list.php @@ -23,7 +23,7 @@ return [ 'to' => 'Naar', 'budget' => 'Budget', 'category' => 'Categorie', - 'bill' => 'Rekening', + 'bill' => 'Contract', 'withdrawal' => 'Uitgave', 'deposit' => 'Inkomsten', 'transfer' => 'Overschrijving', diff --git a/resources/twig/form/amount.twig b/resources/twig/form/amount.twig index cc0ff82ae1..765b200feb 100644 --- a/resources/twig/form/amount.twig +++ b/resources/twig/form/amount.twig @@ -1,4 +1,4 @@ -
+
diff --git a/resources/twig/form/balance.twig b/resources/twig/form/balance.twig index 882db8e808..e8e8e05ae0 100644 --- a/resources/twig/form/balance.twig +++ b/resources/twig/form/balance.twig @@ -1,4 +1,4 @@ -
+
diff --git a/resources/twig/form/checkbox.twig b/resources/twig/form/checkbox.twig index 21d8e59177..448986aa03 100644 --- a/resources/twig/form/checkbox.twig +++ b/resources/twig/form/checkbox.twig @@ -1,4 +1,4 @@ -
+
diff --git a/resources/twig/form/date.twig b/resources/twig/form/date.twig index 33a300d057..918b5bc6fd 100644 --- a/resources/twig/form/date.twig +++ b/resources/twig/form/date.twig @@ -1,4 +1,4 @@ -
+
{{ Form.input('date', name, value, options) }} diff --git a/resources/twig/form/integer.twig b/resources/twig/form/integer.twig index 527a5b2fea..f8fc237bfc 100644 --- a/resources/twig/form/integer.twig +++ b/resources/twig/form/integer.twig @@ -1,4 +1,4 @@ -
+
diff --git a/resources/twig/form/location.twig b/resources/twig/form/location.twig index efb95bb6c3..582181e434 100644 --- a/resources/twig/form/location.twig +++ b/resources/twig/form/location.twig @@ -1,4 +1,4 @@ -
+
diff --git a/resources/twig/form/multiRadio.twig b/resources/twig/form/multiRadio.twig index b79ff1559c..b03b69be7e 100644 --- a/resources/twig/form/multiRadio.twig +++ b/resources/twig/form/multiRadio.twig @@ -1,4 +1,4 @@ -
+
{% for value,description in list %} diff --git a/resources/twig/form/select.twig b/resources/twig/form/select.twig index 6956207700..40ac6949f3 100644 --- a/resources/twig/form/select.twig +++ b/resources/twig/form/select.twig @@ -1,4 +1,4 @@ -
+
{{ Form.select(name, list, selected , options ) }} diff --git a/resources/twig/form/tags.twig b/resources/twig/form/tags.twig index 9160512040..3a00f1479c 100644 --- a/resources/twig/form/tags.twig +++ b/resources/twig/form/tags.twig @@ -1,4 +1,4 @@ -
+
{{ Form.input('text', name, value, options) }} diff --git a/resources/twig/form/text.twig b/resources/twig/form/text.twig index 428b238b70..d13baef62a 100644 --- a/resources/twig/form/text.twig +++ b/resources/twig/form/text.twig @@ -1,4 +1,4 @@ -
+
{{ Form.input('text', name, value, options) }} diff --git a/resources/twig/form/textarea.twig b/resources/twig/form/textarea.twig index 6d1d950a04..4eb913d919 100644 --- a/resources/twig/form/textarea.twig +++ b/resources/twig/form/textarea.twig @@ -1,4 +1,4 @@ -
+
{{ Form.textarea(name, value, options) }} diff --git a/resources/twig/index.twig b/resources/twig/index.twig index 05d277f5f6..caebbdf93e 100644 --- a/resources/twig/index.twig +++ b/resources/twig/index.twig @@ -2,25 +2,7 @@ {% block content %} {{ Breadcrumbs.renderIfExists }} -{% if count == 0 %} -
-
-

{{ 'welcome'|_ }}

- -

- {{ 'createNewAsset'|_ }} - -

-
-
-
- -{% else %} - - - {% include 'partials/boxes.twig' %} +{% include 'partials/boxes.twig' %}
@@ -200,8 +182,6 @@
-{% endif %} - {% endblock %} {% block scripts %} diff --git a/resources/twig/layout/default.twig b/resources/twig/layout/default.twig index 7247597006..a5ef822a86 100644 --- a/resources/twig/layout/default.twig +++ b/resources/twig/layout/default.twig @@ -66,7 +66,7 @@ {{ title }} {% if subTitle %} - + {% if subTitleIcon %} {% endif %} @@ -161,7 +161,7 @@ m.parentNode.insertBefore(a, m) })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); - ga('create', '{{ env('ANALYTICS_ID', 'XXX-XX-X') }}', 'auto'); + ga('create', '{{ env('ANALYTICS_ID', 'XXX-XX-X') }}', {'siteSpeedSampleRate': 100}); ga('send', 'pageview'); // send an event if relevant: diff --git a/resources/twig/list/journals.twig b/resources/twig/list/journals.twig index 78812ceda0..4c020a16c5 100644 --- a/resources/twig/list/journals.twig +++ b/resources/twig/list/journals.twig @@ -57,24 +57,24 @@ {% if not hideTags %} {{ relevantTags(journal)|raw }} {% else %} - {{ journal.correctedActualAmount|formatAmount }} + {{ journal.correct_amount|formatAmount }} {% endif %} {{journal.date.formatLocalized(monthAndDayFormat)}} - {% if journal.transactions[0].account.accountType.type == 'Cash account' %} + {% if journal.source_account.accountType.type == 'Cash account' %} (cash) {% else %} - {{journal.transactions[0].account.name}} + {{journal.source_account.name}} {% endif %} - {% if journal.transactions[1].account.accountType.type == 'Cash account' %} + {% if journal.destination_account.accountType.type == 'Cash account' %} (cash) {% else %} - {{journal.transactions[1].account.name}} + {{journal.destination_account.name}} {% endif %} diff --git a/resources/twig/new-user/index.twig b/resources/twig/new-user/index.twig new file mode 100644 index 0000000000..a92de14d80 --- /dev/null +++ b/resources/twig/new-user/index.twig @@ -0,0 +1,45 @@ +{% extends "./layout/default.twig" %} +{% block content %} +{{ Breadcrumbs.renderIfExists }} + +
+
+

{{ 'getting_started'|_ }}

+

+ {{ 'to_get_started'|_ }} +

+
+ + + {{ ExpandedForm.text('bank_name')}} + {{ ExpandedForm.balance('bank_balance')}} + +

+ {{ 'savings_balance_text'|_ }} +

+ + {{ ExpandedForm.balance('savings_balance') }} + +

+ {{ 'cc_balance_text'|_ }} + +

+ + {{ ExpandedForm.balance('credit_card_limit') }} + +

+ +

+
+
+
+ + +{% endblock %} +{% block scripts %} + + + + + +{% endblock %} diff --git a/resources/twig/partials/menu.twig b/resources/twig/partials/menu.twig index 15779368bf..12567de8d6 100644 --- a/resources/twig/partials/menu.twig +++ b/resources/twig/partials/menu.twig @@ -89,83 +89,83 @@
  • - {{ 'dashboard'|_ }} + {{ 'dashboard'|_ }}
  • -
  • +
  • {{ 'accounts'|_ }}
  • - {{ 'budgets'|_ }} + {{ 'budgets'|_ }}
  • - {{ 'categories'|_ }} + {{ 'categories'|_ }}
  • - {{ 'tags'|_ }} + {{ 'tags'|_ }}
  • - {{ 'reports'|_ }} + {{ 'reports'|_ }}
  • -
  • +
  • {{ 'transactions'|_ }}
  • -
  • +
  • {{ 'moneyManagement'|_ }}
  • -
  • +
  • {{ 'createNew'|_ }} @@ -173,17 +173,17 @@