Yurest · Portal de gestión

Esquema de funcionamiento de la web

Cómo se relacionan las pantallas, los actores, las integraciones, la base de datos y los workflows automáticos.

Actualizado el 4 de agosto de 2026

Actores y pantallas

Las audiencias que tocan la plataforma —organizadas por departamento— y sus pantallas principales.

Ventas / Consultor Cliente Implementación · CS · Soporte · Producto Contabilidad Integraciones externas Backend (n8n propio + Postgres)
flowchart LR classDef cliente fill:#fde68a,stroke:#f59e0b,color:#78350f classDef consultor fill:#dbeafe,stroke:#3b82f6,color:#1e3a8a classDef yurest fill:#fecaca,stroke:#fc5858,color:#7f1d1d classDef contab fill:#dcfce7,stroke:#16a34a,color:#14532d classDef integ fill:#ede9fe,stroke:#8b5cf6,color:#4c1d95 classDef backend fill:#cbd5e1,stroke:#64748b,color:#0f172a Ventas[👔 Ventas / Consultor
configurador · ofertas · lista]:::consultor Cliente[👤 Cliente
oferta.html · solicitud.html
enlace con token]:::cliente Impl[🔧 Implementación
sinasignar · proyectos
panel-sesiones]:::yurest CS[❤️ Customer Success
clientes · bajas · promociones]:::yurest Sop[🎧 Soporte
integraciones · hardware · stock]:::yurest Prod[💡 Producto
triaje · presupuestos · updates]:::yurest Contab[💼 Contabilidad
contabilidad · clientes-a3
proformas]:::contab Ext[🔌 Integraciones externas
Asana · HighLevel · Zendesk
Drive · Redsys · SEUR · Gmail]:::integ BD[(🗄️ n8n.yurest.dev
+ Postgres propio)]:::backend Ventas -.oferta / ficha.-> BD Cliente -.datos firmados / pago.-> BD Impl -.proyectos y sesiones.-> BD CS -.altas / bajas / promos.-> BD Sop -.tickets y envíos.-> BD Prod -.triaje / presupuestos.-> BD Contab -.SEPA / A3.-> BD BD -.sincroniza.-> Ext Ext -.webhooks.-> BD

Flujo principal: Origen → Ficha → Completada → Implementación → A3

El recorrido completo del cliente. La ficha puede nacer de varias fuentes; el ejemplo detalla la solicitud al cliente, la ruta más habitual.

flowchart TD classDef cliente fill:#fde68a,stroke:#f59e0b,color:#78350f classDef consultor fill:#dbeafe,stroke:#3b82f6,color:#1e3a8a classDef yurest fill:#fecaca,stroke:#fc5858,color:#7f1d1d classDef contab fill:#dcfce7,stroke:#16a34a,color:#14532d classDef backend fill:#cbd5e1,stroke:#64748b,color:#0f172a O0[🟦 Origen de la ficha
Oferta ganada · Solicitud al cliente
Importador Sheet · HighLevel]:::consultor A1[1️⃣ Consultor · lista.html
📨 Solicitar ficha]:::consultor A2[(solicitudes
estado=pendiente
access_token=uuid)]:::backend A3[📧 Email al cliente
solicitud.html?t=ABC]:::backend B1[2️⃣ Cliente · solicitud.html
Empresa, JP, firmante,
TPV, SEPA]:::cliente B2[✍️ Firma SEPA en canvas
+ valida IBAN MOD-97]:::cliente B3[📤 Envía formulario]:::cliente C1[(fichas_alta
estado=completada
fecha_rellenado set
sepa_mandato JSONB)]:::backend C2[📁 Crea carpeta Drive]:::backend C3[📧 Email al cliente
con enlace a Drive]:::backend C4[📧 Email al consultor
aviso ficha rellenada]:::backend C5{TPV
no integrado?}:::backend C6[📋 Tarea Asana
+ email a soporte]:::backend D1[3️⃣ Pestaña 'Rellenado cliente'
Consultor pulsa 'Completar ficha']:::consultor D2[Consultor · ficha-cliente.html
Módulos, locales, financiero,
plan y precios]:::consultor D3[(fichas_alta
estado=rellenado
fecha_completado set)]:::backend P1[🔧 Proyecto de implementación
proyectos.html + Asana]:::yurest E1[4️⃣ Pestaña 'Fichas'
Listado con SEPA disponible]:::yurest E2[5️⃣ Contabilidad · contabilidad.html
Pendientes A3]:::contab E3[📄 Ver mandato SEPA
+ Descargar PDF]:::contab E4[Toggle 'Grabado en A3']:::contab E5[(grabado_a3=true
grabado_a3_at set)]:::backend O0 --> A1 A1 --> A2 --> A3 --> B1 B1 --> B2 --> B3 B3 --> C1 C1 --> C2 --> C3 C1 --> C4 C1 --> C5 C5 -- Sí --> C6 C5 -- No --> D1 C6 --> D1 C1 --> D1 D1 --> D2 --> D3 D3 --> P1 D3 --> E1 D3 --> E2 E2 --> E3 E2 --> E4 --> E5

