Product::latest()->paginate(20), 'orders' => Order::latest()->limit(10)->get(), 'revenue' => Order::where('payment_status', 'paid')->sum('grand_total'), 'lowStock' => Product::where('track_inventory', true)->whereColumn('stock_quantity', '<=', 'low_stock_threshold')->count(), 'customers' => Customer::count(), 'promotions' => Promotion::where('is_active', true)->count()]); } public function storeProduct(Request $request): RedirectResponse { $data = $request->validate(['name' => ['required', 'string', 'max:255'], 'slug' => ['nullable', 'string', 'max:255', 'unique:commerce_products,slug'], 'sku' => ['nullable', 'string', 'max:120', 'unique:commerce_products,sku'], 'type' => ['required', 'in:physical,digital,service,bundle'], 'summary' => ['nullable', 'string'], 'description' => ['nullable', 'string'], 'price' => ['required', 'numeric', 'min:0'], 'stock_quantity' => ['required', 'integer'], 'status' => ['required', 'in:draft,active,archived']]); $data['slug'] = $data['slug'] ?: Str::slug($data['name']); $data['currency'] = config('commerce.currency', 'GBP'); $data['published_at'] = $data['status'] === 'active' ? now() : null; Product::create($data); return back()->with('status', 'Product created.'); } public function updateProduct(Request $request, Product $product): RedirectResponse { $product->update($request->validate(['name' => ['required', 'string', 'max:255'], 'price' => ['required', 'numeric', 'min:0'], 'stock_quantity' => ['required', 'integer'], 'status' => ['required', 'in:draft,active,archived']])); return back()->with('status', 'Product updated.'); } public function destroyProduct(Product $product): RedirectResponse { $product->delete(); return back()->with('status', 'Product deleted.'); } public function updateOrder(Request $request, Order $order): RedirectResponse { $order->update($request->validate(['status' => ['required', 'in:pending,processing,completed,cancelled,refunded'], 'payment_status' => ['required', 'in:unpaid,authorised,paid,partially_refunded,refunded,failed'], 'fulfilment_status' => ['required', 'in:unfulfilled,partial,fulfilled,returned']])); return back()->with('status', 'Order updated.'); } }