. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\MassDeleteJournalRequest; use FireflyIII\Http\Requests\MassEditJournalRequest; use FireflyIII\Models\AccountType; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Transformers\TransactionTransformer; use Illuminate\Support\Collection; use Preferences; use Symfony\Component\HttpFoundation\ParameterBag; use View; use Illuminate\View\View as IlluminateView; /** * Class MassController. */ class MassController extends Controller { /** @var JournalRepositoryInterface */ private $repository; /** * */ public function __construct() { parent::__construct(); $this->middleware( function ($request, $next) { app('view')->share('title', trans('firefly.transactions')); app('view')->share('mainTitleIcon', 'fa-repeat'); $this->repository = app(JournalRepositoryInterface::class); return $next($request); } ); } /** * @param Collection $journals * * @return IlluminateView */ public function delete(Collection $journals): IlluminateView { $subTitle = trans('firefly.mass_delete_journals'); // put previous url in session $this->rememberPreviousUri('transactions.mass-delete.uri'); return view('transactions.mass.delete', compact('journals', 'subTitle')); } /** * @param MassDeleteJournalRequest $request * * @return mixed */ public function destroy(MassDeleteJournalRequest $request) { $ids = $request->get('confirm_mass_delete'); $set = new Collection; if (\is_array($ids)) { /** @var string $journalId */ foreach ($ids as $journalId) { /** @var TransactionJournal $journal */ $journal = $this->repository->findNull((int)$journalId); if (null !== $journal && (int)$journalId === $journal->id) { $set->push($journal); } } } unset($journal); $count = 0; /** @var TransactionJournal $journal */ foreach ($set as $journal) { $this->repository->destroy($journal); ++$count; } Preferences::mark(); session()->flash('success', trans('firefly.mass_deleted_transactions_success', ['amount' => $count])); // redirect to previous URL: return redirect($this->getPreviousUri('transactions.mass-delete.uri')); } /** * @param Collection $journals * * @return View */ public function edit(Collection $journals): IlluminateView { $subTitle = trans('firefly.mass_edit_journals'); /** @var AccountRepositoryInterface $repository */ $repository = app(AccountRepositoryInterface::class); $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); // get budgets /** @var BudgetRepositoryInterface $budgetRepository */ $budgetRepository = app(BudgetRepositoryInterface::class); $budgets = $budgetRepository->getBudgets(); // put previous url in session $this->rememberPreviousUri('transactions.mass-edit.uri'); // use the collector to get them. $transformer = new TransactionTransformer(new ParameterBag); /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setUser(auth()->user()); $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); $collector->setJournals($journals); $collector->addFilter(NegativeAmountFilter::class); $transactions = $collector->getJournals(); // add some filters: // transform to array $journals = $transactions->map( function (Transaction $transaction) use ($transformer) { $result = $transformer->transform($transaction); return $result; } ); return view('transactions.mass.edit', compact('journals', 'subTitle', 'accounts', 'budgets')); } /** * @param MassEditJournalRequest $request * @param JournalRepositoryInterface $repository * * @return mixed */ public function update(MassEditJournalRequest $request, JournalRepositoryInterface $repository) { $journalIds = $request->get('journals'); $count = 0; if (is_array($journalIds)) { foreach ($journalIds as $journalId) { $journal = $repository->find((int)$journalId); if (null !== $journal) { // get optional fields: $what = strtolower($this->repository->getTransactionType($journal)); $sourceAccountId = $request->get('source_account_id')[$journal->id] ?? null; $currencyId = $request->get('transaction_currency_id')[$journal->id] ?? 1; $sourceAccountName = $request->get('source_account_name')[$journal->id] ?? null; $destAccountId = $request->get('destination_account_id')[$journal->id] ?? null; $destAccountName = $request->get('destination_account_name')[$journal->id] ?? null; $budgetId = (int)($request->get('budget_id')[$journal->id] ?? 0.0); $category = $request->get('category')[$journal->id]; $tags = $journal->tags->pluck('tag')->toArray(); $amount = round($request->get('amount')[$journal->id], 12); $foreignAmount = isset($request->get('foreign_amount')[$journal->id]) ? round($request->get('foreign_amount')[$journal->id], 12) : null; $foreignCurrencyId = isset($request->get('foreign_currency_id')[$journal->id]) ? (int)$request->get('foreign_currency_id')[$journal->id] : null; // build data array $data = [ 'id' => $journal->id, 'what' => $what, 'description' => $request->get('description')[$journal->id], 'date' => new Carbon($request->get('date')[$journal->id]), 'bill_id' => null, 'bill_name' => null, 'notes' => $repository->getNoteText($journal), 'transactions' => [[ 'category_id' => null, 'category_name' => $category, 'budget_id' => (int)$budgetId, 'budget_name' => null, 'source_id' => (int)$sourceAccountId, 'source_name' => $sourceAccountName, 'destination_id' => (int)$destAccountId, 'destination_name' => $destAccountName, 'amount' => $amount, 'identifier' => 0, 'reconciled' => false, 'currency_id' => (int)$currencyId, 'currency_code' => null, 'description' => null, 'foreign_amount' => $foreignAmount, 'foreign_currency_id' => $foreignCurrencyId, 'foreign_currency_code' => null, //'native_amount' => $amount, //'source_amount' => $amount, //'foreign_amount' => $foreignAmount, //'destination_amount' => $foreignAmount, //'amount' => $foreignAmount, ]], 'currency_id' => $foreignCurrencyId, 'tags' => $tags, 'interest_date' => $journal->interest_date, 'book_date' => $journal->book_date, 'process_date' => $journal->process_date, ]; // call repository update function. $repository->update($journal, $data); ++$count; } } } Preferences::mark(); session()->flash('success', trans('firefly.mass_edited_transactions_success', ['amount' => $count])); // redirect to previous URL: return redirect($this->getPreviousUri('transactions.mass-edit.uri')); } }