Initial commit

This commit is contained in:
2026-10-31 13:24:24 +01:00
commit e6805f2245
87 changed files with 16180 additions and 0 deletions
+128
View File
@@ -0,0 +1,128 @@
<?php
namespace App\Http\Controllers;
use App\Models\Material;
use App\Models\Product;
use Illuminate\Http\Request;
class CartController extends Controller
{
public function index()
{
$cart = session()->get('cart', []);
$subtotal = 0;
foreach ($cart as $item) {
$subtotal += $item['price'] * $item['quantity'];
}
$shipping = $subtotal > 50 || empty($cart) ? 0.00 : 4.95;
$total = $subtotal + $shipping;
return view('cart.index', compact('cart', 'subtotal', 'shipping', 'total'));
}
public function add(Request $request)
{
$validated = $request->validate([
'product_id' => 'required|exists:products,id',
'material' => 'required|string',
'color' => 'required|string',
'scale' => 'nullable|string',
'infill' => 'nullable|string',
'quantity' => 'required|integer|min:1|max:50',
]);
$product = Product::findOrFail($validated['product_id']);
$material = Material::where('code', $validated['material'])->first();
// Prijs berekening inclusief materiaal vermenigvuldiger & schaal
$unitPrice = $product->base_price;
if ($material) {
$unitPrice *= $material->price_multiplier;
}
// Schaal aanpassing
$scale = $validated['scale'] ?? '100%';
if ($scale === '150%') {
$unitPrice *= 1.45;
} elseif ($scale === '200%') {
$unitPrice *= 1.95;
}
$unitPrice = round($unitPrice, 2);
// Unieke sleutel in sessie op basis van product + configuratie
$cartKey = md5($product->id . '_' . $validated['material'] . '_' . $validated['color'] . '_' . $scale);
$cart = session()->get('cart', []);
if (isset($cart[$cartKey])) {
$cart[$cartKey]['quantity'] += (int)$validated['quantity'];
} else {
$cart[$cartKey] = [
'id' => $product->id,
'name' => $product->name,
'slug' => $product->slug,
'image_url' => $product->image_url,
'material' => $material ? $material->name : $validated['material'],
'material_code' => $validated['material'],
'color' => $validated['color'],
'scale' => $scale,
'infill' => $validated['infill'] ?? 'Standaard (20%)',
'price' => $unitPrice,
'quantity' => (int)$validated['quantity'],
];
}
session()->put('cart', $cart);
if ($request->wantsJson()) {
return response()->json([
'success' => true,
'message' => 'Artikel toegevoegd aan je winkelwagen!',
'cartCount' => array_sum(array_column($cart, 'quantity')),
]);
}
return redirect()->route('cart.index')->with('success', "{$product->name} is toegevoegd aan je winkelwagen!");
}
public function update(Request $request)
{
$validated = $request->validate([
'key' => 'required|string',
'quantity' => 'required|integer|min:1|max:50',
]);
$cart = session()->get('cart', []);
if (isset($cart[$validated['key']])) {
$cart[$validated['key']]['quantity'] = (int)$validated['quantity'];
session()->put('cart', $cart);
}
return redirect()->route('cart.index')->with('success', 'Winkelwagen bijgewerkt.');
}
public function remove($key)
{
$cart = session()->get('cart', []);
if (isset($cart[$key])) {
unset($cart[$key]);
session()->put('cart', $cart);
}
return redirect()->route('cart.index')->with('success', 'Artikel verwijderd uit je winkelwagen.');
}
public function count()
{
$cart = session()->get('cart', []);
$totalItems = array_sum(array_column($cart, 'quantity'));
return response()->json(['count' => $totalItems]);
}
}