/** * @param Collection $accounts * * @return Collection */ public function getBillsForAccounts(Collection $accounts) : Collection { $fields = ['bills.id', 'bills.created_at', 'bills.updated_at', 'bills.deleted_at', 'bills.user_id', 'bills.name', 'bills.match', 'bills.amount_min', 'bills.amount_max', 'bills.date', 'bills.repeat_freq', 'bills.skip', 'bills.automatch', 'bills.active', 'bills.name_encrypted', 'bills.match_encrypted']; $ids = $accounts->pluck('id')->toArray(); $set = $this->user->bills()->leftJoin('transaction_journals', function (JoinClause $join) { $join->on('transaction_journals.bill_id', '=', 'bills.id')->whereNull('transaction_journals.deleted_at'); })->leftJoin('transactions', function (JoinClause $join) { $join->on('transaction_journals.id', '=', 'transactions.transaction_journal_id')->where('transactions.amount', '<', 0); })->whereIn('transactions.account_id', $ids)->whereNull('transaction_journals.deleted_at')->groupBy($fields)->get($fields); $set = $set->sortBy(function (Bill $bill) { $int = $bill->active == 1 ? 0 : 1; return $int . strtolower($bill->name); }); return $set; }