refactor BookingFotoController and PesanBuketController to remove commented code and improve readability

This commit is contained in:
LailaWulandarii 2026-01-16 16:42:30 +07:00
parent 54e9f32413
commit d8b8e6e832
2 changed files with 15 additions and 73 deletions

View File

@ -27,16 +27,11 @@ public function detail($id)
{ {
$foto = PaketFoto::findOrFail($id); $foto = PaketFoto::findOrFail($id);
\Carbon\Carbon::setLocale('id'); \Carbon\Carbon::setLocale('id');
// Jika add-ons disimpan di DB, ambil juga:
$additionals = Additional::all(); $additionals = Additional::all();
// Logika Tanggal $start = \Carbon\Carbon::now();
$start = \Carbon\Carbon::now(); // Mulai hari ini $end = \Carbon\Carbon::now()->addMonth();
$end = \Carbon\Carbon::now()->addMonth(); // Maksimal 1 bulan ke depan
// Untuk navigasi panah
$prevMonth = $start->copy()->subMonth(); $prevMonth = $start->copy()->subMonth();
$nextMonth = $start->copy()->addMonth(); $nextMonth = $start->copy()->addMonth();
// translatedFormat akan mengikuti locale 'id' di config Anda
$currentMonthLabel = $start->isoFormat('MMMM YYYY'); $currentMonthLabel = $start->isoFormat('MMMM YYYY');
return view('user.detail-foto', compact('foto', 'additionals', 'start', 'end', 'currentMonthLabel', 'prevMonth', 'nextMonth')); 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'); $month = $request->month ?? date('m');
$year = $request->year ?? date('Y'); $year = $request->year ?? date('Y');
$start = \Carbon\Carbon::createFromDate($year, $month, 1); $start = \Carbon\Carbon::createFromDate($year, $month, 1);
// Data Navigasi
$prevMonth = $start->copy()->subMonth(); $prevMonth = $start->copy()->subMonth();
$nextMonth = $start->copy()->addMonth(); $nextMonth = $start->copy()->addMonth();
$currentMonthLabel = $start->isoFormat('MMMM YYYY'); $currentMonthLabel = $start->isoFormat('MMMM YYYY');
@ -58,7 +51,6 @@ public function loadCalendar(Request $request)
'currentMonthLabel' 'currentMonthLabel'
))->render(); ))->render();
// Return JSON agar JavaScript bisa membacanya sebagai data.html
return response()->json(['html' => $html]); return response()->json(['html' => $html]);
} }
public function cekSlot(Request $request) public function cekSlot(Request $request)
@ -72,15 +64,11 @@ public function cekSlot(Request $request)
} }
public function formulir(Request $request) public function formulir(Request $request)
{ {
// 1. Ambil Data Paket
$foto = PaketFoto::findOrFail($request->id_paket); $foto = PaketFoto::findOrFail($request->id_paket);
$durasiDasar = $foto->durasi; // Ambil durasi paket asli $durasiDasar = $foto->durasi;
// 2. Hitung Total Add-ons & Tambahan Menit
$addonsDetails = []; $addonsDetails = [];
$totalAddon = 0; $totalAddon = 0;
$tambahanMenit = 0; // Inisialisasi tambahan waktu $tambahanMenit = 0;
if ($request->has('addons')) { if ($request->has('addons')) {
foreach ($request->addons as $id => $qty) { foreach ($request->addons as $id => $qty) {
if ($qty > 0) { if ($qty > 0) {
@ -89,10 +77,9 @@ public function formulir(Request $request)
$subtotal = $add->harga * $qty; $subtotal = $add->harga * $qty;
$totalAddon += $subtotal; $totalAddon += $subtotal;
// LOGIKA TAMBAHAN WAKTU BERDASARKAN ID if ($id == 4) {
if ($id == 4) { // Tambah waktu/5 menit
$tambahanMenit += (5 * $qty); $tambahanMenit += (5 * $qty);
} elseif ($id == 6) { // Tambah 10 menit sesi Spotlight } elseif ($id == 6) {
$tambahanMenit += (10 * $qty); $tambahanMenit += (10 * $qty);
} }
@ -106,44 +93,34 @@ public function formulir(Request $request)
} }
} }
} }
// 3. Hitung Ulang Jam Selesai
$totalDurasi = $durasiDasar + $tambahanMenit; $totalDurasi = $durasiDasar + $tambahanMenit;
$jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai); $jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai);
$jamSelesaiBaru = $jamMulai->copy()->addMinutes($totalDurasi)->format('H:i'); $jamSelesaiBaru = $jamMulai->copy()->addMinutes($totalDurasi)->format('H:i');
// 4. Hitung Grand Total
$grandTotal = $foto->harga + $totalAddon; $grandTotal = $foto->harga + $totalAddon;
// 5. Logika Deadline Pembayaran (Tetap sama)
if (!session()->has('payment_deadline')) { if (!session()->has('payment_deadline')) {
$deadline = now()->addHours(2); $deadline = now()->addHours(2);
session()->put('payment_deadline', $deadline); session()->put('payment_deadline', $deadline);
} else { } else {
$deadline = session('payment_deadline'); $deadline = session('payment_deadline');
} }
$sisaWaktu = now()->diffInSeconds($deadline, false); $sisaWaktu = now()->diffInSeconds($deadline, false);
if ($sisaWaktu <= 0) { if ($sisaWaktu <= 0) {
session()->forget(['payment_deadline', 'addons']); session()->forget(['payment_deadline', 'addons']);
return redirect()->route('booking.foto')->with('error', 'Waktu pembayaran telah habis.'); 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( return view('user.pembayaran-foto', compact(
'foto', 'foto',
'request', 'request',
'addonsDetails', 'addonsDetails',
'grandTotal', 'grandTotal',
'sisaWaktu', 'sisaWaktu',
'jamSelesaiBaru' // Variabel baru untuk ditampilkan di blade 'jamSelesaiBaru'
)); ));
} }
public function cancelBooking() public function cancelBooking()
{ {
session()->forget(['payment_deadline', 'addons']); // Hapus session timer & data session()->forget(['payment_deadline', 'addons']);
return redirect()->route('booking.foto'); // Kembali ke katalog utama return redirect()->route('booking.foto');
} }
public function store(Request $request) public function store(Request $request)
{ {
@ -155,7 +132,6 @@ public function store(Request $request)
'no_wa' => 'required|numeric|digits_between:10,15', 'no_wa' => 'required|numeric|digits_between:10,15',
'bukti_bayar' => 'required|image|mimes:jpeg,png,jpg|max:2048', 'bukti_bayar' => 'required|image|mimes:jpeg,png,jpg|max:2048',
], [ ], [
// Detail Pesan Kustom
'required' => 'Kolom :attribute wajib diisi.', 'required' => 'Kolom :attribute wajib diisi.',
'string' => 'Input :attribute harus berupa teks valid.', 'string' => 'Input :attribute harus berupa teks valid.',
'min' => ':attribute terlalu pendek, minimal :min karakter.', '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.', 'after_or_equal' => ':attribute tidak boleh tanggal yang sudah lewat.',
'image' => ':attribute harus berupa file gambar.', 'image' => ':attribute harus berupa file gambar.',
'mimes' => 'Format :attribute harus jpeg, png, atau jpg.', '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', 'nama' => 'nama pemesan',
'no_wa' => 'nomor WhatsApp', 'no_wa' => 'nomor WhatsApp',
'bukti_bayar' => 'bukti pembayaran', 'bukti_bayar' => 'bukti pembayaran',
]); ]);
DB::beginTransaction(); // Mulai Transaksi Database DB::beginTransaction();
try { try {
// 2. Ambil Data Paket & Hitung Waktu
$paket = PaketFoto::findOrFail($request->id_paket); $paket = PaketFoto::findOrFail($request->id_paket);
// Asumsi durasi default 20 menit (atau ambil dari database jika ada kolom durasi)
$durasiMenit = $paket->durasi; $durasiMenit = $paket->durasi;
$jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai); $jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai);
$jamSelesai = $jamMulai->copy()->addMinutes($durasiMenit); $jamSelesai = $jamMulai->copy()->addMinutes($durasiMenit);
// 3. Cek Slot Sekali Lagi (Mencegah Race Condition)
$isTaken = BookingFoto::where('tgl_booking', $request->tgl_booking) $isTaken = BookingFoto::where('tgl_booking', $request->tgl_booking)
->where('jam_mulai', $request->jam_mulai) ->where('jam_mulai', $request->jam_mulai)
->whereIn('status_booking', ['menunggu_verifikasi', 'diterima', 'selesai']) ->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.'); return back()->with('error', 'Mohon maaf, slot waktu ini baru saja diambil orang lain.');
} }
// 4. Simpan/Update Data Pelanggan
$pelanggan = Pelanggan::firstOrCreate( $pelanggan = Pelanggan::firstOrCreate(
['no_wa' => $request->no_wa], ['no_wa' => $request->no_wa],
['nama' => $request->nama] ['nama' => $request->nama]
); );
// 6. Hitung Grand Total (Paket + Additional)
// Kita hitung ulang di server agar aman dari manipulasi inspect element
$grandTotal = $paket->harga; $grandTotal = $paket->harga;
$listAdditional = []; $listAdditional = [];
$totalDurasi = $durasiMenit; $totalDurasi = $durasiMenit;
@ -212,9 +180,8 @@ public function store(Request $request)
$subtotal = $add->harga * $qty; $subtotal = $add->harga * $qty;
$grandTotal += $subtotal; $grandTotal += $subtotal;
// Logika Tambah Waktu berdasarkan ID yang sebelumnya kita bahas if ($idAddon == 4) $totalDurasi += (5 * $qty);
if ($idAddon == 4) $totalDurasi += (5 * $qty); // Tambah 5 menit if ($idAddon == 6) $totalDurasi += (10 * $qty);
if ($idAddon == 6) $totalDurasi += (10 * $qty); // Tambah 10 menit
$listAdditional[] = [ $listAdditional[] = [
'id_additional' => $idAddon, 'id_additional' => $idAddon,
@ -226,35 +193,25 @@ public function store(Request $request)
} }
} }
} }
$jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai); $jamMulai = \Carbon\Carbon::createFromFormat('H:i', $request->jam_mulai);
$jamSelesai = $jamMulai->copy()->addMinutes($totalDurasi); $jamSelesai = $jamMulai->copy()->addMinutes($totalDurasi);
// 3. Cek Slot Sekali Lagi (Mencegah Race Condition)
$isTaken = \App\Models\BookingFoto::where('tgl_booking', $request->tgl_booking) $isTaken = \App\Models\BookingFoto::where('tgl_booking', $request->tgl_booking)
->where('jam_mulai', $request->jam_mulai) ->where('jam_mulai', $request->jam_mulai)
->whereIn('status_booking', ['menunggu_verifikasi', 'diterima']) ->whereIn('status_booking', ['menunggu_verifikasi', 'diterima'])
->exists(); ->exists();
if ($isTaken) { if ($isTaken) {
return back()->with('error', 'Mohon maaf, slot waktu ini baru saja diambil orang lain.'); return back()->with('error', 'Mohon maaf, slot waktu ini baru saja diambil orang lain.');
} }
// 4. Simpan Data Pelanggan
$pelanggan = \App\Models\Pelanggan::create([ $pelanggan = \App\Models\Pelanggan::create([
'nama' => $request->nama, 'nama' => $request->nama,
'no_wa' => $request->no_wa 'no_wa' => $request->no_wa
]); ]);
// 5. Upload Bukti Bayar
$pathBukti = null; $pathBukti = null;
if ($request->hasFile('bukti_bayar')) { if ($request->hasFile('bukti_bayar')) {
$file = $request->file('bukti_bayar'); $file = $request->file('bukti_bayar');
$namaFile = 'bukti_' . time() . '.' . $file->getClientOriginalExtension(); $namaFile = 'bukti_' . time() . '.' . $file->getClientOriginalExtension();
$pathBukti = $file->storeAs('img/payment/foto', $namaFile, 'public'); $pathBukti = $file->storeAs('img/payment/foto', $namaFile, 'public');
} }
// 6. Simpan Booking Utama
$booking = \App\Models\BookingFoto::create([ $booking = \App\Models\BookingFoto::create([
'no_invoice' => 'INV-FOTO-' . strtoupper(\Illuminate\Support\Str::random(6)), 'no_invoice' => 'INV-FOTO-' . strtoupper(\Illuminate\Support\Str::random(6)),
'id_pelanggan' => $pelanggan->id_pelanggan, 'id_pelanggan' => $pelanggan->id_pelanggan,
@ -266,8 +223,6 @@ public function store(Request $request)
'bukti_bayar' => $pathBukti, 'bukti_bayar' => $pathBukti,
'status_booking' => 'menunggu_verifikasi' 'status_booking' => 'menunggu_verifikasi'
]); ]);
// 7. Simpan Detail Additional
foreach ($listAdditional as $item) { foreach ($listAdditional as $item) {
\App\Models\DetailAdditional::create([ \App\Models\DetailAdditional::create([
'id_booking' => $booking->id_booking, 'id_booking' => $booking->id_booking,
@ -276,18 +231,15 @@ public function store(Request $request)
'subtotal' => $item['subtotal'] 'subtotal' => $item['subtotal']
]); ]);
} }
\Illuminate\Support\Facades\DB::commit(); \Illuminate\Support\Facades\DB::commit();
$txtAddons = ""; $txtAddons = "";
if (count($listAdditional) > 0) { if (count($listAdditional) > 0) {
$txtAddons = "*Additional:*"; // Judul $txtAddons = "*Additional:*";
foreach ($listAdditional as $item) { foreach ($listAdditional as $item) {
// Ambil nama yang tadi kita titip
$txtAddons .= "\n- " . $item['nama_barang'] . " (" . $item['qty'] . "x)"; $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" . $pesan = "Halo Admin Flo.do! Saya sudah melakukan pembayaran untuk invoice {$booking->no_invoice}:\n\n" .
"*Data Pemesan:*\n" . "*Data Pemesan:*\n" .
"Nama: {$request->nama}\n" . "Nama: {$request->nama}\n" .

View File

@ -56,7 +56,6 @@ public function formulir($slug_id)
public function store(Request $request) public function store(Request $request)
{ {
$buket = Buket::findOrFail($request->id_buket); $buket = Buket::findOrFail($request->id_buket);
// 1. Validasi Detail dengan Pesan Kustom & Alias
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'nama' => 'required|string|min:3|max:100', 'nama' => 'required|string|min:3|max:100',
'no_wa' => 'required|numeric|digits_between:10,15', 'no_wa' => 'required|numeric|digits_between:10,15',
@ -72,7 +71,6 @@ public function store(Request $request)
'request_khusus' => 'nullable|string|max:255', 'request_khusus' => 'nullable|string|max:255',
'ucapan' => 'nullable|string|max:500', 'ucapan' => 'nullable|string|max:500',
], [ ], [
// Detail Pesan Kustom
'required' => 'Kolom :attribute wajib diisi.', 'required' => 'Kolom :attribute wajib diisi.',
'string' => 'Input :attribute harus berupa teks valid.', 'string' => 'Input :attribute harus berupa teks valid.',
'min' => ':attribute terlalu pendek, minimal :min karakter.', '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.after_or_equal' => 'Jam operasional kami mulai pukul 09:00.',
'waktu_ambil.before_or_equal' => 'Jam operasional kami berakhir pukul 21:00.', 'waktu_ambil.before_or_equal' => 'Jam operasional kami berakhir pukul 21:00.',
], [ ], [
// Alias Atribut agar lebih ramah
'nama' => 'nama pemesan', 'nama' => 'nama pemesan',
'no_wa' => 'nomor WhatsApp', 'no_wa' => 'nomor WhatsApp',
'tgl_ambil' => 'tanggal pengambilan', 'tgl_ambil' => 'tanggal pengambilan',
@ -96,28 +93,22 @@ public function store(Request $request)
'ucapan' => 'kartu ucapan', 'ucapan' => 'kartu ucapan',
]); ]);
// Jika validasi gagal
if ($validator->fails()) { if ($validator->fails()) {
return back()->withErrors($validator)->withInput(); return back()->withErrors($validator)->withInput();
} }
try { try {
db::beginTransaction(); db::beginTransaction();
// 2. Simpan ke Tabel Pelanggan dulu
$pelanggan = Pelanggan::create([ $pelanggan = Pelanggan::create([
'nama' => $request->nama, 'nama' => $request->nama,
'no_wa' => $request->no_wa, 'no_wa' => $request->no_wa,
]); ]);
// 3. Handle File Upload Bukti Bayar
$namaFile = null; $namaFile = null;
if ($request->hasFile('bukti_bayar')) { if ($request->hasFile('bukti_bayar')) {
$file = $request->file('bukti_bayar'); $file = $request->file('bukti_bayar');
$namaFile = 'bukti_' . time() . '.' . $file->getClientOriginalExtension(); $namaFile = 'bukti_' . time() . '.' . $file->getClientOriginalExtension();
$pathBukti = $file->storeAs('img/payment/buket', $namaFile, 'public'); $pathBukti = $file->storeAs('img/payment/buket', $namaFile, 'public');
} }
$transaksi = TransaksiBuket::create([ $transaksi = TransaksiBuket::create([
'id_pelanggan' => $pelanggan->id_pelanggan, 'id_pelanggan' => $pelanggan->id_pelanggan,
'id_buket' => $request->id_buket, 'id_buket' => $request->id_buket,
@ -132,7 +123,6 @@ public function store(Request $request)
DB::commit(); DB::commit();
// 5. Membuat Pesan WhatsApp Otomatis
$pesan = "Halo Admin Flo.do! Saya sudah melakukan pembayaran untuk invoice {$transaksi->no_invoice}:\n\n" . $pesan = "Halo Admin Flo.do! Saya sudah melakukan pembayaran untuk invoice {$transaksi->no_invoice}:\n\n" .
"*Data Pemesan:*\n" . "*Data Pemesan:*\n" .
"Nama: {$pelanggan->nama}\n" . "Nama: {$pelanggan->nama}\n" .