El modeloDocumentation 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.
Producto forma parte del espacio de nombres TiendaMiCholo.Models y representa cada artículo registrado en el catálogo de la tienda. Es la entidad central del sistema de inventario: almacena información de identificación, precios, stock disponible y fecha de vencimiento, y sirve como punto de conexión entre los proveedores que suministran la mercancía y los detalles de cada venta realizada. Toda operación de compra, venta o ajuste de inventario referencia directamente a esta entidad.
Propiedades
Clave primaria de la entidad. Generada automáticamente por la base de datos mediante
DatabaseGeneratedOption.Identity. No debe asignarse manualmente.Código interno del producto. Longitud máxima de 50 caracteres. Se utiliza para identificar el producto de forma abreviada en listas y comprobantes.
Nombre descriptivo del producto. Longitud máxima de 100 caracteres. Solo acepta letras (incluyendo caracteres acentuados y ñ), números y espacios, según la expresión regular:
Categoría a la que pertenece el producto (por ejemplo: “Abarrotes”, “Bebidas”, “Limpieza”). Longitud máxima de 50 caracteres.
Precio al que la tienda adquiere el producto de su proveedor. Almacenado con precisión
decimal(18,2). Debe ser mayor a 0.01 según la anotación [Range(0.01, double.MaxValue)].Este campo establece el piso económico del producto. La lógica de negocio del controlador impide guardar un
PrecioVenta inferior a este valor.Precio al que el producto se vende al cliente. Almacenado con precisión
decimal(18,2). No tiene anotación Range propia, pero la regla de negocio exige que PrecioVenta >= PrecioCompra; esta validación se aplica en el controlador antes de persistir el registro.Cantidad de unidades disponibles en inventario. Debe ser mayor o igual a
0 ([Range(0, int.MaxValue)]). El stock se descuenta automáticamente al confirmar una venta y se restaura si la venta es anulada.Indica si el producto está disponible para la venta. Valor predeterminado:
true. Los productos inactivos no aparecen en el flujo de registro de ventas, pero sus registros históricos en DetalleVenta se conservan intactos.Fecha de vencimiento del producto. Campo nullable — los productos que no tienen vencimiento (útiles de limpieza, artículos de bazar, etc.) pueden dejarlo en
null. Cuando se proporciona, la lógica de negocio valida que la fecha no sea anterior a la fecha actual al momento de guardar.Clave foránea que referencia al
Proveedor que suministra este producto. Obligatorio: todo producto debe estar asociado a un proveedor registrado en el sistema.Relaciones
El modeloProducto participa en dos relaciones definidas en AppDbContext.OnModelCreating:
Proveedor (muchos a uno)
Proveedor expone el objeto Proveedor completo asociado al producto. La política OnDelete: Restrict impide eliminar un proveedor mientras tenga productos registrados en el sistema.
DetallesVentas (uno a muchos)
DetallesVentas (tipo ICollection<DetalleVenta>) contiene todos los registros de línea de venta en los que aparece este producto. La política OnDelete: Restrict protege el historial de ventas: un producto no puede ser eliminado si ya fue vendido alguna vez.
Modelo DetalleVenta
DetalleVenta es la entidad de enlace entre Venta y Producto. Representa una línea individual dentro de un comprobante de venta: qué producto se vendió, en qué cantidad y a qué precio unitario.
Clave primaria, generada automáticamente por la base de datos.
Clave foránea hacia la entidad
Venta a la que pertenece este detalle. Configurada con OnDelete: Cascade — si se elimina una venta (operación no expuesta en la UI actual), todos sus detalles se eliminan en cascada.Clave foránea hacia el
Producto vendido en esta línea. Configurada con OnDelete: Restrict — garantiza la integridad del historial.Número de unidades del producto incluidas en esta línea de venta. Debe ser un entero positivo.
Precio por unidad aplicado en el momento de la venta. Se captura en el momento de la transacción para preservar el historial aunque el
PrecioVenta del producto cambie posteriormente.El subtotal de cada línea se calcula como
Cantidad × PrecioUnitario. La suma de todos los subtotales de una venta debe coincidir con el campo Total del encabezado Venta.