with([ 'file', 'tourDates', ]) ->when($request->filled('search'), function (Builder $query) use ($request) { $search = $request->input('search'); $query->where(function (Builder $query) use ($search) { $query->where('title', 'LIKE', "%{$search}%") ->orWhere('summary', 'LIKE', "%{$search}%") ->orWhere('origin', 'LIKE', "%{$search}%") ->orWhere('destination', 'LIKE', "%{$search}%"); }); }) ->when($request->filled('status'), function (Builder $query) use ($request) { $query->where( 'status', $request->input('status') ); }) ->orderByDesc('created_at') ->paginate(15) ->withQueryString(); return view('admin.tours.index', compact('tours')); } public function create() { return view('admin.tours.create'); } public function store(TourStoreRequest $request) { DB::beginTransaction(); try { $image = $request->file('image'); $path = $image->store('tours', 'public'); $file = File::create([ 'name' => pathinfo( $image->hashName(), PATHINFO_FILENAME ), 'extension' => $image->getClientOriginalExtension(), 'size' => $image->getSize(), 'original_name' => $image->getClientOriginalName(), 'path' => $path, ]); $tour = Tour::create([ 'title' => $request->title, 'summary' => $request->input('summary') ?? '', 'descriptions' => $request->input('descriptions') ?? '', 'file_id' => $file->id, 'origin' => $request->origin, 'destination' => $request->destination, 'duration' => $request->duration, 'price' => $request->price, 'views' => 0, 'status' => $request->status, 'created_at' => now(), 'updated_at' => now(), ]); TourDate::create([ 'tour_id' => $tour->id, 'start_date' => $request->start_date, 'end_date' => $request->end_date, 'price' => $request->tour_date_price, 'capacity' => $request->capacity, 'status' => $request->tour_date_status, ]); DB::commit(); } catch (\Exception $exception) { DB::rollBack(); Log::error($exception); return back() ->withErrors([ 'general' => 'خطایی در ایجاد تور رخ داده است.' ]) ->withInput(); } return redirect() ->route('admin.tours.index') ->with('success', 'تور با موفقیت ایجاد شد.'); } public function edit(Tour $tour) { $tour->load([ 'file', 'tourDates', ]); $createdLog = ActivityLog::query() ->where('model_type', Tour::class) ->where('model_id', $tour->id) ->where('action', 'created') ->with('admin') ->first(); $lastUpdatedLog = ActivityLog::query() ->where('model_type', Tour::class) ->where('model_id', $tour->id) ->where('action', 'updated') ->with('admin') ->latest('created_at') ->first(); return view('admin.tours.edit', compact( 'tour', 'createdLog', 'lastUpdatedLog' )); } public function update(TourUpdateRequest $request, Tour $tour) { DB::beginTransaction(); try { $fileId = $tour->file_id; if ($request->hasFile('image')) { $image = $request->file('image'); $path = $image->store('tours', 'public'); $file = File::create([ 'name' => pathinfo( $image->hashName(), PATHINFO_FILENAME ), 'extension' => $image->getClientOriginalExtension(), 'size' => $image->getSize(), 'original_name' => $image->getClientOriginalName(), 'path' => $path, ]); $fileId = $file->id; } $tour->update([ 'title' => $request->title, 'summary' => $request->input('summary') ?? '', 'descriptions' => $request->input('descriptions') ?? '', 'file_id' => $fileId, 'origin' => $request->origin, 'destination' => $request->destination, 'duration' => $request->duration, 'price' => $request->price, 'status' => $request->status, ]); $tourDate = $tour->tourDates()->first(); if ($tourDate) { $tourDate->update([ 'start_date' => $request->start_date, 'end_date' => $request->end_date, 'price' => $request->tour_date_price, 'capacity' => $request->capacity, 'status' => $request->tour_date_status, ]); } else { $tour->tourDates()->create([ 'start_date' => $request->start_date, 'end_date' => $request->end_date, 'price' => $request->tour_date_price, 'capacity' => $request->capacity, 'status' => $request->tour_date_status, ]); } DB::commit(); } catch (\Exception $exception) { DB::rollBack(); Log::error($exception); return back() ->withErrors([ 'general' => 'خطایی در ویرایش تور رخ داده است.' ]) ->withInput(); } return redirect() ->route('admin.tours.index') ->with('success', 'تور با موفقیت ویرایش شد.'); } public function destroy(Tour $tour) { if ($tour->tourDates()->whereHas('bookings')->exists()) { return back()->withErrors([ 'error' => 'این تور دارای رزرو است و قابل حذف نیست.' ]); } $tour->tourDates()->delete(); $tour->delete(); return redirect() ->route('admin.tours.index') ->with('success', 'تور با موفقیت حذف شد.'); } }