has('search') && !empty($request->search)) { $query->whereMonth('tanggal_checkout', $request->search); } $bookings = $query->orderBy('tanggal_checkout', 'desc')->paginate(10); return view('admin.booking', compact('bookings')); } /** * Menampilkan form untuk menambahkan booking baru. */ public function create() { $users = User::all(); $rooms = Room::all(); return view('admin.createbooking', compact('users', 'rooms')); } /** * Menyimpan data booking baru ke database. */ public function store(Request $request) { $request->validate([ 'id_user' => 'required|exists:users,id_user', 'id_kamar' => 'required|exists:rooms,id_kamar', 'status_booking' => 'required|in:Pending,Dikonfirmasi,Dibatalkan,Selesai', 'tanggal_booking' => 'required|date', 'tanggal_checkin' => 'required|date|after_or_equal:tanggal_booking', 'tanggal_checkout' => 'required|date|after:tanggal_checkin', ]); Booking::create([ 'id_user' => $request->id_user, 'id_kamar' => $request->id_kamar, 'status_booking' => $request->status_booking, 'tanggal_booking' => $request->tanggal_booking, 'tanggal_checkin' => $request->tanggal_checkin, 'tanggal_checkout' => $request->tanggal_checkout, ]); return redirect()->route('admin.booking')->with('success', 'Booking berhasil ditambahkan.'); } /** * Menampilkan form untuk mengedit booking. */ public function edit($id_booking) { $booking = Booking::findOrFail($id_booking); $users = User::all(); $rooms = Room::all(); return view('admin.editbooking', compact('booking', 'users', 'rooms')); } /** * Memperbarui data booking di database. */ public function update(Request $request, $id_booking) { $request->validate([ 'id_user' => 'required|exists:users,id_user', 'id_kamar' => 'required|exists:rooms,id_kamar', 'status_booking' => 'required|in:Pending,Dikonfirmasi,Dibatalkan,Selesai', 'tanggal_booking' => 'required|date', 'tanggal_checkin' => 'required|date|after_or_equal:tanggal_booking', 'tanggal_checkout' => 'required|date|after:tanggal_checkin', ]); $booking = Booking::findOrFail($id_booking); $booking->update([ 'id_user' => $request->id_user, 'id_kamar' => $request->id_kamar, 'status_booking' => $request->status_booking, 'tanggal_booking' => $request->tanggal_booking, 'tanggal_checkin' => $request->tanggal_checkin, 'tanggal_checkout' => $request->tanggal_checkout, ]); return redirect()->route('admin.booking')->with('success', 'Booking berhasil diperbarui.'); } /** * Menghapus data booking dari database. */ public function destroy($id_booking) { $booking = Booking::findOrFail($id_booking); $booking->delete(); return redirect()->route('admin.booking')->with('success', 'Booking berhasil dihapus.'); } public function storeBooking(Request $request) { $validated = $request->validate([ 'id_user' => 'required|exists:users,id_user', 'id_kamar' => 'required|exists:rooms,id_kamar', 'tanggal_booking' => 'required|date', 'tanggal_checkin' => 'required|date|after_or_equal:tanggal_booking', 'tanggal_checkout' => 'required|date|after:tanggal_checkin', ]); // Tambahkan status_booking secara manual karena tidak berasal dari input $validated['status_booking'] = 'Pending'; // Simpan booking $booking = Booking::create([ 'id_user' => $request->id_user, 'id_kamar' => $request->id_kamar, 'tanggal_booking' => $request->tanggal_booking, 'tanggal_checkin' => $request->tanggal_checkin, 'tanggal_checkout' => $request->tanggal_checkout, 'status_booking' => 'Pending', ]); // Redirect ke halaman pembayaran return redirect()->route('users.pembayaran', ['id_booking' => $booking->id_booking]) ->with('success', 'Booking berhasil, lanjut ke pembayaran'); } public function confirm($id_booking) { // Ambil data booking berdasarkan ID $booking = Booking::findOrFail($id_booking); // Pastikan status booking belum dikonfirmasi if ($booking->status_booking !== 'Dikonfirmasi') { // Perbarui status booking menjadi 'Dikonfirmasi' $booking->update(['status_booking' => 'Dikonfirmasi']); // Ambil data kamar yang terkait dengan booking ini $room = $booking->room; // Asumsi sudah ada relasi antara Booking dan Room if ($room) { // Perbarui status kamar menjadi 'terisi' $room->update(['status' => 'terisi']); } } return redirect()->route('admin.booking')->with('success', 'Pemesanan berhasil dikonfirmasi.'); } public function cancel($id_booking) { Log::info('Cancel function called for booking ID: ' . $id_booking); $booking = Booking::findOrFail($id_booking); // Ubah status booking menjadi Dibatalkan jika statusnya belum Selesai if (in_array($booking->status_booking, ['Pending', 'Dikonfirmasi'])) { $booking->update([ 'status_booking' => 'Dibatalkan' ]); // Update kamar jadi tersedia jika sebelumnya status booking dikonfirmasi if ($booking->room && $booking->status_booking === 'Dikonfirmasi') { $booking->room->update([ 'status' => 'tersedia' ]); } } return redirect()->route('admin.booking')->with('success', 'Booking berhasil dibatalkan.'); } public function approvePerpanjangan($id) { // Ambil data perpanjangan $perpanjangan = PerpanjanganBooking::findOrFail($id); // Pastikan belum dikonfirmasi if ($perpanjangan->status !== 'Dikonfirmasi') { // Ambil data booking terkait $booking = Booking::findOrFail($perpanjangan->id_booking); // Update tanggal checkout pada tabel booking $booking->update([ 'tanggal_checkout' => $perpanjangan->tanggal_checkout_baru, ]); // Update status perpanjangan menjadi 'Dikonfirmasi' $perpanjangan->update([ 'status' => 'Dikonfirmasi', ]); // Update status booking jika belum dikonfirmasi if ($booking->status_booking !== 'Dikonfirmasi') { $booking->update([ 'status_booking' => 'Dikonfirmasi', ]); // Update status kamar juga jika belum terisi if ($booking->room && $booking->room->status !== 'terisi') { $booking->room->update([ 'status' => 'terisi', ]); } } } return redirect()->route('admin.booking')->with('success', 'Perpanjangan berhasil dikonfirmasi.'); } public function markAsCompleted($id_booking) { $booking = Booking::findOrFail($id_booking); // Pastikan hanya booking yang dikonfirmasi bisa selesai if ($booking->status_booking === 'Dikonfirmasi') { $booking->update(['status_booking' => 'Selesai']); // Update status kamar menjadi tersedia $room = $booking->room; if ($room) { $room->update(['status' => 'tersedia']); } return redirect()->route('admin.booking')->with('success', 'Booking telah diselesaikan.'); } return redirect()->route('admin.booking')->with('error', 'Booking belum dikonfirmasi.'); } }