has('produk_id')) { $produk = Produk::with('petani')->findOrFail($request->produk_id); return view('landing.checkout', compact('produk')); } return redirect()->route('shop')->with('error', 'Silakan pilih produk yang ingin dibeli terlebih dahulu.'); } // Proses Simpan Transaksi public function prosesCheckout(Request $request) { $request->validate([ 'produk_id' => 'required|exists:produks,id', 'jumlah' => 'required|integer|min:1', 'alamat_pengiriman' => 'required|string', 'metode_pembayaran' => 'required|in:cod', ]); $produk = Produk::findOrFail($request->produk_id); if ($produk->stok < $request->jumlah) { return back()->with('error', 'Stok produk tidak mencukupi!'); } $total_harga = $produk->harga * $request->jumlah; DB::transaction(function () use ($request, $produk, $total_harga) { $transaksi = Transaksi::create([ 'pembeli_id' => Auth::guard('pembeli')->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, ]); // C. Kurangi Stok $produk->decrement('stok', $request->jumlah); }); return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.'); } // Riwayat Pesanan public function pesananSaya() { $transaksis = Transaksi::with(['details.produk.petani']) ->where('pembeli_id', Auth::guard('pembeli')->id()) ->latest() ->get(); return view('landing.pesanan_saya', compact('transaksis')); } // --- FITUR PETANI --- // Daftar Pesanan Masuk public function pesananMasuk() { $petaniId = Auth::guard('petani')->id(); $pesanans = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) { $q->where('petani_id', $petaniId); }) ->with(['pembeli', 'details.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, pastikan transaksi tersebut memiliki produk milik petani ini $pesanan = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) { $q->where('petani_id', $petaniId); }) ->with(['pembeli', 'details.produk']) ->findOrFail($id); return view('petani.pesanan.detail', compact('pesanan')); } }