Productos
Ruta:
/owner/productsGestiona tu catálogo de productos y servicios, control de inventario, almacenes y ubicaciones de almacenamiento.
Pestañas principales
Sección titulada «Pestañas principales»El módulo de Productos se organiza en 4 pestañas principales:
| Pestaña | Descripción | Icono |
|---|---|---|
| Productos | Catálogo completo de productos y servicios | 📦 |
| Inventario | Dashboard de stock, movimientos y alertas | 📊 |
| Almacenes | Gestión de almacenes y ubicaciones físicas | 🏭 |
| Reportes | Análisis y reportes de productos | 📈 |
Vista de lista — Productos
Sección titulada «Vista de lista — Productos»La pestaña principal muestra el catálogo completo con tarjetas de resumen:
Tarjetas de resumen:
| Tarjeta | Color | Descripción |
|---|---|---|
| Total Productos | — | Número total de productos y servicios |
| Productos Activos | Verde | Productos con estado activo |
| Categorías | — | Número de categorías diferentes |
| Precio Promedio | — | Precio medio del catálogo |
Columnas de la tabla: Producto, Tipo, SKU, Categoría, Precio, IVA, Unidad, Estado, Acciones
Filtros disponibles:
| Filtro | Opciones | Descripción |
|---|---|---|
| Búsqueda | Texto libre | Nombre, SKU, descripción o categoría |
| Estado | Activo / Inactivo / Todos | Estado del producto |
| Categoría | Lista dinámica | Categoría del producto |
| Nivel de Stock | Bajo / Sin stock / Normal / Todos | Nivel de inventario |
| Tipo Producto | Producto / Servicio / Todos | Tipo de artículo |
Funciones
Sección titulada «Funciones»| Función | Descripción | Documentación |
|---|---|---|
| Crear Producto/Servicio | Registra un nuevo producto o servicio en el catálogo | Ver |
| Actualizar Stock | Ajusta manualmente el stock de un producto | Ver |
| Gestionar Variantes | Crea variantes de producto con atributos (talla, color, etc.) | Ver |
| Gestionar Lotes | Control de lotes con fechas de fabricación y caducidad | Ver |
| Importar Productos | Carga masiva desde Excel con validaciones | Ver |
| Editor Masivo | Actualiza precios, impuestos o categorías en bloque | Ver |
| Ubicaciones Almacén | Gestiona ubicaciones físicas (pasillo, estante, compartimento) | Ver |
| Historial Stock | Consulta movimientos históricos de inventario | Ver |
Tipos de producto
Sección titulada «Tipos de producto»Factux diferencia entre productos físicos y servicios:
| Tipo | Cuándo usarlo | Características |
|---|---|---|
| Producto | Artículo físico con stock | Control de inventario, lotes, ubicaciones |
| Servicio | Servicio o trabajo intangible | Sin control de stock, precio por hora/unidad |
Nota: Los servicios no tienen campos de stock ni inventario. Solo productos físicos pueden usar variantes, lotes y ubicaciones.
Pestaña Inventario
Sección titulada «Pestaña Inventario»La pestaña de Inventario ofrece 3 sub-pestañas:
Dashboard:
- Resumen visual del estado del inventario
- Alertas de stock bajo
- Productos sin stock
- Valor total del inventario
Movimientos:
- Historial completo de movimientos de stock
- Filtros por producto, tipo de movimiento y fecha
- Tipos: Entrada, Salida, Ajuste, Devolución, Transferencia
Nuevo:
- Formulario para registrar movimientos manuales
- Soporte para transferencias entre ubicaciones
- Notas y motivos por movimiento
Pestaña Almacenes
Sección titulada «Pestaña Almacenes»Gestión de almacenes físicos y sus ubicaciones:
Almacenes:
- Registro de almacenes con código y nombre
- Activar/desactivar almacenes
- Cada producto puede tener stock en múltiples almacenes
Ubicaciones:
- Ubicaciones físicas dentro de cada almacén
- Estructura: Pasillo → Estante → Compartimento
- Código único de ubicación
- Asignación de productos a ubicaciones específicas
Validaciones SKU
Sección titulada «Validaciones SKU»El SKU (Stock Keeping Unit) es el código único de cada producto:
Reglas:
- Máximo 50 caracteres
- Único por negocio (no pueden repetirse)
- Opcional pero recomendado
- Formato libre (números, letras, guiones)
Ejemplos válidos:
PROD-001CAM-AZ-MSRV-CONSULT-01
ALERTA: Si introduces un SKU duplicado, el sistema mostrará un error y no permitirá guardar el producto.
Control de stock
Sección titulada «Control de stock»El sistema de inventario permite control detallado:
Niveles de stock:
- Stock actual: Cantidad disponible en tiempo real
- Stock mínimo: Nivel de alerta para reposición
- Stock máximo: Capacidad máxima de almacenamiento
- Punto de reposición: Nivel que dispara aviso de reorden
Alertas automáticas:
- Stock bajo: Cuando el stock actual ≤ stock mínimo
- Sin stock: Cuando el stock actual = 0
- Stock normal: Cuando el stock actual > stock mínimo
Variantes de producto
Sección titulada «Variantes de producto»Las variantes permiten manejar productos con múltiples opciones:
Características:
- SKU propio para cada variante
- Ajuste de precio (+/- sobre precio base)
- Stock independiente por variante
- Atributos personalizables (talla, color, modelo, etc.)
- Estado activo/inactivo por variante
Ejemplo:
- Producto base: Camiseta Básica (€15)
- Variante 1: Talla S, Color Rojo (+€0) → SKU: CAM-S-RED
- Variante 2: Talla L, Color Azul (+€2) → SKU: CAM-L-BLUE
Lotes de producto
Sección titulada «Lotes de producto»Los lotes permiten trazabilidad completa:
Campos del lote:
- Número de lote (único)
- Cantidad del lote
- Fecha de fabricación
- Fecha de caducidad
- Precio de compra
- Notas adicionales
Uso típico:
- Productos perecederos (alimentos, medicamentos)
- Control de calidad por fecha de fabricación
- Trazabilidad en caso de retirada de producto
- Control de márgenes por lote
Referencia técnica
Sección titulada «Referencia técnica»Detalles técnicos
Tablas de base de datos
Sección titulada «Tablas de base de datos»| Tabla | Columnas principales | FK |
|---|---|---|
products | id, business_id, name, description, sku, product_type, unit_price, cost_price, tax_rate, unit, category, is_active, track_stock, stock_quantity, min_stock_level, max_stock_level, reorder_point | businesses |
product_variants | id, product_id, variant_name, sku_variant, price_adjustment, stock_quantity, attributes, is_active | products |
product_batches | id, product_id, batch_number, quantity, manufacturing_date, expiration_date, purchase_price, notes, is_active | products |
stock_movements | id, product_id, business_id, movement_type, quantity, reason, notes, created_by, warehouse_location_from_id, warehouse_location_to_id | products, warehouse_locations |
warehouse_locations | id, warehouse_id, name, code, description, aisle, shelf, bin, is_active | warehouses |
Políticas RLS
Sección titulada «Políticas RLS»| Política | Regla |
|---|---|
products_business_isolation | business_id = negocio del usuario autenticado |
product_variants_via_product | Acceso vía producto padre con mismo business_id |
product_batches_via_product | Acceso vía producto padre con mismo business_id |
stock_movements_business_isolation | business_id = negocio del usuario autenticado |
warehouse_locations_via_warehouse | Acceso vía almacén padre con mismo business_id |
Adapter
Sección titulada «Adapter»| Clase | Métodos principales |
|---|---|
ProductAdapter | create(), update(), getById(), list(), delete(), updateStock() |
Ubicación: /src/features/products/api/product-adapter.ts
Interface implementada: IProductModule
Schema de validación
Sección titulada «Schema de validación»Ubicación: /src/schemas/validation.ts (líneas 98-149)
Schemas principales:
productSchema— Validación completa de productosstockMovementSchema— Validación de movimientos de stock
Queries de diagnóstico
Sección titulada «Queries de diagnóstico»Productos con stock bajo:
SELECT id, name, sku, stock_quantity, min_stock_level, (stock_quantity - min_stock_level) as deficitFROM productsWHERE business_id = '<business_id>' AND track_stock = true AND stock_quantity <= min_stock_levelORDER BY deficit ASC;Movimientos de stock por producto:
SELECT p.name, sm.movement_type, sm.quantity, sm.reason, sm.created_atFROM stock_movements smINNER JOIN products p ON p.id = sm.product_idWHERE sm.business_id = '<business_id>' AND sm.product_id = '<product_id>'ORDER BY sm.created_at DESCLIMIT 50;Productos sin SKU:
SELECT id, name, product_type, unit_priceFROM productsWHERE business_id = '<business_id>' AND (sku IS NULL OR sku = '');Valor total del inventario:
SELECT SUM(stock_quantity * unit_price) as valor_venta, SUM(stock_quantity * COALESCE(cost_price, 0)) as valor_coste, SUM(stock_quantity * (unit_price - COALESCE(cost_price, 0))) as margen_potencialFROM productsWHERE business_id = '<business_id>' AND track_stock = true AND product_type = 'product';Productos por categoría:
SELECT category, COUNT(*) as total, SUM(CASE WHEN is_active THEN 1 ELSE 0 END) as activos, AVG(unit_price) as precio_promedioFROM productsWHERE business_id = '<business_id>'GROUP BY categoryORDER BY total DESC;