', 0)->get(); // Retornamos la vista (que crearemos en el paso 4) pasando los productos return view('sales.create', compact('products')); } public function store(Request $request) { $request->validate([ 'payment_method' => 'required|string', 'items' => 'required|array', 'items.*.product_id' => 'required|exists:products,id', 'items.*.quantity' => 'required|integer|min:1', ]); try { DB::transaction(function () use ($request) { $totalVenta = 0; foreach ($request->items as $item) { $producto = Product::find($item['product_id']); $totalVenta += $producto->price * $item['quantity']; if ($producto->stock < $item['quantity']) { throw new \Exception("No hay suficiente stock de " . $producto->name); } } // raro arreglar $sale = Sale::create([ 'user_id' => auth()->id(), // El empleado logueado 'total' => $totalVenta, 'payment_method' => $request->payment_method, ]); foreach ($request->items as $item) { $producto = Product::find($item['product_id']); SaleDetail::create([ 'sale_id' => $sale->id, 'product_id' => $producto->id, 'quantity' => $item['quantity'], 'price' => $producto->price, ]); $producto->decrement('stock', $item['quantity']); } }); // 5. REDIRECCIÓN DE ÉXITO // Redirigimos al usuario con un mensaje flash [cite: 668] return redirect()->route('sales.create')->with('success', '¡Venta registrada correctamente!'); } catch (\Exception $e) { // Si algo falló (ej: falta stock), volvemos atrás con el error return back()->with('error', 'Error en la venta: ' . $e->getMessage()); } } }