MIF_E31222378/app/Http/Controllers/BookingController.php

255 lines
8.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Booking;
use App\Models\Pricelist;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Log;
class BookingController extends Controller
{
public function __construct()
{
// $this->middleware('auth');
}
//milik user untuk upload
public function getBookings($customerId)
{
$bookings = Booking::where('customer_id', $customerId)->get();
return response()->json($bookings);
}
public function getBookingsCustomer()
{
try {
// Ambil semua booking yang statusnya bukan 'declined'
$bookings = Booking::where('status', '!=', 'declined')->get();
// Ubah data booking ke format yang bisa dibaca FullCalendar
$bookingsData = $bookings->map(function ($booking) {
$color = '#007bff'; // Default warna
// Tentukan warna berdasarkan status
switch ($booking->status) {
case 'approved':
$color = '#dc3545'; // Merah
break;
case 'pending':
$color = '#facc15'; // Kuning
break;
}
return [
'title' => $booking->produk . ' - ' . $booking->paket,
'start' => $booking->tanggal_pemotretan,
'color' => $color,
'status' => $booking->status
];
});
return response()->json($bookingsData);
} catch (\Exception $e) {
return response()->json([
'error' => 'Gagal mengambil data booking',
'message' => $e->getMessage()
], 500);
}
}
public function uploadBuktiPelunasan(Request $request, $bookingId)
{
$request->validate([
'bukti_pelunasan' => 'required|image|mimes:jpeg,png,jpg|max:2048',
'pelunasan' => 'required|numeric',
]);
$booking = Booking::findOrFail($bookingId);
if ($request->hasFile('bukti_pelunasan')) {
$file = $request->file('bukti_pelunasan');
$filename = time() . '_' . $file->getClientOriginalName();
// Simpan ke public/images/bukti_pelunasan
$file->move(public_path('images/bukti_pelunasan'), $filename);
// Simpan nama file saja di database
$booking->bukti_pelunasan = $filename;
}
$booking->pelunasan = $request->pelunasan;
$booking->status = 'lunas'; // Update status jika perlu
$saved = $booking->save();
\Log::info('Booking ID ' . $booking->id . ' berhasil diperbarui? ' . ($saved ? 'Ya' : 'Tidak'));
return redirect()->back()->with('success', 'Bukti pelunasan berhasil diunggah.');
}
public function uploadBukti(Request $request, $id)
{
$request->validate([
'bukti_transfer' => 'required|image|mimes:jpg,jpeg,png|max:10240',
]);
$booking = Booking::findOrFail($id);
if ((int) $booking->customer_id !== (int) Auth::id()) {
abort(403, 'Anda tidak berhak upload bukti untuk booking ini.');
}
$destination = public_path('images/bukti_transfer');
if (!file_exists($destination)) {
mkdir($destination, 0755, true);
}
if (!is_writable($destination)) {
return back()->withErrors(['bukti_transfer' => 'Folder upload tidak bisa ditulis.']);
}
$file = $request->file('bukti_transfer');
$filename = time() . '_' . $file->getClientOriginalName();
$file->move($destination, $filename);
// Simpan path relatif supaya bisa dipanggil pakai asset()
$booking->bukti_transfer = 'bukti_transfer/' . $filename;
$booking->save();
return back()->with('success', 'Bukti transfer berhasil diupload.');
}
public function index()
{
// Mengambil semua booking untuk pengguna yang login
$bookings = Booking::where('customer_id', Auth::id())
->select('produk', 'tanggal_pemotretan')
->get()
->map(function ($booking) {
return [
'title' => $booking->produk,
'start' => $booking->tanggal_pemotretan->format('Y-m-d'),
];
});
return view('booking.index', compact('bookings'));
}
public function create()
{
$bookedDates = Booking::pluck('tanggal_pemotretan')->toArray();
$bookings = Booking::where('customer_id', Auth::id())->orderBy('created_at', 'desc')->get();
$pricelists = Pricelist::all(); // Pastikan mengambil data terbaru
$paketPerProduk = $pricelists->mapWithKeys(function ($item) {
return [strtolower($item->judul) => $item->paket ?? []];
});
return view('customer.booking', compact('bookedDates', 'bookings', 'pricelists', 'paketPerProduk'));
}
public function keranjang()
{
$bookedDates = Booking::pluck('tanggal_pemotretan')->toArray();
$bookings = Booking::where('customer_id', Auth::id())->orderBy('created_at', 'desc')->get();
$pricelists = Pricelist::all(); // Pastikan mengambil data terbaru
$paketPerProduk = $pricelists->mapWithKeys(function ($item) {
return [strtolower($item->judul) => $item->paket ?? []];
});
return view('customer.keranjang', compact('bookedDates', 'bookings', 'pricelists', 'paketPerProduk'));
}
public function store(Request $request)
{
$user = Auth::user();
if (!$user || $user->role !== 'customer') {
return redirect()->back()->with('error', 'Hanya customer yang bisa melakukan booking.');
}
$request->validate([
'produk' => 'required|exists:pricelists,judul',
'paket' => 'required|string',
'tanggal_pemotretan' => 'required|date',
'payment_method' => 'required|string',
'total_harga' => 'required|numeric',
]);
$produk = Pricelist::where('judul', $request->produk)->firstOrFail();
$tanggal = $request->tanggal_pemotretan;
$fullDayConflict = Booking::where('tanggal_pemotretan', $tanggal)
->where('durasi_booking', 'full_day')
->exists();
if ($fullDayConflict) {
return redirect()->back()->with('error', 'Tanggal ini sudah dibooking penuh oleh produk lain.');
}
if ($produk->durasi_booking === 'full_day') {
$anyBooking = Booking::where('tanggal_pemotretan', $tanggal)->exists();
if ($anyBooking) {
return redirect()->back()->with('error', 'Sudah ada booking lain di tanggal tersebut. Produk full day tidak bisa dibooking.');
}
}
if ($produk->durasi_booking === 'slot') {
$jumlahSlotBooking = Booking::where('tanggal_pemotretan', $tanggal)
->where('durasi_booking', 'slot')
->count();
if ($jumlahSlotBooking >= 3) {
return redirect()->back()->with('error', 'Booking slot pada tanggal ini sudah penuh (maksimal 3).');
}
}
// ✅ Simpan booking
Booking::create([
'customer_id' => $user->id,
'produk' => $produk->judul,
'paket' => $request->paket,
'tanggal_pemotretan' => $tanggal,
'payment_method' => $request->payment_method,
'total_harga' => $request->total_harga,
'durasi_booking' => $produk->durasi_booking,
'status' => 'pending', // atau bisa kamu hapus kalau tidak pakai status
]);
return redirect()->back()->with('success', 'Booking berhasil dibuat!');
}
// 📌 Tampilkan Daftar Booking untuk User (Karyawan/Admin)
public function indexUser()
{
$bookings = Booking::where('status', 'pending')->get();
return view('user.booking', compact('bookings'));
}
// 📌 Terima Booking
public function accept($id)
{
$booking = Booking::findOrFail($id);
$booking->status = 'accepted';
$booking->save();
return redirect()->route('user.booking')->with('success', 'Booking diterima.');
}
// 📌 Tolak Booking
public function decline($id)
{
$booking = Booking::findOrFail($id);
$booking->status = 'declined';
$booking->save();
return redirect()->route('user.booking')->with('error', 'Booking ditolak.');
}
}