관리-도구
편집 파일: OrdersController.php
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Mail\OrderShippedMail; use App\Models\Order; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; class OrdersController extends Controller { public function index(Request $request) { $status = $request->get('status', 'pending'); // default filter $search = $request->get('search'); $orders = Order::with(['orderDetails', 'user', 'payment']) // ✅ filter by payment success only ->whereHas('payment', function ($q) { $q->where('status', 'success'); }) ->when($status !== 'all', function ($query) use ($status) { $query->where('status', $status); }) ->when($search, function ($query) use ($search) { $query->where(function ($q) use ($search) { $q->where('first_name', 'like', "%{$search}%") ->orWhere('last_name', 'like', "%{$search}%") ->orWhere('id', $search) ->orWhere('phone', 'like', "%{$search}%"); }); }) ->latest() ->get(); return view('admin.orders', compact('orders', 'status', 'search')); } public function show($id) { $order = Order::with(['orderDetails.product', 'user', 'payment']) ->findOrFail($id); return view('admin.order-details', compact('order')); } public function updateOrder(Request $request) { $request->validate([ 'order_id' => 'required|exists:orders,id', 'status' => 'required|string|in:Pending,Processing,Completed,Cancelled,Shipped', 'tracking_code' => 'nullable|string|max:255', 'courier_name' => 'nullable|string|max:255', ]); $order = Order::findOrFail($request->order_id); // Update everything together $order->status = $request->status; $order->tracking_code = $request->tracking_code; $order->courier_name = $request->courier_name; if ($request->status === 'Shipped') { $order->shipping_status = 'shipped'; $order->shipped_at = now(); // Send email if user email exists if ($order->user && $order->user->email) { Mail::to($order->user->email)->send(new OrderShippedMail($order)); } } $order->save(); return response()->json([ 'success' => true, 'message' => 'Order updated successfully!', 'order' => $order ]); } /** * Update order shipping details */ public function updateShipping(Request $request) { Log::info('updateShipping called', $request->all()); try { $validated = $request->validate([ 'order_id' => 'required|exists:orders,id', 'tracking_code' => 'nullable|string|max:255', 'courier_name' => 'nullable|string|max:255', ]); $order = \App\Models\Order::find($validated['order_id']); if (!$order) { Log::warning('Order not found in updateShipping', ['order_id' => $validated['order_id']]); return response()->json(['success' => false, 'message' => 'Order not found'], 404); } $order->tracking_code = $validated['tracking_code'] ?? $order->tracking_code; $order->courier_name = $validated['courier_name'] ?? $order->courier_name; // mark shipped status if not already (optional — adjust per your logic) if ($order->status !== 'shipped') { $order->status = 'shipped'; $order->shipping_status = 'shipped'; // if you keep shipping_status column $order->shipped_at = now(); } $order->save(); Log::info('Shipping updated for order', ['order_id' => $order->id, 'tracking' => $order->tracking_code]); // optionally dispatch a notification job here // dispatch(new \App\Jobs\NotifyOrderShipped($order)); return response()->json([ 'success' => true, 'message' => 'Shipping details updated', 'order' => [ 'id' => $order->id, 'tracking_code' => $order->tracking_code, 'courier_name' => $order->courier_name, 'status' => $order->status, ] ]); } catch (\Illuminate\Validation\ValidationException $ve) { Log::warning('Validation failed updateShipping', ['errors' => $ve->errors()]); return response()->json(['success' => false, 'message' => 'Validation failed', 'errors' => $ve->errors()], 422); } catch (\Exception $e) { Log::error('updateShipping error', [ 'message' => $e->getMessage(), 'trace' => $e->getTraceAsString(), 'request' => $request->all() ]); return response()->json(['success' => false, 'message' => 'Server error', 'error' => $e->getMessage()], 500); } } }