diff --git a/app/Http/Controllers/SaleController.php b/app/Http/Controllers/SaleController.php new file mode 100644 index 0000000..b96847f --- /dev/null +++ b/app/Http/Controllers/SaleController.php @@ -0,0 +1,72 @@ +', 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()); + } + } +} diff --git a/resources/views/sales/create.blade.php b/resources/views/sales/create.blade.php new file mode 100644 index 0000000..8af8f72 --- /dev/null +++ b/resources/views/sales/create.blade.php @@ -0,0 +1,72 @@ +@extends('layouts.app') + +@section('title', 'Nueva Venta') + +@section('main') +