Mapa de pantallas y navegación

Sidebar agrupado por departamento (con búsqueda global ⌘K). Cada pantalla es accesible desde cualquier otra y se filtra por permisos del usuario.

flowchart LR classDef informes fill:#fff7ed,stroke:#f59e0b,color:#9a3412 classDef consultor fill:#eff6ff,stroke:#3b82f6,color:#1e40af classDef impl fill:#fef2f2,stroke:#fc5858,color:#7f1d1d classDef contab fill:#f0fdf4,stroke:#16a34a,color:#14532d classDef sop fill:#faf5ff,stroke:#8b5cf6,color:#5b21b6 classDef cs fill:#fff1f2,stroke:#fb7185,color:#9f1239 classDef prod fill:#fefce8,stroke:#ca8a04,color:#854d0e classDef adm fill:#f1f5f9,stroke:#64748b,color:#0f172a SB[📐 Sidebar lateral
+ búsqueda global ⌘K] SB --> I[📊 Informes] I --> Iimp[Implementadores · Proyectos
Heatmaps · Resúmenes IA · Churn]:::informes SB --> Ve[💼 Ventas] Ve --> Vc[Configurador · Ofertas
Fichas de cliente · Escalados]:::consultor SB --> Im[🔧 Implementación] Im --> Ip[Sin asignar 🟠 · Proyectos
Panel Sesiones]:::impl SB --> Cs[❤️ Customer Success] Cs --> Ck[Cascada CS · Bajas · Promociones
HighLevel · Sin CRM]:::cs SB --> Cont[📒 Contabilidad] Cont --> Ca[Grabar en A3 🟠 · Clientes A3
Pagos de proformas]:::contab SB --> Sup[🎧 Soporte] Sup --> Si[Estado clientes · Integraciones
Hardware envíos · Stock · Docs]:::sop SB --> Pr[💡 Producto] Pr --> Pt[Triaje · Presupuestos · Bolsa de horas
Documento interno IA · Updates]:::prod SB --> Ad[🛡️ Administración] Ad --> Au[Usuarios y permisos · Logs]:::adm

Índice completo de pantallas (47). Todas las páginas del portal con su fichero y su función. Las de «Cliente / público» se acceden por enlace con token; el resto viven tras el login.

