Ir al contenido

Generar Token de Acceso al Portal

Crea un enlace unico y seguro para que el cliente acceda a su portal y vea sus facturas, presupuestos y albaranes.

  1. Localiza el cliente en la lista.
  2. Clic en el icono de ojo (Ver) — se abre la vista de detalle.
  3. Seccion “Portal del Cliente” → Clic en “Generar Enlace”.
  4. Confirma el email del cliente (obligatorio para verificacion).
  5. Clic en “Generar” — se crea el token y el enlace.
  6. Copia el enlace con el boton “Copiar” y envialo al cliente por email, WhatsApp, etc.
CaracteristicaDescripcion
Unico por clienteUn token por cliente (regenerable)
Verificacion obligatoriaRequiere verificacion por email en primer acceso
Estado configurableActivo / Inactivo (puedes desactivar sin eliminar)
Expiracion configurablePor defecto: sin expiracion (o segun configuracion)
RegenerablePuedes generar un nuevo token en cualquier momento (invalida el anterior)
https://tudominio.com/portal/cliente-slug?t=TOKEN_UNICO

Ejemplo real:

https://facturik.com/portal/acme-software?t=abc123def456ghi789
  • El enlace aparece en el modal con boton de copiar.
  • Toast de confirmacion: “Enlace generado” o “Configuracion actualizada”.
  • En la lista de clientes, el badge “Portal” aparece junto al nombre del cliente.
MensajeCausaSolucion
”Email requerido”Cliente sin email registradoEdita el cliente y anade email antes de generar token
”Error al generar token”Error de servidorReintenta o contacta soporte
🔧 Detalles Tecnicos — Generar Token Portal

Tablas involucradas:

TablaColumnas claveFK
customer_portal_tokensid, customer_id, token, requires_email_verification, is_active, expires_at, created_at, updated_atcustomers

Generacion de token:

  • Funcion RPC: get_or_create_customer_portal_token(p_customer_id, p_requires_verification)
  • Token: UUID v4 (32 caracteres hexadecimales)
  • Verificacion: SIEMPRE true por seguridad

Logica:

  1. Si existe token activo → retorna token existente
  2. Si NO existe → INSERT nuevo token
  3. Retorna: { token_id, token, is_new }

Queries de diagnostico:

-- Token activo por cliente
SELECT * FROM customer_portal_tokens
WHERE customer_id = '<customer_id>'
AND is_active = true;
-- Tokens por negocio
SELECT c.name, t.token, t.is_active, t.created_at
FROM customer_portal_tokens t
INNER JOIN customers c ON c.id = t.customer_id
WHERE c.business_id = '<business_id>';
-- Desactivar token
UPDATE customer_portal_tokens
SET is_active = false
WHERE customer_id = '<customer_id>';

Componente:

  • PortalTokenGenerator.tsx
  • Props: customerId, customerEmail, customerName, customerSlug
  • Hook: loadExistingToken() — Verifica si ya existe token

URL del portal:

  • Formato: ${window.location.origin}/portal/${customerSlug}?t=${token}
  • Slug: Generado desde nombre del cliente (minusculas, sin espacios)

Seguridad:

  • Verificacion email: Codigo OTP enviado al email del cliente
  • Token expirable: Configurable en tabla (campo expires_at)
  • Logs de acceso: Tabla customer_portal_access_log