. */ declare(strict_types=1); namespace FireflyIII\Services\Internal\Update; use FireflyIII\Factory\PiggyBankEventFactory; use FireflyIII\Models\Budget; use FireflyIII\Models\Category; use FireflyIII\Models\Note; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalMeta; /** * Class GroupCloneService */ class GroupCloneService { /** * @param TransactionGroup $group * * @return TransactionGroup */ public function cloneGroup(TransactionGroup $group): TransactionGroup { $newGroup = $group->replicate(); $newGroup->save(); foreach ($group->transactionJournals as $journal) { $this->cloneJournal($journal, $newGroup, (int)$group->id); } return $newGroup; } /** * @param TransactionJournal $journal * @param TransactionGroup $newGroup * @param int $originalGroup */ private function cloneJournal(TransactionJournal $journal, TransactionGroup $newGroup, int $originalGroup): void { $newJournal = $journal->replicate(); $newJournal->transaction_group_id = $newGroup->id; $newJournal->date = today(config('app.timezone')); $newJournal->save(); foreach ($journal->transactions as $transaction) { $this->cloneTransaction($transaction, $newJournal); } // clone notes /** @var Note $note */ foreach ($journal->notes as $note) { $this->cloneNote($note, $newJournal, $originalGroup); } // clone location (not yet available) // clone meta /** @var TransactionJournalMeta $meta */ foreach ($journal->transactionJournalMeta as $meta) { $this->cloneMeta($meta, $newJournal); } // clone category /** @var Category $category */ foreach ($journal->categories as $category) { $newJournal->categories()->save($category); } // clone budget /** @var Budget $budget */ foreach ($journal->budgets as $budget) { $newJournal->budgets()->save($budget); } // clone links (ongoing). // clone tags /** @var Tag $tag */ foreach ($journal->tags as $tag) { $newJournal->tags()->save($tag); } // add note saying "cloned". // add relation. // TODO clone ALL linked piggy banks /** @var PiggyBankEvent $event */ $event = $journal->piggyBankEvents()->first(); if (null !== $event) { $piggyBank = $event->piggyBank; $factory = app(PiggyBankEventFactory::class); $factory->create($newJournal, $piggyBank); } } /** * @param Transaction $transaction * @param TransactionJournal $newJournal */ private function cloneTransaction(Transaction $transaction, TransactionJournal $newJournal): void { $newTransaction = $transaction->replicate(); $newTransaction->transaction_journal_id = $newJournal->id; $newTransaction->reconciled = false; $newTransaction->save(); } /** * @param Note $note * @param TransactionJournal $newJournal * @param int $oldGroupId */ private function cloneNote(Note $note, TransactionJournal $newJournal, int $oldGroupId): void { $newNote = $note->replicate(); $newNote->text .= sprintf( "\n\n%s", trans('firefly.clones_journal_x', ['description' => $newJournal->description, 'id' => $oldGroupId]) ); $newNote->noteable_id = $newJournal->id; $newNote->save(); } /** * @param TransactionJournalMeta $meta * @param TransactionJournal $newJournal */ private function cloneMeta(TransactionJournalMeta $meta, TransactionJournal $newJournal): void { $newMeta = $meta->replicate(); $newMeta->transaction_journal_id = $newJournal->id; if ('recurrence_id' !== $newMeta->name) { $newMeta->save(); } } }