diff --git a/app/Http/Controllers/CheckoutController.php b/app/Http/Controllers/CheckoutController.php deleted file mode 100644 index 820d46e..0000000 --- a/app/Http/Controllers/CheckoutController.php +++ /dev/null @@ -1,22 +0,0 @@ -get('cart'); - if (!$cart || count($cart) == 0) { - return redirect()->route('shop')->with('error', 'Keranjang Anda kosong, silahkan belanja produk terlebih dahulu.'); - } - - return view('landing.checkout', compact('cart')); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/TransaksiController.php b/app/Http/Controllers/TransaksiController.php index dcf6c38..1b2651e 100644 --- a/app/Http/Controllers/TransaksiController.php +++ b/app/Http/Controllers/TransaksiController.php @@ -3,81 +3,132 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; +use App\Models\Produk; use App\Models\Transaksi; use App\Models\DetailTransaksi; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; class TransaksiController extends Controller { - /** - * PROSES CHECKOUT / MENYIMPAN TRANSAKSI. - * Menggunakan DB Transaction agar data header dan detail tersimpan atomik (bersamaan). - */ - public function store(Request $request) + // --- FITUR PEMBELI --- + + // Tampilkan Halaman Checkout + public function checkoutPage(Request $request) { - $cart = session()->get('cart'); - - // Validasi Keranjang (Backend validation) - if (!$cart) { - return redirect()->route('shop')->with('error', 'Keranjang kosong!'); + if ($request->has('produk_id')) { + $produk = Produk::with('petani')->findOrFail($request->produk_id); + return view('landing.checkout', compact('produk')); } - // Validasi Input User + return redirect()->route('shop')->with('error', 'Silakan pilih produk yang ingin dibeli terlebih dahulu.'); + } + + // Proses Simpan Transaksi + public function prosesCheckout(Request $request) + { $request->validate([ - 'alamat_pengiriman' => 'required|string|max:500', - 'no_hp' => 'required|numeric', - 'nama_lengkap' => 'required|string|max:255', + 'produk_id' => 'required|exists:produks,id', + 'jumlah' => 'required|integer|min:1', + 'alamat_pengiriman' => 'required|string', + 'metode_pembayaran' => 'required|in:cod', ]); - try { - DB::beginTransaction(); + $produk = Produk::findOrFail($request->produk_id); - $subtotal = $this->hitungSubtotal($cart); - $ongkir = 10000; - $total_bayar = $subtotal + $ongkir; + 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(), + 'pembeli_id' => Auth::guard('pembeli')->id(), 'tanggal_transaksi' => now(), 'alamat_pengiriman' => $request->alamat_pengiriman, - 'total_harga' => $total_bayar, - 'status' => 'pending', - 'kode_invoice' => 'INV/' . date('Ymd') . '/' . mt_rand(1000, 9999), - 'catatan' => $request->catatan, + 'total_harga' => $total_harga, + 'status' => 'menunggu_konfirmasi', + 'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999), ]); - foreach ($cart as $id_produk => $details) { - DetailTransaksi::create([ - 'transaksi_id' => $transaksi->id, - 'produk_id' => $id_produk, - 'jumlah' => $details['quantity'], - 'harga_satuan' => $details['price'], - 'subtotal' => $details['price'] * $details['quantity'], - ]); - } + DetailTransaksi::create([ + 'transaksi_id' => $transaksi->id, + 'produk_id' => $produk->id, + 'jumlah' => $request->jumlah, + 'harga_satuan' => $produk->harga, + 'subtotal' => $total_harga, + ]); - DB::commit(); + // C. Kurangi Stok + $produk->decrement('stok', $request->jumlah); + }); - session()->forget('cart'); - - return redirect()->route('home')->with('success', 'Pesanan berhasil dibuat! Kode Invoice: ' . $transaksi->kode_invoice); - - } catch (\Exception $e) { - DB::rollBack(); - return redirect()->back()->with('error', 'Terjadi kesalahan saat memproses transaksi: ' . $e->getMessage()); - } + return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.'); } - /** - * Helper untuk menghitung subtotal belanjaan dari session. - */ - private function hitungSubtotal($cart) + // Riwayat Pesanan + public function pesananSaya() { - $total = 0; - foreach($cart as $id => $details) { - $total += $details['price'] * $details['quantity']; + $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 $total; + + 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')); } } \ No newline at end of file diff --git a/resources/views/landing/checkout.blade.php b/resources/views/landing/checkout.blade.php index c01e478..9284bee 100644 --- a/resources/views/landing/checkout.blade.php +++ b/resources/views/landing/checkout.blade.php @@ -3,133 +3,89 @@ @section('title', 'Checkout') @section('content') - -