. */ declare(strict_types=1); namespace FireflyIII\Factory; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use Log; /** * Create piggy bank events. * * Class PiggyBankEventFactory */ class PiggyBankEventFactory { /** * @param TransactionJournal $journal * @param PiggyBank|null $piggyBank * * @return PiggyBankEvent|null */ public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): ?PiggyBankEvent { Log::debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type)); if (null === $piggyBank) { return null; } // is a transfer? 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; } /** @var PiggyBankRepositoryInterface $piggyRepos */ $piggyRepos = app(PiggyBankRepositoryInterface::class); $piggyRepos->setUser($journal->user); // repetition exists? $repetition = $piggyRepos->getRepetition($piggyBank); if (null === $repetition) { Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d'))); return null; } // get the amount $amount = $piggyRepos->getExactAmount($piggyBank, $repetition, $journal); if (0 === bccomp($amount, '0')) { Log::debug('Amount is zero, will not create event.'); return null; } // update amount $piggyRepos->addAmountToRepetition($repetition, $amount); $event = $piggyRepos->createEventWithJournal($piggyBank, $amount, $journal); Log::debug(sprintf('Created piggy bank event #%d', $event->id)); return $event; } }