validate([ 'width' => 'required|numeric|min:0.01', 'length' => 'required|numeric|min:0.01', 'weight' => 'required|numeric|min:0.01', ]); // Check: Order must exist and not already be packed if (! $order) { return response()->json(['error' => 'Order not found'], 404); } if ($order->packing_completed_at !== null) { return response()->json(['error' => 'Order already packed'], 409); } // Check: Order must be in Inspection state if ($order->status !== 'inspection') { return response()->json([ 'error' => 'Order must be in Inspection state before packing', 'current_status' => $order->status, ], 409); } try { // Save packing data $order->update([ 'packing_width' => $validated['width'], 'packing_length' => $validated['length'], 'packing_weight' => $validated['weight'], 'packing_completed_at' => now(), 'packed_by' => Auth::id(), 'status' => 'packing', ]); Log::info('Order packed', [ 'order_id' => $order->id, 'width' => $validated['width'], 'length' => $validated['length'], 'weight' => $validated['weight'], 'packed_by' => Auth::id(), ]); // Emit event to trigger Trello update, Slack notification OrderPacked::dispatch( $order, (float) $validated['width'], (float) $validated['length'], (float) $validated['weight'], Auth::id(), ); return response()->json([ 'success' => true, 'message' => 'Order packed successfully', 'order_id' => $order->id, 'packing_completed_at' => $order->packing_completed_at, 'dimensions' => [ 'width' => $validated['width'], 'length' => $validated['length'], 'weight' => $validated['weight'], ], ]); } catch (\Exception $e) { Log::error('Error packing order', [ 'order_id' => $order->id, 'error' => $e->getMessage(), ]); return response()->json([ 'error' => 'Failed to pack order', 'message' => $e->getMessage(), ], 500); } } }