MIF_E31220480/app/Http/Controllers/BookingController.php

251 lines
8.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Booking;
use App\Models\User;
use Illuminate\Support\Facades\Log;
use App\Models\Room;
use App\Models\PerpanjanganBooking;
class BookingController extends Controller
{
/**
* Menampilkan daftar booking.
*/
public function index(Request $request)
{
$query = Booking::query();
// Filter pencarian berdasarkan bulan dari tanggal_booking
if ($request->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.');
}
}