Dashboard Global
Metricas en tiempo real desde Supabase.
Clientes Activos
{{ gStats.active }}
de {{ gStats.total }}
{{ gStats.total?Math.round(gStats.active/gStats.total*100):0 }}%
Al corriente
Por Vencer (≤7d)
{{ gStats.soon }}
urgentes
{{ gStats.total?Math.round(gStats.soon/gStats.total*100):0 }}%
de la base total
Vencidos
{{ gStats.expired }}
expirados
{{ gStats.total?Math.round(gStats.expired/gStats.total*100):0 }}%
de la base total
Mis Marcas
{{ marcasUsuario.length }} marca{{ marcasUsuario.length!==1?'s':'' }} registrada{{ marcasUsuario.length!==1?'s':'' }}. Selecciona una para filtrar sus clientes.
Sin marcas registradas
Crea tu primera marca para comenzar a organizar tus clientes.
{{ marca.nombre }}
Clientes
{{ allClients.filter(c=>String(c.brand_id)===String(marca.id)).length }}
Activos
{{ allClients.filter(c=>String(c.brand_id)===String(marca.id)&&daysLeft(c.fecha_renovacion)>7).length }}
Venc.
{{ allClients.filter(c=>String(c.brand_id)===String(marca.id)&&daysLeft(c.fecha_renovacion)<0).length }}
Licencias y Pagos
Estado de cuentas de revendedores en tiempo real desde Supabase.
Sin licencias registradas
Crea usuarios en Supabase Auth y agrega sus filas en la tabla perfiles.
Cargando licencias desde Supabase...
Rol
{{ lic.rol||'revendedor' }}Clientes asignados
{{ allClients.filter(c=>c.user_id===lic.id).length }}
Alta
{{ lic.created_at?fmtDate(lic.created_at.slice(0,10)):'—' }}
Vencimiento
{{ lic.license_expires_at?fmtDate(lic.license_expires_at.slice(0,10)):'Sin fecha' }}
Tabla requerida:
perfiles
con columnas:
id uuid,
nombre text,
correo text,
rol text,
license_active boolean,
license_expires_at timestamptz,
brand_id text,
created_at timestamptz.
Agregar Revendedor
Crea un nuevo revendedor en Supabase Auth y registra su perfil.
{{ newRevError }}
{{ newRevSuccess }}
Creacion segura via Edge Function
El sistema usa la Edge Function
crear-revendedor
que corre en el servidor con la Service Role Key.
El browser solo envía el token de sesion del admin — ninguna clave privilegiada queda expuesta.
Deploy:
supabase functions deploy crear-revendedor
Configuracion
{{ configTab==='whatsapp'?'Personaliza la plantilla de mensajes WhatsApp': configTab==='planes'?'Administra los planes y precios del sistema (solo admin)': configTab==='marcas'?'Gestiona tus marcas personales vinculadas a tu cuenta': 'Exporta o importa la base de datos completa' }}
Conexion Supabase
URL
Tabla: clientes — Columnas esperadas
id, nombre, telefono, correo, usuario, contrasena, tipo_cliente, brand_id, producto, fecha_inicio, fecha_renovacion, notas, estado
Plantilla WhatsApp
Variables: {nombre} {servicio} {marca} {fecha_renovacion} {dias_restantes}
Vista previa
{{ editingPlan?'Editar Plan':'Nuevo Plan' }}
Planes Configurados
{{ p.nombre }}
{{ p.precio?'$'+parseFloat(p.precio).toFixed(2):'' }} {{ p.duracion_dias?'· '+p.duracion_dias+'d':'' }} {{ p.descripcion?'· '+p.descripcion:'' }}
Tabla requerida:
planes
— columnas: id uuid, nombre text, precio numeric, duracion_dias int, activo boolean, descripcion text, created_at timestamptz
{{ editingMarca?'Editar Marca':'Nueva Marca' }}
Mis Marcas ({{ marcasUsuario.length }})
{{ m.nombre }}
{{ m.descripcion||'Sin descripcion' }} · {{ allClients.filter(c=>c.brand_id===m.id||c.brand_id===String(m.id)).length }} clientes
Tabla requerida:
marcas_usuario
— columnas: id uuid, nombre text, descripcion text, color text, icono text, revendedor_id uuid (FK auth.users), created_at timestamptz
RLS: auth.uid() = revendedor_id para SELECT/INSERT/UPDATE/DELETE.
Backup de Base de Datos
Clientes en DB
{{ allClients.length }}
Marcas
{{ brands.length }}
Ultima sync
{{ lastSaved }}
Zona de peligro