PantallaFicheroPara qué
📊 Informes
Distribución implementadoresdistribucion.htmlCarga y disponibilidad del equipo de implementación.
Proyectos (dashboard)informe-implementacion.htmlKPIs de implementación con filtros por implementador y plan.
Mapa de calor de ticketsinforme-tickets.htmlVolumen de tickets por franja horaria.
Heatmap · Agente IAinforme-tickets-ia.htmlMismo mapa de calor para el agente de IA.
Resumen semanalresumen-semanal.htmlResumen IA de las incidencias de la semana.
Resumen mensualresumen-mensual.htmlInforme mensual profundo de incidencias.
Churn técnicochurn-tecnico.htmlSeñales técnicas de fuga de clientes.
💼 Ventas
Configurador de ofertaconfigurador.htmlArma la oferta (planes, módulos, order bumps) y la envía al cliente.
Ofertas generadasofertas.htmlListado de ofertas y su estado (enviada / ganada); ampliar caducidad.
Fichas de clientelista.htmlFichas con pestañas Fichas / Rellenado cliente / Solicitudes.
Escalados de clientesescalados.htmlAmpliaciones y upsell de contrato.
🔧 Implementación
Sin asignarsinasignar.htmlFichas personalizadas pendientes de asignar implementador.
Proyectosproyectos.htmlGestor de proyectos: pestañas, secciones por módulo, cronograma Asana.
Panel Sesionespanel-sesiones.htmlAgenda de sesiones + registro Show/No-Show y auto-resumen.
❤️ Customer Success
Cascada CSclientes.htmlKanban del ciclo de vida del cliente.
Bajasbajas.htmlGestión de bajas de clientes.
Promocionespromociones.htmlPromos grupales y ocupación de huecos (importador Asana).
HighLevel · Contactoscs-highlevel.htmlContactos del CRM HighLevel.
HighLevel · Clientes ganadoshighlevel-clientes.htmlOportunidades ganadas en HighLevel.
Clientes Yurest sin CRMhuerfanos-prod.htmlClientes en producción sin ficha en el CRM.
📒 Contabilidad
Grabar en A3contabilidad.htmlMandato SEPA + toggle de alta en A3.
Clientes A3clientes-a3.htmlClientes ya grabados en A3.
Pagos de proformasproformas.htmlSeguimiento de cobros de proformas de hardware.
🎧 Soporte
Estado clientes Yurestestado-clientes-yurest.htmlTelemetría de uso del producto por cliente.
Integracionesintegraciones.htmlPanel de tareas de integración (Asana) y TPV no integrados.
Doc. integracionesdocumentacion-integraciones.htmlManual de integraciones (público).
Hardware envíoshardware.htmlEnvíos de hardware (SEUR) y generación de proformas.
Stockstock.htmlInventario de hardware.
💡 Producto
Triajetriaje.htmlClasificación de tareas por módulo con sugerencias IA.
Presupuestospresupuestos.htmlPresupuestos y documento/PDF que ve el cliente.
Bolsa de horasbolsa-horas.htmlControl financiero de horas (consumo FIFO).
Documento interno IAdocumento-interno-ia.htmlBase de conocimiento de sprints generada por IA.
Updatesupdates.htmlNewsletter de novedades a clientes desde Asana.
🛡️ Administración
Usuarios y permisosadmin.htmlRoles, permisos por usuario y auditoría.
Logs de actividadlogs.htmlTrazabilidad de acciones del portal.
👤 Cliente / público (enlace con token)
Ficha de alta (cliente)solicitud.htmlEl cliente rellena empresa, JP, firmante, TPV y firma SEPA.
Tu oferta (cliente)oferta.htmlEl cliente ve la oferta, edita plan/módulos y paga (Redsys).
Formulario de altaficha-cliente.htmlEl consultor completa todos los detalles de la ficha.
Firmar mandato SEPAfirmar-sepa.htmlRe-firma del mandato SEPA por parte del cliente.
⚙️ Sistema / utilidades
Portal (inicio)index.htmlHome con accesos por departamento y buscador global.
Accesologin.htmlLogin; emite el token de sesión firmado.
Página no encontrada404.htmlError 404.
Matcheo entre sistemasmatcheo-sistemas.htmlCruce de IDs Yurest / HighLevel / Zendesk por cliente.
Cascada CS (alias)cs-kanban.htmlEntrada alternativa al kanban de Customer Success.
Proforma (mockup)proforma-mockup.htmlMockup visual del documento de proforma.
Doc. integraciones (standalone)documentacion-integraciones-standalone.htmlVersión independiente del manual de integraciones.
Doc. integraciones (Zendesk)documentacion-integraciones-zendesk.htmlManual de integraciones embebible en Zendesk.

Integraciones externas

El backend n8n orquesta media docena de servicios externos. Todo pasa por workflows; el frontend nunca habla directamente con ellos.

ServicioPara quéDirección
AsanaProyectos de implementación (secciones por módulo/cliente), tareas, cronograma y tickets de Zendesk enlazados.lectura + escritura
HighLevel (CRM)Contactos, negocios y oportunidades. Al ganar la ficha sincroniza contacto / business / Custom Object Local.lectura + escritura
ZendeskTickets de soporte por TPV; se enlazan a Asana por el campo «ID Zendesk».lectura + escritura
Google DriveCarpeta por cliente con la documentación de la ficha; grabaciones de sesiones compartidas.escritura
Redsys (TPV BBVA)Pasarela de pago para aceptar ofertas (cobro = importe final × 1,21).request / response
SEUREnvíos de hardware (SEUR PIC); proformas con coste de envío por zona.escritura
Gmail (Soporte)Todos los emails salientes (solicitudes, ofertas, avisos) desde la cuenta de Soporte.escritura

