diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 2f2d480b73..6dcb2e3af0 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -166,7 +166,7 @@ class ReportController extends Controller */ if ($start->between($first, $last) || $end->between($first, $last)) { $exists = true; - $journals = $repos->journalsInPeriod($accounts, [], $start, $end); + $journals = $repos->journalsInPeriod(new Collection([$account]), [], $start, $end); } /* diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 4e9b33f609..9e7ea99f6b 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -82,13 +82,29 @@ class AccountRepository implements AccountRepositoryInterface */ public function earnedInPeriod(Collection $accounts, Carbon $start, Carbon $end): string { - $incomes = $this->incomesInPeriod($accounts, $start, $end); - $sum = '0'; - foreach ($incomes as $entry) { - $amount = TransactionJournal::amount($entry); - $sum = bcadd($sum, $amount); + $query = $this->user->transactionjournals()->expanded()->sortCorrectly() + ->transactionTypes([TransactionType::DEPOSIT, TransactionType::TRANSFER]); + + if ($end >= $start) { + $query->before($end)->after($start); } + if ($accounts->count() > 0) { + $accountIds = $accounts->pluck('id')->toArray(); + $query->leftJoin( + 'transactions as destination', function (JoinClause $join) { + $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id')->where('destination.amount', '>', 0); + } + ); + $query->whereIn('destination.account_id', $accountIds); + + } + // remove group by + $query->getQuery()->getQuery()->groups = null; + + // that should do it: + $sum = strval($query->sum('destination.amount')); + return $sum; } @@ -522,13 +538,29 @@ class AccountRepository implements AccountRepositoryInterface */ public function spentInPeriod(Collection $accounts, Carbon $start, Carbon $end): string { - $incomes = $this->expensesInPeriod($accounts, $start, $end); - $sum = '0'; - foreach ($incomes as $entry) { - $amount = TransactionJournal::amountPositive($entry); - $sum = bcadd($sum, $amount); + /** @var HasMany $query */ + $query = $this->user->transactionjournals()->expanded()->sortCorrectly() + ->transactionTypes([TransactionType::WITHDRAWAL, TransactionType::TRANSFER]); + if ($end >= $start) { + $query->before($end)->after($start); } + 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->whereIn('source.account_id', $accountIds); + + } + // remove group by + $query->getQuery()->getQuery()->groups = null; + + // that should do it: + $sum = strval($query->sum('source.amount')); + return $sum; }