/**
  * @param JournalFormRequest         $request
  * @param JournalRepositoryInterface $repository
  * @param AttachmentHelperInterface  $att
  * @param TransactionJournal         $journal
  *
  * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
  */
 public function update(JournalFormRequest $request, JournalRepositoryInterface $repository, AttachmentHelperInterface $att, TransactionJournal $journal)
 {
     $journalData = $request->getJournalData();
     $repository->update($journal, $journalData);
     // save attachments:
     $att->saveAttachmentsForModel($journal);
     // flash errors
     if (count($att->getErrors()->get('attachments')) > 0) {
         Session::flash('error', $att->getErrors()->get('attachments'));
     }
     // flash messages
     if (count($att->getMessages()->get('attachments')) > 0) {
         Session::flash('info', $att->getMessages()->get('attachments'));
     }
     event(new TransactionJournalUpdated($journal));
     // update, get events by date and sort DESC
     $type = strtolower($journal->transaction_type_type ?? TransactionJournal::transactionTypeStr($journal));
     Session::flash('success', strval(trans('firefly.updated_' . $type, ['description' => e($journalData['description'])])));
     Preferences::mark();
     if (intval($request->get('return_to_edit')) === 1) {
         // set value so edit routine will not overwrite URL:
         Session::put('transactions.edit.fromUpdate', true);
         return redirect(route('transactions.edit', [$journal->id]))->withInput(['return_to_edit' => 1]);
     }
     // redirect to previous URL.
     return redirect(session('transactions.edit.url'));
 }
 /**
  * @param Request            $request
  * @param TransactionJournal $journal
  *
  * @return array
  */
 private function arrayFromJournal(Request $request, TransactionJournal $journal) : array
 {
     $sourceAccounts = TransactionJournal::sourceAccountList($journal);
     $destinationAccounts = TransactionJournal::destinationAccountList($journal);
     $array = ['journal_description' => $request->old('journal_description', $journal->description), 'journal_amount' => TransactionJournal::amountPositive($journal), 'sourceAccounts' => $sourceAccounts, 'journal_source_account_id' => $sourceAccounts->first()->id, 'journal_source_account_name' => $sourceAccounts->first()->name, 'journal_destination_account_id' => $destinationAccounts->first()->id, 'transaction_currency_id' => $request->old('transaction_currency_id', $journal->transaction_currency_id), 'destinationAccounts' => $destinationAccounts, 'what' => strtolower(TransactionJournal::transactionTypeStr($journal)), 'date' => $request->old('date', $journal->date), 'interest_date' => $request->old('interest_date', $journal->interest_date), 'book_date' => $request->old('book_date', $journal->book_date), 'process_date' => $request->old('process_date', $journal->process_date), 'description' => [], 'source_account_id' => [], 'source_account_name' => [], 'destination_account_id' => [], 'destination_account_name' => [], 'amount' => [], 'budget_id' => [], 'category' => []];
     // number of transactions present in old input:
     $previousCount = count($request->old('description'));
     if ($previousCount === 0) {
         // build from scratch
         $transactions = $this->transactionsFromJournal($request, $journal);
         $array['description'] = $transactions['description'];
         $array['source_account_id'] = $transactions['source_account_id'];
         $array['source_account_name'] = $transactions['source_account_name'];
         $array['destination_account_id'] = $transactions['destination_account_id'];
         $array['destination_account_name'] = $transactions['destination_account_name'];
         $array['amount'] = $transactions['amount'];
         $array['budget_id'] = $transactions['budget_id'];
         $array['category'] = $transactions['category'];
         return $array;
     }
     $index = 0;
     while ($index < $previousCount) {
         $description = $request->old('description')[$index] ?? '';
         $destinationId = $request->old('destination_account_id')[$index] ?? 0;
         $destinationName = $request->old('destination_account_name')[$index] ?? '';
         $sourceId = $request->old('source_account_id')[$index] ?? 0;
         $sourceName = $request->old('source_account_name')[$index] ?? '';
         $amount = $request->old('amount')[$index] ?? '';
         $budgetId = $request->old('budget_id')[$index] ?? 0;
         $categoryName = $request->old('category')[$index] ?? '';
         // any transfer not from the source:
         $array['description'][] = $description;
         $array['source_account_id'][] = $sourceId;
         $array['source_account_name'][] = $sourceName;
         $array['destination_account_id'][] = $destinationId;
         $array['destination_account_name'][] = $destinationName;
         $array['amount'][] = $amount;
         $array['budget_id'][] = intval($budgetId);
         $array['category'][] = $categoryName;
         $index++;
     }
     return $array;
 }
 /**
  * @param MassEditJournalRequest     $request
  * @param JournalRepositoryInterface $repository
  *
  * @return mixed
  */
 public function massUpdate(MassEditJournalRequest $request, JournalRepositoryInterface $repository)
 {
     $journalIds = $request->get('journals');
     $count = 0;
     if (is_array($journalIds)) {
         foreach ($journalIds as $journalId) {
             $journal = $repository->find(intval($journalId));
             if ($journal) {
                 // get optional fields:
                 $what = strtolower(TransactionJournal::transactionTypeStr($journal));
                 $sourceAccountId = $request->get('source_account_id')[$journal->id] ?? 0;
                 $sourceAccountName = $request->get('source_account_name')[$journal->id] ?? '';
                 $destAccountId = $request->get('destination_account_id')[$journal->id] ?? 0;
                 $destAccountName = $request->get('destination_account_name')[$journal->id] ?? '';
                 $budgetId = $journal->budgets->first() ? $journal->budgets->first()->id : 0;
                 $category = $request->get('category')[$journal->id];
                 $tags = $journal->tags->pluck('tag')->toArray();
                 // build data array
                 $data = ['id' => $journal->id, 'what' => $what, 'description' => $request->get('description')[$journal->id], 'source_account_id' => intval($sourceAccountId), 'source_account_name' => $sourceAccountName, 'destination_account_id' => intval($destAccountId), 'destination_account_name' => $destAccountName, 'amount' => round($request->get('amount')[$journal->id], 4), 'user' => auth()->user()->id, 'amount_currency_id_amount' => intval($request->get('amount_currency_id_amount_' . $journal->id)), 'date' => new Carbon($request->get('date')[$journal->id]), 'interest_date' => $journal->interest_date, 'book_date' => $journal->book_date, 'process_date' => $journal->process_date, 'budget_id' => $budgetId, 'category' => $category, 'tags' => $tags];
                 // 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(session('transactions.mass-edit.url'));
 }