filled('keyword')) { $search = $request->keyword; $query->where(function ($q) use ($search) { $q->where('nama', 'like', '%' . $search . '%') ->orWhere('deskripsi', 'like', '%' . $search . '%'); }); } if ($request->filled('kategori') && $request->kategori != '') { $query->where('kategori', $request->kategori); } if ($request->filled('min_price')) $query->where('harga', '>=', $request->min_price); if ($request->filled('max_price')) $query->where('harga', '<=', $request->max_price); if ($request->filled('ukuran')) $query->where('ukuran', $request->ukuran); $buket = $query->paginate(8)->withQueryString(); if ($request->ajax()) { return view('user._list', compact('buket'))->render(); } return view('user/pesan-buket', compact('buket')); } public function detail($id) { $buket = Buket::findOrFail($id); return view('user/detail-buket', compact('buket')); } public function formulir($id) { $buket = Buket::findOrFail($id); return view('user/pembayaran-buket', compact('buket')); } 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', 'tgl_ambil' => 'required|date|after_or_equal:today', 'waktu_ambil' => 'required', 'waktu_ambil' => [ 'required', 'date_format:H:i', 'after_or_equal:09:00', 'before_or_equal:21:00', ], 'bukti_bayar' => 'required|image|mimes:jpeg,png,jpg|max:2048', '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.', '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.', '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', 'waktu_ambil' => 'waktu pengambilan', 'bukti_bayar' => 'bukti pembayaran', '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'); // 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); } $transaksi = TransaksiBuket::create([ 'id_pelanggan' => $pelanggan->id_pelanggan, 'id_buket' => $request->id_buket, '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, '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 ]); 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" . "WA: {$pelanggan->no_wa}\n\n" . "*Detail Produk:*\n" . "Produk: {$transaksi->buket->nama}\n" . "Total: Rp " . number_format($transaksi->buket->harga, 0, ',', '.') . "\n\n" . "Mohon segera diproses, ya! Terima kasih."; $urlWA = "https://wa.me/6289673668516?text=" . urlencode($pesan); return redirect()->route('pesan.buket')->with([ 'success' => 'Pesanan Berhasil Dibuat!', 'waUrl' => $urlWA ]); } catch (\Exception $e) { DB::rollBack(); return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage()); } } }