Crear Producto/Servicio
Exportar contenido
Registra un nuevo producto físico o servicio en tu catálogo con precios, impuestos y control de stock.
- Clic en ”+ Nuevo Producto” (botón superior derecha) — se abre el Sheet de formulario.
- Completa la pestaña “General” con datos obligatorios (ver tabla abajo).
- Completa la pestaña “Precios” con precio unitario y tasa de IVA.
- (Opcional - Solo productos físicos) Pestaña “Stock” — configura niveles de inventario.
- Clic en “Guardar” — producto creado.
Campos obligatorios — Pestaña General
Sección titulada «Campos obligatorios — Pestaña General»| Campo | Regla | Descripción | Ejemplo |
|---|---|---|---|
| Nombre | Sí | Nombre descriptivo del producto | Camiseta Básica Algodón |
| Tipo | Sí | Producto (físico) o Servicio | Producto |
| Unidad | Sí | Unidad de medida | und, kg, m, hora |
Campos opcionales — Pestaña General
Sección titulada «Campos opcionales — Pestaña General»| Campo | Descripción | Ejemplo |
|---|---|---|
| Descripción | Descripción detallada del producto | Camiseta 100% algodón, cuello redondo |
| SKU | Código único de producto | CAM-BAS-001 |
| Categoría | Categoría del producto | Ropa |
| Estado | Activo/Inactivo | Activo |
Campos obligatorios — Pestaña Precios
Sección titulada «Campos obligatorios — Pestaña Precios»| Campo | Regla | Descripción | Ejemplo |
|---|---|---|---|
| Precio Unitario | Sí | Precio de venta sin IVA | 15.00 € |
| Tasa de IVA | Sí | Porcentaje de IVA aplicable | 21% |
Campos opcionales — Pestaña Precios
Sección titulada «Campos opcionales — Pestaña Precios»| Campo | Descripción | Ejemplo |
|---|---|---|
| Precio de Coste | Precio de compra o fabricación | 8.50 € |
Campos opcionales — Pestaña Stock (solo productos físicos)
Sección titulada «Campos opcionales — Pestaña Stock (solo productos físicos)»| Campo | Descripción | Valor por defecto |
|---|---|---|
| Seguir inventario | Activar control de stock | No |
| Stock actual | Cantidad disponible | 0 |
| Stock mínimo | Nivel de alerta | 0 |
| Stock máximo | Capacidad máxima | 0 |
| Punto de reposición | Nivel que dispara reorden | 0 |
Cómo sé que lo hice bien
Sección titulada «Cómo sé que lo hice bien»- El producto aparece en la lista principal con estado Activo.
- Toast de confirmación: “Producto creado correctamente”.
- Puedes buscar el producto por nombre o SKU.
Errores comunes
Sección titulada «Errores comunes»| Mensaje | Causa | Solución |
|---|---|---|
| ”El nombre es requerido” | Campo vacío | Introduce nombre del producto |
| ”El precio debe ser mayor o igual a 0” | Precio negativo | Introduce precio válido ≥ 0 |
| ”El IVA debe ser mayor o igual a 0” | IVA negativo | Introduce tasa de IVA válida (0-100) |
| “El IVA no puede exceder 100%“ | IVA > 100 | Reduce la tasa de IVA |
| ”SKU duplicado” | SKU ya existe en el negocio | Cambia el código SKU por uno único |
🔧 Detalles Técnicos — Crear Producto/Servicio
Validaciones:
| Código | Regla |
|---|---|
| VAL-01 | name NOT NULL, min 1 char, max 200 chars |
| VAL-02 | product_type IN (‘product’, ‘service’) |
| VAL-03 | unit_price >= 0, max 999999.99 |
| VAL-04 | cost_price >= 0, max 999999.99 (opcional) |
| VAL-05 | tax_rate >= 0, max 100 |
| VAL-06 | description max 1000 chars (opcional) |
| VAL-07 | sku max 50 chars, único por business_id (opcional) |
| VAL-08 | unit max 20 chars (opcional) |
| VAL-09 | category max 100 chars (opcional) |
| VAL-10 | current_stock >= 0, max 999999 (opcional) |
| VAL-11 | minimum_stock >= 0, max 999999 (opcional) |
| VAL-12 | maximum_stock >= 0, max 999999 (opcional) |
| VAL-13 | reorder_point >= 0, max 999999 (opcional) |
Tablas involucradas:
| Tabla | Columnas clave | 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 |
Schema Zod:
- Ubicación:
/src/schemas/validation.ts(líneas 98-149) productSchema— Validación completa de productos
Componente:
- Formulario:
ProductFormSheet.tsx - Usa
FormSheetcomo template estándar - 3 pestañas: General, Precios, Stock (condicional)
Adapter:
- Archivo:
/src/features/products/api/product-adapter.ts - Método:
create(data: ProductCreateData): Promise<Product> - Transforma datos del formulario a formato de BD mediante
formDataToProductCreate()
Eventos:
productCreatedEvent— Publicado tras inserción exitosa- Payload:
{ productId, productName, sku }
Queries de diagnóstico:
-- Producto recién creadoSELECT * FROM productsWHERE business_id = '<business_id>'ORDER BY created_at DESC LIMIT 1;
-- Verificar duplicados por SKUSELECT id, name, sku, product_typeFROM productsWHERE business_id = '<business_id>' AND sku = '<sku>';