Ir al contenido

Importar Productos

Carga masiva de productos desde Excel con validación automática y detección de errores.

  1. En la lista de productos, clic en “Importar” (botón superior).
  2. Clic en “Descargar Plantilla” para obtener el formato correcto.
  3. Completa el archivo Excel con tus productos.
  4. Arrastra el archivo al área de carga o clic en “Seleccionar archivo”.
  5. Revisa los errores de validación (si los hay).
  6. Clic en “Importar” — productos cargados.

Obligatorias:

ColumnaFormatoEjemplo
nombreTexto (max 200 chars)Camiseta Básica
tipoproducto o servicioproducto
precioNúmero decimal15.00
ivaNúmero (0-100)21
unidadTexto (max 20 chars)und

Opcionales:

ColumnaFormatoEjemplo
descripcionTexto (max 1000 chars)Camiseta 100% algodón
skuTexto (max 50 chars, único)CAM-BAS-001
categoriaTexto (max 100 chars)Ropa
precio_costeNúmero decimal8.50
stock_actualNúmero entero100
stock_minimoNúmero entero10
  • La validación muestra “N producto(s) listos para importar”.
  • Todos los productos importados aparecen en la lista con estado activo.
  • Toast de confirmación: “N productos importados correctamente”.
MensajeCausaSolución
”Formato inválido”Archivo no es ExcelUsa archivo .xlsx o .xls
”El nombre es requerido (fila N)“Fila sin nombreCompleta el campo nombre
”Precio inválido (fila N)“Precio negativo o textoIntroduce número válido ≥ 0
”IVA inválido (fila N)“IVA fuera de rango 0-100Corrige el porcentaje de IVA
”SKU duplicado (fila N)“SKU ya existeUsa código único o deja vacío
🔧 Detalles Técnicos — Importar Productos

Librería usada:

  • xlsx o read-excel-file para parsear archivos Excel
  • Validación con schema Zod del producto

Componente:

  • ProductImportModal.tsx
  • Drag & drop con react-dropzone
  • Validación en tiempo real

Funciones de utilidad:

  • Ubicación: /src/features/products/utils/productImportExport.ts
  • validateImportData(file: File) — Parsea y valida el Excel
  • convertToDbFormat(data: ProductImportRow[]) — Transforma a formato BD
  • generateProductTemplate() — Genera plantilla Excel

Tipo de dato:

interface ProductImportRow {
nombre: string;
descripcion?: string;
sku?: string;
tipo: 'producto' | 'servicio';
precio: number;
precio_coste?: number;
iva: number;
unidad: string;
categoria?: string;
stock_actual?: number;
stock_minimo?: number;
}
interface ValidationError {
row: number;
field: string;
message: string;
}

Flujo de validación:

  1. Parse del archivo Excel → Array de objetos
  2. Validación de cada fila con productSchema
  3. Verificación de SKUs duplicados (contra BD)
  4. Generación de reporte de errores
  5. Inserción masiva con supabase.from('products').insert()

Queries de diagnóstico:

-- Productos importados recientemente (última hora)
SELECT id, name, sku, created_at
FROM products
WHERE business_id = '<business_id>'
AND created_at >= NOW() - INTERVAL '1 hour'
ORDER BY created_at DESC;