Skip to main content

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.
buscarNombre
string
Filtra productos cuyo Nombre contenga el texto indicado (búsqueda parcial con Contains).
filtrarCategoria
string
Filtra productos que tengan exactamente la Categoria especificada.
filtrarProveedor
int
Filtra productos por Proveedor_ID.
pageNumber
int
Número de página a mostrar. Si se omite, se asume la página 1. Tamaño de página fijo: 10 registros.
Autorización: [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.FiltrarCategoria y ViewBag.FiltrarProveedor para repoblar los controles del formulario.
  • Inyecta en ViewBag:
    • ViewBag.Categorias — lista de categorías distintas (SELECT DISTINCT Categoria).
    • ViewBag.Proveedores — lista de proveedores ordenados por RazonSocial.
    • ViewBag.ProductosCriticos — hasta 10 productos con Stock <= 5, ordenados por stock ascendente.
  • Ordena los resultados finales por Nombre antes de paginar.
Retorno: View(PaginatedList<Producto>).
[HttpGet]
public async Task<IActionResult> Listar(
    string buscarNombre,
    string filtrarCategoria,
    int? filtrarProveedor,
    int? pageNumber)

GET /Producto/DashboardAlertas

Devuelve la vista de alertas de stock crítico, mostrando todos los productos cuyo Stock sea menor o igual a 5. Autorización: [Authorize] (cualquier usuario autenticado). Comportamiento:
  • Consulta _context.Productos con Include(p => p.Proveedor) para mostrar datos del proveedor junto a cada alerta.
  • Aplica Where(p => p.Stock <= 5) y ordena por stock ascendente.
Retorno: View(List<Producto>).
[HttpGet]
public async Task<IActionResult> DashboardAlertas()

GET /Producto/Categorias

Devuelve una vista agregada que agrupa el catálogo por categoría. Autorización: [Authorize] (cualquier usuario autenticado). Comportamiento:
  • Agrupa _context.Productos por Categoria.
  • 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 de PrecioVenta * Stock de todos los productos del grupo.
  • Ordena los grupos por nombre de categoría ascendente.
  • Almacena la lista resultante en ViewBag.CategoriasStats.
Retorno: View() (sin modelo directo; datos expuestos vía ViewBag.CategoriasStats).
[HttpGet]
public async Task<IActionResult> Categorias()

GET /Producto/Nuevo

Muestra el formulario de alta de producto. Autorización: [Authorize(Roles = "Admin")]. Comportamiento:
  • Carga en ViewBag.CategoriasExistentes las categorías ya registradas (para el datalist o dropdown de autocompletado).
  • Carga en ViewBag.Proveedores todos los proveedores disponibles.
Retorno: View() (formulario vacío).
[HttpGet]
[Authorize(Roles = "Admin")]
public IActionResult Nuevo()

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].
producto
Producto
required
Objeto Producto enlazado desde el formulario. Las propiedades de navegación Proveedor y DetallesVentas se eliminan de ModelState antes de validar.
Validaciones adicionales (reglas de negocio):
Si PrecioVenta < PrecioCompra, se añade un error de modelo en el campo PrecioVenta: “El precio de venta no puede ser menor al de compra.” y se devuelve el formulario.
Si FechaVencimiento tiene valor y es anterior a la fecha de hoy (DateOnly.FromDateTime(DateTime.Now)), se añade un error de modelo en FechaVencimiento: “La fecha de vencimiento no puede ser una fecha pasada.” y se devuelve el formulario.
Comportamiento en éxito:
  • Persiste el producto con AddAsync + SaveChangesAsync.
  • Establece TempData["Success"] y redirige a Listar.
Comportamiento en error:
  • Recarga ViewBag.CategoriasExistentes y ViewBag.Proveedores.
  • Devuelve View(producto) con los errores de validación.
Retorno: RedirectToAction("Listar") en éxito · View(Producto) en error.
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> Nuevo(Producto producto)

GET /Producto/Editar/

Muestra el formulario de edición para el producto indicado. Autorización: [Authorize(Roles = "Admin")].
id
int
required
Identificador del producto (IdProducto).
Comportamiento:
  • Busca el producto con FirstOrDefaultAsync(p => p.IdProducto == id).
  • Si no existe, establece TempData["Error"] y redirige a Listar.
  • Carga ViewBag.CategoriasExistentes y ViewBag.Proveedores.
Retorno: View(Producto) · RedirectToAction("Listar") si no se encuentra.
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> Editar(int id)

POST /Producto/Editar

Procesa la actualización de un producto existente. Aplica las mismas validaciones de negocio que POST /Producto/Nuevo. Autorización: [Authorize(Roles = "Admin")]. Incluye [ValidateAntiForgeryToken].
producto
Producto
required
Objeto Producto con los datos actualizados, incluyendo IdProducto para identificar el registro. Las propiedades de navegación Proveedor y DetallesVentas se eliminan de ModelState.
Comportamiento en éxito:
  • Llama a _context.Productos.Update(producto) + SaveChangesAsync.
  • Establece TempData["Success"] y redirige a Listar.
Retorno: RedirectToAction("Listar") en éxito · View(Producto) en error.
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> Editar(Producto producto)

POST /Producto/ToggleActivo

Invierte el estado Activo (habilitado/deshabilitado) del producto indicado. Autorización: [Authorize(Roles = "Admin")].
id
int
required
Identificador del producto (IdProducto). Se envía como parámetro de formulario o query string, no como cuerpo JSON.
Comportamiento:
  • Localiza el producto con FindAsync(id).
  • Si existe, ejecuta producto.Activo = !producto.Activo y persiste el cambio.
  • Establece TempData["Success"] con el nombre del producto y el nuevo estado (“activado” / “desactivado”).
  • Si no existe, redirige a Listar sin acción.
Retorno: RedirectToAction("Listar") en todos los casos.
[HttpPost]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> ToggleActivo(int id)

GET /Producto/Eliminar/

Elimina definitivamente un producto del catálogo, siempre que no esté referenciado en ventas. Autorización: [Authorize(Roles = "Admin")].
id
int
required
Identificador del producto (IdProducto).
Antes de eliminar, el controller verifica si existe algún DetalleVenta con Producto_ID == id mediante AnyAsync. Si se encuentra al menos uno, la eliminación es bloqueada y se establece TempData["Error"] con el mensaje: “No se puede eliminar el producto porque esta registrado en transacciones de venta existentes.”
Comportamiento en éxito:
  • Llama a _context.Productos.Remove(producto) + SaveChangesAsync.
  • Establece TempData["Success"].
Retorno: RedirectToAction("Listar") en todos los casos (bloqueado o eliminado).
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> Eliminar(int id)

Build docs developers (and LLMs) love