Projects/3BIT/winter-semester/IIS/xnecasr00/app/Http/Controllers/CartController.php
2026-04-14 19:28:46 +02:00

140 lines
3.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Wine;
use Illuminate\Support\Facades\Session;
class CartController extends Controller
{
/**
* Display the shopping cart
*/
public function index()
{
$cart = $this->getCart();
$cartItems = [];
$total = 0;
foreach ($cart as $wineId => $item) {
$wine = Wine::with('grapeVariety')->find($wineId);
if ($wine) {
$itemTotal = $wine->price_per_bottle * $item['quantity'];
$cartItems[] = [
'wine' => $wine,
'quantity' => $item['quantity'],
'item_total' => $itemTotal,
];
$total += $itemTotal;
}
}
return view('cart.index', compact('cartItems', 'total'));
}
/**
* Add item to cart
*/
public function add(Request $request, $wineId)
{
$wine = Wine::findOrFail($wineId);
$quantity = $request->input('quantity', 1);
// Check stock availability
if ($wine->bottles_in_stock < $quantity) {
return redirect()->back()->with('error', 'Nedostatočné množstvo na sklade.');
}
$cart = $this->getCart();
if (isset($cart[$wineId])) {
$cart[$wineId]['quantity'] += $quantity;
} else {
$cart[$wineId] = [
'quantity' => $quantity,
'price' => $wine->price_per_bottle,
];
}
Session::put('cart', $cart);
return redirect()->back()->with('success', 'Víno pridané do košíka.');
}
/**
* Update cart item quantity
*/
public function update(Request $request, $wineId)
{
$quantity = $request->input('quantity', 1);
if ($quantity < 1) {
return $this->remove($wineId);
}
$wine = Wine::findOrFail($wineId);
// Check stock availability
if ($wine->bottles_in_stock < $quantity) {
return redirect()->back()->with('error', 'Nedostatočné množstvo na sklade.');
}
$cart = $this->getCart();
if (isset($cart[$wineId])) {
$cart[$wineId]['quantity'] = $quantity;
Session::put('cart', $cart);
}
return redirect()->back()->with('success', 'Košík aktualizovaný.');
}
/**
* Remove item from cart
*/
public function remove($wineId)
{
$cart = $this->getCart();
if (isset($cart[$wineId])) {
unset($cart[$wineId]);
Session::put('cart', $cart);
}
return redirect()->back()->with('success', 'Položka odstránená z košíka.');
}
/**
* Clear entire cart
*/
public function clear()
{
Session::forget('cart');
return redirect()->route('cart.index')->with('success', 'Košík vyprázdnený.');
}
/**
* Get cart from session
*/
private function getCart()
{
return Session::get('cart', []);
}
/**
* Get cart item count
*/
public function count()
{
$cart = $this->getCart();
$count = 0;
foreach ($cart as $item) {
$count += $item['quantity'];
}
return response()->json(['count' => $count]);
}
}