get('cart', []); return view('cart', compact('cart')); } public function add(Request $request, $id) { $product = Product::findOrFail($id); $quantity = (int) $request->input('quantity', 1); // Check if product has enough stock if ($product->Amount < $quantity) { if ($request->ajax()) { return response()->json([ 'success' => false, 'message' => 'Insufficient stock. Available: ' . $product->Amount ]); } return back()->with('error', 'Insufficient stock. Available: ' . $product->Amount); } $cart = session()->get('cart', []); if (isset($cart[$id])) { $newQuantity = $cart[$id]['quantity'] + $quantity; if ($newQuantity > $product->Amount) { if ($request->ajax()) { return response()->json([ 'success' => false, 'message' => 'Cannot add more items. Stock limit: ' . $product->Amount ]); } return back()->with('error', 'Cannot add more items. Stock limit: ' . $product->Amount); } $cart[$id]['quantity'] = $newQuantity; } else { $cart[$id] = [ 'id' => $product->id, 'name' => $product->name, 'image' => $product->image, 'price' => $product->price, 'quantity' => $quantity, 'game' => $product->game, ]; } session()->put('cart', $cart); // Return JSON response for AJAX requests if ($request->ajax()) { return response()->json([ 'success' => true, 'message' => 'Item added to cart successfully', 'cart_count' => array_sum(array_column($cart, 'quantity')) ]); } return redirect()->route('cart.index')->with('success', 'เพิ่มสินค้าลงตะกร้าเรียบร้อยแล้ว'); } public function remove($id) { $cart = session()->get('cart', []); if (isset($cart[$id])) { unset($cart[$id]); session()->put('cart', $cart); } return redirect()->route('cart.index')->with('success', 'ลบสินค้าออกจากตะกร้าเรียบร้อยแล้ว'); } public function checkout(Request $request) { $request->validate([ 'customer_name' => 'required|string|max:255', 'phone' => 'required|string|max:20', 'payment_slip' => 'required|image|mimes:jpeg,png,jpg,gif|max:10240', // 10MB limit ]); try { $path = $request->file('payment_slip')->store('payment_slips', 'public'); // Get cart data $cart = session()->get('cart', []); if (empty($cart)) { return back()->with('error', 'Your cart is empty'); } // Calculate total amount and validate stock $totalAmount = 0; foreach ($cart as $item) { $product = Product::find($item['id']); if (!$product) { return back()->with('error', "Product {$item['name']} no longer exists"); } if ($product->Amount < $item['quantity']) { return back()->with('error', "Insufficient stock for {$product->name}. Available: {$product->Amount}, Requested: {$item['quantity']}"); } $totalAmount += $item['price'] * $item['quantity']; } // Create order $order = Order::create([ 'customer_name' => $request->customer_name, 'phone' => $request->phone, 'payment_slip_path' => $path, 'cart_data' => json_encode($cart), 'total_amount' => $totalAmount, 'status' => 'pending', ]); // Update product stock foreach ($cart as $item) { $product = Product::find($item['id']); if ($product) { $product->Amount = max(0, $product->Amount - $item['quantity']); $product->save(); } } // Clear cart session()->forget('cart'); return redirect()->route('cart.index')->with('success', 'Thank you for your order! We have received your order successfully.'); } catch (\Exception $e) { return back()->with('error', 'Failed to process order: ' . $e->getMessage()); } } public function order() { $orders = Order::latest()->get(); // ดึงทั้งหมด เรียงล่าสุดก่อน return view('order', compact('orders')); } public function deleteOrder($id) { try { $order = Order::findOrFail($id); // Delete payment slip file if it exists if ($order->payment_slip_path && Storage::disk('public')->exists($order->payment_slip_path)) { Storage::disk('public')->delete($order->payment_slip_path); } $order->delete(); return back()->with('success', 'Order deleted successfully'); } catch (\Exception $e) { return back()->with('error', 'Failed to delete order: ' . $e->getMessage()); } } public function show($id) { try { $order = Order::findOrFail($id); return view('order-detail', compact('order')); } catch (\Exception $e) { return redirect()->route('orders.index')->with('error', 'Order not found'); } } public function completeOrder($id) { try { $order = Order::findOrFail($id); // Update order status to completed $order->status = 'completed'; $order->save(); return redirect()->route('orders.index')->with('success', 'Order #' . str_pad($order->id, 4, '0', STR_PAD_LEFT) . ' has been ACCEPTED successfully!'); } catch (\Exception $e) { return redirect()->route('orders.index')->with('error', 'Failed to accept order: ' . $e->getMessage()); } } public function rejectOrder($id) { try { $order = Order::findOrFail($id); // Update order status to cancelled (rejected) $order->status = 'cancelled'; $order->save(); return redirect()->route('orders.index')->with('success', 'Order #' . str_pad($order->id, 4, '0', STR_PAD_LEFT) . ' has been REJECTED. Customer will see it as cancelled.'); } catch (\Exception $e) { return redirect()->route('orders.index')->with('error', 'Failed to reject order: ' . $e->getMessage()); } } public function customerOrders(Request $request) { // For now, we'll show all orders since we don't have user authentication for customers // In a real app, you'd filter by authenticated customer $orders = Order::latest()->get(); // If it's an AJAX request for load more functionality if ($request->ajax()) { $page = $request->get('page', 1); $perPage = 3; $offset = ($page - 1) * $perPage; $status = $request->get('status'); $game = $request->get('game'); // Filter orders based on status $filteredOrders = $orders; if ($status && $status !== 'recently') { $filteredOrders = $orders->where('status', $status); } // Filter by game if specified if ($game && $game !== 'all') { $filteredOrders = $filteredOrders->filter(function($order) use ($game) { $items = json_decode($order->cart_data, true); if (is_array($items)) { foreach ($items as $item) { $product = \App\Models\Product::find($item['id'] ?? null); if ($product && $product->game === $game) { return true; } } } return false; }); } $paginatedOrders = $filteredOrders->slice($offset, $perPage); $hasMore = $filteredOrders->count() > ($offset + $perPage); return response()->json([ 'orders' => $paginatedOrders->values(), 'hasMore' => $hasMore, 'currentPage' => $page ]); } return view('customer-orders', compact('orders')); } }