From cd8a6b6a6e74fcbbde626e2c1b1f4d1da5325f8c Mon Sep 17 00:00:00 2001 From: LailaWulandarii Date: Thu, 8 Jan 2026 19:00:52 +0700 Subject: [PATCH] refactor: update file handling to use Storage facade and improve image path references --- .../User/BookingFotoController.php | 66 +++++++++++-------- .../Controllers/User/PesanBuketController.php | 6 +- app/Models/Buket.php | 4 +- resources/views/user/booking-foto.blade.php | 2 +- .../views/user/components/_list.blade.php | 3 +- resources/views/user/detail-buket.blade.php | 2 +- resources/views/user/detail-foto.blade.php | 2 +- .../views/user/pembayaran-buket.blade.php | 3 +- resources/views/user/pesan-buket.blade.php | 7 +- 9 files changed, 54 insertions(+), 41 deletions(-) diff --git a/app/Http/Controllers/User/BookingFotoController.php b/app/Http/Controllers/User/BookingFotoController.php index 3f10a5b..21389f7 100755 --- a/app/Http/Controllers/User/BookingFotoController.php +++ b/app/Http/Controllers/User/BookingFotoController.php @@ -11,6 +11,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Storage; class BookingFotoController extends Controller { @@ -157,39 +158,46 @@ public function store(Request $request) 'nama' => 'required|string|min:3|max:100', '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.', - 'max' => ':attribute terlalu panjang, maksimal :max karakter.', - 'numeric' => ':attribute harus berupa angka.', - 'digits_between' => ':attribute harus antara :min sampai :max digit.', - 'date' => 'Format tanggal pada :attribute tidak valid.', - 'after_or_equal' => ':attribute tidak boleh tanggal yang sudah lewat.', - 'image' => ':attribute harus berupa file gambar.', - 'mimes' => 'Format :attribute harus jpeg, png, atau jpg.', - 'max.file' => 'Ukuran :attribute maksimal adalah 2MB.', - ], [ - // Alias Atribut agar lebih ramah - 'id_paket' => 'paket foto', - 'nama' => 'nama pemesan', - 'no_wa' => 'nomor WhatsApp', - 'tgl_booking' => 'tanggal booking', - 'jam_mulai' => 'jam mulai', - 'bukti_bayar' => 'bukti pembayaran', ]); - if ($validator->fails()) { - return back()->withErrors($validator)->withInput(); - } - - \Illuminate\Support\Facades\DB::beginTransaction(); // Mulai Transaksi Database + DB::beginTransaction(); // Mulai Transaksi Database try { - // 2. Ambil Data Paket & Hitung Waktu (Termasuk Tambahan Menit dari Addons) - $paket = \App\Models\PaketFoto::findOrFail($request->id_paket); - $totalDurasi = $paket->durasi; + // 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']) + ->exists(); + + if ($isTaken) { + 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] + ); + + // 5. Upload Bukti Bayar + $pathBukti = null; + if ($request->hasFile('bukti_bayar')) { + $file = $request->file('bukti_bayar'); + $namaFile = 'bukti_' . time() . '_' . Str::random(5) . '.' . $file->getClientOriginalExtension(); + $file->move(public_path('img/payment/foto'), $namaFile); + $pathBukti = $file->storeAs('img/payment/foto', $namaFile, 'public'); + } + + // 6. Hitung Grand Total (Paket + Additional) + // Kita hitung ulang di server agar aman dari manipulasi inspect element $grandTotal = $paket->harga; $listAdditional = []; diff --git a/app/Http/Controllers/User/PesanBuketController.php b/app/Http/Controllers/User/PesanBuketController.php index 02d9069..777a1e5 100755 --- a/app/Http/Controllers/User/PesanBuketController.php +++ b/app/Http/Controllers/User/PesanBuketController.php @@ -36,7 +36,7 @@ public function index(Request $request) $buket = $query->paginate(8)->withQueryString(); if ($request->ajax()) { - return view('user._list', compact('buket'))->render(); + return view('user.components._list', compact('buket'))->render(); } return view('user/pesan-buket', compact('buket')); @@ -117,7 +117,7 @@ public function store(Request $request) // Membuat nama file unik berdasarkan waktu agar tidak tertimpa $namaFile = 'bukti_' . time() . $file->getClientOriginalExtension(); // Pindahkan ke folder public/img/payment - $file->move(public_path('img/payment/buket'), $namaFile); + $pathBukti = $file->storeAs('img/payment/buket', $namaFile, 'public'); } $transaksi = TransaksiBuket::create([ @@ -126,7 +126,7 @@ public function store(Request $request) 'tgl_ambil' => $request->tgl_ambil . ' ' . $request->waktu_ambil, 'request' => $request->request_khusus, // Ubah dari request_khusus ke request 'ucapan' => $request->ucapan, - 'bukti_bayar' => 'img/payment/' . $namaFile, + 'bukti_bayar' => 'img/payment/buket' . $namaFile, 'status_transaksi' => 'menunggu_verifikasi', // Ubah dari status ke status_transaksi 'total_bayar' => $buket->harga, // Tambahkan ini karena total_bayar wajib di fillable 'no_invoice' => 'INV-BUKET-' . strtoupper(\Illuminate\Support\Str::random(6)), // Tambahkan invoice sederhana diff --git a/app/Models/Buket.php b/app/Models/Buket.php index c4b85fc..8970d2c 100755 --- a/app/Models/Buket.php +++ b/app/Models/Buket.php @@ -19,8 +19,8 @@ class Buket extends Model 'ucapan', 'harga', 'foto', - 'kategori', // Enum - 'ukuran', // Enum + 'kategori', + 'ukuran', ]; public function transaksi() diff --git a/resources/views/user/booking-foto.blade.php b/resources/views/user/booking-foto.blade.php index 81ff7ca..ebacaca 100755 --- a/resources/views/user/booking-foto.blade.php +++ b/resources/views/user/booking-foto.blade.php @@ -20,7 +20,7 @@
- {{ $f->nama }}
diff --git a/resources/views/user/components/_list.blade.php b/resources/views/user/components/_list.blade.php index 275322b..c069dd0 100755 --- a/resources/views/user/components/_list.blade.php +++ b/resources/views/user/components/_list.blade.php @@ -4,7 +4,8 @@
- {{ $b->nama }} + {{ $b->nama }}
{{ $b->nama }}

Rp {{ number_format($b->harga, 0, ',', '.') }}

diff --git a/resources/views/user/detail-buket.blade.php b/resources/views/user/detail-buket.blade.php index 26aed68..8aafdab 100755 --- a/resources/views/user/detail-buket.blade.php +++ b/resources/views/user/detail-buket.blade.php @@ -18,7 +18,7 @@
- {{ $buket->nama }} + {{ $buket->nama }}
diff --git a/resources/views/user/detail-foto.blade.php b/resources/views/user/detail-foto.blade.php index 0618321..f38e74f 100755 --- a/resources/views/user/detail-foto.blade.php +++ b/resources/views/user/detail-foto.blade.php @@ -28,7 +28,7 @@
- {{ $foto->nama }}
diff --git a/resources/views/user/pembayaran-buket.blade.php b/resources/views/user/pembayaran-buket.blade.php index 5ca4b99..121685f 100755 --- a/resources/views/user/pembayaran-buket.blade.php +++ b/resources/views/user/pembayaran-buket.blade.php @@ -22,7 +22,8 @@

Rincian Pesanan

- {{ $buket->nama }} + {{ $buket->nama }}
{{ $buket->nama }}

Rp {{ number_format($buket->harga, 0, ',', '.') }}

diff --git a/resources/views/user/pesan-buket.blade.php b/resources/views/user/pesan-buket.blade.php index 6b8ff4c..27bd1ef 100755 --- a/resources/views/user/pesan-buket.blade.php +++ b/resources/views/user/pesan-buket.blade.php @@ -147,6 +147,7 @@ class="page-number text-decoration-none">{{ $page }} +