/home2/mshostin/carnival.ms-hostingladz.com/app/Http/Controllers/AppointmentController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Appointment;
use App\Models\AppointmentSlot;
use App\Models\Service;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Auth;
class AppointmentController extends Controller
{
public function index(Request $request)
{
$appointments = Appointment::with("service", "user", "slots");
if ($request->has('search') && $request->search != null && $request->search != '') {
$appointments = $appointments->where('title', 'LIKE', '%' . $request->search . '%');
}
$appointments = $appointments->paginate(10);
if ($request->has("type")) {
return $appointments;
}
return view('dashboard.admin.appointments.index', compact('appointments'));
}
public function create()
{
$services = Service::all();
return view('dashboard.admin.appointments.create', compact('services'));
}
public function store(Request $request)
{
$request->validate([
'user_id' => 'required',
'service_id' => 'required',
'appointment_datetime.*' => [
'required',
'date',
function ($attribute, $value, $fail) use ($request) {
$serviceId = $request->input('service_id');
$existingDates = AppointmentSlot::whereHas('appointment', function ($query) use ($serviceId) {
$query->where('service_id', $serviceId);
})
->whereIn('datetime', $request->input('appointment_datetime'))
->exists();
if ($existingDates) {
$fail('One or more appointment dates already exist for this service.');
}
},
],
]);
$appointment = Appointment::create([
'user_id' => $request->input('user_id'),
'service_id' => $request->input('service_id'),
'notes' => $request->input('notes'),
]);
foreach ($request->input('appointment_datetime') as $datetime) {
$appointment->slots()->create([
'datetime' => $datetime,
]);
}
return redirect()->route('appointments.index')
->with('success', 'Appointment booked successfully.');
}
public function checkConflict(Request $request)
{
$serviceId = $request->input('service_id');
$appointmentDatetime = $request->input('appointment_datetime');
$conflict = AppointmentSlot::whereHas('appointment', function ($query) use ($serviceId, $appointmentDatetime) {
$query->where('service_id', $serviceId)
->where('datetime', $appointmentDatetime);
})->exists();
return response()->json(['conflict' => $conflict]);
}
public function edit($id)
{
$appointment = Appointment::with('slots')->findOrFail($id);
$services = Service::all();
return view('dashboard.admin.appointments.edit', compact('appointment', 'services'));
}
public function update(Request $request, $id)
{
$request->validate([
'user_id' => 'required',
'service_id' => 'required',
'appointment_datetime.*' => [
'required',
'date',
Rule::unique('appointment_slots', 'datetime')->ignore($id, 'appointment_id'),
],
]);
$appointment = Appointment::findOrFail($id);
$appointment->update([
'user_id' => $request->user_id,
'service_id' => $request->service_id,
'notes' => $request->notes,
'status' => $request->status ?? 1,
]);
$appointment->slots()->delete();
foreach ($request->input('appointment_datetime') as $datetime) {
$appointment->slots()->create([
'datetime' => $datetime,
]);
}
return redirect()->route('appointments.index')
->with('success', 'Appointment updated successfully.');
}
public function destroy($id)
{
$appointment = Appointment::findOrFail($id);
$appointment->delete();
return redirect()->route('appointments.index')
->with('success', 'Appointment deleted successfully.');
}
}