. */ declare(strict_types=1); namespace FireflyIII\Services\Internal\Update; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Transaction; use FireflyIII\Services\Internal\Support\TransactionServiceTrait; use FireflyIII\User; /** * Class TransactionUpdateService */ class TransactionUpdateService { use TransactionServiceTrait; /** @var User */ private $user; /** * @param int $transactionId * * @return Transaction|null */ public function reconcile(int $transactionId): ?Transaction { $transaction = Transaction::find($transactionId); if (!is_null($transaction)) { $transaction->reconciled = true; $transaction->save(); return $transaction; } return null; } /** * @param User $user */ public function setUser(User $user): void { $this->user = $user; } /** * @param Transaction $transaction * @param array $data * * @return Transaction * @throws FireflyException */ public function update(Transaction $transaction, array $data): Transaction { $currency = $this->findCurrency($data['currency_id'], $data['currency_code']); $journal = $transaction->transactionJournal; $description = $journal->description === $data['description'] ? null : $data['description']; // update description: $transaction->description = $description; $foreignAmount = null; if (floatval($transaction->amount) < 0) { // this is the source transaction. $type = $this->accountType($journal, 'source'); $account = $this->findAccount($type, $data['source_id'], $data['source_name']); $amount = app('steam')->negative(strval($data['amount'])); $foreignAmount = app('steam')->negative(strval($data['foreign_amount'])); } if (floatval($transaction->amount) > 0) { // this is the destination transaction. $type = $this->accountType($journal, 'destination'); $account = $this->findAccount($type, $data['destination_id'], $data['destination_name']); $amount = app('steam')->positive(strval($data['amount'])); $foreignAmount = app('steam')->positive(strval($data['foreign_amount'])); } // update the actual transaction: $transaction->description = $description; $transaction->amount = $amount; $transaction->foreign_amount = null; $transaction->transaction_currency_id = $currency->id; $transaction->account_id = $account->id; $transaction->reconciled = $data['reconciled']; $transaction->save(); // set foreign currency $foreign = $this->findCurrency($data['foreign_currency_id'], $data['foreign_currency_code']); // set foreign amount: if (!is_null($data['foreign_amount'])) { $this->setForeignCurrency($transaction, $foreign); $this->setForeignAmount($transaction, $foreignAmount); } if (is_null($data['foreign_amount'])) { $this->setForeignCurrency($transaction, null); $this->setForeignAmount($transaction, null); } // set budget: $budget = $this->findBudget($data['budget_id'], $data['budget_name']); $this->setBudget($transaction, $budget); // set category $category = $this->findCategory($data['category_id'], $data['category_name']); $this->setCategory($transaction, $category); return $transaction; } /** * Update budget for a journal. * * @param Transaction $transaction * @param int $budgetId * * @return Transaction */ public function updateBudget(Transaction $transaction, int $budgetId): Transaction { $budget = $this->findBudget($budgetId, null); $this->setBudget($transaction, $budget); return $transaction; } /** * Update category for a journal. * * @param Transaction $transaction * @param string $category * * @return Transaction */ public function updateCategory(Transaction $transaction, string $category): Transaction { $category = $this->findCategory(0, $category); $this->setCategory($transaction, $category); return $category; } }