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.

El módulo de proveedores permite administrar el directorio de empresas o personas que abastecen el inventario de Tienda MiCholo. Cada producto del catálogo está vinculado a exactamente un proveedor mediante la clave foránea Proveedor_ID. El módulo completo está protegido por el atributo [Authorize(Roles = "Admin")] a nivel de controlador, por lo que únicamente los usuarios con rol Admin pueden acceder a cualquiera de sus vistas o acciones.

Campos del proveedor

El modelo Proveedor define los siguientes campos con sus validaciones:
CampoTipo C#ObligatorioValidaciones
IdProveedorintClave primaria, generada automáticamente por la base de datos.
RazonSocialstring✅ SíLongitud máxima: 100 caracteres. No puede contener dígitos — regex: ^[^0-9]+$. Mensaje de error: "El nombre de la empresa no admite números."
Rucstring✅ SíLongitud máxima y mínima: exactamente 11 caracteres. Solo dígitos numéricos — regex: ^\d{11}$. Debe ser único en todo el sistema (validado en el controlador).
Telefonostring❌ NoLongitud máxima: 50 caracteres. Si se proporciona, debe tener 9 dígitos, comenzar con 9 y no tener todos los dígitos iguales — regex: ^9(?!(\d)\1{7})\d{8}$.
El campo Telefono es opcional. Sin embargo, si se proporciona, debe cumplir estrictamente el formato de número celular peruano: 9 dígitos, comenzar en 9 y no ser una secuencia de dígitos repetidos (por ejemplo, 999999999 es rechazado).

Crear proveedor

GET  /Proveedor/Nuevo   → Formulario de alta
POST /Proveedor/Nuevo   → Guarda el nuevo proveedor
El proceso de creación sigue los siguientes pasos:
1

Validar el modelo

El servidor verifica el ModelState. Si alguna anotación de validación falla (formato de RazonSocial, formato de Ruc, formato de Telefono), se recarga el formulario con los errores correspondientes.
2

Verificar unicidad del RUC

Antes de insertar el registro, el controlador consulta si ya existe otro proveedor con el mismo RUC:
bool rucExiste = await _context.Proveedores.AnyAsync(p => p.Ruc == proveedor.Ruc);
if (rucExiste)
{
    ModelState.AddModelError("Ruc", "El RUC ingresado ya se encuentra registrado.");
    return View(proveedor);
}
Si el RUC ya está en uso, se muestra el error en el campo Ruc y no se guarda el registro.
3

Guardar el proveedor

Si todas las validaciones pasan, el proveedor se agrega a la base de datos con AddAsync + SaveChangesAsync. El usuario es redirigido al listado (GET /Proveedor/Listar) con el mensaje "Proveedor creado correctamente." en TempData["Success"].

Editar proveedor

GET  /Proveedor/Editar/{id}   → Carga el formulario con los datos actuales
POST /Proveedor/Editar/{id}   → Guarda los cambios
La edición aplica las mismas validaciones de formato que el alta. La verificación de unicidad del RUC en edición excluye al propio registro mediante su IdProveedor, para permitir guardar sin cambiar el RUC:
bool rucExiste = await _context.Proveedores.AnyAsync(
    p => p.Ruc == proveedor.Ruc && p.IdProveedor != proveedor.IdProveedor
);
if (rucExiste)
{
    ModelState.AddModelError("Ruc", "El RUC ingresado ya se encuentra registrado en otro proveedor.");
    return View(proveedor);
}
Si el proveedor no existe (FindAsync retorna null), el servidor devuelve un NotFound (HTTP 404).

Eliminar proveedor

GET /Proveedor/Eliminar/{id}
Antes de eliminar físicamente el proveedor, el controlador verifica si existe al menos un producto vinculado a él a través de la FK Proveedor_ID:
bool tieneProducto = await _context.Productos.AnyAsync(p => p.Proveedor_ID == id);
if (tieneProducto)
{
    TempData["Error"] = "No se puede eliminar el proveedor porque posee productos asociados en el inventario.";
    return RedirectToAction(nameof(Listar));
}
Si el proveedor tiene productos asociados (independientemente de si están activos o inactivos), la eliminación queda bloqueada y el usuario es redirigido al listado con el mensaje de error. Solo los proveedores sin ningún producto en el catálogo pueden eliminarse de forma permanente.
Si el IdProveedor proporcionado no corresponde a ningún registro, el controlador redirige al listado con el mensaje "Proveedor no encontrado." en TempData["Error"]. No se produce ningún error HTTP no controlado.

Acceso restringido

El controlador ProveedorController aplica el atributo [Authorize(Roles = "Admin")] a nivel de clase, lo que significa que todas sus rutas están restringidas al rol Admin:
RutaMétodoDescripción
/Proveedor/ListarGETLista todos los proveedores ordenados por razón social.
/Proveedor/NuevoGET / POSTFormulario de alta y creación.
/Proveedor/Editar/{id}GET / POSTFormulario de edición y actualización.
/Proveedor/Eliminar/{id}GETEliminación con verificación de dependencias.
Los usuarios con rol Vendedor no tienen acceso a ninguna ruta del módulo de proveedores. Cualquier intento de acceso directo a estas URLs resultará en una redirección a la página de acceso denegado configurada en la aplicación.

Build docs developers (and LLMs) love