From 3de36901b8797ed153d15149999f19a0a4a9c5ba Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 29 May 2018 07:25:04 +0200 Subject: [PATCH] Fix #1425 --- app/Helpers/Collector/JournalCollector.php | 2 + app/Helpers/Filter/TransactionViewFilter.php | 80 +++++++++++++++++++ .../Transaction/MassController.php | 17 ++-- app/Models/Transaction.php | 7 +- .../Support/TransactionServiceTrait.php | 4 +- .../Internal/Update/JournalUpdateService.php | 10 ++- .../Update/TransactionUpdateService.php | 1 + app/Transformers/TransactionTransformer.php | 4 + resources/views/transactions/mass/edit.twig | 71 ++++++++-------- 9 files changed, 146 insertions(+), 50 deletions(-) create mode 100644 app/Helpers/Filter/TransactionViewFilter.php diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index 79e69f923c..427da305d9 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -32,6 +32,7 @@ use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Helpers\Filter\OpposingAccountFilter; use FireflyIII\Helpers\Filter\PositiveAmountFilter; use FireflyIII\Helpers\Filter\SplitIndicatorFilter; +use FireflyIII\Helpers\Filter\TransactionViewFilter; use FireflyIII\Helpers\Filter\TransferFilter; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; @@ -768,6 +769,7 @@ class JournalCollector implements JournalCollectorInterface NegativeAmountFilter::class => new NegativeAmountFilter, SplitIndicatorFilter::class => new SplitIndicatorFilter, CountAttachmentsFilter::class => new CountAttachmentsFilter, + TransactionViewFilter::class => new TransactionViewFilter, ]; Log::debug(sprintf('Will run %d filters on the set.', \count($this->filters))); foreach ($this->filters as $enabled) { diff --git a/app/Helpers/Filter/TransactionViewFilter.php b/app/Helpers/Filter/TransactionViewFilter.php new file mode 100644 index 0000000000..ea83a62e75 --- /dev/null +++ b/app/Helpers/Filter/TransactionViewFilter.php @@ -0,0 +1,80 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Helpers\Filter; + +use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionType; +use Illuminate\Support\Collection; +use Log; + +/** + * Class TransactionViewFilter. + * + * This filter removes the entry with a negative amount when it's a withdrawal + * And the positive amount when it's a deposit or transfer + * + * This is used in the mass-edit routine. + * + */ +class TransactionViewFilter implements FilterInterface +{ + /** + * @param Collection $set + * + * @return Collection + */ + public function filter(Collection $set): Collection + { + return $set->filter( + function (Transaction $transaction) { + // remove if amount is less than zero and type is withdrawal. + if ($transaction->transaction_type_type === TransactionType::WITHDRAWAL && 1 === bccomp($transaction->transaction_amount, '0')) { + Log::debug( + sprintf( + 'Filtered #%d because amount is %f and type is %s.', $transaction->id, $transaction->transaction_amount, + $transaction->transaction_type_type + ) + ); + + return null; + } + + if ($transaction->transaction_type_type === TransactionType::DEPOSIT && -1 === bccomp($transaction->transaction_amount, '0')) { + Log::debug( + sprintf( + 'Filtered #%d because amount is %f and type is %s.', $transaction->id, $transaction->transaction_amount, + $transaction->transaction_type_type + ) + ); + + return null; + } + Log::debug( + sprintf('#%d: amount is %f and type is %s.', $transaction->id, $transaction->transaction_amount, $transaction->transaction_type_type) + ); + + return $transaction; + } + ); + } +} diff --git a/app/Http/Controllers/Transaction/MassController.php b/app/Http/Controllers/Transaction/MassController.php index e404300f61..8b78a9ccb9 100644 --- a/app/Http/Controllers/Transaction/MassController.php +++ b/app/Http/Controllers/Transaction/MassController.php @@ -25,6 +25,7 @@ namespace FireflyIII\Http\Controllers\Transaction; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Filter\NegativeAmountFilter; +use FireflyIII\Helpers\Filter\TransactionViewFilter; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\MassDeleteJournalRequest; use FireflyIII\Http\Requests\MassEditJournalRequest; @@ -145,22 +146,24 @@ class MassController extends Controller $collector->setUser(auth()->user()); $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); $collector->setJournals($journals); - $collector->addFilter(NegativeAmountFilter::class); - $transactions = $collector->getJournals(); + $collector->addFilter(TransactionViewFilter::class); + $collection = $collector->getJournals(); // add some filters: // transform to array - $journals = $transactions->map( + $transactions = $collection->map( function (Transaction $transaction) use ($transformer) { - $result = $transformer->transform($transaction); - - return $result; + $transaction= $transformer->transform($transaction); + // make sure amount is positive: + $transaction['amount'] = app('steam')->positive((string)$transaction['amount']); + $transaction['foreign_amount'] = app('steam')->positive((string)$transaction['foreign_amount']); + return $transaction; } ); - return view('transactions.mass.edit', compact('journals', 'subTitle', 'accounts', 'budgets')); + return view('transactions.mass.edit', compact('transactions', 'subTitle', 'accounts', 'budgets')); } /** diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 14ed95095b..bdd5253e1c 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -27,11 +27,6 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use FireflyIII\Models\TransactionJournal; -use FireflyIII\Models\TransactionCurrency; -use FireflyIII\Models\Category; -use FireflyIII\Models\Budget; -use FireflyIII\Models\Account; /** * Class Transaction. @@ -49,12 +44,14 @@ use FireflyIII\Models\Account; * @property string $account_iban * @property string $account_number * @property string $account_bic + * @property string $account_type * @property string $account_currency_code * @property int $opposing_account_id * @property string $opposing_account_name * @property string $opposing_account_iban * @property string $opposing_account_number * @property string $opposing_account_bic + * @property string $opposing_account_type * @property string $opposing_currency_code * @property int $transaction_budget_id * @property string $transaction_budget_name diff --git a/app/Services/Internal/Support/TransactionServiceTrait.php b/app/Services/Internal/Support/TransactionServiceTrait.php index 3c02b991cd..06fe1fe99c 100644 --- a/app/Services/Internal/Support/TransactionServiceTrait.php +++ b/app/Services/Internal/Support/TransactionServiceTrait.php @@ -99,9 +99,9 @@ trait TransactionServiceTrait * @param int|null $accountId * @param string|null $accountName * - * @return Account + * @return Account|null */ - public function findAccount(?string $expectedType, ?int $accountId, ?string $accountName): Account + public function findAccount(?string $expectedType, ?int $accountId, ?string $accountName): ?Account { $accountId = (int)$accountId; $accountName = (string)$accountName; diff --git a/app/Services/Internal/Update/JournalUpdateService.php b/app/Services/Internal/Update/JournalUpdateService.php index 3964818fd5..8dde0112c2 100644 --- a/app/Services/Internal/Update/JournalUpdateService.php +++ b/app/Services/Internal/Update/JournalUpdateService.php @@ -57,7 +57,7 @@ class JournalUpdateService $service = app(TransactionUpdateService::class); $service->setUser($journal->user); - // create transactions + // create transactions: /** @var TransactionFactory $factory */ $factory = app(TransactionFactory::class); $factory->setUser($journal->user); @@ -105,6 +105,12 @@ class JournalUpdateService // connect tags: $this->connectTags($journal, $data); + // remove category from journal: + $journal->categories()->sync([]); + + // remove budgets from journal: + $journal->budgets()->sync([]); + // update or create custom fields: // store date meta fields (if present): $this->storeMeta($journal, $data, 'interest_date'); @@ -162,6 +168,8 @@ class JournalUpdateService foreach ($journal->transactions as $transaction) { $service->updateCategory($transaction, $category); } + // make journal empty: + $journal->categories()->sync([]); return $journal; } diff --git a/app/Services/Internal/Update/TransactionUpdateService.php b/app/Services/Internal/Update/TransactionUpdateService.php index c2f94d08e3..ee8bcaf9d9 100644 --- a/app/Services/Internal/Update/TransactionUpdateService.php +++ b/app/Services/Internal/Update/TransactionUpdateService.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Services\Internal\Update; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Transaction; use FireflyIII\Services\Internal\Support\TransactionServiceTrait; use FireflyIII\User; diff --git a/app/Transformers/TransactionTransformer.php b/app/Transformers/TransactionTransformer.php index 1956162c06..60a5f75f16 100644 --- a/app/Transformers/TransactionTransformer.php +++ b/app/Transformers/TransactionTransformer.php @@ -31,6 +31,7 @@ use FireflyIII\Models\TransactionType; use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Item; use League\Fractal\TransformerAbstract; +use Log; use Symfony\Component\HttpFoundation\ParameterBag; /** @@ -214,6 +215,7 @@ class TransactionTransformer extends TransformerAbstract // switch on type for consistency switch ($transaction->transaction_type_type) { case TransactionType::WITHDRAWAL: + Log::debug(sprintf('%d is a withdrawal', $transaction->journal_id)); $data['source_id'] = $transaction->account_id; $data['source_name'] = $transaction->account_name; $data['source_iban'] = $transaction->account_iban; @@ -222,6 +224,8 @@ class TransactionTransformer extends TransformerAbstract $data['destination_name'] = $transaction->opposing_account_name; $data['destination_iban'] = $transaction->opposing_account_iban; $data['destination_type'] = $transaction->opposing_account_type; + Log::debug(sprintf('source_id / account_id is %d', $transaction->account_id)); + Log::debug(sprintf('source_name / account_name is "%s"', $transaction->account_name)); break; case TransactionType::DEPOSIT: case TransactionType::TRANSFER: diff --git a/resources/views/transactions/mass/edit.twig b/resources/views/transactions/mass/edit.twig index 1da5e566db..d6fcaff658 100644 --- a/resources/views/transactions/mass/edit.twig +++ b/resources/views/transactions/mass/edit.twig @@ -1,7 +1,7 @@ {% extends "./layout/default" %} {% block breadcrumbs %} - {{ Breadcrumbs.render(Route.getCurrentRoute.getName, journals) }} + {{ Breadcrumbs.render(Route.getCurrentRoute.getName, transactions) }} {% endblock %} {% block content %} @@ -29,90 +29,91 @@ {{ trans('list.category') }} {{ trans('list.budget') }} - {% for journal in journals %} + {% for transaction in transactions %} {# LINK TO EDIT FORM #} - - + {# DESCRIPTION #} + placeholder="{{ transaction.description }}" name="description[{{ transaction.journal_id }}]" + type="text" value="{{ transaction.description }}"> {# AMOUNT #}
- {{ journal.currency_symbol }} - - + {{ transaction.currency_symbol }} + +
- {% if journal.foreign_amount %} + {% if transaction.foreign_amount %} {# insert foreign data #}
- {{ journal.foreign_currency.symbol }} - - + {{ transaction.foreign_currency_symbol }} + +
{% endif %} {# DATE #} + name="date[{{ transaction.journal_id }}]" type="date" value="{{ transaction.date }}"> {# SOURCE ACCOUNT ID FOR TRANSFER OR WITHDRAWAL #} - {% if journal.transaction_type_type == 'Transfer' or journal.transaction_type_type == 'Withdrawal' %} - {% for account in accounts %} - + + {% endfor %} {% else %} {# SOURCE ACCOUNT NAME FOR DEPOSIT #} - + {% endif %} - {% if journal.transaction_type_type == 'Transfer' or journal.transaction_type_type == 'Deposit' %} + {% if transaction.type == 'Transfer' or transaction.type == 'Deposit' %} {# DESTINATION ACCOUNT NAME FOR TRANSFER AND DEPOSIT #} - {% for account in accounts %} - {% endfor %} {% else %} + {# DESTINATION ACCOUNT NAME FOR EXPENSE #} - + {% endif %} {# category #} - + {# budget #} - {% if journal.transaction_type_type == 'Withdrawal' %} - {% for budget in budgets %} - {% endfor %}