LPDI Actualizado: 09-ago-2026 · Versión 3 · Especificación Técnica del Sistema LPDI
Sistema LPDI · Documentación técnica completa

Especificación Técnica del Sistema LPDI

Radiografía completa de la plataforma: arquitectura, modelo de datos, subsistemas (Relacionamiento, Contenidos y Eventos), módulo de Beneficios, sistema de codificación, autenticación y roles, API, automatizaciones y reglas de negocio. Reescritura de la V.2 (03-jun-2026): actualizada contra el código real en producción e incorporando todo lo construido desde entonces.

Sistema eco.lpdi.co · Repositorio lpdi-relacionamiento (rama master) · Verificado el 09-ago-2026 contra el código y la base de datos vivos.

3
subsistemas (SGR · SGC · SGE)
205
migraciones SQL
80+
endpoints de API
16
cron jobs
2.514
eventos en la base
Este documento es la V.3: la V.2 (jun-2026) describía solo el núcleo de Relacionamiento (startups/ICGs/usuarios). Desde entonces se sumaron el Subsistema de Gestión de Eventos (SGE), el módulo de Beneficios (Perks), el sistema de roles por módulo, la transferencia de entidades, el acceso por referidos y la anonimización de bajas. El detalle profundo del SGE vive en su propio reporte: Reporte del módulo de eventos.
1

Stack tecnológico

Plataforma SvelteKit + Supabase, desplegada en Vercel.

CapaTecnologíaVersiónRol
FrontendSvelteKit (Svelte 4)2.xSSR + SPA híbrido
StylingTailwindCSS3.4.xutilidades CSS
BuildVite5.xbundler + HMR
Backend / BaaSSupabasesupabase-js 2.45+Auth, DB (Postgres), Storage, RPC
SSR Auth@supabase/ssr0.5.xcookies server-side
EmailNodemailer + Resend8.xSMTP relay vía lpdi.co
HostingVerceladapter-vercel 5.4Edge + Serverless + Cron
DNS / CDNCloudflareDNS, SSL, caché
QRqrcode1.5.xgeneración de QR
TestingPlaywright / Vitest1.59 / 4.1E2E / unitarios
TiposTypeScript5.xtype safety
Sin ORM: Prisma fue eliminado (LAP-258). Todo acceso a datos es vía el cliente Supabase JS directo (.from().select() + RPC). El estado del esquema se versiona en supabase/migrations/ (205 migraciones a la fecha).
2

Arquitectura y subsistemas

Una plataforma (SL) con tres subsistemas de gestión + módulos transversales.

SiglaSubsistema / móduloQué gestiona
SLSistema LPDIla plataforma completa (eco.lpdi.co)
SGRGestión del Relacionamiento CRMregistro y perfiles de Startups/PyMEs e ICGs, usuarios, equipos, matchmaking, ecosistema
SGCGestión de Contenidoscontenidos del ecosistema (subsistema hermano, comparte instancia Supabase)
SGEGestión de Eventos nuevoregistro, curaduría y directorio de eventos y organizadores (§5)
PerksBeneficios nuevocatálogo público de beneficios de aliados (§6)
SCSistema de Codificacióncódigos únicos internos de entidades y eventos (§7)

Todos comparten la misma instancia de Supabase (Auth + Postgres + RLS) y el mismo despliegue en Vercel. El ruteo es por convención SvelteKit: rutas públicas (registro, ecosistema, perks, ficha de evento), rutas autenticadas bajo /dashboard, y endpoints bajo /api. La lógica sensible siempre corre server-side (+page.server.ts / +server.ts); RLS habilitado en todas las tablas.

3

Modelo de datos

Tablas por dominio. Todas con RLS; el esquema vive en supabase/migrations/.

Identidad y entidades (SGR)

TablaContenido / campos claveRLS
profilesPK id = auth.uid(). Identidad (email, nombres, país, ciudad, empresa, cargo, teléfono, foto), redes sociales, languages/industries (jsonb), completion_score, timestamps.solo el propio usuario (id = auth.uid())
startupsStartup/PyME/Scaleup. Identidad + negocio (pitch, ICP, problema, solución, modelo), niveles BRL/TRL/CRL, financiero, legal, presencia digital, equipo (CEO), status (DRAFT/PENDING/APPROVED/REJECTED), completion_score, deleted_at.owner ALL; contact_email y founders SELECT
icgsInversionista/Corporativo/Gestor. icg_type (7 valores), rol e industrias de interés, niveles preferidos, contacto designado, consentimiento, deleted_at.owner/contact ALL; públicos (is_public) SELECT
startup_foundersMiembros del equipo: role, can_edit_form, verification_status, invitation_token.heredada por joins
consent_logConsentimiento auditable: consent_type (terms/privacy), versión, IP, user-agent, metadata.append-only
profile_deletions_log / bajasRegistro de bajas y anonimización (para el reporte diario y el flujo de anonimización).service-role

