Skip to main content

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.

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.

Características Principales

  • Código único por producto — el campo codigo es único en la base de datos e inmutable una vez creado.
  • Doble precio — se mantienen por separado el precioCompra (costo) y el precioVenta (precio al cliente).
  • Control de stock automáticostockActual se 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 codigoBarras se usa en el POS de ventas y compras para escaneo rápido.
  • Importación masiva desde Excel — sube un archivo .xlsx para crear o actualizar cientos de productos de una sola vez.

Campos del Producto

La entidad Producto (tabla productos en MySQL) expone los siguientes campos a través de la API:
CampoTipoRequeridoValor por defectoDescripción
idLongautoIdentificador interno
codigoString (max 50)Código único de referencia interna
nombreString (max 150)Nombre del producto
descripcionString (TEXT)nullDescripción larga
precioCompraBigDecimal0.00Precio de costo
precioVentaBigDecimal0.00Precio al público
stockActualInteger0Unidades disponibles en almacén
stockMinimoInteger5Umbral para alerta de stock bajo
imagenUrlString (max 500)nullURL de imagen del producto
codigoBarrasString (max 50)nullCódigo EAN/UPC para escáner
unidadMedidaString (max 50)"UNIDADES"Ej.: KG, PAQUETE, LITROS
monedaString (max 10)"PEN"PEN (S/) o USD ($)
categoriaIdLongCategoría a la que pertenece
almacenIdLongnullAlmacén físico (opcional)
activoBooleantrueBorrado lógico

Gestión de Stock

El stockActual 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 registradastockActual -= cantidad por cada ítem del detalle.
  • Compra recibidastockActual += cantidad por cada ítem del detalle.
  • Venta anuladastockActual += cantidad (reversión).
Cuando 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

GET /api/productos
Devuelve todos los productos con activo = true. Incluye los objetos anidados categoria y almacen.
GET /api/productos/buscar?q=laptop
Búsqueda por nombre, codigo o codigoBarras (solo productos con activo = true).
GET /api/productos/{id}
Obtiene un producto por su ID. Devuelve 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/importar
Authorization: Bearer <token>   # ADMIN o ALMACENERO
Content-Type: application/json
Request Body: arreglo de objetos con la misma estructura que el POST /api/productos, más el campo adicional categoriaNombre.
[
  {
    "codigo": "PROD-001",
    "nombre": "Laptop HP 15",
    "precioCompra": 2500.00,
    "precioVenta": 3200.00,
    "stockActual": 10,
    "stockMinimo": 3,
    "categoriaNombre": "Electrónica",
    "codigoBarras": "7501111111111",
    "unidadMedida": "UNIDADES",
    "moneda": "PEN"
  },
  {
    "codigo": "PROD-010",
    "nombre": "Arroz Costeño 1kg",
    "precioCompra": 3.50,
    "precioVenta": 5.00,
    "categoriaNombre": "Abarrotes"
  }
]

Lógica de upsert

  1. Para cada fila del arreglo, se busca por codigo en la base de datos (findByCodigo).
  2. Si existe → se actualizan todos los campos enviados (excepto codigo).
  3. 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").
  4. Categoría automática — si categoriaNombre está 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).
  5. Las filas con codigo vacío o nombre vacío son ignoradas silenciosamente.
Respuesta: arreglo con los productos procesados (creados o actualizados). El frontend Angular soporta la carga del archivo .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ónADMINVENDEDORALMACENERO
Listar / Ver / Buscar
Crear / Editar
Importar Excel
Eliminar (borrado lógico)
Usa GET /api/productos/stock-bajo para obtener en tiempo real la lista de productos que necesitan reposición. Este mismo endpoint alimenta el widget del Dashboard. Intégralo en tus rutinas diarias de reabastecimiento para generar órdenes de compra antes de que el stock llegue a cero.

Build docs developers (and LLMs) love