# Wizard de Onboarding — Flujo de Pantallas

Principio de diseño: cada pantalla escribe en una tabla que ya existe en `schema.sql`.
No hay tablas temporales de "registro en progreso" — el `tenant` se crea desde la
Pantalla 1 y se va completando. Esto permite hacer seguimiento de quién empezó y
no terminó (`onboarding_completado = FALSE`).

Cada pantalla, al guardar, actualiza `tenants.onboarding_paso` con su propio nombre.
Esto es lo que permite retomar el wizard donde quedó si el usuario cierra la pestaña.

---

## Pantalla 1 — Datos de contacto
**Campos:** nombre, apellido, teléfono, email, contraseña

**Al guardar:**
- `INSERT INTO tenants` (nombre_comercial temporal = "Mi barbería", onboarding_paso = 'datos_negocio')
- `INSERT INTO usuarios` (rol = 'dueño', tenant_id = el recién creado)

**Validaciones:** email único, teléfono con formato chileno (+569XXXXXXXX)

**Nota:** en este punto ya queda registro aunque abandone. Es el dato que pediste
para hacer seguimiento de demos.

---

## Pantalla 2 — Datos del negocio
**Campos:** nombre_comercial, rut (opcional), dirección, slug (URL pública)

**Al guardar:**
- `UPDATE tenants SET nombre_comercial, rut, slug` — validar `slug` disponible
  en tiempo real (chequeo AJAX contra el UNIQUE de `tenants.slug`)
- `INSERT INTO sucursales` — crea automáticamente "Sucursal Principal"
- `onboarding_paso = 'equipo'`

---

## Pantalla 3 — Sucursales y equipo
**Campos:** ¿cuántas sucursales tiene? (1 por defecto, puede agregar más),
¿va a invitar barberos ahora o después?

**Al guardar:**
- `INSERT INTO sucursales` adicionales si agrega más de una
- Si invita barberos: `INSERT INTO usuarios` (rol='barbero') por cada uno,
  envía invitación por email/WhatsApp para que configuren su clave
- Este paso es **saltable** — puede seguir sin invitar a nadie todavía
- `onboarding_paso = 'servicios'`

---

## Pantalla 4 — Qué servicios ofrece
**Campos:** selección múltiple de categorías (Cabello, Barba, Cejas, Facial, Otro)

**Al elegir una categoría**, mostrar 3-4 servicios típicos pre-armados
(nombre + precio sugerido + duración) que puede aceptar tal cual o editar.
Ej. si elige "Barba": *Afeitado clásico ($8.000, 30 min)*, *Arreglo de barba
($5.000, 20 min)*.

**Al guardar:**
- `INSERT INTO servicios` por cada uno aceptado/editado
- `onboarding_paso = 'comisiones'`

---

## Pantalla 5 — Cómo trabajan tus barberos
**Campos:** modelo general — comisión estándar / arriendo de silla / mixto
(se puede afinar por persona más adelante)

- Si **comisión estándar**: pide % sugerido → se aplica como default a
  `servicios.porcentaje_comision` de todos los servicios recién creados
- Si **arriendo de silla**: pide % o monto fijo → se guarda como plantilla,
  se aplicará a cada barbero cuando lo invite (`personal_comision_config`)

**Al guardar:** `onboarding_paso = 'citas'`

---

## Pantalla 6 — ¿Vas a agendar citas?
**Campos:** Sí/No (→ `tenants.features.citas_habilitadas`)

**Si es Sí, preguntas adicionales:**
- Modalidad de pago: en el local / online opcional / online obligatorio
- Pasarela: Mercado Pago / Flow / ambas (solo guarda la preferencia;
  las credenciales reales de la API se cargan después, no se piden acá)

**Al guardar:**
- `UPDATE tenants` (features JSON)
- `INSERT INTO tenant_config_pagos` (modalidad + flags de pasarela, sin credenciales aún)
- `onboarding_paso = 'documentos'`

---

## Pantalla 7 — Boleta, factura o control interno
**Campos:** "Por ahora solo control interno" / "Ya emito boleta electrónica"
/ "Ya emito factura"

**Al guardar:**
- Solo se guarda como preferencia informativa en `tenants` (no se escribe
  `tenant_config_sii` todavía — eso requiere credenciales reales del
  proveedor, se configura después desde el panel, no en el wizard)
- `onboarding_paso = 'confirmacion'`

---

## Pantalla 8 — Confirmación y acceso
Resume todo lo configurado en las pantallas anteriores.

**Al confirmar:**
- `UPDATE tenants SET plan_id = (plan trial), fecha_vencimiento_plan = HOY + duracion_dias_trial, onboarding_completado = TRUE, estado = 'activo'`
- Muestra en pantalla: link de acceso (`tuservicio.cl/{slug}`), email, y
  botón para ir directo al sistema ya logueado
- Envía las mismas credenciales por correo, por si las pierde

---

## Flujo de invitación (Pantalla 3 y también desde "Mi equipo" después)

**1. El dueño invita:**
- Completa: nombre, apellido, teléfono, email, rol (barbero/cajero/admin_local),
  y opcionalmente el modelo de comisión de esa persona
- `INSERT INTO invitaciones` con `token` aleatorio (32 bytes, hex) y
  `expira_en = HOY + 7 días`
- Se envía el link `tuservicio.cl/invitacion/{token}` por email y/o WhatsApp
  al teléfono ingresado (mismo patrón de templates que ya usaste en SetecTech)

**2. El invitado hace clic en el link:**
- Backend valida: `token` existe, `estado = 'pendiente'`, no expirado
- Si está vencido: mensaje claro + botón para que el dueño reenvíe
- Si es válido: se le muestra "Te invitaron a unirte a {nombre_comercial}
  como {rol}" con un campo para elegir su contraseña

**3. Al confirmar la contraseña:**
- `INSERT INTO usuarios` (con los datos de la invitación + password_hash nuevo)
- Si la invitación traía `modelo_comision`: `INSERT INTO personal_comision_config`
  para ese usuario, copiando esos valores
- `UPDATE invitaciones SET estado = 'aceptada'`
- Queda logueado y entra directo a su vista (agenda propia si es barbero)

**Casos borde ya cubiertos por el diseño:**
- Reenviar invitación → regenera `token` y `expira_en`, misma fila
- Cancelar invitación pendiente → `estado = 'cancelada'`, el link deja de servir
- El dueño invita dos veces al mismo email → se valida en la app antes de
  insertar (buscar invitación `pendiente` existente con ese email en el tenant)

---

## Notas de implementación

- **Guardado incremental real**, no solo al final — cada pantalla hace su
  propio `UPDATE`/`INSERT` al tocar "Siguiente". Si se cae el internet a
  mitad de camino, no se pierde nada.
- **Pasos 3, 4, 5 y 6 deben ser saltables** con valores por defecto
  razonables (ej: sin servicios pre-cargados, comisión estándar 40% por
  defecto, citas desactivadas). Alguien que solo quiere probar rápido no
  debería sentir que tiene que llenar 8 formularios para ver el sistema.
- **Progreso visible**: barra de "Paso 3 de 8" — reduce abandono.
- **Slug**: validar disponibilidad en tiempo real conforme escribe, no solo
  al enviar el formulario — evita que llegue al final y se encuentre con
  que su URL ya está tomada.
