gamtest / app /Http /Controllers /CartController.php
veela4's picture
Upload folder using huggingface_hub
70ba896 verified
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\Models\Product;
use App\Models\Order;
class CartController extends Controller
{
public function index()
{
$cart = session()->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'));
}
}