126 lines
4 KiB
PHP
126 lines
4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Event;
|
|
use Illuminate\Http\Request;
|
|
|
|
class EventController extends Controller
|
|
{
|
|
/**
|
|
* Display a listing of events.
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$query = Event::query();
|
|
|
|
// Search functionality
|
|
if ($request->filled('search')) {
|
|
$search = $request->search;
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('name', 'like', "%{$search}%")
|
|
->orWhere('description', 'like', "%{$search}%")
|
|
->orWhere('location', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
// Filter by type
|
|
if ($request->filled('type') && $request->type !== 'all') {
|
|
$query->where('type', $request->type);
|
|
}
|
|
|
|
// Filter by status
|
|
if ($request->filled('status') && $request->status !== 'all') {
|
|
$query->where('status', $request->status);
|
|
}
|
|
|
|
$events = $query->orderBy('event_date', 'desc')->paginate(15);
|
|
|
|
return view('admin.events.index', compact('events'));
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new event.
|
|
*/
|
|
public function create()
|
|
{
|
|
return view('admin.events.create');
|
|
}
|
|
|
|
/**
|
|
* Store a newly created event in storage.
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => ['required', 'string', 'max:255'],
|
|
'description' => ['required', 'string'],
|
|
'type' => ['required', 'in:tasting,harvest_festival,vineyard_tour'],
|
|
'event_date' => ['required', 'date', 'after_or_equal:today'],
|
|
'event_time' => ['required', 'date_format:H:i'],
|
|
'capacity' => ['required', 'integer', 'min:1'],
|
|
'price_per_person' => ['required', 'numeric', 'min:0'],
|
|
'location' => ['nullable', 'string', 'max:255'],
|
|
'status' => ['required', 'in:upcoming,cancelled,completed'],
|
|
]);
|
|
|
|
Event::create($validated);
|
|
|
|
return redirect()->route('admin.events.index')
|
|
->with('success', 'Event created successfully.');
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified event.
|
|
*/
|
|
public function edit(Event $event)
|
|
{
|
|
// Load event with reservations and user data
|
|
$event->load(['reservations' => function($query) {
|
|
$query->wherePivot('status', 'confirmed')
|
|
->withPivot('number_of_guests', 'status', 'created_at')
|
|
->orderBy('event_reservations.created_at', 'desc');
|
|
}]);
|
|
|
|
return view('admin.events.edit', compact('event'));
|
|
}
|
|
|
|
/**
|
|
* Update the specified event in storage.
|
|
*/
|
|
public function update(Request $request, Event $event)
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => ['required', 'string', 'max:255'],
|
|
'description' => ['required', 'string'],
|
|
'type' => ['required', 'in:tasting,harvest_festival,vineyard_tour'],
|
|
'event_date' => ['required', 'date'],
|
|
'event_time' => ['required', 'date_format:H:i'],
|
|
'capacity' => ['required', 'integer', 'min:1'],
|
|
'price_per_person' => ['required', 'numeric', 'min:0'],
|
|
'location' => ['nullable', 'string', 'max:255'],
|
|
'status' => ['required', 'in:upcoming,cancelled,completed'],
|
|
]);
|
|
|
|
$event->update($validated);
|
|
|
|
return redirect()->route('admin.events.index')
|
|
->with('success', 'Event updated successfully.');
|
|
}
|
|
|
|
/**
|
|
* Delete an event.
|
|
*/
|
|
public function destroy(Event $event)
|
|
{
|
|
// Check if event has reservations
|
|
if ($event->reservations()->wherePivot('status', 'confirmed')->count() > 0) {
|
|
return back()->with('error', 'Cannot delete event with confirmed reservations.');
|
|
}
|
|
|
|
$event->delete();
|
|
|
|
return back()->with('success', 'Event deleted successfully.');
|
|
}
|
|
}
|