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')); } // Checkout dari Keranjang $cart = session()->get('cart'); if ($cart && count($cart) > 0) { $items = collect(); foreach ($cart as $id => $details) { $produk = Produk::find($id); if ($produk) { $items->push((object) [ 'id' => $id, 'produk' => $produk, 'nama_produk' => $details['name'], 'harga' => $details['price'], 'jumlah' => $details['quantity'], 'subtotal' => $details['price'] * $details['quantity'], 'foto' => $details['photo'] ]); } } $total_belanja = $items->sum('subtotal'); return view('landing.checkout', compact('items', 'total_belanja')); } return redirect()->route('shop')->with('error', 'Keranjang Anda kosong, silakan belanja dulu.'); } // fungsi prosesCheckout 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 (Single Item) --- $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 (Cart) --- $cart = session()->get('cart'); // Kelompokkan produk berdasarkan Petani ID $cartItems = []; foreach ($cart as $id => $details) { $produk = Produk::find($id); if ($produk) { $cartItems[$produk->petani_id][] = [ 'produk' => $produk, 'qty' => $details['quantity'] ]; } } foreach ($cartItems as $petani_id => $items) { $subtotal_transaksi = 0; $kode_invoice = 'INV/' . date('Ymd') . '/' . rand(1000, 9999); // Membuat Header Transaksi per Petani $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' => $kode_invoice, ]); foreach ($items as $item) { $produk = $item['produk']; $qty = $item['qty']; $total_per_item = $produk->harga * $qty; $subtotal_transaksi += $total_per_item; DetailTransaksi::create([ 'transaksi_id' => $transaksi->id, 'produk_id' => $produk->id, 'jumlah' => $qty, 'harga_satuan' => $produk->harga, 'subtotal' => $total_per_item, ]); $produk->decrement('stok', $qty); } // Update total harga transaksi $transaksi->update(['total_harga' => $subtotal_transaksi]); } session()->forget('cart'); } }); return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.'); } // Riwayat Pesanan 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); // Hanya bisa selesai jika status sebelumnya 'dikirim' if ($transaksi->status == 'dikirim') { $transaksi->status = 'selesai'; $transaksi->save(); return back()->with('success', 'Terima kasih! Pesanan telah diselesaikan.'); } return back()->with('error', 'Pesanan belum dikirim atau sudah selesai.'); } // --- FITUR PETANI --- // Daftar Pesanan Masuk 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 (Terima/Tolak/Kirim) 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(); if ($request->status == 'batal') { foreach ($transaksi->details as $detail) { $detail->produk->increment('stok', $detail->jumlah); } } return back()->with('success', 'Status pesanan berhasil diperbarui.'); } // Detail Pesanan (Petani) public function pesananDetail($id) { $petaniId = Auth::guard('petani')->id(); // Ambil transaksi berdasarkan 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')); } }