. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\TransactionGroup; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Rules\System\IsValidOriginUrl; use FireflyIII\Services\Internal\Update\GroupCloneService; use FireflyIII\Support\Facades\Preferences; use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use Safe\Exceptions\UrlException; use function Safe\parse_url; /** * Class CreateController */ final 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', 'bi-shuffle'); $this->repository = app(TransactionGroupRepositoryInterface::class); return $next($request); }); } public function cloneGroup(Request $request): JsonResponse { // validate query, and give error if invalid. $validator = validator(['_from' => $request->input('_from')], ['nullable', 'max:255', new IsValidOriginUrl()]); if ($validator->fails()) { throw new FireflyException(trans('validation.bad_url_parts')); } $from = $request->input('_from'); $groupId = (int) $request->input('id'); if (0 !== $groupId) { $group = $this->repository->find($groupId); if ($group instanceof TransactionGroup) { /** @var GroupCloneService $service */ $service = app(GroupCloneService::class); $newGroup = $service->cloneGroup($group); Preferences::mark(); $title = '' === (string) $newGroup->title ? $newGroup->transactionJournals()->first()->description : $newGroup->title; $link = route('transactions.show', [$newGroup->id]); session()->flash('success', trans('firefly.stored_journal', ['description' => $title])); session()->flash('success_url', $link); if ('edit' === $request->input('redirect')) { return response()->json(['redirect' => route('transactions.edit', [$newGroup->id]).'?_from='.urlencode($from)]); } return response()->json(['redirect' => route('index').$from]); } } return response()->json(['redirect' => route('index').$from]); } /** * Create a new transaction group. * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface * @throws UrlException */ public function create(?string $objectType): Factory|View { 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 = 'bi-plus'; $allowedOpposingTypes = config('firefly.allowed_opposing_types'); $accountToTypes = config('firefly.account_to_transaction'); $previousUrl = $this->rememberPreviousUrl('transactions.create.url'); $parts = parse_url((string) $previousUrl); $search = sprintf('?%s', $parts['query'] ?? ''); $previousUrl = str_replace($search, '', $previousUrl); // map info: $longitude = config('firefly.default_location.longitude'); $latitude = config('firefly.default_location.latitude'); $zoomLevel = config('firefly.default_location.zoom_level'); session()->put('preFilled', $preFilled); return view('transactions.create', [ 'subTitleIcon' => $subTitleIcon, 'cash' => $cash, // 'longitude' => $longitude, // 'latitude' => $latitude, // 'zoomLevel' => $zoomLevel, 'objectType' => $objectType, 'subTitle' => $subTitle, 'previousUrl' => $previousUrl, 'preFilled' => $preFilled, 'allowedOpposingTypes' => $allowedOpposingTypes, 'accountToTypes' => $accountToTypes, 'sourceId' => $sourceId, 'destinationId' => $destinationId, ]); } }