Eventos (SGE)

TablaContenido
eventosEvento completo (contacto, datos clave, temática, registro) + workflow (status, approved_*, rejected_at, edited_*, deleted_*, publish_at) + evento_codigo, codigo_unico, organizadores_raw. Esquema detallado en el reporte del SGE.
super_eventosAgrupador padre (ej. una "Tech Week"): nombre, mnemotecnia, país, años, código.
directorio_organizadoresDirectorio vivo de organizadores (una fila por nombre normalizado); calidad, estado, vínculo a entidad, merged_into_id.
evento_organizadoresPuente N:M evento↔organizador (rol_en_evento, orden).
evento_favoritos · invitaciones_organizador · evento_permisos_gestion · organizador_criterios · evento_codigo_countersFavoritos, invitaciones a organizadores no registrados, permisos de gestión por evento, criterios de calidad del directorio, y contadores del consecutivo de código.

Beneficios (Perks) y roles

TablaContenido
perksBeneficio de un aliado: entidad ofertante (entity_type/entity_id), categoría, headline, value_badge, público objetivo, países, start/end_date, permanent, status, slug, contenido de la ficha (about, includes, steps).
perk_categoriesCatálogo de categorías de beneficio (id, label, color) — fuente del color de marca por categoría.
admin_rolesRol GLOBAL: super_admin, curador (con scope). Legacy purgados en mig 077.
module_permissionsRol POR MÓDULO (eventos/beneficios): admin, curador, editor_confianza, duplicador, publicador, organizadores.
event_editor_privileges · event_autopublish_privilegesPrivilegios por correo: editar con auto-aprobación / publicar sin curaduría.

Catálogos (SELECT público vía RLS)

industries · subindustries · paises / catalogo_pais · catalogo_red_social · catalogo_rol_ecosistema · catalogo_tematica_evento · catalogo_actividad_evento · catalogo_industria

