Ir al contenido

Productos

Ruta: /owner/products Gestiona tu catálogo de productos y servicios, control de inventario, almacenes y ubicaciones de almacenamiento.


El módulo de Productos se organiza en 4 pestañas principales:

PestañaDescripciónIcono
ProductosCatálogo completo de productos y servicios📦
InventarioDashboard de stock, movimientos y alertas📊
AlmacenesGestión de almacenes y ubicaciones físicas🏭
ReportesAnálisis y reportes de productos📈

La pestaña principal muestra el catálogo completo con tarjetas de resumen:

Tarjetas de resumen:

TarjetaColorDescripción
Total ProductosNúmero total de productos y servicios
Productos ActivosVerdeProductos con estado activo
CategoríasNúmero de categorías diferentes
Precio PromedioPrecio medio del catálogo

Columnas de la tabla: Producto, Tipo, SKU, Categoría, Precio, IVA, Unidad, Estado, Acciones

Filtros disponibles:

FiltroOpcionesDescripción
BúsquedaTexto libreNombre, SKU, descripción o categoría
EstadoActivo / Inactivo / TodosEstado del producto
CategoríaLista dinámicaCategoría del producto
Nivel de StockBajo / Sin stock / Normal / TodosNivel de inventario
Tipo ProductoProducto / Servicio / TodosTipo de artículo

FunciónDescripciónDocumentación
Crear Producto/ServicioRegistra un nuevo producto o servicio en el catálogoVer
Actualizar StockAjusta manualmente el stock de un productoVer
Gestionar VariantesCrea variantes de producto con atributos (talla, color, etc.)Ver
Gestionar LotesControl de lotes con fechas de fabricación y caducidadVer
Importar ProductosCarga masiva desde Excel con validacionesVer
Editor MasivoActualiza precios, impuestos o categorías en bloqueVer
Ubicaciones AlmacénGestiona ubicaciones físicas (pasillo, estante, compartimento)Ver
Historial StockConsulta movimientos históricos de inventarioVer

Factux diferencia entre productos físicos y servicios:

TipoCuándo usarloCaracterísticas
ProductoArtículo físico con stockControl de inventario, lotes, ubicaciones
ServicioServicio o trabajo intangibleSin 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.


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

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

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-001
  • CAM-AZ-M
  • SRV-CONSULT-01

ALERTA: Si introduces un SKU duplicado, el sistema mostrará un error y no permitirá guardar el producto.


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

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

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

Detalles técnicos
TablaColumnas principalesFK
productsid, 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_pointbusinesses
product_variantsid, product_id, variant_name, sku_variant, price_adjustment, stock_quantity, attributes, is_activeproducts
product_batchesid, product_id, batch_number, quantity, manufacturing_date, expiration_date, purchase_price, notes, is_activeproducts
stock_movementsid, product_id, business_id, movement_type, quantity, reason, notes, created_by, warehouse_location_from_id, warehouse_location_to_idproducts, warehouse_locations
warehouse_locationsid, warehouse_id, name, code, description, aisle, shelf, bin, is_activewarehouses
PolíticaRegla
products_business_isolationbusiness_id = negocio del usuario autenticado
product_variants_via_productAcceso vía producto padre con mismo business_id
product_batches_via_productAcceso vía producto padre con mismo business_id
stock_movements_business_isolationbusiness_id = negocio del usuario autenticado
warehouse_locations_via_warehouseAcceso vía almacén padre con mismo business_id
ClaseMétodos principales
ProductAdaptercreate(), update(), getById(), list(), delete(), updateStock()

Ubicación: /src/features/products/api/product-adapter.ts

Interface implementada: IProductModule

Ubicación: /src/schemas/validation.ts (líneas 98-149)

Schemas principales:

  • productSchema — Validación completa de productos
  • stockMovementSchema — Validación de movimientos de stock

Productos con stock bajo:

SELECT id, name, sku, stock_quantity, min_stock_level,
(stock_quantity - min_stock_level) as deficit
FROM products
WHERE business_id = '<business_id>'
AND track_stock = true
AND stock_quantity <= min_stock_level
ORDER BY deficit ASC;

Movimientos de stock por producto:

SELECT p.name, sm.movement_type, sm.quantity, sm.reason, sm.created_at
FROM stock_movements sm
INNER JOIN products p ON p.id = sm.product_id
WHERE sm.business_id = '<business_id>'
AND sm.product_id = '<product_id>'
ORDER BY sm.created_at DESC
LIMIT 50;

Productos sin SKU:

SELECT id, name, product_type, unit_price
FROM products
WHERE 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_potencial
FROM products
WHERE 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_promedio
FROM products
WHERE business_id = '<business_id>'
GROUP BY category
ORDER BY total DESC;