Infraestructura y seguridad

Cómo está montada la plataforma hoy, tras la migración a infraestructura propia.

PiezaDetalle
FrontendHTML/JS estático servido por Cloudflare Pages desde un repo privado (build scripts/build-site.sh). URLs limpias, sin .html.
Backend~130 workflows en n8n propio (n8n.yurest.dev). Toda la lógica y las integraciones viven aquí.
Base de datosPostgreSQL autogestionado (BD yurest), sustituto de Supabase. Los workflows leen y escriben directamente.
AutenticaciónEl login emite un token de sesión firmado (HMAC); cada webhook de staff lo valida en línea. Sin auth básica compartida.
PermisosRoles con permisos predefinidos + deltas por usuario; el sidebar y las páginas se filtran por permiso. Trazabilidad en logs.html.

Workflows n8n implicados

La instancia tiene ~130 workflows. Estos son los que sostienen el flujo principal; el resto cubre integraciones, informes y automatismos programados.

WorkflowTriggerQué hace
Auth / rolesPOST login · rolesValida credenciales y emite el token de sesión HMAC; resuelve permisos (rol + deltas por usuario).
Configurador / ofertasPOST oferta-enviar · GET ofertasGenera la oferta, la envía al cliente y gestiona estados (enviada/ganada) y caducidad.
Pago RedsysPOST pago/iniciar · retorno TPVFirma la petición Redsys, procesa el retorno y dispara el enlace a la ficha tras el cobro.
Fichas de altaPOST guardarFicha · GET altasListado y CRUD de fichas. UPDATE solo de campos enviados (no destructivo).
SolicitudesPOST crearSolicitud · GET listaSolicitudesCrea la solicitud con access_token y devuelve la lista filtrada por estado.
Responder solicitudPOST responderSolicitudCliente envía → INSERT ficha + carpeta Drive + emails (cliente/consultor) + tarea Asana si TPV no integrado.
Importador SheetPOST importar-sheetConvierte una URL de Google Sheets en una ficha pre-rellenada.
ProyectosPOST/PUT proyectos + tareasCrea el proyecto desde la ficha (master Asana según módulos), secciones y tareas.
Panel de sesioneswebhooks panel/*Agenda sesiones, valida disponibilidad de calendario y registra Show/No-Show en Asana.
Grabado A3POST grabadoA3Toggle del flag grabado_a3 con diagnóstico de filas afectadas.
Sync HighLevelwebhook al ganar fichaUpsert de contacto / business / oportunidad ganada + Custom Object Local en el CRM.

Modelo de datos esencial

Tablas y relaciones que sostienen todo el flujo. Soft-delete vía deleted_at en todas.

erDiagram OFERTAS ||--o| FICHAS_ALTA : "oferta↔ficha (oferta_id / solicitud_ficha_id)" SOLICITUDES ||--o{ FICHAS_ALTA : genera FICHAS_ALTA ||--o{ LOCALES : tiene FICHAS_ALTA ||--o{ PROYECTOS : "se convierte en" FICHAS_ALTA ||--o| PROMOCIONES : "ocupa hueco (promocion_id)" FICHAS_ALTA ||--o{ BAJAS : "puede darse de baja" FICHAS_ALTA ||--o{ DISTRIBUCION : "asignada a implementador" FICHAS_ALTA ||--o{ FICHAS_HISTORIAL : "registra cambios" PROYECTOS ||--o| PROMOCIONES : "ocupa hueco (promocion_id)" OFERTAS { uuid id PK text estado "borrador|ganada|pagada_transferencia" text billing "mensual|anual" text plan text cliente_sociedad text cliente_cif jsonb addons "módulos/extras del configurador" numeric final_amount uuid solicitud_ficha_id FK text access_token UK timestamptz expires_at timestamptz created_at } SOLICITUDES { uuid id PK text access_token UK uuid ficha_id FK text estado jsonb datos timestamptz created_at } FICHAS_ALTA { uuid id PK text estado "completada|rellenado" text tipo_cliente "lite|pro|corporate" text denominacion text nombre_comercial text cif text modulos "array TEXT[]" uuid oferta_id FK uuid promocion_id FK text promocion_turno "manana|tarde" text cred_master text cred_yurest text origen "sheet|solicitud|manual|highlevel" bool introducido_yurest jsonb paquetes_carrito "snapshot del carrito" jsonb adjuntos bool grabado_a3 jsonb sepa_mandato timestamptz fecha_rellenado timestamptz fecha_completado } LOCALES { uuid id PK uuid ficha_id FK "NOT NULL, ON DELETE RESTRICT" text nombre text sociedad_cif decimal mensualidad bool es_cocina_central text tpv uuid sepa_mandato_id } PROYECTOS { uuid id PK uuid ficha_id FK text cliente text estado "activo|completado|pausado" uuid promocion_id FK text asana_project_url jsonb secciones "tareas del proyecto" jsonb sepa_mandato } PROMOCIONES { uuid id PK text nombre date fecha_inicio int plazas_manana int plazas_tarde text asana_project_gid } BAJAS { uuid id PK uuid ficha_id FK } DISTRIBUCION { uuid id PK uuid ficha_id FK text implementador } FICHAS_HISTORIAL { uuid id PK uuid ficha_id FK text accion timestamptz created_at }

Alcance: diagrama esencial. fichas_alta tiene ~120 columnas reales (financiero fin_*, highlevel_*, health_*, exento_iva, fraccionamiento_*, TPV, dirección de entrega…); arriba solo las representativas. Tablas secundarias no diagramadas: usuarios, cs_estado_historial, prod_clientes_snapshot/estado, hardware_pedidos, escalados, seur_*. La fuente de verdad es database/schema.sql + las migraciones en database/migrations/.

Nota semántica: en fichas_alta el estado completada significa "rellenada por el cliente" y rellenado significa "completada por el consultor". Triggers SQL actualizan automáticamente fecha_rellenado, fecha_completado y grabado_a3_at al cambiar el campo correspondiente.

Cómo se usa cada acción clave

AcciónQuiénDóndeQué pasa
Solicitar fichaConsultorlista.html · botón "Solicitar ficha"Crea solicitud + envía email al cliente con URL ?t=<token>.
Rellenar solicitudClientesolicitud.html (link del email)Datos empresa + JP + firmante + TPV (integrado/no) + IBAN + firma SEPA.
Completar fichaConsultorPestaña "Rellenado cliente" → botónAbre index.html con los datos prellenados; al guardar pasa a estado rellenado.
Editar fichaConsultor / YurestPestaña "Fichas" · botón EditarUPDATE solo de campos enviados — no destructivo.
Eliminar ficha/solicitudConsultor / YurestPestañas correspondientes · botón EliminarSoft-delete con confirmación + toast de diagnóstico.
Grabar en A3Contabilidadcontabilidad.html · toggle por filaUPDATE flag grabado_a3; trigger setea grabado_a3_at.
Ver mandato SEPAContabilidadcontabilidad.html · botón "📄 Ver mandato"Modal con datos legales completos + firma + descarga PDF (popup, una sola hoja A4).
TPV no integradoClientesolicitud.html · checkbox cabecera TPVAl enviar: tarea automática en Asana (proyecto Integraciones) + email a soporte/Yurest/Roocket.

Estados de ficha y solicitud

stateDiagram-v2 [*] --> OfertaEnviada: Consultor genera oferta OfertaEnviada --> OfertaGanada: Cliente acepta / paga OfertaGanada --> FichaCompletada: Arranca la ficha [*] --> SolicitudPendiente: Consultor crea solicitud SolicitudPendiente --> SolicitudCompletada: Cliente rellena SolicitudCompletada --> FichaCompletada: INSERT fichas_alta
estado=completada FichaCompletada --> FichaRellenada: Consultor guarda
estado=rellenado FichaRellenada --> Implementacion: Se crea proyecto en Asana FichaRellenada --> GrabadoA3: Contabilidad activa toggle GrabadoA3 --> [*]

"Completada" = rellenada por cliente · "Rellenado" = cerrada por consultor. La nomenclatura es legacy pero los triggers SQL ya alinean fechas con esta semántica.