From eb78cf20c2d27c9c4f91764672e79e0ef3c51802 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 22 Nov 2016 19:10:17 +0100 Subject: [PATCH] This fixes #414 --- app/Http/Controllers/Controller.php | 38 +++++++++++++++++++ .../Transaction/ConvertController.php | 8 ++++ .../Transaction/SingleController.php | 22 +++++++++-- .../Transaction/SplitController.php | 9 +++++ .../Controllers/TransactionController.php | 5 +++ app/Models/TransactionJournal.php | 12 +++--- resources/lang/en_US/firefly.php | 2 +- 7 files changed, 86 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 6109a79967..9aaad05724 100755 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -13,10 +13,15 @@ declare(strict_types = 1); namespace FireflyIII\Http\Controllers; +use FireflyIII\Models\AccountType; +use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\TransactionType; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; +use Session; use View; /** @@ -60,4 +65,37 @@ class Controller extends BaseController } + + /** + * @param TransactionJournal $journal + * + * @return bool + */ + protected function isOpeningBalance(TransactionJournal $journal): bool + { + return TransactionJournal::transactionTypeStr($journal) === TransactionType::OPENING_BALANCE; + } + + /** + * @param TransactionJournal $journal + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + protected function redirectToAccount(TransactionJournal $journal) + { + $valid = [AccountType::DEFAULT, AccountType::ASSET]; + $transactions = $journal->transactions; + /** @var Transaction $transaction */ + foreach ($transactions as $transaction) { + $account = $transaction->account; + if (in_array($account->accountType->type, $valid)) { + return redirect(route('accounts.show', [$account->id])); + } + + } + Session::flash('error', strval(trans('firefly.cannot_redirect_to_account'))); + + return redirect(route('index')); + } + } diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index f00fb809ad..1941da2f6a 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -64,6 +64,10 @@ class ConvertController extends Controller */ public function convert(TransactionType $destinationType, TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $positiveAmount = TransactionJournal::amountPositive($journal); $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getActiveAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); $sourceType = $journal->transactionType; @@ -113,6 +117,10 @@ class ConvertController extends Controller */ public function submit(Request $request, JournalRepositoryInterface $repository, TransactionType $destinationType, TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $data = $request->all(); // cannot convert to its own type. diff --git a/app/Http/Controllers/Transaction/SingleController.php b/app/Http/Controllers/Transaction/SingleController.php index d917fac89b..803971fe52 100644 --- a/app/Http/Controllers/Transaction/SingleController.php +++ b/app/Http/Controllers/Transaction/SingleController.php @@ -125,6 +125,10 @@ class SingleController extends Controller */ public function delete(TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $what = strtolower($journal->transaction_type_type ?? $journal->transactionType->type); $subTitle = trans('firefly.delete_' . $what, ['description' => $journal->description]); @@ -146,6 +150,10 @@ class SingleController extends Controller */ public function destroy(JournalRepositoryInterface $repository, TransactionJournal $transactionJournal) { + if ($this->isOpeningBalance($transactionJournal)) { + return $this->redirectToAccount($transactionJournal); + } + $type = TransactionJournal::transactionTypeStr($transactionJournal); Session::flash('success', strval(trans('firefly.deleted_' . $type, ['description' => e($transactionJournal->description)]))); @@ -164,17 +172,23 @@ class SingleController extends Controller */ public function edit(TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $count = $journal->transactions()->count(); + if ($count > 2) { return redirect(route('transactions.edit-split', [$journal->id])); } + $what = strtolower(TransactionJournal::transactionTypeStr($journal)); $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); $budgetList = ExpandedForm::makeSelectListWithEmpty($this->budgets->getActiveBudgets()); // view related code $subTitle = trans('breadcrumbs.edit_journal', ['description' => $journal->description]); - $what = strtolower(TransactionJournal::transactionTypeStr($journal)); + // journal related code $sourceAccounts = TransactionJournal::sourceAccountList($journal); @@ -290,6 +304,10 @@ class SingleController extends Controller */ public function update(JournalFormRequest $request, JournalRepositoryInterface $repository, TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $data = $request->getJournalData(); $journal = $repository->update($journal, $data); $this->attachments->saveAttachmentsForModel($journal); @@ -324,6 +342,4 @@ class SingleController extends Controller return redirect(session('transactions.edit.url')); } - - } diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index 7c80d3f392..f14cde1885 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -89,6 +89,10 @@ class SplitController extends Controller */ public function edit(Request $request, TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $uploadSize = min(Steam::phpBytes(ini_get('upload_max_filesize')), Steam::phpBytes(ini_get('post_max_size'))); $currencies = ExpandedForm::makeSelectList($this->currencies->get()); $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); @@ -127,6 +131,10 @@ class SplitController extends Controller */ public function update(Request $request, JournalRepositoryInterface $repository, TransactionJournal $journal) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $data = $this->arrayFromInput($request); $journal = $repository->updateSplitJournal($journal, $data); @@ -284,4 +292,5 @@ class SplitController extends Controller return $return; } + } diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 70c9dd7164..b8e269be0a 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -210,6 +210,10 @@ class TransactionController extends Controller */ public function show(TransactionJournal $journal, JournalTaskerInterface $tasker) { + if ($this->isOpeningBalance($journal)) { + return $this->redirectToAccount($journal); + } + $events = $tasker->getPiggyBankEvents($journal); $transactions = $tasker->getTransactionsOverview($journal); $what = strtolower($journal->transaction_type_type ?? $journal->transactionType->type); @@ -219,4 +223,5 @@ class TransactionController extends Controller } + } diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 0441e6e8a0..f76f8bcdcf 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -64,12 +64,12 @@ class TransactionJournal extends TransactionJournalSupport public static function routeBinder($value) { if (auth()->check()) { - $validTypes = [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]; - $object = TransactionJournal::where('transaction_journals.id', $value) - ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') - ->whereIn('transaction_types.type', $validTypes) - ->where('user_id', auth()->user()->id)->first(['transaction_journals.*']); - if ($object) { + $object = TransactionJournal + ::where('transaction_journals.id', $value) + ->with('transactionType') + ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->where('user_id', auth()->user()->id)->first(['transaction_journals.*']); + if (!is_null($object)) { return $object; } } diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 665e43838f..73362cc316 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -90,7 +90,7 @@ return [ 'expenses_by_category' => 'Expenses by category', 'expenses_by_budget' => 'Expenses by budget', 'income_by_category' => 'Income by category', - + 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', 'repeat_freq_monthly' => 'monthly',