From d8b8e6e832540fcdf93e962d7b1e6668702ec567 Mon Sep 17 00:00:00 2001 From: LailaWulandarii Date: Fri, 16 Jan 2026 16:42:30 +0700 Subject: [PATCH] refactor BookingFotoController and PesanBuketController to remove commented code and improve readability --- .../User/BookingFotoController.php | 78 ++++--------------- .../Controllers/User/PesanBuketController.php | 10 --- 2 files changed, 15 insertions(+), 73 deletions(-) diff --git a/app/Http/Controllers/User/BookingFotoController.php b/app/Http/Controllers/User/BookingFotoController.php index 2a830a9..0cf4b4f 100755 --- a/app/Http/Controllers/User/BookingFotoController.php +++ b/app/Http/Controllers/User/BookingFotoController.php @@ -27,16 +27,11 @@ public function detail($id) { $foto = PaketFoto::findOrFail($id); \Carbon\Carbon::setLocale('id'); - // Jika add-ons disimpan di DB, ambil juga: $additionals = Additional::all(); - // Logika Tanggal - $start = \Carbon\Carbon::now(); // Mulai hari ini - $end = \Carbon\Carbon::now()->addMonth(); // Maksimal 1 bulan ke depan - // Untuk navigasi panah + $start = \Carbon\Carbon::now(); + $end = \Carbon\Carbon::now()->addMonth(); $prevMonth = $start->copy()->subMonth(); $nextMonth = $start->copy()->addMonth(); - - // translatedFormat akan mengikuti locale 'id' di config Anda $currentMonthLabel = $start->isoFormat('MMMM YYYY'); return view('user.detail-foto', compact('foto', 'additionals', 'start', 'end', 'currentMonthLabel', 'prevMonth', 'nextMonth')); } @@ -46,8 +41,6 @@ public function loadCalendar(Request $request) $month = $request->month ?? date('m'); $year = $request->year ?? date('Y'); $start = \Carbon\Carbon::createFromDate($year, $month, 1); - - // Data Navigasi $prevMonth = $start->copy()->subMonth(); $nextMonth = $start->copy()->addMonth(); $currentMonthLabel = $start->isoFormat('MMMM YYYY'); @@ -58,7 +51,6 @@ public function loadCalendar(Request $request) 'currentMonthLabel' ))->render(); - // Return JSON agar JavaScript bisa membacanya sebagai data.html return response()->json(['html' => $html]); } public function cekSlot(Request $request) @@ -72,15 +64,11 @@ public function cekSlot(Request $request) } public function formulir(Request $request) { - // 1. Ambil Data Paket $foto = PaketFoto::findOrFail($request->id_paket); - $durasiDasar = $foto->durasi; // Ambil durasi paket asli - - // 2. Hitung Total Add-ons & Tambahan Menit + $durasiDasar = $foto->durasi; $addonsDetails = []; $totalAddon = 0; - $tambahanMenit = 0; // Inisialisasi tambahan waktu - + $tambahanMenit = 0; if ($request->has('addons')) { foreach ($request->addons as $id => $qty) { if ($qty > 0) { @@ -89,10 +77,9 @@ public function formulir(Request $request) $subtotal = $add->harga * $qty; $totalAddon += $subtotal; - // LOGIKA TAMBAHAN WAKTU BERDASARKAN ID - if ($id == 4) { // Tambah waktu/5 menit + if ($id == 4) { $tambahanMenit += (5 * $qty); - } elseif ($id == 6) { // Tambah 10 menit sesi Spotlight + } elseif ($id == 6) { $tambahanMenit += (10 * $qty); } @@ -106,44 +93,34 @@ public function formulir(Request $request) } } } - - // 3. Hitung Ulang Jam Selesai $totalDurasi = $durasiDasar + $tambahanMenit; $jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai); $jamSelesaiBaru = $jamMulai->copy()->addMinutes($totalDurasi)->format('H:i'); - - // 4. Hitung Grand Total $grandTotal = $foto->harga + $totalAddon; - - // 5. Logika Deadline Pembayaran (Tetap sama) if (!session()->has('payment_deadline')) { $deadline = now()->addHours(2); session()->put('payment_deadline', $deadline); } else { $deadline = session('payment_deadline'); } - $sisaWaktu = now()->diffInSeconds($deadline, false); - if ($sisaWaktu <= 0) { session()->forget(['payment_deadline', 'addons']); return redirect()->route('booking.foto')->with('error', 'Waktu pembayaran telah habis.'); } - - // 6. Kirim jam_selesai yang sudah diperbarui ke View return view('user.pembayaran-foto', compact( 'foto', 'request', 'addonsDetails', 'grandTotal', 'sisaWaktu', - 'jamSelesaiBaru' // Variabel baru untuk ditampilkan di blade + 'jamSelesaiBaru' )); } public function cancelBooking() { - session()->forget(['payment_deadline', 'addons']); // Hapus session timer & data - return redirect()->route('booking.foto'); // Kembali ke katalog utama + session()->forget(['payment_deadline', 'addons']); + return redirect()->route('booking.foto'); } public function store(Request $request) { @@ -155,7 +132,6 @@ public function store(Request $request) 'no_wa' => 'required|numeric|digits_between:10,15', 'bukti_bayar' => 'required|image|mimes:jpeg,png,jpg|max:2048', ], [ - // Detail Pesan Kustom 'required' => 'Kolom :attribute wajib diisi.', 'string' => 'Input :attribute harus berupa teks valid.', 'min' => ':attribute terlalu pendek, minimal :min karakter.', @@ -166,25 +142,20 @@ public function store(Request $request) 'after_or_equal' => ':attribute tidak boleh tanggal yang sudah lewat.', 'image' => ':attribute harus berupa file gambar.', 'mimes' => 'Format :attribute harus jpeg, png, atau jpg.', - 'bukti_bayar.max' => 'Ukuran :attribute maksimal adalah 2MB.', + 'bukti_bayar.max' => 'Ukuran :attribute maksimal adalah 2MB.', ], [ 'nama' => 'nama pemesan', 'no_wa' => 'nomor WhatsApp', 'bukti_bayar' => 'bukti pembayaran', ]); - DB::beginTransaction(); // Mulai Transaksi Database - + DB::beginTransaction(); try { - // 2. Ambil Data Paket & Hitung Waktu $paket = PaketFoto::findOrFail($request->id_paket); - - // Asumsi durasi default 20 menit (atau ambil dari database jika ada kolom durasi) $durasiMenit = $paket->durasi; $jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai); $jamSelesai = $jamMulai->copy()->addMinutes($durasiMenit); - // 3. Cek Slot Sekali Lagi (Mencegah Race Condition) $isTaken = BookingFoto::where('tgl_booking', $request->tgl_booking) ->where('jam_mulai', $request->jam_mulai) ->whereIn('status_booking', ['menunggu_verifikasi', 'diterima', 'selesai']) @@ -194,13 +165,10 @@ public function store(Request $request) return back()->with('error', 'Mohon maaf, slot waktu ini baru saja diambil orang lain.'); } - // 4. Simpan/Update Data Pelanggan $pelanggan = Pelanggan::firstOrCreate( ['no_wa' => $request->no_wa], ['nama' => $request->nama] ); - // 6. Hitung Grand Total (Paket + Additional) - // Kita hitung ulang di server agar aman dari manipulasi inspect element $grandTotal = $paket->harga; $listAdditional = []; $totalDurasi = $durasiMenit; @@ -212,9 +180,8 @@ public function store(Request $request) $subtotal = $add->harga * $qty; $grandTotal += $subtotal; - // Logika Tambah Waktu berdasarkan ID yang sebelumnya kita bahas - if ($idAddon == 4) $totalDurasi += (5 * $qty); // Tambah 5 menit - if ($idAddon == 6) $totalDurasi += (10 * $qty); // Tambah 10 menit + if ($idAddon == 4) $totalDurasi += (5 * $qty); + if ($idAddon == 6) $totalDurasi += (10 * $qty); $listAdditional[] = [ 'id_additional' => $idAddon, @@ -226,35 +193,25 @@ public function store(Request $request) } } } - $jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai); $jamSelesai = $jamMulai->copy()->addMinutes($totalDurasi); - - // 3. Cek Slot Sekali Lagi (Mencegah Race Condition) $isTaken = \App\Models\BookingFoto::where('tgl_booking', $request->tgl_booking) ->where('jam_mulai', $request->jam_mulai) ->whereIn('status_booking', ['menunggu_verifikasi', 'diterima']) ->exists(); - if ($isTaken) { return back()->with('error', 'Mohon maaf, slot waktu ini baru saja diambil orang lain.'); } - - // 4. Simpan Data Pelanggan $pelanggan = \App\Models\Pelanggan::create([ 'nama' => $request->nama, 'no_wa' => $request->no_wa ]); - - // 5. Upload Bukti Bayar $pathBukti = null; if ($request->hasFile('bukti_bayar')) { $file = $request->file('bukti_bayar'); $namaFile = 'bukti_' . time() . '.' . $file->getClientOriginalExtension(); $pathBukti = $file->storeAs('img/payment/foto', $namaFile, 'public'); } - - // 6. Simpan Booking Utama $booking = \App\Models\BookingFoto::create([ 'no_invoice' => 'INV-FOTO-' . strtoupper(\Illuminate\Support\Str::random(6)), 'id_pelanggan' => $pelanggan->id_pelanggan, @@ -266,8 +223,6 @@ public function store(Request $request) 'bukti_bayar' => $pathBukti, 'status_booking' => 'menunggu_verifikasi' ]); - - // 7. Simpan Detail Additional foreach ($listAdditional as $item) { \App\Models\DetailAdditional::create([ 'id_booking' => $booking->id_booking, @@ -276,18 +231,15 @@ public function store(Request $request) 'subtotal' => $item['subtotal'] ]); } - \Illuminate\Support\Facades\DB::commit(); $txtAddons = ""; if (count($listAdditional) > 0) { - $txtAddons = "*Additional:*"; // Judul + $txtAddons = "*Additional:*"; foreach ($listAdditional as $item) { - // Ambil nama yang tadi kita titip $txtAddons .= "\n- " . $item['nama_barang'] . " (" . $item['qty'] . "x)"; } - $txtAddons .= "\n"; // Kasih jarak baris + $txtAddons .= "\n"; } - // 8. Redirect ke WhatsApp $pesan = "Halo Admin Flo.do! Saya sudah melakukan pembayaran untuk invoice {$booking->no_invoice}:\n\n" . "*Data Pemesan:*\n" . "Nama: {$request->nama}\n" . diff --git a/app/Http/Controllers/User/PesanBuketController.php b/app/Http/Controllers/User/PesanBuketController.php index d1f3c45..8637ef3 100755 --- a/app/Http/Controllers/User/PesanBuketController.php +++ b/app/Http/Controllers/User/PesanBuketController.php @@ -56,7 +56,6 @@ public function formulir($slug_id) public function store(Request $request) { $buket = Buket::findOrFail($request->id_buket); - // 1. Validasi Detail dengan Pesan Kustom & Alias $validator = Validator::make($request->all(), [ 'nama' => 'required|string|min:3|max:100', 'no_wa' => 'required|numeric|digits_between:10,15', @@ -72,7 +71,6 @@ public function store(Request $request) 'request_khusus' => 'nullable|string|max:255', 'ucapan' => 'nullable|string|max:500', ], [ - // Detail Pesan Kustom 'required' => 'Kolom :attribute wajib diisi.', 'string' => 'Input :attribute harus berupa teks valid.', 'min' => ':attribute terlalu pendek, minimal :min karakter.', @@ -87,7 +85,6 @@ public function store(Request $request) 'waktu_ambil.after_or_equal' => 'Jam operasional kami mulai pukul 09:00.', 'waktu_ambil.before_or_equal' => 'Jam operasional kami berakhir pukul 21:00.', ], [ - // Alias Atribut agar lebih ramah 'nama' => 'nama pemesan', 'no_wa' => 'nomor WhatsApp', 'tgl_ambil' => 'tanggal pengambilan', @@ -96,28 +93,22 @@ public function store(Request $request) 'ucapan' => 'kartu ucapan', ]); - // Jika validasi gagal if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } try { db::beginTransaction(); - - // 2. Simpan ke Tabel Pelanggan dulu $pelanggan = Pelanggan::create([ 'nama' => $request->nama, 'no_wa' => $request->no_wa, ]); - - // 3. Handle File Upload Bukti Bayar $namaFile = null; if ($request->hasFile('bukti_bayar')) { $file = $request->file('bukti_bayar'); $namaFile = 'bukti_' . time() . '.' . $file->getClientOriginalExtension(); $pathBukti = $file->storeAs('img/payment/buket', $namaFile, 'public'); } - $transaksi = TransaksiBuket::create([ 'id_pelanggan' => $pelanggan->id_pelanggan, 'id_buket' => $request->id_buket, @@ -132,7 +123,6 @@ public function store(Request $request) DB::commit(); - // 5. Membuat Pesan WhatsApp Otomatis $pesan = "Halo Admin Flo.do! Saya sudah melakukan pembayaran untuk invoice {$transaksi->no_invoice}:\n\n" . "*Data Pemesan:*\n" . "Nama: {$pelanggan->nama}\n" .