Creados un monton de componentes para reutilizar en las paginas, modificadas vistas, faltan agregar mas cosas

This commit is contained in:
BryamE
2025-12-06 19:52:33 -03:00
parent 7840cc79ae
commit 20e7da64de
22 changed files with 810 additions and 168 deletions
+110 -41
View File
@@ -4,67 +4,136 @@ namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule; // Necesario para validar unicidad al editar
class ProductosController extends Controller
{
public function index(){
$products = Product::orderBy('id','desc')->paginate();
/**
* Muestra la lista de productos con buscador y paginación.
*/
public function index(Request $request)
{
// Recuperamos lo que el usuario escribió en el buscador (si escribió algo)
$query = $request->input('search');
// Construimos la consulta
$products = Product::query()
->when($query, function ($q) use ($query) {
// Si hay búsqueda, filtra por nombre o SKU
return $q->where('name', 'like', "%{$query}%")
->orWhere('sku', 'like', "%{$query}%");
})
->orderBy('stock_quantity', 'asc') // Ordenamos primero los que tienen poco stock (Alerta visual)
->paginate(10) // Paginamos de a 10
->withQueryString(); // Mantiene el filtro de búsqueda al cambiar de página
return view('productos.index', compact('products'));
}
public function create(){
/**
* Muestra el formulario de creación.
*/
public function create()
{
return view('productos.create');
}
public function show($id){
$producto = Product::find($id);
/**
* Guarda el producto nuevo en la base de datos.
*/
public function store(Request $request)
{
// 1. Validamos los datos con las nuevas columnas
$validated = $request->validate([
'name' => 'required|string|max:255',
'sku' => 'nullable|string|unique:products,sku|max:50', // SKU único
'description' => 'nullable|string',
'price' => 'required|numeric|min:0',
'cost' => 'nullable|numeric|min:0', // Costo opcional
'stock_quantity' => 'required|integer|min:0',
'min_stock_alert' => 'required|integer|min:0',
'type' => 'required|in:bike,accessory,service', // Solo permite estos 3 valores
'serial_number' => 'nullable|string|max:100',
]);
// 2. Si no viene SKU, generamos uno automático (Opcional pero útil)
if (empty($validated['sku'])) {
$validated['sku'] = 'GEN-' . strtoupper(uniqid());
}
// 3. Creamos el producto
Product::create($validated);
// 4. Redireccionamos con mensaje de éxito (Necesitas el componente Alert en el layout)
return redirect()->route('productos.index')
->with('success', 'Producto creado correctamente.');
}
/**
* Muestra el detalle de un producto.
* Usamos Route Model Binding: Laravel busca el ID solo.
*/
public function show(Product $producto)
{
return view('productos.show', compact('producto'));
}
public function edit($id){
$producto = Product::find($id);
/**
* Muestra el formulario de edición.
*/
public function edit(Product $producto)
{
return view('productos.edit', compact('producto'));
}
public function store(Request $request){
$request->validate([
'nombre' => 'required',
'marca' => 'required',
'modelo' => 'required',
'descripcion' => 'required',
'rodado' => 'required',
'color' => 'required',
'tipo' => 'required',
'precio' => 'required'
/**
* Actualiza el producto existente.
*/
public function update(Request $request, Product $producto)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
// Validamos que el SKU sea único PERO ignoramos el ID de este producto actual
'sku' => ['nullable', 'string', Rule::unique('products')->ignore($producto->id)],
'description' => 'nullable|string',
'price' => 'required|numeric|min:0',
'cost' => 'nullable|numeric|min:0',
'stock_quantity' => 'required|integer|min:0',
'min_stock_alert' => 'required|integer|min:0',
'type' => 'required|in:bike,accessory,service',
'serial_number' => 'nullable|string|max:100',
]);
Product::create($request->all());
return redirect(route('productos.index'));
$producto->update($validated);
return redirect()->route('productos.index')
->with('success', 'Producto actualizado exitosamente.');
}
public function update(Request $request,Product $producto){
$request->validate([
'nombre' => 'required',
'marca' => 'required',
'modelo' => 'required',
'descripcion' => 'required',
'rodado' => 'required',
'color' => 'required',
'tipo' => 'required',
'precio' => 'required'
]);
$producto->update($request->all());
return redirect(route('productos.show',$producto));
}
public function destroy($id){
$producto = Product::find($id);
/**
* Elimina el producto.
*/
public function destroy(Product $producto)
{
$producto->delete();
return redirect(route('productos.index'));
return redirect()->route('productos.index')
->with('success', 'Producto eliminado.');
}
public function vistaUsuario($id){
$producto = Product::find($id);
return view('productos.vistaUsuario', compact('producto'));
/**
* Vista simplificada para consultar precios (empleados).
*/
public function checker(Request $request)
{
$search = $request->input('query');
$result = null;
if ($search) {
$result = Product::where('sku', $search)
->orWhere('name', 'like', "%{$search}%")
->first(); // Devuelve el primer resultado encontrado
}
return view('productos.checker', compact('result', 'search'));
}
}
}