Exemplo n.º 1
0
 /**
  * @param $value
  * @param $route
  *
  * @return mixed
  */
 public static function routeBinder($value, $route) : Collection
 {
     if (auth()->check()) {
         $ids = explode(',', $value);
         /** @var \Illuminate\Support\Collection $object */
         $object = TransactionJournal::whereIn('transaction_journals.id', $ids)->expanded()->where('transaction_journals.user_id', auth()->user()->id)->get(TransactionJournal::queryFields());
         if ($object->count() > 0) {
             return $object;
         }
     }
     throw new NotFoundHttpException();
 }
Exemplo n.º 2
0
 /**
  * @param array $words
  *
  * @return Collection
  */
 public function searchTransactions(array $words) : Collection
 {
     // decrypted transaction journals:
     $decrypted = auth()->user()->transactionJournals()->expanded()->where('transaction_journals.encrypted', 0)->where(function (EloquentBuilder $q) use($words) {
         foreach ($words as $word) {
             $q->orWhere('transaction_journals.description', 'LIKE', '%' . e($word) . '%');
         }
     })->get(TransactionJournal::queryFields());
     // encrypted
     $all = auth()->user()->transactionJournals()->expanded()->where('transaction_journals.encrypted', 1)->get(TransactionJournal::queryFields());
     $set = $all->filter(function (TransactionJournal $journal) use($words) {
         foreach ($words as $word) {
             $haystack = strtolower($journal->description);
             $word = strtolower($word);
             if (!(strpos($haystack, $word) === false)) {
                 return $journal;
             }
         }
         return null;
     });
     $filtered = $set->merge($decrypted);
     $filtered = $filtered->sortBy(function (TransactionJournal $journal) {
         return intval($journal->date->format('U'));
     });
     $filtered = $filtered->reverse();
     return $filtered;
 }
 /**
  * @param Collection $accounts
  * @param array      $types
  * @param Carbon     $start
  * @param Carbon     $end
  *
  * @return Collection
  */
 public function journalsInPeriod(Collection $accounts, array $types, Carbon $start, Carbon $end) : Collection
 {
     // first collect actual transaction journals (fairly easy)
     $query = $this->user->transactionJournals()->expanded()->sortCorrectly();
     if ($end >= $start) {
         $query->before($end)->after($start);
     }
     if (count($types) > 0) {
         $query->transactionTypes($types);
     }
     if ($accounts->count() > 0) {
         $accountIds = $accounts->pluck('id')->toArray();
         $query->leftJoin('transactions as source', function (JoinClause $join) {
             $join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', 0);
         });
         $query->leftJoin('transactions as destination', function (JoinClause $join) {
             $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id')->where('destination.amount', '>', 0);
         });
         $set = join(', ', $accountIds);
         $query->whereRaw('(source.account_id in (' . $set . ') XOR destination.account_id in (' . $set . '))');
     }
     // that should do it:
     $fields = TransactionJournal::queryFields();
     $complete = $query->get($fields);
     return $complete;
 }
 /**
  * @param Collection $accounts
  * @param Carbon     $start
  * @param Carbon     $end
  *
  * @return Collection
  */
 public function journalsInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end) : Collection
 {
     $accountIds = [];
     if ($accounts->count() > 0) {
         $accountIds = $accounts->pluck('id')->toArray();
     }
     /** @var Collection $set */
     $query = $this->user->transactionJournals()->expanded()->sortCorrectly()->transactionTypes([TransactionType::WITHDRAWAL])->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')->whereNull('budget_transaction_journal.id')->leftJoin('transactions as source', function (JoinClause $join) {
         $join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', '0');
     })->before($end)->after($start)->with(['transactions' => function (HasMany $query) {
         $query->where('transactions.amount', '<', 0);
     }, 'transactions.budgets']);
     // add account id's, if relevant:
     if (count($accountIds) > 0) {
         $query->whereIn('source.account_id', $accountIds);
     }
     $set = $query->get(TransactionJournal::queryFields());
     $set = $set->filter(function (TransactionJournal $journal) {
         foreach ($journal->transactions as $t) {
             if ($t->budgets->count() === 0) {
                 return true;
             }
         }
         return false;
     });
     return $set;
 }
 /**
  * Returns a collection of ALL journals, given a specific account and a date range.
  *
  * @param Collection $accounts
  * @param Carbon     $start
  * @param Carbon     $end
  *
  * @return Collection
  */
 public function getJournalsInRange(Collection $accounts, Carbon $start, Carbon $end) : Collection
 {
     $query = $this->user->transactionJournals()->expanded()->sortCorrectly();
     $query->where('transaction_journals.completed', 1);
     $query->before($end);
     $query->after($start);
     if ($accounts->count() > 0) {
         $ids = $accounts->pluck('id')->toArray();
         // join source and destination:
         $query->leftJoin('transactions as source', function (JoinClause $join) {
             $join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', 0);
         });
         $query->leftJoin('transactions as destination', function (JoinClause $join) {
             $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id')->where('destination.amount', '>', 0);
         });
         $query->where(function (Builder $q) use($ids) {
             $q->whereIn('destination.account_id', $ids);
             $q->orWhereIn('source.account_id', $ids);
         });
     }
     $set = $query->get(TransactionJournal::queryFields());
     return $set;
 }
