diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index 113c542869..29f909b928 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -21,6 +21,7 @@ use FireflyIII\Models\RuleGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Rules\Processor; use FireflyIII\Support\Events\BillScanner; +use Log; /** * Class StoredJournalEventHandler @@ -42,30 +43,69 @@ class StoredJournalEventHandler $journal = $event->journal; $piggyBankId = $event->piggyBankId; + Log::debug(sprintf('Trying to connect journal %d to piggy bank %d.', $journal->id, $piggyBankId)); + /** @var PiggyBank $piggyBank */ $piggyBank = $journal->user->piggyBanks()->where('piggy_banks.id', $piggyBankId)->first(['piggy_banks.*']); if (is_null($piggyBank)) { + Log::error('No such piggy bank!'); + return true; } + Log::debug(sprintf('Found piggy bank #%d: "%s"', $piggyBank->id, $piggyBank->name)); // update piggy bank rep for date of transaction journal. $repetition = $piggyBank->piggyBankRepetitions()->relevantOnDate($journal->date)->first(); if (is_null($repetition)) { + Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d'))); + return true; } $amount = TransactionJournal::amountPositive($journal); + Log::debug(sprintf('Will add/remove %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); // if piggy account matches source account, the amount is positive $sources = TransactionJournal::sourceAccountList($journal)->pluck('id')->toArray(); if (in_array($piggyBank->account_id, $sources)) { $amount = bcmul($amount, '-1'); + Log::debug(sprintf('Account #%d is the source, so will remove amount from piggy bank.', $piggyBank->account_id)); + } + + // if the amount is positive: + // make sure it fits in piggy bank: + if (bccomp($amount, '0') === 1) { + // amount is positive + $room = bcsub(strval($piggyBank->targetamount), strval($repetition->currentamount)); + Log::debug(sprintf('Room in piggy bank for extra money is %f', $room)); + if (bccomp($room, $amount) === -1) { + // $room is smaller than $amount + Log::debug(sprintf('There is NO room to add %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); + Log::debug(sprintf('New amount is %f', $room)); + $amount = $room; + } + } + + if (bccomp($amount, '0') === -1) { + // amount is negative + Log::debug(sprintf('Max amount to remove is %f', $repetition->currentamount)); + $compare = bcmul($repetition->currentamount, '-1'); + if (bccomp($compare, $amount) === 1) { + // $currentamount is smaller than $amount + Log::debug(sprintf('Cannot remove %f from piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); + Log::debug(sprintf('New amount is %f', $compare)); + $amount = $compare; + } } $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]); + /** @var PiggyBankEvent $event */ + $event = PiggyBankEvent::create( + ['piggy_bank_id' => $piggyBank->id, 'transaction_journal_id' => $journal->id, 'date' => $journal->date, 'amount' => $amount] + ); + Log::debug(sprintf('Created piggy bank event #%d', $event->id)); return true; } diff --git a/app/Handlers/Events/UpdatedJournalEventHandler.php b/app/Handlers/Events/UpdatedJournalEventHandler.php index 8dbd8ae5f3..b6b7a8c8fd 100644 --- a/app/Handlers/Events/UpdatedJournalEventHandler.php +++ b/app/Handlers/Events/UpdatedJournalEventHandler.php @@ -30,50 +30,6 @@ use FireflyIII\Support\Events\BillScanner; */ class UpdatedJournalEventHandler { - /** - * This method will try to reconnect a journal to a piggy bank, updating the piggy bank repetition. - * - * @param UpdatedTransactionJournal $event - * - * @return bool - */ - public function connectToPiggyBank(UpdatedTransactionJournal $event): bool - { - $journal = $event->journal; - - if (!$journal->isTransfer()) { - return true; - } - - // get the event connected to this journal: - /** @var PiggyBankEvent $event */ - $event = PiggyBankEvent::where('transaction_journal_id', $journal->id)->first(); - if (is_null($event)) { - return false; - } - $piggyBank = $event->piggyBank()->first(); - $repetition = null; - if (!is_null($piggyBank)) { - /** @var PiggyBankRepetition $repetition */ - $repetition = $piggyBank->piggyBankRepetitions()->relevantOnDate($journal->date)->first(); - } - - if (is_null($repetition)) { - return false; - } - - $amount = TransactionJournal::amount($journal); - $diff = bcsub($amount, $event->amount); // update current repetition - - $repetition->currentamount = bcadd($repetition->currentamount, $diff); - $repetition->save(); - - - $event->amount = $amount; - $event->save(); - - return true; - } /** * This method will check all the rules when a journal is updated. diff --git a/app/Http/Controllers/Transaction/SingleController.php b/app/Http/Controllers/Transaction/SingleController.php index dc005002ad..18f4d672eb 100644 --- a/app/Http/Controllers/Transaction/SingleController.php +++ b/app/Http/Controllers/Transaction/SingleController.php @@ -171,7 +171,6 @@ class SingleController extends Controller $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); $budgetList = ExpandedForm::makeSelectListWithEmpty($this->budgets->getActiveBudgets()); - $piggyBankList = ExpandedForm::makeSelectListWithEmpty($this->piggyBanks->getPiggyBanks()); // view related code $subTitle = trans('breadcrumbs.edit_journal', ['description' => $journal->description]); @@ -188,7 +187,6 @@ class SingleController extends Controller 'process_date' => TransactionJournal::dateAsString($journal, 'process_date'), 'category' => TransactionJournal::categoryAsString($journal), 'budget_id' => TransactionJournal::budgetId($journal), - 'piggy_bank_id' => TransactionJournal::piggyBankId($journal), 'tags' => join(',', $journal->tags->pluck('tag')->toArray()), 'source_account_id' => $sourceAccounts->first()->id, 'source_account_name' => $sourceAccounts->first()->name, @@ -225,7 +223,7 @@ class SingleController extends Controller return view( 'transactions.edit', - compact('journal', 'optionalFields', 'assetAccounts', 'what', 'budgetList', 'piggyBankList', 'subTitle') + compact('journal', 'optionalFields', 'assetAccounts', 'what', 'budgetList', 'subTitle') )->with('data', $preFilled); } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 6cfb886b4c..b256815c13 100755 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -70,7 +70,6 @@ class EventServiceProvider extends ServiceProvider 'FireflyIII\Events\UpdatedTransactionJournal' => // is a Transaction Journal related event. [ 'FireflyIII\Handlers\Events\UpdatedJournalEventHandler@scanBills', - 'FireflyIII\Handlers\Events\UpdatedJournalEventHandler@connectToPiggyBank', 'FireflyIII\Handlers\Events\UpdatedJournalEventHandler@processRules', ], diff --git a/resources/views/transactions/edit-split.twig b/resources/views/transactions/edit-split.twig index 5f71a30c78..451371820b 100644 --- a/resources/views/transactions/edit-split.twig +++ b/resources/views/transactions/edit-split.twig @@ -212,8 +212,6 @@ {% endif %}