diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/Admin/AdminController.php similarity index 87% rename from app/Http/Controllers/AdminController.php rename to app/Http/Controllers/Admin/AdminController.php index d690dde..796dee0 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/Admin/AdminController.php @@ -1,7 +1,8 @@ get(); - return view('admin.verifikasi.index', compact('petanis')); } - // Tampilkan Detail Petani public function verifikasiShow($id) { $petani = Petani::findOrFail($id); return view('admin.verifikasi.show', compact('petani')); } - // Proses Terima Pendaftaran (Approve) public function verifikasiApprove($id) { $petani = Petani::findOrFail($id); - $petani->status_akun = 'aktif'; $petani->save(); return redirect('admin/verifikasi')->with('success', 'Pendaftaran Petani BERHASIL diterima.'); } - // Proses Tolak Pendaftaran (Reject) public function verifikasiReject($id) { $petani = Petani::findOrFail($id); - $petani->status_akun = 'ditolak'; $petani->save(); diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php index 8af6b22..1322def 100644 --- a/app/Http/Controllers/CartController.php +++ b/app/Http/Controllers/CartController.php @@ -4,61 +4,95 @@ use Illuminate\Http\Request; use App\Models\Produk; +use App\Models\Cart; +use Illuminate\Support\Facades\Auth; class CartController extends Controller { // Menampilkan Halaman Keranjang public function index() { - $cart = session()->get('cart', []); + // Cek Login Pembeli + if (!Auth::guard('pembeli')->check()) { + return redirect()->route('login')->with('error', 'Silakan login terlebih dahulu untuk melihat keranjang.'); + } + + $pembeli_id = Auth::guard('pembeli')->id(); + + // Ambil data keranjang dari Database + $cart = Cart::with('produk')->where('pembeli_id', $pembeli_id)->get(); + return view('landing.cart', compact('cart')); } - // Menambahkan Produk ke Session Keranjang + // Menambahkan Produk ke DB Keranjang public function addToCart(Request $request) { - $id = $request->id; - $produk = Produk::findOrFail($id); - - $cart = session()->get('cart', []); - - // Validasi qty default ke 1 jika kosong - $quantity = $request->qty ? $request->qty : 1; - - if (isset($cart[$id])) { - $cart[$id]['quantity'] += $quantity; - } else { - $cart[$id] = [ - "name" => $produk->nama_produk, - "quantity" => $quantity, - "price" => $produk->harga, - "photo" => $produk->foto_produk - ]; + // Validasi Login + if (!Auth::guard('pembeli')->check()) { + return redirect()->route('login')->with('error', 'Silakan login dulu untuk belanja!'); + } + + $produk_id = $request->id; + $pembeli_id = Auth::guard('pembeli')->id(); + $quantity = $request->qty ? $request->qty : 1; + + // Cek stok produk + $produk = Produk::find($produk_id); + if ($produk->stok < $quantity) { + return redirect()->back()->with('error', 'Stok produk tidak mencukupi.'); + } + + // Cek produk yang ada di keranjang database user + $existingCart = Cart::where('pembeli_id', $pembeli_id) + ->where('produk_id', $produk_id) + ->first(); + + if ($existingCart) { + $existingCart->quantity += $quantity; + $existingCart->save(); + } else { + Cart::create([ + 'pembeli_id' => $pembeli_id, + 'produk_id' => $produk_id, + 'quantity' => $quantity + ]); } - session()->put('cart', $cart); return redirect()->back()->with('success', 'Produk berhasil masuk keranjang!'); } public function updateCart(Request $request) { + if (!Auth::guard('pembeli')->check()) { + return response()->json(['status' => 'error', 'message' => 'Unauthorized']); + } + if ($request->id && $request->quantity) { - $cart = session()->get('cart'); - $cart[$request->id]["quantity"] = $request->quantity; - session()->put('cart', $cart); - session()->flash('success', 'Keranjang berhasil diperbarui'); + $cartItem = Cart::where('id', $request->id) + ->where('pembeli_id', Auth::guard('pembeli')->id()) + ->first(); + + if ($cartItem) { + $cartItem->quantity = $request->quantity; + $cartItem->save(); + session()->flash('success', 'Keranjang berhasil diperbarui'); + } } } - // Menghapus Item dari Keranjang + // Menghapus Item dari DB Keranjang public function remove(Request $request) { + if (!Auth::guard('pembeli')->check()) { + return redirect()->route('login'); + } + if ($request->id) { - $cart = session()->get('cart'); - if (isset($cart[$request->id])) { - unset($cart[$request->id]); - session()->put('cart', $cart); - } + Cart::where('id', $request->id) + ->where('pembeli_id', Auth::guard('pembeli')->id()) + ->delete(); + return redirect()->back()->with('success', 'Produk dihapus dari keranjang'); } } diff --git a/app/Http/Controllers/LandingController.php b/app/Http/Controllers/LandingController.php index 0721158..25c94df 100644 --- a/app/Http/Controllers/LandingController.php +++ b/app/Http/Controllers/LandingController.php @@ -10,11 +10,17 @@ class LandingController extends Controller public function index(Request $request) { $query = Produk::with('petani')->latest(); + if ($request->has('kategori') && $request->kategori != '' && $request->kategori != 'Semua') { - $query->where('kategori', $request->kategori); + $slug = $request->kategori; + + $query->whereHas('kategori', function ($q) use ($slug) { + $q->where('slug', $slug); + }); } $produks = $query->take(8)->get(); + if ($request->ajax()) { return view('landing.partials.product_list', compact('produks'))->render(); } @@ -35,16 +41,19 @@ public function shop(Request $request) { $query = Produk::where('stok', '>', 0); - // Filter Kategori Berdasarkan Slug + if ($request->has('search') && $request->search != '') { + $query->where('nama_produk', 'like', '%' . $request->search . '%'); + } + + // Filter Kategori if ($request->has('kategori') && $request->kategori != '') { $slug = $request->kategori; - $query->whereHas('kategori', function ($q) use ($slug) { $q->where('slug', $slug); }); } - // Sorting (Urutkan) + // Sorting if ($request->has('sort')) { switch ($request->sort) { case 'termurah': @@ -73,8 +82,8 @@ public function detail($id) { $produk = Produk::with(['kategori', 'petani', 'images'])->findOrFail($id); - $produk_terkait = Produk::where('kategori_id', $produk->kategori_id) - ->where('id', '!=', $produk->id) + $produk_terkait = Produk::where('kategori_id', $produk->kategori_id) + ->where('id', '!=', $produk->id) ->where('stok', '>', 0) ->inRandomOrder() ->take(4) diff --git a/app/Http/Controllers/Petani/DashboardController.php b/app/Http/Controllers/Petani/DashboardController.php index 1630bb8..31486af 100644 --- a/app/Http/Controllers/Petani/DashboardController.php +++ b/app/Http/Controllers/Petani/DashboardController.php @@ -13,23 +13,31 @@ public function index() { $petaniId = Auth::guard('petani')->id(); - // + // 1. Hitung Total Produk Aktif $totalProduk = Produk::where('petani_id', $petaniId)->count(); - // Hitung Pesanan Baru + // 2. Hitung Pesanan Baru (Yang statusnya 'dibayar' / perlu diproses) $pesananBaru = DetailTransaksi::whereHas('produk', function($q) use ($petaniId) { $q->where('petani_id', $petaniId); })->whereHas('transaksi', function($q) { $q->where('status', 'dibayar'); })->count(); - // Hitung Total Pendapatan + // 3. Hitung TOTAL SEMUA PEMESANAN (Valid) + // Menghitung semua transaksi masuk (Dibayar, Dikirim, Selesai) kecuali yang Batal + $totalPemesanan = DetailTransaksi::whereHas('produk', function($q) use ($petaniId) { + $q->where('petani_id', $petaniId); + })->whereHas('transaksi', function($q) { + $q->where('status', '!=', 'batal'); // Ambil semua kecuali yang batal + })->count(); + + // 4. Hitung Total Pendapatan (Hanya yang status 'selesai') $totalPendapatan = DetailTransaksi::whereHas('produk', function($q) use ($petaniId) { $q->where('petani_id', $petaniId); })->whereHas('transaksi', function($q) { $q->where('status', 'selesai'); })->sum('subtotal'); - return view('petani.dashboard', compact('totalProduk', 'pesananBaru', 'totalPendapatan')); + return view('petani.dashboard', compact('totalProduk', 'pesananBaru', 'totalPemesanan', 'totalPendapatan')); } } \ No newline at end of file diff --git a/app/Models/Cart.php b/app/Models/Cart.php new file mode 100644 index 0000000..a635d32 --- /dev/null +++ b/app/Models/Cart.php @@ -0,0 +1,25 @@ +belongsTo(Produk::class, 'produk_id'); + } + + // Relasi ke Pembeli + public function pembeli() + { + return $this->belongsTo(Pembeli::class, 'pembeli_id'); + } +} \ No newline at end of file diff --git a/database/migrations/2025_12_24_123129_create_carts_table.php b/database/migrations/2025_12_24_123129_create_carts_table.php new file mode 100644 index 0000000..0a025dd --- /dev/null +++ b/database/migrations/2025_12_24_123129_create_carts_table.php @@ -0,0 +1,24 @@ +id(); + $table->foreignId('pembeli_id')->constrained('pembelis')->onDelete('cascade'); + $table->foreignId('produk_id')->constrained('produks')->onDelete('cascade'); + $table->integer('quantity')->default(1); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('carts'); + } +}; \ No newline at end of file diff --git a/public/template/frontend/css/style.css b/public/template/frontend/css/style.css index 3280efd..9370d5b 100644 --- a/public/template/frontend/css/style.css +++ b/public/template/frontend/css/style.css @@ -159,7 +159,7 @@ @media (min-width: 1200px) { .dropdown .dropdown-menu a:hover { background: var(--bs-secondary); - color: var(--bs-primary); + color: var(--bs-primary);z } .navbar .nav-item:hover .dropdown-menu { diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index 4bf21ff..7afdf45 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -33,7 +33,7 @@
/ Detail Pesanan
+Invoice: #{{ $transaksi->kode_invoice }}
+