Documentation Index
Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/proyecto-dise-o/llms.txt
Use this file to discover all available pages before exploring further.
ProductoController gestiona todas las operaciones CRUD sobre el catálogo de productos de Tienda MiCholo. El controller está decorado con [Authorize] a nivel de clase, lo que significa que todas las acciones exigen sesión iniciada. Las acciones de escritura (crear, editar, cambiar estado y eliminar) añaden además [Authorize(Roles = "Admin")], restringiendo esas rutas únicamente al rol Admin. El controller recibe AppDbContext vía inyección de dependencias y utiliza PaginatedList<T> del namespace TiendaMiCholo.Helpers para el listado paginado.
GET /Producto/Listar
Devuelve el listado paginado de productos con soporte de búsqueda y filtros combinados.Filtra productos cuyo
Nombre contenga el texto indicado (búsqueda parcial con Contains).Filtra productos que tengan exactamente la
Categoria especificada.Filtra productos por
Proveedor_ID.Número de página a mostrar. Si se omite, se asume la página
1. Tamaño de página fijo: 10 registros.[Authorize] (cualquier usuario autenticado).
Comportamiento:
- Construye una consulta sobre
_context.Productos.Include(p => p.Proveedor)y aplica los filtros de forma encadenada. - Almacena los valores de filtro activos en
ViewBag.BuscarNombre,ViewBag.FiltrarCategoriayViewBag.FiltrarProveedorpara repoblar los controles del formulario. - Inyecta en
ViewBag:ViewBag.Categorias— lista de categorías distintas (SELECT DISTINCT Categoria).ViewBag.Proveedores— lista de proveedores ordenados porRazonSocial.ViewBag.ProductosCriticos— hasta 10 productos conStock <= 5, ordenados por stock ascendente.
- Ordena los resultados finales por
Nombreantes de paginar.
View(PaginatedList<Producto>).
GET /Producto/DashboardAlertas
Devuelve la vista de alertas de stock crítico, mostrando todos los productos cuyoStock sea menor o igual a 5.
Autorización: [Authorize] (cualquier usuario autenticado).
Comportamiento:
- Consulta
_context.ProductosconInclude(p => p.Proveedor)para mostrar datos del proveedor junto a cada alerta. - Aplica
Where(p => p.Stock <= 5)y ordena por stock ascendente.
View(List<Producto>).
GET /Producto/Categorias
Devuelve una vista agregada que agrupa el catálogo por categoría. Autorización:[Authorize] (cualquier usuario autenticado).
Comportamiento:
- Agrupa
_context.ProductosporCategoria. - Para cada grupo proyecta un objeto anónimo con:
Nombre— nombre de la categoría (clave del grupo).CantidadProductos— cantidad de productos en esa categoría.ValorTotal— suma dePrecioVenta * Stockde todos los productos del grupo.
- Ordena los grupos por nombre de categoría ascendente.
- Almacena la lista resultante en
ViewBag.CategoriasStats.
View() (sin modelo directo; datos expuestos vía ViewBag.CategoriasStats).
GET /Producto/Nuevo
Muestra el formulario de alta de producto. Autorización:[Authorize(Roles = "Admin")].
Comportamiento:
- Carga en
ViewBag.CategoriasExistenteslas categorías ya registradas (para el datalist o dropdown de autocompletado). - Carga en
ViewBag.Proveedorestodos los proveedores disponibles.
View() (formulario vacío).
POST /Producto/Nuevo
Procesa la creación de un nuevo producto tras validar el modelo y reglas de negocio. Autorización:[Authorize(Roles = "Admin")]. Incluye [ValidateAntiForgeryToken].
Objeto
Producto enlazado desde el formulario. Las propiedades de navegación Proveedor y DetallesVentas se eliminan de ModelState antes de validar.- Persiste el producto con
AddAsync+SaveChangesAsync. - Establece
TempData["Success"]y redirige aListar.
- Recarga
ViewBag.CategoriasExistentesyViewBag.Proveedores. - Devuelve
View(producto)con los errores de validación.
RedirectToAction("Listar") en éxito · View(Producto) en error.
GET /Producto/Editar/
Muestra el formulario de edición para el producto indicado. Autorización:[Authorize(Roles = "Admin")].
Identificador del producto (
IdProducto).- Busca el producto con
FirstOrDefaultAsync(p => p.IdProducto == id). - Si no existe, establece
TempData["Error"]y redirige aListar. - Carga
ViewBag.CategoriasExistentesyViewBag.Proveedores.
View(Producto) · RedirectToAction("Listar") si no se encuentra.
POST /Producto/Editar
Procesa la actualización de un producto existente. Aplica las mismas validaciones de negocio quePOST /Producto/Nuevo.
Autorización: [Authorize(Roles = "Admin")]. Incluye [ValidateAntiForgeryToken].
Objeto
Producto con los datos actualizados, incluyendo IdProducto para identificar el registro. Las propiedades de navegación Proveedor y DetallesVentas se eliminan de ModelState.- Llama a
_context.Productos.Update(producto)+SaveChangesAsync. - Establece
TempData["Success"]y redirige aListar.
RedirectToAction("Listar") en éxito · View(Producto) en error.
POST /Producto/ToggleActivo
Invierte el estadoActivo (habilitado/deshabilitado) del producto indicado.
Autorización: [Authorize(Roles = "Admin")].
Identificador del producto (
IdProducto). Se envía como parámetro de formulario o query string, no como cuerpo JSON.- Localiza el producto con
FindAsync(id). - Si existe, ejecuta
producto.Activo = !producto.Activoy persiste el cambio. - Establece
TempData["Success"]con el nombre del producto y el nuevo estado (“activado” / “desactivado”). - Si no existe, redirige a
Listarsin acción.
RedirectToAction("Listar") en todos los casos.
GET /Producto/Eliminar/
Elimina definitivamente un producto del catálogo, siempre que no esté referenciado en ventas. Autorización:[Authorize(Roles = "Admin")].
Identificador del producto (
IdProducto).- Llama a
_context.Productos.Remove(producto)+SaveChangesAsync. - Establece
TempData["Success"].
RedirectToAction("Listar") en todos los casos (bloqueado o eliminado).