mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 10:47:00 +00:00 
			
		
		
		
	Some extended code for the category report.
This commit is contained in:
		| @@ -6,6 +6,7 @@ namespace FireflyIII\Helpers\Collector; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use Crypt; | ||||
| use DB; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Models\Budget; | ||||
| @@ -16,6 +17,7 @@ use FireflyIII\Models\TransactionType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Database\Eloquent\Builder as EloquentBuilder; | ||||
| use Illuminate\Database\Query\JoinClause; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use Log; | ||||
| @@ -30,9 +32,10 @@ use Log; | ||||
| class JournalCollector implements JournalCollectorInterface | ||||
| { | ||||
|  | ||||
|     /** @var array */ | ||||
|     private $accountIds = []; | ||||
|     /** @var  int */ | ||||
|     private $count = 0; | ||||
|  | ||||
|     /** @var array */ | ||||
|     private $fields | ||||
|         = [ | ||||
| @@ -63,6 +66,8 @@ class JournalCollector implements JournalCollectorInterface | ||||
|     /** @var  bool */ | ||||
|     private $joinedCategory = false; | ||||
|     /** @var bool */ | ||||
|     private $joinedOpposing = false; | ||||
|     /** @var bool */ | ||||
|     private $joinedTag = false; | ||||
|     /** @var  int */ | ||||
|     private $limit; | ||||
| @@ -112,6 +117,16 @@ class JournalCollector implements JournalCollectorInterface | ||||
|         return $this->count; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return JournalCollectorInterface | ||||
|      */ | ||||
|     public function disableFilter(): JournalCollectorInterface | ||||
|     { | ||||
|         $this->filterTransfers = false; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Collection | ||||
|      */ | ||||
| @@ -133,6 +148,42 @@ class JournalCollector implements JournalCollectorInterface | ||||
|         return $set; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return JournalCollectorInterface | ||||
|      */ | ||||
|     public function getOpposingAccount(): JournalCollectorInterface | ||||
|     { | ||||
|         $this->joinOpposingTables(); | ||||
|  | ||||
|         $accountIds = $this->accountIds; | ||||
|         $this->query->where( | ||||
|             function (EloquentBuilder $q1) use ($accountIds) { | ||||
|                 // set 1 | ||||
|                 $q1->where( | ||||
|                     function (EloquentBuilder $q2) use ($accountIds) { | ||||
|                         // transactions.account_id in set | ||||
|                         $q2->whereIn('transactions.account_id', $accountIds); | ||||
|                         // opposing.account_id not in set | ||||
|                         $q2->whereNotIn('opposing.account_id', $accountIds); | ||||
|  | ||||
|                     } | ||||
|                 ); | ||||
|                 // or set 2 | ||||
|                 $q1->orWhere( | ||||
|                     function (EloquentBuilder $q3) use ($accountIds) { | ||||
|                         // transactions.account_id not in set | ||||
|                         $q3->whereNotIn('transactions.account_id', $accountIds); | ||||
|                         // B in set | ||||
|                         // opposing.account_id not in set | ||||
|                         $q3->whereIn('opposing.account_id', $accountIds); | ||||
|                     } | ||||
|                 ); | ||||
|             } | ||||
|         ); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return LengthAwarePaginator | ||||
|      * @throws FireflyException | ||||
| @@ -159,12 +210,15 @@ class JournalCollector implements JournalCollectorInterface | ||||
|         if ($accounts->count() > 0) { | ||||
|             $accountIds = $accounts->pluck('id')->toArray(); | ||||
|             $this->query->whereIn('transactions.account_id', $accountIds); | ||||
|             Log::debug(sprintf('setAccounts: %s', join(', ', $accountIds))); | ||||
|             $this->accountIds = $accountIds; | ||||
|         } | ||||
|  | ||||
|         if ($accounts->count() > 1) { | ||||
|             $this->filterTransfers = true; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
| @@ -179,6 +233,7 @@ class JournalCollector implements JournalCollectorInterface | ||||
|         if ($accounts->count() > 0) { | ||||
|             $accountIds = $accounts->pluck('id')->toArray(); | ||||
|             $this->query->whereIn('transactions.account_id', $accountIds); | ||||
|             $this->accountIds = $accountIds; | ||||
|         } | ||||
|  | ||||
|         if ($accounts->count() > 1) { | ||||
| @@ -223,6 +278,29 @@ class JournalCollector implements JournalCollectorInterface | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $categories | ||||
|      * | ||||
|      * @return JournalCollectorInterface | ||||
|      */ | ||||
|     public function setCategories(Collection $categories): JournalCollectorInterface | ||||
|     { | ||||
|         $categoryIds = $categories->pluck('id')->toArray(); | ||||
|         if (count($categoryIds) === 0) { | ||||
|             return $this; | ||||
|         } | ||||
|         $this->joinCategoryTables(); | ||||
|  | ||||
|         $this->query->where( | ||||
|             function (EloquentBuilder $q) use ($categoryIds) { | ||||
|                 $q->whereIn('category_transaction.category_id', $categoryIds); | ||||
|                 $q->orWhereIn('category_transaction_journal.category_id', $categoryIds); | ||||
|             } | ||||
|         ); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Category $category | ||||
|      * | ||||
| @@ -389,6 +467,7 @@ class JournalCollector implements JournalCollectorInterface | ||||
|             $set = $set->filter( | ||||
|                 function (Transaction $transaction) { | ||||
|                     if (!($transaction->transaction_type_type === TransactionType::TRANSFER && bccomp($transaction->transaction_amount, '0') === -1)) { | ||||
|  | ||||
|                         Log::debug( | ||||
|                             sprintf( | ||||
|                                 'Included journal #%d (transaction #%d) because its a %s with amount %f', | ||||
| @@ -443,6 +522,24 @@ class JournalCollector implements JournalCollectorInterface | ||||
|             $this->joinedCategory = true; | ||||
|             $this->query->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); | ||||
|             $this->query->leftJoin('category_transaction', 'category_transaction.transaction_id', '=', 'transactions.id'); | ||||
|             $this->fields[] = 'category_transaction_journal.category_id as transaction_journal_category_id'; | ||||
|             $this->fields[] = 'category_transaction.category_id as transaction_category_id'; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private function joinOpposingTables() | ||||
|     { | ||||
|         if (!$this->joinedOpposing) { | ||||
|             // join opposing transaction (hard): | ||||
|             $this->query->leftJoin( | ||||
|                 'transactions as opposing', function (JoinClause $join) { | ||||
|                 $join->on('opposing.transaction_journal_id', '=', 'transactions.transaction_journal_id') | ||||
|                      ->where('opposing.identifier', '=', 'transactions.identifier') | ||||
|                      ->where('opposing.amount', '=', DB::raw('transactions.amount * -1')); | ||||
|             } | ||||
|             ); | ||||
|  | ||||
|             $this->fields[] = 'opposing.account_id as opposing_account_id'; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -481,5 +578,4 @@ class JournalCollector implements JournalCollectorInterface | ||||
|         return $query; | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -12,6 +12,7 @@ | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Helpers\Collector; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\Category; | ||||
| @@ -32,11 +33,21 @@ interface JournalCollectorInterface | ||||
|      */ | ||||
|     public function count(): int; | ||||
|  | ||||
|     /** | ||||
|      * @return JournalCollectorInterface | ||||
|      */ | ||||
|     public function disableFilter(): JournalCollectorInterface; | ||||
|  | ||||
|     /** | ||||
|      * @return Collection | ||||
|      */ | ||||
|     public function getJournals(): Collection; | ||||
|  | ||||
|     /** | ||||
|      * @return JournalCollectorInterface | ||||
|      */ | ||||
|     public function getOpposingAccount(): JournalCollectorInterface; | ||||
|  | ||||
|     /** | ||||
|      * @return LengthAwarePaginator | ||||
|      */ | ||||
| @@ -68,6 +79,13 @@ interface JournalCollectorInterface | ||||
|      */ | ||||
|     public function setBudget(Budget $budget): JournalCollectorInterface; | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $categories | ||||
|      * | ||||
|      * @return JournalCollectorInterface | ||||
|      */ | ||||
|     public function setCategories(Collection $categories): JournalCollectorInterface; | ||||
|  | ||||
|     /** | ||||
|      * @param Category $category | ||||
|      * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user