. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; use FireflyIII\Events\StoredTransactionGroup; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Services\Internal\Update\GroupCloneService; use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use JsonException; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; /** * Class CreateController */ class CreateController extends Controller { private TransactionGroupRepositoryInterface $repository; /** * CreateController constructor. * */ public function __construct() { parent::__construct(); $this->middleware( function ($request, $next) { app('view')->share('title', (string)trans('firefly.transactions')); app('view')->share('mainTitleIcon', 'fa-exchange'); $this->repository = app(TransactionGroupRepositoryInterface::class); return $next($request); } ); } /** * @param Request $request * * @return JsonResponse */ public function cloneGroup(Request $request): JsonResponse { $groupId = (int)$request->get('id'); if (0 !== $groupId) { $group = $this->repository->find($groupId); if (null !== $group) { /** @var GroupCloneService $service */ $service = app(GroupCloneService::class); $newGroup = $service->cloneGroup($group); // event! event(new StoredTransactionGroup($newGroup, true, true)); app('preferences')->mark(); $title = $newGroup->title ?? $newGroup->transactionJournals->first()->description; $link = route('transactions.show', [$newGroup->id]); session()->flash('success', trans('firefly.stored_journal', ['description' => $title])); session()->flash('success_url', $link); return response()->json(['redirect' => route('transactions.show', [$newGroup->id])]); } } return response()->json(['redirect' => route('transactions.show', [$groupId])]); } /** * Create a new transaction group. * * @param string|null $objectType * * @return Factory|View * @throws FireflyException * @throws JsonException * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function create(?string $objectType) { app('preferences')->mark(); $sourceId = (int)request()->get('source'); $destinationId = (int)request()->get('destination'); /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); $cash = $accountRepository->getCashAccount(); $preFilled = session()->has('preFilled') ? session('preFilled') : []; $subTitle = (string)trans(sprintf('breadcrumbs.create_%s', strtolower((string)$objectType))); $subTitleIcon = 'fa-plus'; $optionalFields = app('preferences')->get('transaction_journal_optional_fields', [])->data; $allowedOpposingTypes = config('firefly.allowed_opposing_types'); $accountToTypes = config('firefly.account_to_transaction'); $defaultCurrency = app('amount')->getDefaultCurrency(); $previousUrl = $this->rememberPreviousUrl('transactions.create.url'); $parts = parse_url($previousUrl); $search = sprintf('?%s', $parts['query'] ?? ''); $previousUrl = str_replace($search, '', $previousUrl); session()->put('preFilled', $preFilled); return view( 'transactions.create', compact( 'subTitleIcon', 'cash', 'objectType', 'subTitle', 'defaultCurrency', 'previousUrl', 'optionalFields', 'preFilled', 'allowedOpposingTypes', 'accountToTypes', 'sourceId', 'destinationId' ) ); } }