/**
  * @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;
 }
示例#3
0
 /**
  * @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;
 }
示例#4
0
 /**
  * @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;
 }
示例#7
0
 /**
  * @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;
 }
示例#9
0
 /**
  * @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;
 }
示例#10
0
 /**
  * @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;
 }
示例#11
0
 /**
  * @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 '';
 }
示例#13
0
 /**
  * @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;
 }
示例#14
0
 /**
  * @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;
 }