. */ declare(strict_types=1); namespace FireflyIII\Services\Internal\Update; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Recurrence; use FireflyIII\Services\Internal\Support\RecurringTransactionTrait; use FireflyIII\Services\Internal\Support\TransactionServiceTrait; use FireflyIII\Services\Internal\Support\TransactionTypeTrait; use FireflyIII\User; /** * Class RecurrenceUpdateService */ class RecurrenceUpdateService { use TransactionTypeTrait, TransactionServiceTrait, RecurringTransactionTrait; /** @var User */ private $user; /** * Updates a recurrence. * * @param Recurrence $recurrence * @param array $data * * @return Recurrence * @throws FireflyException */ public function update(Recurrence $recurrence, array $data): Recurrence { // is expected by TransactionServiceTrait $this->user = $recurrence->user; $transactionType = $this->findTransactionType(ucfirst($data['recurrence']['type'])); // update basic fields first: $recurrence->transaction_type_id = $transactionType->id; $recurrence->title = $data['recurrence']['title'] ?? $recurrence->title; $recurrence->description = $data['recurrence']['description'] ?? $recurrence->description; $recurrence->first_date = $data['recurrence']['first_date'] ?? $recurrence->first_date; $recurrence->repeat_until = $data['recurrence']['repeat_until'] ?? $recurrence->repeat_until; $recurrence->repetitions = $data['recurrence']['repetitions'] ?? $recurrence->repetitions; $recurrence->apply_rules = $data['recurrence']['apply_rules'] ?? $recurrence->apply_rules; $recurrence->active = $data['recurrence']['active'] ?? $recurrence->active; if (isset($data['recurrence']['repetition_end'])) { if (\in_array($data['recurrence']['repetition_end'], ['forever ', 'until_date'])) { $recurrence->repetitions = 0; } if (\in_array($data['recurrence']['repetition_end'], ['forever ', 'times'])) { $recurrence->repeat_until = null; } } $recurrence->save(); // update all meta data: $this->updateMetaData($recurrence, $data); // update all repetitions $this->deleteRepetitions($recurrence); $this->createRepetitions($recurrence, $data['repetitions'] ?? []); // update all transactions (and associated meta-data); $this->deleteTransactions($recurrence); $this->createTransactions($recurrence, $data['transactions'] ?? []); return $recurrence; } }