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 @@ +
{{-- ID ini harus ada agar AJAX bisa menimpa isinya --}} +
+ @forelse ($buket as $b) +
+
+
+ {{ $b->nama }} +
+
{{ $b->nama }}
+

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

+
+ +
+
+ @empty +
+

Buket tidak ditemukan

+
+ @endforelse +
+
diff --git a/resources/views/user/detail-buket.blade.php b/resources/views/user/detail-buket.blade.php index d2d5169..6f49b34 100644 --- a/resources/views/user/detail-buket.blade.php +++ b/resources/views/user/detail-buket.blade.php @@ -7,7 +7,7 @@
-
+
Kembali ke Katalog @@ -18,16 +18,16 @@
- Buket Lily Premium + {{ $buket->nama }}
-

Buket Lily Premium

+

{{ $buket->nama }}

-

Rp 150.000

+

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

@@ -38,7 +38,8 @@
Kategori - Fresh Flowers + {{ ucfirst(str_replace('_', ' ', $buket->kategori)) }}
@@ -50,7 +51,7 @@
Ukuran - Medium (40cm) + Size {{ $buket->ukuran }}
@@ -58,27 +59,29 @@

- 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 @@
-
+ @csrf
@@ -22,21 +22,31 @@

Rincian Pesanan

- Product + {{ $buket->nama }}
-
Buket Lily Premium
-

Rp 150.000

+
{{ $buket->nama }}
+

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

+
- + + @error('request_khusus') +
{{ $message }}
+ @enderror
- + + @error('ucapan') +
{{ $message }}
+ @enderror
@@ -45,24 +55,44 @@
- + + + @error('nama') +
{{ $message }}
+ @enderror
- + + @error('no_wa') +
{{ $message }}
+ @enderror
- + + @error('tgl_ambil') +
{{ $message }}
+ @enderror
- + + Jam operasional: 09.00 - 21.00 WIB + @error('waktu_ambil') +
{{ $message }}
+ @enderror
@@ -74,7 +104,7 @@
Total Pembayaran -
Rp 150.000
+
Rp {{ number_format($buket->harga, 0, ',', '.') }}

Transfer ke Rekening Berikut:

@@ -115,24 +145,27 @@ class="btn btn-sm btn-outline-secondary py-1 px-3 x-small btn-copy"

Upload Bukti Pembayaran

- -
+ +

Upload Bukti Pembayaran

Max. 2 MB

- + @error('bukti_bayar') +
{{ $message }}
+ @enderror

*Note: Pastikan pembayaran sudah dilakukan sebelum mengunggah bukti, ya!

- Batalkan - +
@@ -155,4 +188,22 @@ class="btn formulirbuket-btn-cancel flex-fill">Batalkan }); }); + + + + @endsection diff --git a/resources/views/user/pesan-buket.blade.php b/resources/views/user/pesan-buket.blade.php index fafa22f..2c62c29 100644 --- a/resources/views/user/pesan-buket.blade.php +++ b/resources/views/user/pesan-buket.blade.php @@ -8,14 +8,15 @@
-

Koleksi Bunga Flo.do

+

Koleksi Buket Flo.do

Jelajahi berbagai pilihan buket dan rangkaian bunga dari Flodo

- +
@@ -35,10 +36,14 @@ @@ -82,58 +87,56 @@ aria-labelledby="headingSize">
- - - + + +
- +
-
- - @for ($i = 1; $i <= 8; $i++) -
- -
- -
- Buket Bunga -
- -
Buket Lily Premium
-

Rp 150.000

- - -
-
- @endfor -
- + @include('user._list')
- - Sebelumnya - + @if ($buket->onFirstPage()) + + Sebelumnya + + @else + + Sebelumnya + + @endif + {{-- Nomor Halaman --}}
- 1 - 2 - 3 - ... - 10 + @foreach ($buket->getUrlRange(1, $buket->lastPage()) as $page => $url) + @if ($page == $buket->currentPage()) + {{ $page }} + @else + {{ $page }} + @endif + @endforeach
- - Selanjutnya - + @if ($buket->hasMorePages()) + + Selanjutnya + + @else + + Selanjutnya + + @endif
@@ -142,53 +145,120 @@
-@endsection - + + + + + + {{-- Letakkan di file yang rutenya pesan.buket --}} + @if (session('waUrl')) + + + + @endif +@endsection