관리-도구
편집 파일: OrderController.php
<?php namespace App\Http\Controllers; use App\Models\Cart; use App\Models\Coupon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\DB; use App\Models\Products; use App\Models\Address; use App\Models\Order; use App\Models\OrderDetails; use Illuminate\Support\Facades\Auth; class OrderController extends Controller { // Add product to "buy now" and redirect to checkout page public function buyNow($id) { // quick debug log — helps confirm this method runs Log::info('OrderController@buyNow called', ['id' => $id]); $product = Products::findOrFail($id); $buyNowCart = [ $product->id => [ 'id' => $product->id, 'name' => $product->title, 'price' => (float) $product->price, 'quantity' => 1, 'image' => $product->image ?? null, ], ]; // store using helper (consistent) session(['buy_now' => $buyNowCart]); return redirect()->route('checkout.buy.now')->with('success', 'Proceed to Buy Now checkout!'); } // show Buy Now checkout page (GET) public function showBuyNowCheckout() { $buyNowCart = session('buy_now', []); if (empty($buyNowCart)) { // send user somewhere sensible if no item return redirect()->route('index')->with('error', 'No product selected for Buy Now!'); } return view('frontend.checkout', compact('buyNowCart')); } // place Buy Now order (POST) public function checkoutBuyNow(Request $request) { $request->validate([ 'first_name' => 'required|string|max:255', 'last_name' => 'required|string|max:255', 'email' => 'required|email', 'phone' => 'required', ]); $buyNowCart = session('buy_now', []); if (empty($buyNowCart)) { return redirect()->back()->with('error', 'No product selected for Buy Now!'); } DB::beginTransaction(); try { $subtotal = collect($buyNowCart)->sum(fn($i) => $i['price'] * $i['quantity']); // get coupon info (from hidden inputs) $couponCode = $request->input('coupon_code'); $discount = (float) $request->input('discount_amount', 0); $total = round(max($subtotal - $discount, 0), 2); $order = Order::create([ 'user_id' => auth()->id() ?? null, 'transaction_id' => uniqid('TXN'), 'total_amount' => $total, 'discount' => $discount, 'coupon_code' => $couponCode, 'first_name' => $request->first_name, 'last_name' => $request->last_name, 'email' => $request->email, 'phone' => $request->phone, 'address' => $request->address, 'city' => $request->city, 'state' => $request->state, 'zip' => $request->zip, 'country' => $request->country ?? 'India', 'order_notes' => $request->order_notes, 'status' => 'pending', ]); foreach ($buyNowCart as $productId => $item) { OrderDetails::create([ 'order_id' => $order->id, 'product_id' => $productId, 'product_name' => $item['name'], 'product_price' => $item['price'], 'quantity' => $item['quantity'], 'total_price' => $item['price'] * $item['quantity'], ]); } session()->forget('buy_now'); DB::commit(); return redirect()->route('initiatePayment', ['order' => $order->id]); } catch (\Exception $e) { DB::rollBack(); Log::error('Checkout Buy Now Failed: ' . $e->getMessage(), [ 'trace' => $e->getTraceAsString(), 'user_id' => auth()->id(), ]); return redirect()->back()->with('error', 'Something went wrong while processing your order.'); } } public function cartcheckout() { $cartItems = Cart::with('product')->where('user_id', Auth::id())->get(); $address = Address::first(); return view('frontend.checkout', compact('cartItems','address')); } // Cart checkout submit public function submit(Request $request) { DB::beginTransaction(); try { $cartItems = Cart::with('product')->where('user_id', Auth::id())->get(); if ($cartItems->isEmpty()) { return redirect()->route('cart')->with('error', 'Your cart is empty.'); } $subtotal = $cartItems->sum(fn($item) => $item->product->price * $item->quantity); // get coupon info (from hidden inputs) $couponCode = $request->input('coupon_code'); $discount = (float) $request->input('discount_amount', 0); $total = round(max($subtotal - $discount, 0), 2); $order = Order::create([ 'user_id' => Auth::id(), 'transaction_id' => uniqid('TXN'), 'total_amount' => $total, 'discount' => $discount, 'coupon_code' => $couponCode, 'first_name' => $request->first_name, 'last_name' => $request->last_name, 'email' => $request->email, 'phone' => $request->phone, 'address' => $request->address, 'city' => $request->city, 'state' => $request->state, 'zip' => $request->zip, 'country' => $request->country ?? 'India', 'order_notes' => $request->order_notes, 'status' => 'pending', ]); foreach ($cartItems as $item) { OrderDetails::create([ 'order_id' => $order->id, 'product_id' => $item->product->id, 'product_name' => $item->product->title, 'product_price' => $item->product->price, 'quantity' => $item->quantity, 'total_price' => $item->product->price * $item->quantity, ]); } Cart::where('user_id', Auth::id())->delete(); DB::commit(); return redirect()->route('initiatePayment', ['order' => $order->id]); } catch (\Exception $e) { DB::rollBack(); return back()->with('error', 'Something went wrong: ' . $e->getMessage()); } } public function apply(Request $request) { $request->validate([ 'code' => 'required|string', 'cart_total' => 'required|numeric|min:0', ]); // Find active coupon by code $coupon = Coupon::where('code', $request->code) ->where('is_active', true) ->first(); if (!$coupon) { return response()->json(['error' => 'Invalid or inactive coupon code.'], 400); } // Check expiry if ($coupon->expiry_date && $coupon->expiry_date < now()) { return response()->json(['error' => 'This coupon has expired.'], 400); } // Check minimum purchase if ($coupon->min_purchase && $request->cart_total < $coupon->min_purchase) { return response()->json([ 'error' => 'Minimum purchase of ₹' . number_format($coupon->min_purchase, 2) . ' required to use this coupon.' ], 400); } // Calculate discount $discount = 0; if ($coupon->discount_amount) { $discount = $coupon->discount_amount; } elseif ($coupon->discount_percent) { $discount = $request->cart_total * ($coupon->discount_percent / 100); } // Ensure discount doesn’t exceed total $discount = min($discount, $request->cart_total); $finalTotal = $request->cart_total - $discount; return response()->json([ 'success' => true, 'code' => $coupon->code, 'discount' => round($discount, 2), 'final_total' => round($finalTotal, 2), 'message' => 'Coupon applied successfully!' ]); } // Buy Now checkout submit (session based) }