diff --git a/app/Events/ChangedPiggyBankAmount.php b/app/Events/ChangedPiggyBankAmount.php new file mode 100644 index 0000000000..fd3462c5f0 --- /dev/null +++ b/app/Events/ChangedPiggyBankAmount.php @@ -0,0 +1,58 @@ +. + */ + +namespace FireflyIII\Events; + +use FireflyIII\Models\PiggyBank; +use FireflyIII\Models\TransactionGroup; +use FireflyIII\Models\TransactionJournal; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Log; + +/** + * Class ChangedPiggyBankAmount + */ +class ChangedPiggyBankAmount extends Event +{ + use SerializesModels; + + public PiggyBank $piggyBank; + public ?TransactionJournal $transactionJournal; + public ?TransactionGroup $transactionGroup; + public string $amount; + + /** + * Create a new event instance. + * + * @param PiggyBank $piggyBank + * @param string $amount + * @param TransactionJournal|null $transactionJournal + * @param TransactionGroup|null $transactionGroup + */ + public function __construct(PiggyBank $piggyBank, string $amount, ?TransactionJournal $transactionJournal, ?TransactionGroup $transactionGroup) + { + Log::debug(sprintf('Created piggy bank event for piggy bank #%d with amount %s', $piggyBank->id, $amount)); + $this->piggyBank = $piggyBank; + $this->transactionJournal = $transactionJournal; + $this->transactionGroup = $transactionGroup; + $this->amount = $amount; + } +} diff --git a/app/Factory/PiggyBankEventFactory.php b/app/Factory/PiggyBankEventFactory.php index 727be78405..158bd3801b 100644 --- a/app/Factory/PiggyBankEventFactory.php +++ b/app/Factory/PiggyBankEventFactory.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Factory; +use FireflyIII\Events\ChangedPiggyBankAmount; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\TransactionJournal; @@ -40,22 +41,20 @@ class PiggyBankEventFactory /** * @param TransactionJournal $journal * @param PiggyBank|null $piggyBank - * - * @return PiggyBankEvent|null */ - public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): ?PiggyBankEvent + public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): void { Log::debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type)); if (null === $piggyBank) { Log::debug('Piggy bank is null'); - return null; + return; } if (TransactionType::TRANSFER !== $journal->transactionType->type) { Log::info(sprintf('Will not connect %s #%d to a piggy bank.', $journal->transactionType->type, $journal->id)); - return null; + return; } /** @var PiggyBankRepositoryInterface $piggyRepos */ @@ -66,20 +65,17 @@ class PiggyBankEventFactory if (null === $repetition) { Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d'))); - return null; + return; } Log::debug('Found repetition'); $amount = $piggyRepos->getExactAmount($piggyBank, $repetition, $journal); if (0 === bccomp($amount, '0')) { Log::debug('Amount is zero, will not create event.'); - return null; + return; } + // amount can be negative. $piggyRepos->addAmountToRepetition($repetition, $amount); - $event = $piggyRepos->createEventWithJournal($piggyBank, $amount, $journal); - Log::debug(sprintf('Created piggy bank event #%d', $event->id)); - - return $event; } } diff --git a/app/Factory/TransactionJournalFactory.php b/app/Factory/TransactionJournalFactory.php index d44a48bd66..8cf056b3ee 100644 --- a/app/Factory/TransactionJournalFactory.php +++ b/app/Factory/TransactionJournalFactory.php @@ -92,7 +92,7 @@ class TransactionJournalFactory /** * Store a new (set of) transaction journals. * - * @param array $data + * @param array $data * * @return Collection * @throws DuplicateTransactionException @@ -143,7 +143,7 @@ class TransactionJournalFactory } /** - * @param NullArrayObject $row + * @param NullArrayObject $row * * @return TransactionJournal|null * @throws DuplicateTransactionException @@ -160,11 +160,11 @@ class TransactionJournalFactory $type = $this->typeRepository->findTransactionType(null, $row['type']); $carbon = $row['date'] ?? today(config('app.timezone')); $order = $row['order'] ?? 0; - $currency = $this->currencyRepository->findCurrency((int) $row['currency_id'], $row['currency_code']); + $currency = $this->currencyRepository->findCurrency((int)$row['currency_id'], $row['currency_code']); $foreignCurrency = $this->currencyRepository->findCurrencyNull($row['foreign_currency_id'], $row['foreign_currency_code']); - $bill = $this->billRepository->findBill((int) $row['bill_id'], $row['bill_name']); + $bill = $this->billRepository->findBill((int)$row['bill_id'], $row['bill_name']); $billId = TransactionType::WITHDRAWAL === $type->type && null !== $bill ? $bill->id : null; - $description = (string) $row['description']; + $description = (string)$row['description']; /** Manipulate basic fields */ $carbon->setTimezone(config('app.timezone')); @@ -237,7 +237,7 @@ class TransactionJournalFactory $transactionFactory->setForeignCurrency($foreignCurrency); $transactionFactory->setReconciled($row['reconciled'] ?? false); try { - $negative = $transactionFactory->createNegative((string) $row['amount'], (string) $row['foreign_amount']); + $negative = $transactionFactory->createNegative((string)$row['amount'], (string)$row['foreign_amount']); } catch (FireflyException $e) { Log::error('Exception creating negative transaction.'); Log::error($e->getMessage()); @@ -256,7 +256,7 @@ class TransactionJournalFactory $transactionFactory->setForeignCurrency($foreignCurrency); $transactionFactory->setReconciled($row['reconciled'] ?? false); try { - $transactionFactory->createPositive((string) $row['amount'], (string) $row['foreign_amount']); + $transactionFactory->createPositive((string)$row['amount'], (string)$row['foreign_amount']); } catch (FireflyException $e) { Log::error('Exception creating positive transaction.'); Log::error($e->getMessage()); @@ -294,7 +294,7 @@ class TransactionJournalFactory } /** - * @param NullArrayObject $row + * @param NullArrayObject $row * * @return string * @throws JsonException @@ -306,10 +306,8 @@ class TransactionJournalFactory unset($dataRow['import_hash_v2'], $dataRow['original_source']); $json = json_encode($dataRow, JSON_THROW_ON_ERROR); if (false === $json) { - - $json = json_encode((string) microtime(), JSON_THROW_ON_ERROR); + $json = json_encode((string)microtime(), JSON_THROW_ON_ERROR); Log::error(sprintf('Could not hash the original row! %s', json_last_error_msg()), $dataRow); - } $hash = hash('sha256', $json); Log::debug(sprintf('The hash is: %s', $hash), $dataRow); @@ -320,7 +318,7 @@ class TransactionJournalFactory /** * If this transaction already exists, throw an error. * - * @param string $hash + * @param string $hash * * @throws DuplicateTransactionException * @throws JsonException @@ -353,7 +351,7 @@ class TransactionJournalFactory } /** - * @param NullArrayObject $data + * @param NullArrayObject $data * * @throws FireflyException */ @@ -366,10 +364,10 @@ class TransactionJournalFactory // validate source account. $array = [ - 'id' => $data['source_id'] ? (int) $data['source_id'] : null, - 'name' => $data['source_name'] ? (string) $data['source_name'] : null, - 'iban' => $data['source_iban'] ? (string) $data['source_iban'] : null, - 'number' => $data['source_number'] ? (string) $data['source_number'] : null, + 'id' => $data['source_id'] ? (int)$data['source_id'] : null, + 'name' => $data['source_name'] ? (string)$data['source_name'] : null, + 'iban' => $data['source_iban'] ? (string)$data['source_iban'] : null, + 'number' => $data['source_number'] ? (string)$data['source_number'] : null, ]; $validSource = $this->accountValidator->validateSource($array); @@ -381,10 +379,10 @@ class TransactionJournalFactory // validate destination account $array = [ - 'id' => $data['destination_id'] ? (int) $data['destination_id'] : null, - 'name' => $data['destination_name'] ? (string) $data['destination_name'] : null, - 'iban' => $data['destination_iban'] ? (string) $data['destination_iban'] : null, - 'number' => $data['destination_number'] ? (string) $data['destination_number'] : null, + 'id' => $data['destination_id'] ? (int)$data['destination_id'] : null, + 'name' => $data['destination_name'] ? (string)$data['destination_name'] : null, + 'iban' => $data['destination_iban'] ? (string)$data['destination_iban'] : null, + 'number' => $data['destination_number'] ? (string)$data['destination_number'] : null, ]; $validDestination = $this->accountValidator->validateDestination($array); @@ -395,10 +393,10 @@ class TransactionJournalFactory } /** - * @param string $type - * @param TransactionCurrency|null $currency - * @param Account $source - * @param Account $destination + * @param string $type + * @param TransactionCurrency|null $currency + * @param Account $source + * @param Account $destination * * @return TransactionCurrency */ @@ -413,8 +411,8 @@ class TransactionJournalFactory } /** - * @param TransactionCurrency|null $currency - * @param Account $account + * @param TransactionCurrency|null $currency + * @param Account $account * * @return TransactionCurrency * @throws FireflyException @@ -437,8 +435,8 @@ class TransactionJournalFactory /** * Set foreign currency to NULL if it's the same as the normal currency: * - * @param TransactionCurrency|null $currency - * @param TransactionCurrency|null $foreignCurrency + * @param TransactionCurrency|null $currency + * @param TransactionCurrency|null $foreignCurrency * * @return TransactionCurrency|null */ @@ -455,9 +453,9 @@ class TransactionJournalFactory } /** - * @param string $type - * @param TransactionCurrency|null $foreignCurrency - * @param Account $destination + * @param string $type + * @param TransactionCurrency|null $foreignCurrency + * @param Account $destination * * @return TransactionCurrency|null */ @@ -471,7 +469,7 @@ class TransactionJournalFactory } /** - * @param string $description + * @param string $description * * @return string */ @@ -486,7 +484,7 @@ class TransactionJournalFactory * Force the deletion of an entire set of transaction journals and their meta object in case of * an error creating a group. * - * @param Collection $collection + * @param Collection $collection */ private function forceDeleteOnError(Collection $collection): void { @@ -500,7 +498,7 @@ class TransactionJournalFactory } /** - * @param Transaction $transaction + * @param Transaction $transaction */ private function forceTrDelete(Transaction $transaction): void { @@ -516,8 +514,8 @@ class TransactionJournalFactory /** * Link a piggy bank to this journal. * - * @param TransactionJournal $journal - * @param NullArrayObject $data + * @param TransactionJournal $journal + * @param NullArrayObject $data */ private function storePiggyEvent(TransactionJournal $journal, NullArrayObject $data): void { @@ -528,7 +526,7 @@ class TransactionJournalFactory return; } - $piggyBank = $this->piggyRepository->findPiggyBank((int) $data['piggy_bank_id'], $data['piggy_bank_name']); + $piggyBank = $this->piggyRepository->findPiggyBank((int)$data['piggy_bank_id'], $data['piggy_bank_name']); if (null !== $piggyBank) { $this->piggyEventFactory->create($journal, $piggyBank); @@ -540,8 +538,8 @@ class TransactionJournalFactory } /** - * @param TransactionJournal $journal - * @param NullArrayObject $transaction + * @param TransactionJournal $journal + * @param NullArrayObject $transaction */ private function storeMetaFields(TransactionJournal $journal, NullArrayObject $transaction): void { @@ -551,16 +549,16 @@ class TransactionJournalFactory } /** - * @param TransactionJournal $journal - * @param NullArrayObject $data - * @param string $field + * @param TransactionJournal $journal + * @param NullArrayObject $data + * @param string $field */ protected function storeMeta(TransactionJournal $journal, NullArrayObject $data, string $field): void { $set = [ 'journal' => $journal, 'name' => $field, - 'data' => (string) ($data[$field] ?? ''), + 'data' => (string)($data[$field] ?? ''), ]; //Log::debug(sprintf('Going to store meta-field "%s", with value "%s".', $set['name'], $set['data'])); @@ -571,7 +569,7 @@ class TransactionJournalFactory } /** - * @param bool $errorOnHash + * @param bool $errorOnHash */ public function setErrorOnHash(bool $errorOnHash): void { @@ -584,7 +582,7 @@ class TransactionJournalFactory /** * Set the user. * - * @param User $user + * @param User $user */ public function setUser(User $user): void { diff --git a/app/Handlers/Events/PiggyBankEventHandler.php b/app/Handlers/Events/PiggyBankEventHandler.php new file mode 100644 index 0000000000..646d363198 --- /dev/null +++ b/app/Handlers/Events/PiggyBankEventHandler.php @@ -0,0 +1,55 @@ +. + */ + +namespace FireflyIII\Handlers\Events; + +use Carbon\Carbon; +use FireflyIII\Events\ChangedPiggyBankAmount; +use FireflyIII\Models\PiggyBankEvent; + +/** + * Class PiggyBankEventHandler + */ +class PiggyBankEventHandler +{ + /** + * @param ChangedPiggyBankAmount $event + * @return void + */ + public function changePiggyAmount(ChangedPiggyBankAmount $event): void + { + // find journal if group is present. + $journal = $event->transactionJournal; + if (null !== $event->transactionGroup) { + $journal = $event->transactionGroup->transactionJournals()->first(); + } + $date = $journal?->date ?? Carbon::now(); + PiggyBankEvent::create( + [ + 'piggy_bank_id' => $event->piggyBank->id, + 'transaction_journal_id' => $journal?->id, + 'date' => $date->format('Y-m-d'), + 'amount' => $event->amount, + ] + ); + } + +} diff --git a/app/Http/Controllers/PiggyBank/AmountController.php b/app/Http/Controllers/PiggyBank/AmountController.php index 0489c76a12..46802f9f4c 100644 --- a/app/Http/Controllers/PiggyBank/AmountController.php +++ b/app/Http/Controllers/PiggyBank/AmountController.php @@ -129,7 +129,6 @@ class AmountController extends Controller } if ($this->piggyRepos->canAddAmount($piggyBank, $amount)) { $this->piggyRepos->addAmount($piggyBank, $amount); - $this->piggyRepos->createEvent($piggyBank, $amount); session()->flash( 'success', (string) trans( diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index c8f9302154..04f7084e0b 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -25,6 +25,7 @@ namespace FireflyIII\Providers; use Exception; use FireflyIII\Events\ActuallyLoggedIn; use FireflyIII\Events\AdminRequestedTestMessage; +use FireflyIII\Events\ChangedPiggyBankAmount; use FireflyIII\Events\DestroyedTransactionGroup; use FireflyIII\Events\DetectedNewIPAddress; use FireflyIII\Events\RegisteredUser; @@ -140,6 +141,11 @@ class EventServiceProvider extends ServiceProvider WarnUserAboutBill::class => [ 'FireflyIII\Handlers\Events\BillEventHandler@warnAboutBill', ], + + // piggy bank related events: + ChangedPiggyBankAmount::class => [ + 'FireflyIII\Handlers\Events\PiggyBankEventHandler@changePiggyAmount', + ], ]; /** diff --git a/app/Repositories/PiggyBank/ModifiesPiggyBanks.php b/app/Repositories/PiggyBank/ModifiesPiggyBanks.php index 01a2ca0cc7..f68e6d3b44 100644 --- a/app/Repositories/PiggyBank/ModifiesPiggyBanks.php +++ b/app/Repositories/PiggyBank/ModifiesPiggyBanks.php @@ -24,17 +24,15 @@ declare(strict_types=1); namespace FireflyIII\Repositories\PiggyBank; -use Carbon\Carbon; use Exception; +use FireflyIII\Events\ChangedPiggyBankAmount; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Note; use FireflyIII\Models\PiggyBank; -use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\PiggyBankRepetition; -use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\ObjectGroup\CreatesObjectGroups; use Illuminate\Database\QueryException; -use Log; +use Illuminate\Support\Facades\Log; /** * Trait ModifiesPiggyBanks @@ -44,8 +42,8 @@ trait ModifiesPiggyBanks use CreatesObjectGroups; /** - * @param PiggyBank $piggyBank - * @param string $amount + * @param PiggyBank $piggyBank + * @param string $amount * * @return bool */ @@ -59,30 +57,34 @@ trait ModifiesPiggyBanks $repetition->currentamount = bcadd($currentAmount, $amount); $repetition->save(); - // create event - //$this->createEvent($piggyBank, $amount); + Log::debug('addAmount: Trigger change for positive amount.'); + event(new ChangedPiggyBankAmount($piggyBank, $amount, null, null)); return true; } /** - * @param PiggyBankRepetition $repetition - * @param string $amount + * @param PiggyBankRepetition $repetition + * @param string $amount * - * @return string + * @return void */ - public function addAmountToRepetition(PiggyBankRepetition $repetition, string $amount): string + public function addAmountToRepetition(PiggyBankRepetition $repetition, string $amount): void { - $newAmount = bcadd($repetition->currentamount, $amount); - $repetition->currentamount = $newAmount; - $repetition->save(); - - return $newAmount; + Log::debug(sprintf('addAmountToRepetition: %s', $amount)); + if (-1 === bccomp($amount, '0')) { + Log::debug('Remove amount.'); + $this->removeAmount($repetition->piggyBank, bcmul($amount, '-1')); + } + if (1 === bccomp($amount, '0')) { + Log::debug('Add amount.'); + $this->addAmount($repetition->piggyBank, $amount); + } } /** - * @param PiggyBank $piggyBank - * @param string $amount + * @param PiggyBank $piggyBank + * @param string $amount * * @return bool */ @@ -90,10 +92,10 @@ trait ModifiesPiggyBanks { $today = today(config('app.timezone')); $leftOnAccount = $this->leftOnAccount($piggyBank, $today); - $savedSoFar = (string) $this->getRepetition($piggyBank)->currentamount; + $savedSoFar = (string)$this->getRepetition($piggyBank)->currentamount; $maxAmount = $leftOnAccount; $leftToSave = null; - if (0.0 !== (float) $piggyBank->targetamount) { + if (0.0 !== (float)$piggyBank->targetamount) { $leftToSave = bcsub($piggyBank->targetamount, $savedSoFar); $maxAmount = 1 === bccomp($leftOnAccount, $leftToSave) ? $leftToSave : $leftOnAccount; } @@ -111,8 +113,8 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param string $amount + * @param PiggyBank $piggyBank + * @param string $amount * * @return bool */ @@ -128,25 +130,7 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param string $amount - * @param TransactionJournal $journal - * - * @return PiggyBankEvent - */ - public function createEventWithJournal(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): PiggyBankEvent - { - return PiggyBankEvent::create( - [ - 'piggy_bank_id' => $piggyBank->id, - 'transaction_journal_id' => $journal->id, - 'date' => $journal->date->format('Y-m-d'), - 'amount' => $amount] - ); - } - - /** - * @param PiggyBank $piggyBank + * @param PiggyBank $piggyBank * * @return bool * @throws Exception @@ -160,8 +144,8 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param string $amount + * @param PiggyBank $piggyBank + * @param string $amount * * @return bool */ @@ -174,27 +158,12 @@ trait ModifiesPiggyBanks $repetition->currentamount = bcsub($repetition->currentamount, $amount); $repetition->save(); - // create event - $this->createEvent($piggyBank, bcmul($amount, '-1')); + Log::debug('addAmount: Trigger change for negative amount.'); + event(new ChangedPiggyBankAmount($piggyBank, bcmul($amount, '-1'), null, null)); return true; } - /** - * @param PiggyBank $piggyBank - * @param string $amount - * - * @return PiggyBankEvent - */ - public function createEvent(PiggyBank $piggyBank, string $amount): PiggyBankEvent - { - if (0 === bccomp('0', $amount)) { - return new PiggyBankEvent; - } - - return PiggyBankEvent::create(['date' => Carbon::now(), 'amount' => $amount, 'piggy_bank_id' => $piggyBank->id]); - } - /** * @inheritDoc */ @@ -206,8 +175,8 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param string $amount + * @param PiggyBank $piggyBank + * @param string $amount * * @return PiggyBank */ @@ -225,8 +194,14 @@ trait ModifiesPiggyBanks $repetition->currentamount = $amount; $repetition->save(); - // create event - $this->createEvent($piggyBank, $difference); + if (-1 === bccomp($difference, '0')) { + Log::debug('addAmount: Trigger change for negative amount.'); + event(new ChangedPiggyBankAmount($piggyBank, bcmul($amount, '-1'), null, null)); + } + if (1 === bccomp($difference, '0')) { + Log::debug('addAmount: Trigger change for positive amount.'); + event(new ChangedPiggyBankAmount($piggyBank, $amount, null, null)); + } return $piggyBank; } @@ -242,11 +217,10 @@ trait ModifiesPiggyBanks } return $piggyBank; - } /** - * @param array $data + * @param array $data * * @return PiggyBank * @throws FireflyException @@ -263,7 +237,7 @@ trait ModifiesPiggyBanks unset($piggyData['object_group_title'], $piggyData['object_group_id'], $piggyData['notes'], $piggyData['current_amount']); // validate amount: - if (array_key_exists('targetamount', $piggyData) && '' === (string) $piggyData['targetamount']) { + if (array_key_exists('targetamount', $piggyData) && '' === (string)$piggyData['targetamount']) { $piggyData['targetamount'] = '0'; } @@ -295,10 +269,9 @@ trait ModifiesPiggyBanks $piggyBank->objectGroups()->sync([$objectGroup->id]); $piggyBank->save(); } - } // try also with ID - $objectGroupId = (int) ($data['object_group_id'] ?? 0); + $objectGroupId = (int)($data['object_group_id'] ?? 0); if (0 !== $objectGroupId) { $objectGroup = $this->findObjectGroupById($objectGroupId); if (null !== $objectGroup) { @@ -318,7 +291,7 @@ trait ModifiesPiggyBanks $set = $this->user->piggyBanks()->orderBy('piggy_banks.order', 'ASC')->get(['piggy_banks.*']); $current = 1; foreach ($set as $piggyBank) { - if ((int) $piggyBank->order !== $current) { + if ((int)$piggyBank->order !== $current) { Log::debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current)); $piggyBank->order = $current; $piggyBank->save(); @@ -332,7 +305,7 @@ trait ModifiesPiggyBanks */ public function setOrder(PiggyBank $piggyBank, int $newOrder): bool { - $oldOrder = (int) $piggyBank->order; + $oldOrder = (int)$piggyBank->order; Log::debug(sprintf('Will move piggy bank #%d ("%s") from %d to %d', $piggyBank->id, $piggyBank->name, $oldOrder, $newOrder)); if ($newOrder > $oldOrder) { $this->user->piggyBanks()->where('piggy_banks.order', '<=', $newOrder)->where('piggy_banks.order', '>', $oldOrder) @@ -356,8 +329,8 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param string $note + * @param PiggyBank $piggyBank + * @param string $note * * @return bool */ @@ -387,8 +360,8 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param array $data + * @param PiggyBank $piggyBank + * @param array $data * * @return PiggyBank */ @@ -396,12 +369,12 @@ trait ModifiesPiggyBanks { $piggyBank = $this->updateProperties($piggyBank, $data); if (array_key_exists('notes', $data)) { - $this->updateNote($piggyBank, (string) $data['notes']); + $this->updateNote($piggyBank, (string)$data['notes']); } // update the order of the piggy bank: - $oldOrder = (int) $piggyBank->order; - $newOrder = (int) ($data['order'] ?? $oldOrder); + $oldOrder = (int)$piggyBank->order; + $newOrder = (int)($data['order'] ?? $oldOrder); if ($oldOrder !== $newOrder) { $this->setOrder($piggyBank, $newOrder); } @@ -409,9 +382,11 @@ trait ModifiesPiggyBanks // if the piggy bank is now smaller than the current relevant rep, // remove money from the rep. $repetition = $this->getRepetition($piggyBank); - if (null !== $repetition && $repetition->currentamount > $piggyBank->targetamount && 0.0 !== (float) $piggyBank->targetamount) { - $diff = bcsub($piggyBank->targetamount, $repetition->currentamount); - $this->createEvent($piggyBank, $diff); + if (null !== $repetition && $repetition->currentamount > $piggyBank->targetamount && 0.0 !== (float)$piggyBank->targetamount) { + $difference = bcsub($piggyBank->targetamount, $repetition->currentamount); + + // an amount will be removed, create "negative" event: + event(new ChangedPiggyBankAmount($piggyBank, $difference, null, null)); $repetition->currentamount = $piggyBank->targetamount; $repetition->save(); @@ -419,7 +394,7 @@ trait ModifiesPiggyBanks // update using name: if (array_key_exists('object_group_title', $data)) { - $objectGroupTitle = (string) $data['object_group_title']; + $objectGroupTitle = (string)$data['object_group_title']; if ('' !== $objectGroupTitle) { $objectGroup = $this->findOrCreateObjectGroup($objectGroupTitle); if (null !== $objectGroup) { @@ -438,7 +413,7 @@ trait ModifiesPiggyBanks // try also with ID: if (array_key_exists('object_group_id', $data)) { - $objectGroupId = (int) ($data['object_group_id'] ?? 0); + $objectGroupId = (int)($data['object_group_id'] ?? 0); if (0 !== $objectGroupId) { $objectGroup = $this->findObjectGroupById($objectGroupId); if (null !== $objectGroup) { @@ -454,8 +429,8 @@ trait ModifiesPiggyBanks } /** - * @param PiggyBank $piggyBank - * @param array $data + * @param PiggyBank $piggyBank + * @param array $data * * @return PiggyBank */ @@ -465,7 +440,7 @@ trait ModifiesPiggyBanks $piggyBank->name = $data['name']; } if (array_key_exists('account_id', $data) && 0 !== $data['account_id']) { - $piggyBank->account_id = (int) $data['account_id']; + $piggyBank->account_id = (int)$data['account_id']; } if (array_key_exists('targetamount', $data) && '' !== $data['targetamount']) { $piggyBank->targetamount = $data['targetamount']; @@ -475,7 +450,6 @@ trait ModifiesPiggyBanks } if (array_key_exists('startdate', $data)) { $piggyBank->startdate = $data['startdate']; - } $piggyBank->save(); diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php index cc0f494b7e..63e2743a71 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php +++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php @@ -47,10 +47,8 @@ interface PiggyBankRepositoryInterface /** * @param PiggyBankRepetition $repetition * @param string $amount - * - * @return string */ - public function addAmountToRepetition(PiggyBankRepetition $repetition, string $amount): string; + public function addAmountToRepetition(PiggyBankRepetition $repetition, string $amount): void; /** * @param PiggyBank $piggyBank @@ -68,25 +66,6 @@ interface PiggyBankRepositoryInterface */ public function canRemoveAmount(PiggyBank $piggyBank, string $amount): bool; - /** - * Create a new event. - * - * @param PiggyBank $piggyBank - * @param string $amount - * - * @return PiggyBankEvent - */ - public function createEvent(PiggyBank $piggyBank, string $amount): PiggyBankEvent; - - /** - * @param PiggyBank $piggyBank - * @param string $amount - * @param TransactionJournal $journal - * - * @return PiggyBankEvent - */ - public function createEventWithJournal(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): PiggyBankEvent; - /** * Destroy piggy bank. * diff --git a/app/Services/Internal/Destroy/JournalDestroyService.php b/app/Services/Internal/Destroy/JournalDestroyService.php index 841f39a89b..a005d2d061 100644 --- a/app/Services/Internal/Destroy/JournalDestroyService.php +++ b/app/Services/Internal/Destroy/JournalDestroyService.php @@ -83,6 +83,7 @@ class JournalDestroyService $journal->notes()->delete(); // update events + // TODO move to repository $journal->piggyBankEvents()->update(['transaction_journal_id' => null]); $journal->delete(); diff --git a/app/Services/Internal/Update/GroupCloneService.php b/app/Services/Internal/Update/GroupCloneService.php index 1b5746e51f..5950f62095 100644 --- a/app/Services/Internal/Update/GroupCloneService.php +++ b/app/Services/Internal/Update/GroupCloneService.php @@ -105,7 +105,7 @@ class GroupCloneService // add note saying "cloned". // add relation. - // clone linked piggy banks + // TODO clone ALL linked piggy banks /** @var PiggyBankEvent $event */ $event = $journal->piggyBankEvents()->first(); if(null !== $event) { diff --git a/app/TransactionRules/Actions/UpdatePiggybank.php b/app/TransactionRules/Actions/UpdatePiggybank.php index 614c771b0f..26c232362c 100644 --- a/app/TransactionRules/Actions/UpdatePiggybank.php +++ b/app/TransactionRules/Actions/UpdatePiggybank.php @@ -152,7 +152,6 @@ class UpdatePiggybank implements ActionInterface Log::debug(sprintf('Will now remove %s from piggy bank.', $amount)); $repository->removeAmount($piggyBank, $amount); - $repository->createEventWithJournal($piggyBank, app('steam')->negative($amount), $journal); } /** @@ -191,6 +190,5 @@ class UpdatePiggybank implements ActionInterface Log::debug(sprintf('Will now add %s to piggy bank.', $amount)); $repository->addAmount($piggyBank, $amount); - $repository->createEventWithJournal($piggyBank, app('steam')->positive($amount), $journal); } } diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 2d051bcffa..d698c19c43 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -1851,6 +1851,7 @@ return [ 'no_tags' => '(no tags)', // piggy banks: + 'event_history' => 'Event history', 'add_money_to_piggy' => 'Add money to piggy bank ":name"', 'piggy_bank' => 'Piggy bank', 'new_piggy_bank' => 'New piggy bank', diff --git a/resources/views/piggy-banks/show.twig b/resources/views/piggy-banks/show.twig index c3ba9a0b10..0c0ef544bb 100644 --- a/resources/views/piggy-banks/show.twig +++ b/resources/views/piggy-banks/show.twig @@ -98,7 +98,7 @@