diff --git a/app/Generator/Report/Tag/MonthReportGenerator.php b/app/Generator/Report/Tag/MonthReportGenerator.php index 2b6e3d067d..5f6de0bbc9 100644 --- a/app/Generator/Report/Tag/MonthReportGenerator.php +++ b/app/Generator/Report/Tag/MonthReportGenerator.php @@ -29,6 +29,7 @@ use Carbon\Carbon; use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Generator\Report\Support; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\Filter\DoubleTransactionFilter; use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Helpers\Filter\OpposingAccountFilter; use FireflyIII\Helpers\Filter\PositiveAmountFilter; @@ -216,9 +217,9 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface ->setTypes([TransactionType::WITHDRAWAL, TransactionType::TRANSFER]) ->setTags($this->tags)->withOpposingAccount(); $collector->removeFilter(TransferFilter::class); - $collector->addFilter(OpposingAccountFilter::class); $collector->addFilter(PositiveAmountFilter::class); + $collector->addFilter(DoubleTransactionFilter::class); $transactions = $collector->getTransactions(); $this->expenses = $transactions; diff --git a/app/Helpers/Collector/TransactionCollector.php b/app/Helpers/Collector/TransactionCollector.php index 5e7456b938..46c4b200a2 100644 --- a/app/Helpers/Collector/TransactionCollector.php +++ b/app/Helpers/Collector/TransactionCollector.php @@ -28,6 +28,7 @@ use Carbon\Carbon; use DB; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Filter\CountAttachmentsFilter; +use FireflyIII\Helpers\Filter\DoubleTransactionFilter; use FireflyIII\Helpers\Filter\FilterInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Helpers\Filter\NegativeAmountFilter; @@ -53,26 +54,14 @@ use Log; /** * Class TransactionCollector * - * @codeCoverageIgnore + * @codeCoverageIgnore */ class TransactionCollector implements TransactionCollectorInterface { - /** - * Constructor. - */ - public function __construct() - { - if ('testing' === env('APP_ENV')) { - Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); - } - } - - /** @var array */ private $accountIds = []; /** @var int */ private $count = 0; - /** @var array */ private $fields = [ @@ -139,6 +128,16 @@ class TransactionCollector implements TransactionCollectorInterface /** @var User */ private $user; + /** + * Constructor. + */ + public function __construct() + { + if ('testing' === env('APP_ENV')) { + Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); + } + } + /** * @param string $filter * @@ -253,6 +252,30 @@ class TransactionCollector implements TransactionCollectorInterface return $this->count; } + /** + * @return LengthAwarePaginator + * @throws FireflyException + */ + public function getPaginatedTransactions(): LengthAwarePaginator + { + if (true === $this->run) { + throw new FireflyException('Cannot getPaginatedTransactions after run in TransactionCollector.'); + } + $this->count(); + $set = $this->getTransactions(); + $journals = new LengthAwarePaginator($set, $this->count, $this->limit, $this->page); + + return $journals; + } + + /** + * @return EloquentBuilder + */ + public function getQuery(): EloquentBuilder + { + return $this->query; + } + /** * @return Collection */ @@ -309,30 +332,6 @@ class TransactionCollector implements TransactionCollectorInterface return $set; } - /** - * @return LengthAwarePaginator - * @throws FireflyException - */ - public function getPaginatedTransactions(): LengthAwarePaginator - { - if (true === $this->run) { - throw new FireflyException('Cannot getPaginatedTransactions after run in TransactionCollector.'); - } - $this->count(); - $set = $this->getTransactions(); - $journals = new LengthAwarePaginator($set, $this->count, $this->limit, $this->page); - - return $journals; - } - - /** - * @return EloquentBuilder - */ - public function getQuery(): EloquentBuilder - { - return $this->query; - } - /** * @return TransactionCollectorInterface */ @@ -784,14 +783,15 @@ class TransactionCollector implements TransactionCollectorInterface { // create all possible filters: $filters = [ - InternalTransferFilter::class => new InternalTransferFilter($this->accountIds), - OpposingAccountFilter::class => new OpposingAccountFilter($this->accountIds), - TransferFilter::class => new TransferFilter, - PositiveAmountFilter::class => new PositiveAmountFilter, - NegativeAmountFilter::class => new NegativeAmountFilter, - SplitIndicatorFilter::class => new SplitIndicatorFilter, - CountAttachmentsFilter::class => new CountAttachmentsFilter, - TransactionViewFilter::class => new TransactionViewFilter, + InternalTransferFilter::class => new InternalTransferFilter($this->accountIds), + OpposingAccountFilter::class => new OpposingAccountFilter($this->accountIds), + TransferFilter::class => new TransferFilter, + PositiveAmountFilter::class => new PositiveAmountFilter, + NegativeAmountFilter::class => new NegativeAmountFilter, + SplitIndicatorFilter::class => new SplitIndicatorFilter, + CountAttachmentsFilter::class => new CountAttachmentsFilter, + TransactionViewFilter::class => new TransactionViewFilter, + DoubleTransactionFilter::class => new DoubleTransactionFilter, ]; Log::debug(sprintf('Will run %d filters on the set.', \count($this->filters))); foreach ($this->filters as $enabled) { diff --git a/app/Helpers/Filter/DoubleTransactionFilter.php b/app/Helpers/Filter/DoubleTransactionFilter.php new file mode 100644 index 0000000000..ce35b22c60 --- /dev/null +++ b/app/Helpers/Filter/DoubleTransactionFilter.php @@ -0,0 +1,60 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Helpers\Filter; + + +use FireflyIII\Models\Transaction; +use Illuminate\Support\Collection; + +/** + * + * Used when the final collection contains double transactions, which can happen when viewing the tag report. + * Class DoubleTransactionFilter + */ +class DoubleTransactionFilter implements FilterInterface +{ + + /** + * Apply the filter. + * + * @param Collection $set + * + * @return Collection + */ + public function filter(Collection $set): Collection + { + $count = []; + $result = new Collection; + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $id = (int)$transaction->id; + $count[$id] = isset($count[$id]) ? $count[$id] + 1 : 1; + if (1 === $count[$id]) { + $result->push($transaction); + } + } + + return $result; + } +} \ No newline at end of file