Exemplo n.º 6
0
 /**
  * This method also returns the amount of the journal in "journalAmount"
  * for easy access.
  *
  * @param Bill $bill
  *
  * @param int  $page
  * @param int  $pageSize
  *
  * @return LengthAwarePaginator|Collection
  */
 public function getJournals(Bill $bill, int $page, int $pageSize = 50) : LengthAwarePaginator
 {
     $offset = ($page - 1) * $pageSize;
     $query = $bill->transactionJournals()->expanded()->sortCorrectly();
     $count = $query->count();
     $set = $query->take($pageSize)->offset($offset)->get(TransactionJournal::queryFields());
     $paginator = new LengthAwarePaginator($set, $count, $pageSize, $page);
     return $paginator;
 }
Exemplo n.º 7
0
 /**
  * @param Tag $tag
  *
  * @return Collection
  */
 public function getJournals(Tag $tag) : Collection
 {
     /** @var Collection $journals */
     $journals = $tag->transactionJournals()->sortCorrectly()->expanded()->groupBy(['tag_transaction_journal.tag_id', 'tag_transaction_journal.transaction_journal_id'])->get(TransactionJournal::queryFields());
     return $journals;
 }
 /**
  * @param Collection $accounts
  * @param  array     $types
  * @param Carbon     $start
  * @param Carbon     $end
  *
  * @return Collection
  */
 public function journalsInPeriodWithoutCategory(Collection $accounts, array $types, Carbon $start, Carbon $end) : Collection
 {
     /** @var Collection $set */
     $query = $this->user->transactionJournals();
     if (count($types) > 0) {
         $query->transactionTypes($types);
     }
     $query->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')->whereNull('category_transaction_journal.id')->before($end)->after($start);
     if ($accounts->count() > 0) {
         $accountIds = $accounts->pluck('id')->toArray();
         $query->leftJoin('transactions as t', 't.transaction_journal_id', '=', 'transaction_journals.id');
         $query->whereIn('t.account_id', $accountIds);
     }
     $set = $query->get(['transaction_journals.*']);
     if ($set->count() == 0) {
         return new Collection();
     }
     // grab all the transactions from this set.
     // take only the journals with transactions that all have no category.
     // select transactions left join journals where id in this set
     // and left join transaction-category where null category
     $journalIds = $set->pluck('id')->toArray();
     $secondQuery = $this->user->transactions()->leftJoin('category_transaction', 'category_transaction.transaction_id', '=', 'transactions.id')->whereNull('category_transaction.id')->whereIn('transaction_journals.id', $journalIds);
     if ($accounts->count() > 0) {
         $accountIds = $accounts->pluck('id')->toArray();
         $secondQuery->whereIn('transactions.account_id', $accountIds);
     }
     // this second set REALLY doesn't have any categories.
     $secondSet = $secondQuery->get(['transactions.transaction_journal_id']);
     $allIds = $secondSet->pluck('transaction_journal_id')->toArray();
     $return = $this->user->transactionJournals()->sortCorrectly()->expanded()->whereIn('transaction_journals.id', $allIds)->get(TransactionJournal::queryFields());
     return $return;
 }