Doble fuente en catálogos de eventos: catalogo_tematica_evento, catalogo_actividad_evento y catalogo_industria tienen un espejo hardcodeado en src/lib/data/*.ts regenerado por scripts/regen-event-catalogs.py. Cambiar la tabla sin regenerar el TS desalinea el formulario. El selector de país del formulario de eventos usa la lista hardcodeada (countries.ts), no la tabla.
4

SGR — Subsistema de Relacionamiento

El CRM: registro y perfiles de entidades y usuarios.

Registro de entidades y usuarios

SiglaFormularioRutaNotas
FSSStartup — Simplificado/registro-startupcrea auth user + profile + startup DRAFT; envía welcome
FSDStartup — Detallado/registro-startup-detallado · /dashboard/startups/nuevo-detallado6 paneles con stepper, autosave, draft resume
FISICG — Simplificado/registro-icg · /dashboard/icg/nuevo-simplificadocrea ICG + opcionalmente usuario del contacto designado
FIDICG — Detallado/dashboard/icg/nuevo
FUSUsuario — Simplificado/registro-usuarioregistro standalone sin entidad
FUDUsuario — Detallado/registro-usuario-detallado+ about, empresa, cargo, industrias, idiomas, redes, foto

Los 6 paneles del FSD: (1) datos básicos, (2) negocio + niveles BRL/TRL/CRL, (3) financiero (necesidades con picker multinivel), (4) legal, (5) presencia digital, (6) equipo fundador (invitación por email + permisos). Validación por panel con highlight de faltantes.

Dashboard, perfiles y ecosistema

5

SGE — Subsistema de Gestión de Eventos

Registro, curaduría y directorio de eventos. Detalle completo en su reporte dedicado.

El SGE es el subsistema más nuevo. Su pieza central es el Formulario de registro de Eventos (FE / EventFormShell) de 4 pasos, público (/registro-evento) o desde el dashboard, que inserta en la tabla eventos vía service-role. Un evento nuevo entra como PENDING y pasa por el panel de aprobación (/dashboard/eventos/admin/aprobacion); los organizadores se sincronizan a un directorio con detección de duplicados y fusión. Cada evento recibe dos códigos (§7).

2.514
eventos
4
modalidades (pres/online/híbrido/dual)
1.176
organizadores en directorio
6
estados posibles del evento
La documentación exhaustiva del SGE (los 4 pasos campo por campo, catálogos, validaciones, endpoint y payload, esquema de la tabla, panel de aprobación, roles, estados y directorio de organizadores) está en el Reporte del módulo de eventos.
6

Módulo de Beneficios (Perks)

Catálogo público de beneficios ofrecidos por los aliados del ecosistema.

7

Sistema de Codificación (SC)

Códigos únicos internos para entidades y eventos.

El SC asigna identificadores legibles y únicos. Para eventos hay dos:

Documento de referencia del SC: codigos-sistema-lpdi. Detalle de la generación en el reporte del SGE.

8

Autenticación y autorización

Supabase Auth + cookies SSR + RLS + guardas globales.

9

Roles y permisos

Dos capas: rol global y rol por módulo (arquitectura vigente, mig 080).

CapaTablaRolesSe lee en
Rol GLOBALadmin_rolessuper_admin, curadoris_super_admin()
Rol POR MÓDULOmodule_permissionsadmin, curador, editor_confianza, duplicador, publicador, organizadoresis_module_admin(), has_module_permission(), is_event_admin(), has_event_role(), can_duplicate(), can_manage_organizadores()

Del lado del SGR/entidades, los roles operativos son de negocio: Owner (registered_by), CEO (ceo_user_id, gestiona equipo), Editor (can_edit_form=true), Viewer, Contacto ICG. La matriz completa de rol × capacidad para eventos está en el reporte del SGE.

Drift conocido: la UI de "Permisos" del panel de eventos escribe roles en admin_roles, pero los gates de enforcement vigentes leen module_permissions. Los roles reales de módulo se asignan por /api/admin/module-permissions.
10

API — endpoints

80+ endpoints bajo /api. Selección por dominio.

DominioEndpoints (selección)
Auth / consentimientoauth/register · auth/accept-consent · auth/verify-event-user · check-email · check-company-name · check-contact-email · check-profile-slug
Cuentaaccount/delete · account/pre-delete-check · account/update-email · account/update-password · account/assign-editor · account/logout-all
Entidadesentities/trash · entities/delete · entities/restore · entidades/search · entidades/similares · entidades/solicitudes · me/entidades
Transferencia de entidadentity-transfer/create · entity-transfer/candidates · entity-transfer/[action]
ICG / equipoicg/confirm · icg/contact/invite · icg/reject · icg/unlink · icg/visibility · team/confirm · team/reject · team/resend
Eventos (público)eventos/[id] · eventos/[id]/duplicar · eventos/[id]/restore · eventos/favoritos · eventos/invitar-organizador · eventos/permisos · eventos/speaker-lookup · eventos/speaker-confirmacion(-todos) · eventos/trash
Eventos (admin)admin/eventos/[id] · admin/eventos/autopublish · admin/eventos/editor-privileges · admin/eventos/roles · admin/module-permissions · admin/super-eventos(/[id]/restore)
Organizadoresadmin/organizadores(/[id]) · admin/organizadores/fusionar · admin/organizadores/criterios(/[id])
Perksperks · admin/perks/[id](/reassociate) · admin/perks/entidades · admin/perks/external
Otroscities · country-iso2 · alianzas · ideas · admin/legal/publish · admin/referral-access · user-profile-autosave · dev/email-preview
11

Cron jobs y automatizaciones

Vercel Cron (declarados en vercel.json) + jobs disparados por Bearer CRON_SECRET.

CronHorarioFunción
publish-scheduled05:00libera eventos aprobados con publish_at vencida
purge-eventos04:00REJECTED >30d → papelera; hard-delete de papelera vencida (excepto publicados/finalizados); purga supereventos
purge-draft-entities04:15purga de borradores de entidad abandonados
join-request-tick04:30procesa solicitudes de unión a entidad
organizador-invite-reminders04:45recordatorios a organizadores no registrados
speaker-host-invite-reminders04:50recordatorios a speakers/hosts por confirmar

Otros jobs del sistema (vía pg_cron o cron externo): daily-report (reporte + CSV a comunidad@lpdi.co), startup-followup, startup-welcome-reminders (reminders día 3/6 + purge día 8), team-reminders, icg-followup, purge-entities, purge-trash, entity-transfer-tick, account-confirmation-lifecycle, account-definitive-anonymize (anonimización de bajas).

12

Taxonomías (SSOTs)

Fuentes únicas de verdad en src/lib/data/, con lint que detecta duplicación.

13

Sistema de correos

Transaccionales + Supabase Auth + reporte diario.

~22 correos transaccionales + 3 de Supabase Auth + 1 reporte diario con CSV. Implementados en email.ts, email-team.ts y email-daily-report.ts. El inventario completo (IC) es la fuente de verdad de textos y disparadores: informe-emails-lpdi-completo.

Regla dura: ante cualquier cambio de correos hay que actualizar el IC (el HTML) — es la SSOT del inventario de correos.
14

Ciclo de vida del dato

Soft-delete, purga, anonimización y transferencia.

15

Integraciones externas

Servicios y credenciales.

ServicioUsoCredenciales
SupabaseAuth, DB, Storage, RPCPUBLIC_SUPABASE_URL, SUPABASE_ROLE_KEY (sb_secret_)
ResendSMTP relay vía lpdi.coSMTP_HOST/USER/PASS
Google Maps / Placesautocomplete de ubicación en el FEPUBLIC_GOOGLE_PLACES_API_KEY
Vercelhosting, Edge, Crontoken en CI/CD
CloudflareDNS, SSLcuenta dev@lapuntadeliceberg.co
16

Reglas de negocio

Reglas documentadas en el código.