diff --git a/app/Helpers/Report/ReportQuery.php b/app/Helpers/Report/ReportQuery.php index 6775efa21d..b89602a2e9 100644 --- a/app/Helpers/Report/ReportQuery.php +++ b/app/Helpers/Report/ReportQuery.php @@ -20,163 +20,6 @@ use Illuminate\Support\Collection; */ class ReportQuery implements ReportQueryInterface { - /** - * See ReportQueryInterface::incomeInPeriodCorrected. - * - * This method's length is caused mainly by the query build stuff. Therefor: - * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * - * @param Carbon $start - * @param Carbon $end - * @param bool $includeShared - * - * @return Collection - * - */ - public function expenseInPeriodCorrected(Carbon $start, Carbon $end, $includeShared = false) - { - $query = $this->queryJournalsWithTransactions($start, $end); - if ($includeShared === false) { - $query->where( - function (Builder $query) { - $query->where( - function (Builder $q) { // only get withdrawals not from a shared account - $q->where('transaction_types.type', TransactionType::WITHDRAWAL); - $q->where('acm_from.data', '!=', '"sharedAsset"'); - } - ); - $query->orWhere( - function (Builder $q) { // and transfers from a shared account. - $q->where('transaction_types.type', TransactionType::TRANSFER); - $q->where('acm_to.data', '=', '"sharedAsset"'); - $q->where('acm_from.data', '!=', '"sharedAsset"'); - } - ); - } - ); - } else { - $query->where('transaction_types.type', TransactionType::WITHDRAWAL); // any withdrawal is fine. - } - $query->orderBy('transaction_journals.date'); - $data = $query->get( // get everything - ['transaction_journals.*', 'transaction_types.type', 'ac_to.name as name', 'ac_to.id as account_id', 'ac_to.encrypted as account_encrypted'] - ); - - $data->each( - function (TransactionJournal $journal) { - if (intval($journal->account_encrypted) == 1) { - $journal->name = Crypt::decrypt($journal->name); - } - } - ); - - return $data; - } - - /** - * Get a users accounts combined with various meta-data related to the start and end date. - * - * @param Carbon $start - * @param Carbon $end - * @param bool $includeShared - * - * @return Collection - */ - public function getAllAccounts(Carbon $start, Carbon $end, $includeShared = false) - { - $query = Auth::user()->accounts()->orderBy('accounts.name', 'ASC') - ->accountTypeIn(['Default account', 'Asset account', 'Cash account']); - if ($includeShared === false) { - $query->leftJoin( - 'account_meta', function (JoinClause $join) { - $join->on('account_meta.account_id', '=', 'accounts.id')->where('account_meta.name', '=', 'accountRole'); - } - ) - ->where( - function (Builder $query) { - - $query->where('account_meta.data', '!=', '"sharedAsset"'); - $query->orWhereNull('account_meta.data'); - - } - ); - } - $set = $query->get(['accounts.*']); - - return $set; - } - - - /** - * This method works the same way as ReportQueryInterface::incomeInPeriod does, but instead of returning results - * will simply list the transaction journals only. This should allow any follow up counting to be accurate with - * regards to tags. - * - * This method returns all "income" journals in a certain period, which are both transfers from a shared account - * and "ordinary" deposits. The query used is almost equal to ReportQueryInterface::journalsByRevenueAccount but it does - * not group and returns different fields. - * - * @param Carbon $start - * @param Carbon $end - * @param bool $includeShared - * - * @return Collection - */ - public function incomeInPeriodCorrected(Carbon $start, Carbon $end, $includeShared = false) - { - $query = $this->queryJournalsWithTransactions($start, $end); - if ($includeShared === false) { - // only get deposits not to a shared account - // and transfers to a shared account. - $query->where( - function (Builder $query) { - $query->where( - function (Builder $q) { - $q->where('transaction_types.type', TransactionType::DEPOSIT); - $q->where('acm_to.data', '!=', '"sharedAsset"'); - } - ); - $query->orWhere( - function (Builder $q) { - $q->where('transaction_types.type', TransactionType::TRANSFER); - $q->where('acm_from.data', '=', '"sharedAsset"'); - $q->where('acm_to.data', '!=', '"sharedAsset"'); - } - ); - } - ); - } else { - // any deposit is fine. - $query->where('transaction_types.type', TransactionType::DEPOSIT); - } - $query->orderBy('transaction_journals.date'); - - // get everything - $data = $query->get( - ['transaction_journals.*', 'transaction_types.type', 'ac_from.name as name', 'ac_from.id as account_id', 'ac_from.encrypted as account_encrypted'] - ); - - $data->each( - function (TransactionJournal $journal) { - if (intval($journal->account_encrypted) == 1) { - $journal->name = Crypt::decrypt($journal->name); - } - } - ); - $data = $data->filter( - function (TransactionJournal $journal) { - if ($journal->amount != 0) { - return $journal; - } - - return null; - } - ); - - return $data; - } - /** * Covers tags * diff --git a/app/Helpers/Report/ReportQueryInterface.php b/app/Helpers/Report/ReportQueryInterface.php index fa45453b3d..3f0913ad14 100644 --- a/app/Helpers/Report/ReportQueryInterface.php +++ b/app/Helpers/Report/ReportQueryInterface.php @@ -15,22 +15,6 @@ use Illuminate\Support\Collection; interface ReportQueryInterface { - /** - * See ReportQueryInterface::incomeInPeriodCorrected - * - * This method returns all "expense" journals in a certain period, which are both transfers to a shared account - * and "ordinary" withdrawals. The query used is almost equal to ReportQueryInterface::journalsByRevenueAccount but it does - * not group and returns different fields. - * - * @param Carbon $start - * @param Carbon $end - * @param bool $includeShared - * - * @return Collection - * - */ - public function expenseInPeriodCorrected(Carbon $start, Carbon $end, $includeShared = false); - /** * See ReportQueryInterface::incomeInPeriodCorrected * @@ -47,30 +31,6 @@ interface ReportQueryInterface */ public function expenseInPeriodCorrectedForList(Carbon $start, Carbon $end, Collection $accounts); - /** - * Get a users accounts combined with various meta-data related to the start and end date. - * - * @param Carbon $start - * @param Carbon $end - * @param bool $includeShared - * - * @return Collection - */ - public function getAllAccounts(Carbon $start, Carbon $end, $includeShared = false); - - /** - * This method works the same way as ReportQueryInterface::incomeInPeriod does, but instead of returning results - * will simply list the transaction journals only. This should allow any follow up counting to be accurate with - * regards to tags. - * - * @param Carbon $start - * @param Carbon $end - * @param bool $includeShared - * - * @return Collection - */ - public function incomeInPeriodCorrected(Carbon $start, Carbon $end, $includeShared = false); - /** * This method works the same way as ReportQueryInterface::incomeInPeriod does, but instead of returning results * will simply list the transaction journals only. This should allow any follow up counting to be accurate with diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index 9dc2be7629..5c335c8f49 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -178,7 +178,7 @@ class JsonController extends Controller * * @return \Symfony\Component\HttpFoundation\Response */ - public function boxIn(ReportQueryInterface $reportQuery) + public function boxIn(ReportQueryInterface $reportQuery, AccountRepositoryInterface $accountRepository) { $start = Session::get('start', Carbon::now()->startOfMonth()); $end = Session::get('end', Carbon::now()->endOfMonth()); @@ -191,8 +191,8 @@ class JsonController extends Controller if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } - - $amount = $reportQuery->incomeInPeriodCorrected($start, $end, true)->sum('amount'); + $accounts = $accountRepository->getAccounts(['Default account', 'Asset account', 'Cash account']); + $amount = $reportQuery->incomeInPeriodCorrectedForList($start, $end, $accounts)->sum('amount'); $data = ['box' => 'in', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; $cache->store($data); @@ -205,11 +205,12 @@ class JsonController extends Controller * * @return \Symfony\Component\HttpFoundation\Response */ - public function boxOut(ReportQueryInterface $reportQuery) + public function boxOut(ReportQueryInterface $reportQuery, AccountRepositoryInterface $accountRepository) { $start = Session::get('start', Carbon::now()->startOfMonth()); $end = Session::get('end', Carbon::now()->endOfMonth()); + $accounts = $accountRepository->getAccounts(['Default account', 'Asset account', 'Cash account']); // works for json too! $cache = new CacheProperties; @@ -220,7 +221,7 @@ class JsonController extends Controller return Response::json($cache->get()); // @codeCoverageIgnore } - $amount = $reportQuery->expenseInPeriodCorrected($start, $end, true)->sum('amount'); + $amount = $reportQuery->expenseInPeriodCorrectedForList($start, $end, $accounts)->sum('amount'); $amount = $amount * -1; $data = ['box' => 'out', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount];