diff --git a/app/Http/Controllers/user/PesanBuketController.php b/app/Http/Controllers/user/PesanBuketController.php index f52898c..02fe137 100644 --- a/app/Http/Controllers/user/PesanBuketController.php +++ b/app/Http/Controllers/user/PesanBuketController.php @@ -3,20 +3,156 @@ namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; +use App\Models\Buket; +use App\Models\Pelanggan; +use App\Models\TransaksiBuket; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Facades\Validator; class PesanBuketController extends Controller { - public function index() + public function index(Request $request) { - return view('user/pesan-buket'); + $query = Buket::query(); + + if ($request->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() + + public function detail($id) { - return view('user/detail-buket'); + $buket = Buket::findOrFail($id); + + return view('user/detail-buket', compact('buket')); } - public function formulir() + public function formulir($id) { - return view('user/pembayaran-buket'); + $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 = time() . '_' . $file->getClientOriginalName(); + // Pindahkan ke folder public/img/payment + $file->move(public_path('img/payment'), $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-' . time(), // Tambahkan invoice sederhana + ]); + + DB::commit(); + + // 5. Membuat Pesan WhatsApp Otomatis + $pesan = "Halo Admin Flo.do! Saya sudah melakukan pembayaran:\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 dikirim!', + 'waUrl' => $urlWA + ]); + } catch (\Exception $e) { + DB::rollBack(); + return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage()); + } } } diff --git a/app/Models/TransaksiBuket.php b/app/Models/TransaksiBuket.php index b14a919..f96d6a7 100644 --- a/app/Models/TransaksiBuket.php +++ b/app/Models/TransaksiBuket.php @@ -17,6 +17,7 @@ class TransaksiBuket extends Model 'id_pelanggan', 'id_buket', 'request', + 'ucapan', 'tgl_ambil', 'total_bayar', 'bukti_bayar', @@ -33,4 +34,38 @@ public function buket() { return $this->belongsTo(Buket::class, 'id_buket'); } + // Di Model TransaksiBuket.php + + public function getStatusLabelAttribute() + { + // Mapping status ke class subtle dan teks + $statusMap = [ + 'menunggu_verifikasi' => [ + 'class' => 'bg-info-subtle', // text-emphasis agar kontras + 'text' => 'Menunggu Verifikasi' + ], + 'diterima' => [ + 'class' => 'bg-warning-subtle ', + 'text' => 'Diterima' + ], + 'selesai' => [ + 'class' => 'bg-success-subtle', + 'text' => 'Selesai' + ], + 'dibatalkan' => [ + 'class' => 'bg-info-subtle ', + 'text' => 'Dibatalkan' + ], + 'ditolak' => [ + 'class' => 'bg-danger-subtle', + 'text' => 'Ditolak' + ], + ]; + + // Mengambil data berdasarkan status_transaksi, default ke secondary jika tidak ada + return (object) ($statusMap[$this->status_transaksi] ?? [ + 'class' => 'bg-secondary-subtle text-secondary', + 'text' => 'Unknown' + ]); + } } diff --git a/database/seeders/BuketSeeder.php b/database/seeders/BuketSeeder.php index 8b724c0..bb96b4b 100644 --- a/database/seeders/BuketSeeder.php +++ b/database/seeders/BuketSeeder.php @@ -14,26 +14,110 @@ public function run(): void 'nama' => 'Buket Mawar Merah Premium', 'harga' => 150000, 'deskripsi' => 'Buket mawar merah segar isi 10 tangkai dengan wrapping premium.', + 'request_khusus' => 'Tone Warna, Wrapping', 'kategori' => 'fresh', 'ukuran' => 'S', - 'foto' => 'img/buket/buket1.jpg', + 'foto' => 'img/buket/mawar-merah-premium.jpg', ], [ - 'nama' => 'Snack Bouquet Choco', - 'harga' => 75000, - 'deskripsi' => 'Buket isi beng-beng, pocky, dan coklat silverqueen.', - 'kategori' => 'single', - 'ukuran' => 'M', - 'foto' => 'img/buket/buket2.jpg', + 'nama' => 'Sunflower Bliss Bouquet', + 'harga' => 125000, + 'deskripsi' => 'Buket bunga matahari cerah yang melambangkan kebahagiaan.', + 'request_khusus' => 'Warna Pita, Kartu Ucapan', + 'kategori' => 'fresh', + 'ukuran' => 'S', + 'foto' => 'img/buket/sunflower.jpg', ], [ - 'nama' => 'Money Bouquet 500k', - 'harga' => 550000, // Harga jasa + uang - 'deskripsi' => 'Buket uang pecahan 50rb total 500rb, jasa rangkai free kartu ucapan.', + 'nama' => 'Vintage Dried Rose', + 'harga' => 200000, + 'deskripsi' => 'Kombinasi mawar kering dan edelweiss yang tahan lama bertahun-tahun.', + 'request_khusus' => 'Warna Wrapping (Rustic/Pastel)', 'kategori' => 'artificial', - 'ukuran' => 'L', + 'ukuran' => 'M', 'foto' => 'img/buket/buket3.jpg', ], + [ + 'nama' => 'White Lily Elegance', + 'harga' => 350000, + 'deskripsi' => 'Buket Lily putih besar dengan aroma harum yang menenangkan.', + 'request_khusus' => 'Jumlah Tangkai, Wrapping', + 'kategori' => 'fresh', + 'ukuran' => 'L', + 'foto' => 'img/buket/white-lily.jpg', + ], + [ + 'nama' => 'Artificial Tulip Garden', + 'harga' => 110000, + 'deskripsi' => 'Bunga Tulip latex kualitas premium yang terlihat sangat mirip asli.', + 'request_khusus' => 'Tone Warna Tulip', + 'kategori' => 'artificial', + 'ukuran' => 'S', + 'foto' => 'img/buket/artificial-tulip.jpg', + ], + [ + 'nama' => 'Pastel Peony Dream', + 'harga' => 275000, + 'deskripsi' => 'Bunga Peony artificial dalam nuansa warna pastel yang lembut.', + 'request_khusus' => 'Kombinasi Bunga Pendamping', + 'kategori' => 'artificial', + 'ukuran' => 'M', + 'foto' => 'img/buket/pastel-peony.jpg', + ], + [ + 'nama' => ' Lavender Scent', + 'harga' => 185000, + 'deskripsi' => 'Bunga lavender asli dengan aroma terapi alami, cocok untuk kado ultah.', + 'request_khusus' => 'Wrapping Goni/Kertas', + 'kategori' => 'fresh', + 'ukuran' => 'S', + 'foto' => 'img/buket/lavender.jpg', + ], + [ + 'nama' => 'Grand Celebration Mix', + 'harga' => 550000, + 'deskripsi' => 'Buket raksasa campuran Mawar, Baby Breath, dan Hydrangea.', + 'request_khusus' => 'Custom Jenis Bunga, Warna', + 'kategori' => 'fresh', + 'ukuran' => 'L', + 'foto' => 'img/buket/gran-buket.jpg', + ], + [ + 'nama' => 'Hydrangea Sky Blue', + 'harga' => 165000, + 'deskripsi' => 'Satu tangkai besar Hydrangea biru segar dengan filler Baby Breath.', + 'request_khusus' => 'Tone Warna Hydrangea', + 'kategori' => 'fresh', + 'ukuran' => 'M', + 'foto' => 'img/buket/hidraangea.jpg', + ], + [ + 'nama' => 'Baby Breath Clouds', + 'harga' => 140000, + 'deskripsi' => 'Buket full Baby Breath putih yang tampak seperti awan, sangat simpel.', + 'request_khusus' => 'Wrapping Celophane', + 'kategori' => 'fresh', + 'ukuran' => 'S', + 'foto' => 'img/buket/babybreath.jpg', + ], + [ + 'nama' => 'Single Sunflower', + 'harga' => 45000, + 'deskripsi' => 'Satu tangkai bunga matahari besar untuk mencerahkan hari seseorang.', + 'request_khusus' => 'Warna Pita', + 'kategori' => 'single', + 'ukuran' => 'S', + 'foto' => 'img/buket/single-sunflower.jpg', + ], + [ + 'nama' => 'Pink Gerbera Cheer', + 'harga' => 135000, + 'deskripsi' => 'Buket bunga Gerbera pink ceria untuk menyemangati hari orang tersayang.', + 'request_khusus' => 'Warna Pita', + 'kategori' => 'fresh', + 'ukuran' => 'S', + 'foto' => 'img/buket/garbera.jpg', + ], ]; DB::table('bukets')->insert($data); diff --git a/resources/views/user/_list.blade.php b/resources/views/user/_list.blade.php new file mode 100644 index 0000000..275322b --- /dev/null +++ b/resources/views/user/_list.blade.php @@ -0,0 +1,21 @@ +
+ - Buket Lily Premium menghadirkan keanggunan dalam setiap helai kelopak lily segar berwarna - putih atau pink, dipadukan dengan daun hijau dan sentuhan baby’s breath yang lembut. -
-- Rangkaian ini dibalut kertas premium bernuansa nude atau ivory dengan pita satin senada, - menciptakan tampilan yang mewah dan menenangkan. Cocok untuk perayaan pernikahan, wisuda, - atau ucapan terima kasih. + {!! nl2br(e($buket->deskripsi)) !!}
- Note: Penyesuaian warna bunga, wrapping, dan pita dapat ditulis di bagian - catatan saat pemesanan. + Note: {{ $buket->request_khusus }}
diff --git a/resources/views/user/pembayaran-buket.blade.php b/resources/views/user/pembayaran-buket.blade.php index 824e78c..c8227df 100644 --- a/resources/views/user/pembayaran-buket.blade.php +++ b/resources/views/user/pembayaran-buket.blade.php @@ -12,7 +12,7 @@