El módulo de Productos es el corazón del catálogo de Tiendas Mi Cholo. Desde aquí se registran todos los artículos que la tienda compra y vende, incluyendo su precio de costo, precio de venta al público, unidad de medida, moneda, código de barras y el almacén donde se encuentran físicamente. El stock de cada producto se actualiza de forma automática cada vez que se registra una venta (descuenta unidades) o se recibe una compra (suma unidades), sin intervención manual.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/Miercoles-Proyecto/llms.txt
Use this file to discover all available pages before exploring further.
Características Principales
- Código único por producto — el campo
codigoes único en la base de datos e inmutable una vez creado. - Doble precio — se mantienen por separado el
precioCompra(costo) y elprecioVenta(precio al cliente). - Control de stock automático —
stockActualse modifica transaccionalmente al registrar ventas o recibir compras. - Alertas de stock mínimo — cuando
stockActual ≤ stockMinimo, el producto aparece en el widget del Dashboard y en el endpoint/api/productos/stock-bajo. - Código de barras — compatible con lectores USB; el campo
codigoBarrasse usa en el POS de ventas y compras para escaneo rápido. - Importación masiva desde Excel — sube un archivo
.xlsxpara crear o actualizar cientos de productos de una sola vez.
Campos del Producto
La entidadProducto (tabla productos en MySQL) expone los siguientes campos a través de la API:
| Campo | Tipo | Requerido | Valor por defecto | Descripción |
|---|---|---|---|---|
id | Long | — | auto | Identificador interno |
codigo | String (max 50) | ✅ | — | Código único de referencia interna |
nombre | String (max 150) | ✅ | — | Nombre del producto |
descripcion | String (TEXT) | ❌ | null | Descripción larga |
precioCompra | BigDecimal | ✅ | 0.00 | Precio de costo |
precioVenta | BigDecimal | ✅ | 0.00 | Precio al público |
stockActual | Integer | ❌ | 0 | Unidades disponibles en almacén |
stockMinimo | Integer | ❌ | 5 | Umbral para alerta de stock bajo |
imagenUrl | String (max 500) | ❌ | null | URL de imagen del producto |
codigoBarras | String (max 50) | ❌ | null | Código EAN/UPC para escáner |
unidadMedida | String (max 50) | ❌ | "UNIDADES" | Ej.: KG, PAQUETE, LITROS |
moneda | String (max 10) | ❌ | "PEN" | PEN (S/) o USD ($) |
categoriaId | Long | ✅ | — | Categoría a la que pertenece |
almacenId | Long | ❌ | null | Almacén físico (opcional) |
activo | Boolean | ❌ | true | Borrado lógico |
Gestión de Stock
ElstockActual nunca se edita directamente mediante el endpoint PUT /api/productos/{id}. El PUT ignora cualquier cambio a ese campo. Las únicas operaciones que modifican el stock son:
- Venta registrada →
stockActual -= cantidadpor cada ítem del detalle. - Compra recibida →
stockActual += cantidadpor cada ítem del detalle. - Venta anulada →
stockActual += cantidad(reversión).
stockActual ≤ stockMinimo, el producto es clasificado como “stock bajo”. El Dashboard muestra el conteo en la tarjeta Alertas Stock y lista los productos afectados con sus valores stockActual y stockMinimo.
Endpoints de la API
- Listar / Buscar
- Crear / Editar
- Eliminar
activo = true. Incluye los objetos anidados categoria y almacen.nombre, codigo o codigoBarras (solo productos con activo = true).404 si no existe o está inactivo.Importación Masiva desde Excel
El endpoint de importación acepta un arreglo JSON derivado de un archivo.xlsx y aplica lógica upsert (actualizar si existe, crear si no existe):
POST /api/productos, más el campo adicional categoriaNombre.
Lógica de upsert
- Para cada fila del arreglo, se busca por
codigoen la base de datos (findByCodigo). - Si existe → se actualizan todos los campos enviados (excepto
codigo). - Si no existe → se crea un nuevo producto con los valores proporcionados y defaults para los campos omitidos (
stockActual=0,stockMinimo=5,unidadMedida="UNIDADES",moneda="PEN"). - Categoría automática — si
categoriaNombreestá presente y no se encontró la categoría en la BD, se crea automáticamente la categoría. Si no se proporciona ningún identificador de categoría, el producto cae en la categoría"Abarrotes"(creada si tampoco existe). - Las filas con
codigovacío onombrevacío son ignoradas silenciosamente.
.xlsx directamente desde la interfaz (botón Importar Excel). Internamente usa la biblioteca xlsx para parsear las columnas del archivo y mapearlas a los campos del modelo antes de llamar a este endpoint.
Permisos por Rol
| Operación | ADMIN | VENDEDOR | ALMACENERO |
|---|---|---|---|
| Listar / Ver / Buscar | ✅ | ✅ | ✅ |
| Crear / Editar | ✅ | ❌ | ✅ |
| Importar Excel | ✅ | ❌ | ✅ |
| Eliminar (borrado lógico) | ✅ | ❌ | ❌ |