id(); // LOGIKA BELI LANGSUNG (Buy Now) if ($request->has('produk_id')) { $produk = Produk::with('petani')->findOrFail($request->produk_id); $items = collect([ (object) [ 'id' => $produk->id, 'produk' => $produk, 'nama_produk' => $produk->nama_produk, 'harga' => $produk->harga, 'jumlah' => $request->qty ?? 1, 'subtotal' => $produk->harga * ($request->qty ?? 1), 'foto' => $produk->foto_produk ] ]); $total_belanja = $items->sum('subtotal'); return view('landing.checkout', compact('items', 'total_belanja')); } // LOGIKA CHECKOUT DARI KERANJANG (Database) $cartIds = $request->query('cart_ids'); if (!$cartIds) { return redirect()->route('cart')->with('error', 'Pilih minimal satu produk di keranjang untuk dicheckout.'); } $selectedIds = explode(',', $cartIds); $cartItems = Cart::with('produk.petani') ->where('pembeli_id', $pembeli_id) ->whereIn('id', $selectedIds) ->get(); if ($cartItems->isEmpty()) { return redirect()->route('cart')->with('error', 'Barang di keranjang tidak ditemukan atau sudah dihapus.'); } // Transformasi data agar sesuai dengan format yang dibaca di View Checkout $items = $cartItems->map(function ($item) { return (object) [ 'cart_id' => $item->id, 'id' => $item->produk->id, 'produk' => $item->produk, 'nama_produk' => $item->produk->nama_produk, 'harga' => $item->produk->harga, 'jumlah' => $item->quantity, 'subtotal' => $item->produk->harga * $item->quantity, 'foto' => $item->produk->foto_produk ]; }); $total_belanja = $items->sum('subtotal'); return view('landing.checkout', compact('items', 'total_belanja')); } /** * Proses Pembuatan Transaksi * Mengelompokkan pesanan berdasarkan Petani dan membersihkan keranjang */ public function prosesCheckout(Request $request) { $request->validate([ 'alamat_pengiriman' => 'required|string', 'metode_pembayaran' => 'required|in:cod', ]); $pembeli_id = Auth::guard('pembeli')->id(); DB::transaction(function () use ($request, $pembeli_id) { if ($request->has('produk_id')) { // --- LOGIKA BELI LANGSUNG --- $produk = Produk::findOrFail($request->produk_id); $total_harga = $produk->harga * $request->jumlah; $transaksi = Transaksi::create([ 'pembeli_id' => $pembeli_id, 'petani_id' => $produk->petani_id, 'tanggal_transaksi' => now(), 'alamat_pengiriman' => $request->alamat_pengiriman, 'total_harga' => $total_harga, 'status' => 'menunggu konfirmasi', 'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999), ]); DetailTransaksi::create([ 'transaksi_id' => $transaksi->id, 'produk_id' => $produk->id, 'jumlah' => $request->jumlah, 'harga_satuan' => $produk->harga, 'subtotal' => $total_harga, ]); $produk->decrement('stok', $request->jumlah); } else { // --- LOGIKA KERANJANG (DATABASE) --- if (!$request->cart_ids) { throw new \Exception("ID keranjang tidak ditemukan."); } $cartIds = explode(',', $request->cart_ids); $cartItems = Cart::with('produk') ->whereIn('id', $cartIds) ->where('pembeli_id', $pembeli_id) ->get(); $groupedByPetani = []; foreach ($cartItems as $item) { $groupedByPetani[$item->produk->petani_id][] = $item; } foreach ($groupedByPetani as $petani_id => $items) { $transaksi = Transaksi::create([ 'pembeli_id' => $pembeli_id, 'petani_id' => $petani_id, 'tanggal_transaksi' => now(), 'alamat_pengiriman' => $request->alamat_pengiriman, 'total_harga' => 0, 'status' => 'menunggu konfirmasi', 'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999), ]); $subtotal_transaksi = 0; foreach ($items as $item) { $total_per_item = $item->produk->harga * $item->quantity; $subtotal_transaksi += $total_per_item; DetailTransaksi::create([ 'transaksi_id' => $transaksi->id, 'produk_id' => $item->produk->id, 'jumlah' => $item->quantity, 'harga_satuan' => $item->produk->harga, 'subtotal' => $total_per_item, ]); $item->produk->decrement('stok', $item->quantity); } // Update total harga transaksi per petani $transaksi->update(['total_harga' => $subtotal_transaksi]); } Cart::whereIn('id', $cartIds)->delete(); } }); return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Silakan pantau status pesanan Anda.'); } // Riwayat Pesanan Pembeli public function pesananSaya() { $transaksis = Transaksi::with(['detailTransaksis.produk.petani']) ->where('pembeli_id', Auth::guard('pembeli')->id()) ->latest() ->get(); return view('landing.pesanan_saya', compact('transaksis')); } // Konfirmasi Pesanan Diterima oleh Pembeli public function konfirmasiSelesai($id) { $transaksi = Transaksi::where('pembeli_id', Auth::guard('pembeli')->id()) ->findOrFail($id); if ($transaksi->status == 'dikirim') { $transaksi->status = 'selesai'; $transaksi->save(); return back()->with('success', 'Terima kasih! Pesanan telah selesai.'); } return back()->with('error', 'Pesanan belum dikirim atau sudah selesai.'); } // --- FITUR PETANI --- // Daftar Pesanan Masuk untuk Dashboard Petani public function pesananMasuk() { $petaniId = Auth::guard('petani')->id(); $pesanans = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) { $q->where('petani_id', $petaniId); }) ->with(['pembeli', 'detailTransaksis.produk']) ->latest() ->get(); return view('petani.pesanan.index', compact('pesanans')); } // Update Status Pesanan oleh Petani public function updateStatus(Request $request, $id) { $transaksi = Transaksi::findOrFail($id); $request->validate([ 'status' => 'required|in:diproses,dikirim,selesai,batal' ]); $transaksi->status = $request->status; $transaksi->save(); // Jika dibatalkan, kembalikan stok produk if ($request->status == 'batal') { foreach ($transaksi->detailTransaksis as $detail) { $detail->produk->increment('stok', $detail->jumlah); } } return back()->with('success', 'Status pesanan berhasil diperbarui.'); } // Detail Pesanan untuk Sisi Petani public function pesananDetail($id) { $petaniId = Auth::guard('petani')->id(); $pesanan = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) { $q->where('petani_id', $petaniId); }) ->with(['pembeli', 'detailTransaksis.produk']) ->findOrFail($id); return view('petani.pesanan.detail', compact('pesanan')); } }