/** * @param TransactionJournal $journal * * @return bool */ public function act(TransactionJournal $journal) : bool { Log::debug(sprintf('RuleAction PrependDescription prepended "%s" to "%s".', $this->action->action_value, $journal->description)); $journal->description = $this->action->action_value . $journal->description; $journal->save(); return true; }
/** * @param TransactionJournal $journal * * @return bool */ public function act(TransactionJournal $journal) : bool { $oldDescription = $journal->description; $journal->description = $this->action->action_value; $journal->save(); Log::debug(sprintf('RuleAction SetDescription changed the description of journal #%d from "%s" to "%s".', $journal->id, $oldDescription, $this->action->action_value)); return true; }
/** * @param Bill $bill * @param TransactionJournal $journal * * @return boolean|null */ public function scan(Bill $bill, TransactionJournal $journal) { $matches = explode(',', $bill->match); $description = strtolower($journal->description) . ' ' . strtolower($journal->destination_account->name); $wordMatch = $this->doWordMatch($matches, $description); $amountMatch = $this->doAmountMatch($journal->amount_positive, $bill->amount_min, $bill->amount_max); Log::debug('Journal #' . $journal->id . ' has description "' . $description . '"'); /* * If both, update! */ if ($wordMatch && $amountMatch) { $journal->bill()->associate($bill); $journal->save(); return true; } else { Log::debug('Wordmatch: ' . ($wordMatch ? 'true' : 'false') . ' AmountMatch: ' . ($amountMatch ? 'true' : 'false')); } if ($bill->id == $journal->bill_id) { // if no match, but bill used to match, remove it: $journal->bill_id = null; $journal->save(); return true; } return false; }
/** * @param Bill $bill * @param TransactionJournal $journal * * @return boolean|null */ public function scan(Bill $bill, TransactionJournal $journal) { $matches = explode(',', $bill->match); $description = strtolower($journal->description) . ' ' . strtolower($journal->destination_account->name); $wordMatch = $this->doWordMatch($matches, $description); $amountMatch = $this->doAmountMatch($journal->amount, $bill->amount_min, $bill->amount_max); /* * If both, update! */ if ($wordMatch && $amountMatch) { $journal->bill()->associate($bill); $journal->save(); return true; } if ($bill->id == $journal->bill_id) { // if no match, but bill used to match, remove it: $journal->bill_id = null; $journal->save(); return true; } return false; }
/** * @param TransactionJournal $journal * @param ImportEntry $entry */ private function storeCategory(TransactionJournal $journal, ImportEntry $entry) { if (!is_null($entry->fields['category']) && !is_null($entry->fields['category']->id)) { $journal->categories()->save($entry->fields['category']); Log::debug('Attached category', ['id' => $entry->fields['category']->id, 'name' => $entry->fields['category']->name]); $journal->save(); } }
/** * @param TransactionJournal $journal * @param array $data * * @return TransactionJournal */ public function update(TransactionJournal $journal, array $data) : TransactionJournal { // update actual journal. $journal->transaction_currency_id = $data['amount_currency_id_amount']; $journal->description = $data['description']; $journal->date = $data['date']; // unlink all categories, recreate them: $journal->categories()->detach(); if (strlen($data['category']) > 0) { $category = Category::firstOrCreateEncrypted(['name' => $data['category'], 'user_id' => $data['user']]); $journal->categories()->save($category); } // unlink all budgets and recreate them: $journal->budgets()->detach(); if (intval($data['budget_id']) > 0 && $journal->transactionType->type !== TransactionType::TRANSFER) { /** @var \FireflyIII\Models\Budget $budget */ $budget = Budget::where('user_id', $this->user->id)->where('id', $data['budget_id'])->first(); $journal->budgets()->save($budget); } // store accounts (depends on type) list($fromAccount, $toAccount) = $this->storeAccounts($journal->transactionType, $data); // update the from and to transaction. /** @var Transaction $transaction */ foreach ($journal->transactions()->get() as $transaction) { if ($transaction->amount < 0) { // this is the from transaction, negative amount: $transaction->amount = $data['amount'] * -1; $transaction->account_id = $fromAccount->id; $transaction->save(); } if ($transaction->amount > 0) { $transaction->amount = $data['amount']; $transaction->account_id = $toAccount->id; $transaction->save(); } } $journal->save(); // update tags: if (isset($data['tags']) && is_array($data['tags'])) { $this->updateTags($journal, $data['tags']); } // update meta fields: $result = $journal->save(); if ($result) { foreach ($data as $key => $value) { if (in_array($key, $this->validMetaFields)) { $journal->setMeta($key, $value); continue; } Log::debug(sprintf('Could not store meta field "%s" with value "%s" for journal #%d', json_encode($key), json_encode($value), $journal->id)); } return $journal; } return $journal; }
/** * @param Account $account * @param TransactionJournal $journal * @param array $data * * @return TransactionJournal */ protected function updateInitialBalance(Account $account, TransactionJournal $journal, array $data) { $journal->date = $data['openingBalanceDate']; $journal->save(); /** @var Transaction $transaction */ foreach ($journal->transactions()->get() as $transaction) { if ($account->id == $transaction->account_id) { $transaction->amount = $data['openingBalance']; $transaction->save(); } if ($account->id != $transaction->account_id) { $transaction->amount = $data['openingBalance'] * -1; $transaction->save(); } } return $journal; }
/** * @param TransactionJournal $journal * @param Tag $tag * * @return bool */ protected function connectBalancingAct(TransactionJournal $journal, Tag $tag) : bool { /** @var TransactionType $withdrawal */ $withdrawal = TransactionType::whereType(TransactionType::WITHDRAWAL)->first(); $withdrawals = $tag->transactionJournals()->where('transaction_type_id', $withdrawal->id)->count(); /** @var TransactionType $transfer */ $transfer = TransactionType::whereType(TransactionType::TRANSFER)->first(); $transfers = $tag->transactionJournals()->where('transaction_type_id', $transfer->id)->count(); // only if this is the only withdrawal. if ($journal->transaction_type_id == $withdrawal->id && $withdrawals < 1) { $journal->tags()->save($tag); $journal->save(); return true; } // and only if this is the only transfer if ($journal->transaction_type_id == $transfer->id && $transfers < 1) { $journal->tags()->save($tag); $journal->save(); return true; } // ignore expense return false; }
/** * @param TransactionJournal $journal * @param array $data * * @return TransactionJournal */ public function updateJournal(TransactionJournal $journal, array $data) : TransactionJournal { $journal->description = $data['journal_description']; $journal->transaction_currency_id = $data['journal_currency_id']; $journal->date = $data['date']; $journal->interest_date = $data['interest_date']; $journal->book_date = $data['book_date']; $journal->process_date = $data['process_date']; $journal->save(); // delete original transactions, and recreate them. $journal->transactions()->delete(); foreach ($data['transactions'] as $transaction) { $this->storeTransaction($journal, $transaction); } $journal->completed = true; $journal->save(); return $journal; }
/** * @param TransactionJournal $journal * @param array $data * * @return TransactionJournal */ public function update(TransactionJournal $journal, array $data) { // update actual journal. $journal->transaction_currency_id = $data['amount_currency_id']; $journal->description = $data['description']; $journal->date = $data['date']; // unlink all categories, recreate them: $journal->categories()->detach(); if (strlen($data['category']) > 0) { $category = Category::firstOrCreateEncrypted(['name' => $data['category'], 'user_id' => $data['user']]); $journal->categories()->save($category); } // unlink all budgets and recreate them: $journal->budgets()->detach(); if (intval($data['budget_id']) > 0) { /** @var \FireflyIII\Models\Budget $budget */ $budget = Budget::find($data['budget_id']); $journal->budgets()->save($budget); } // store accounts (depends on type) list($from, $to) = $this->storeAccounts($journal->transactionType, $data); // update the from and to transaction. /** @var Transaction $transaction */ foreach ($journal->transactions()->get() as $transaction) { if (floatval($transaction->amount) < 0) { // this is the from transaction, negative amount: $transaction->amount = $data['amount'] * -1; $transaction->account_id = $from->id; $transaction->save(); } if (floatval($transaction->amount) > 0) { $transaction->amount = $data['amount']; $transaction->account_id = $to->id; $transaction->save(); } } $journal->save(); // update tags: if (isset($data['tags']) && is_array($data['tags'])) { $this->updateTags($journal, $data['tags']); } return $journal; }
/** * @param TransactionJournal $journal * @param Tag $tag * * @return bool */ protected function matchAll(TransactionJournal $journal, Tag $tag) { $match = true; /** @var TransactionJournal $check */ foreach ($tag->transactionjournals as $check) { // $checkAccount is the source_account for a withdrawal // $checkAccount is the destination_account for a deposit if ($check->transactionType->type == 'Withdrawal' && $check->source_account->id != $journal->destination_account->id) { $match = false; } if ($check->transactionType->type == 'Deposit' && $check->destination_account->id != $journal->destination_account->id) { $match = false; } } if ($match) { $journal->tags()->save($tag); $journal->save(); return true; } return false; }
/** * @param TransactionJournal $journal * @param string $dateField * * @return string */ public static function dateAsString(TransactionJournal $journal, string $dateField = '') : string { if ($dateField === '') { return $journal->date->format('Y-m-d'); } if (!is_null($journal->{$dateField}) && $journal->{$dateField} instanceof Carbon) { // make field NULL $carbon = clone $journal->{$dateField}; $journal->{$dateField} = null; $journal->save(); // create meta entry $journal->setMeta($dateField, $carbon); // return that one instead. return $carbon->format('Y-m-d'); } $metaField = $journal->getMeta($dateField); if (!is_null($metaField)) { $carbon = new Carbon($metaField); return $carbon->format('Y-m-d'); } return ''; }
/** * @param Account $account * @param TransactionJournal $journal * @param Carbon $date * @param float $amount * * @return bool */ private function updateJournal(Account $account, TransactionJournal $journal, Carbon $date, float $amount) : bool { // update date: $journal->date = $date; $journal->save(); // update transactions: /** @var Transaction $transaction */ foreach ($journal->transactions()->get() as $transaction) { if ($account->id == $transaction->account_id) { $transaction->amount = $amount; $transaction->save(); } if ($account->id != $transaction->account_id) { $transaction->amount = $amount * -1; $transaction->save(); } } return true; }
/** * @param Account $account * @param Account $opposing * @param array $data * * @return TransactionJournal */ protected function storeInitialBalance(Account $account, Account $opposing, array $data) { $type = $data['openingBalance'] < 0 ? 'Withdrawal' : 'Deposit'; $transactionType = TransactionType::whereType($type)->first(); $journal = new TransactionJournal(['user_id' => $data['user'], 'transaction_type_id' => $transactionType->id, 'bill_id' => null, 'transaction_currency_id' => $data['openingBalanceCurrency'], 'description' => 'Initial balance for "' . $account->name . '"', 'completed' => true, 'date' => $data['openingBalanceDate'], 'encrypted' => true]); $journal->save(); if ($data['openingBalance'] < 0) { $firstAccount = $opposing; $secondAccount = $account; $firstAmount = $data['openingBalance'] * -1; $secondAmount = $data['openingBalance']; } else { $firstAccount = $account; $secondAccount = $opposing; $firstAmount = $data['openingBalance']; $secondAmount = $data['openingBalance'] * -1; } // first transaction: from $one = new Transaction(['account_id' => $firstAccount->id, 'transaction_journal_id' => $journal->id, 'amount' => $firstAmount]); $one->save(); // second transaction: to $two = new Transaction(['account_id' => $secondAccount->id, 'transaction_journal_id' => $journal->id, 'amount' => $secondAmount]); $two->save(); return $journal; }