LPDI · SGR · Depuración de catálogos

Plan de saneamiento / Fase 2

Cinco campos que hoy guardan el mismo dato en formatos distintos según qué formulario lo escribió. Antes de tocar la base de producción necesito tu decisión en los puntos marcados. Todo verificado con consultas directas sobre los datos reales, no sobre supuestos.

Fecha 05 ago 2026 Fase 1 ya desplegada (commit 9faa0b3) Producción sin PITR · cada migración lleva respaldo + reversibilidad
Decisión de fondo · Países

El código telefónico no puede ser identificador único de país

Acordamos que el identificador de país sería el código telefónico y no el ISO. Al revisar los datos encontré dos cosas: (1) hoy ningún registro usa el código telefónico, todos guardan el nombre del país (Colombia, México), y el catálogo con código telefónico se construyó pero nunca se conectó a los formularios; (2) el código telefónico se repite entre países distintos: +1 es Estados Unidos y Canadá, +39 es Italia y el Vaticano, +7 es Rusia y Kazajistán. Si lo usamos como identificador, esos países quedan indistinguibles. El único código que sí es único por país es el ISO de dos letras (CO, US, CA). Necesito que definamos esto antes de normalizar países.

Campos con decisión de datos
H2Facturación anual Datos partidos
Columnas: startups.annual_revenue (legacy) · annual_revenue_by_year (la que llena el formulario hoy) · Catálogo: catalogo_rango_revenue

annual_revenue · 40 registros

27 como código0-5000, 25001-50000…
13 como texto$0 a $5.000 USD…
0 huérfanostodos mapean 1:1

annual_revenue_by_year · 47 valores

47 como texto100% consistente
0 huérfanostodos mapean
es la fuente real

Tu decisión · formato canónico

Todo se puede unificar sin perder nada porque cada valor mapea 1:1. La pregunta es a qué formato: al texto legible ($0 a $5.000 USD anuales) o al código corto (0-5000).

Recomiendo texto legible: es lo que el formulario ya guarda hoy, lo que usa la fuente real por año y lo que muestran las gráficas. La migración toca solo ~21 filas y el valor sigue siendo entendible a simple vista en la base.

H1Niveles de madurez · BRL / TRL / CRL / TMRL Cruce roto
Columnas: startups.brl_level / trl_level / crl_level / tmrl_level vs icgs.brl_levels / trl_levels / crl_levels · Catálogo: catalogo_nivel_madurez

Startup guarda

BRL1pegado, sin espacio
TRL1 / CRL1pegado
1TMRL solo el número

ICG guarda (ya usa catálogo)

BRL 1con espacio
TRL 1 / CRL 1con espacio
=formato catálogo

Plan

Unificar la startup al formato del catálogo (BRL 1 con espacio), que es el que ya usa el ICG. Es un mapeo determinista (BRL1 → BRL 1, 1 → TMRL 1). Así el cruce startup ↔ inversor por madurez vuelve a funcionar.

Sin decisión pendiente, solo tu visto bueno. Afecta ~52 registros de startup.

H8Rol en el ecosistema (ICG) Mezcla codigo/texto
Columna: icgs.icg_role · Catálogo: catalogo_rol_ecosistema

icg_role · valores guardados

Ángel Inversionistacomo texto (con tilde)
Consultora boutique, Family Office…como código (sin tilde)

Tu decisión · codigo vs texto

El catálogo separa código (Angel Inversionista, sin tilde) y texto visible (Ángel Inversionista, con tilde). Hoy hay de los dos.

Recomiendo guardar el código y mostrar el texto en pantalla, que es el patrón limpio del resto de catálogos. Alternativa: guardar el texto visible, menos rupturas si en el futuro cambia una tilde.

H6Composición del equipo 1 valor divergente
Columna: startups.team_composition (lista) · Catálogo: catalogo_composicion_equipo

team_composition · ítems guardados

Equipo técnico para desarrollo de softwarecoincide
Mujeres fundadoras y/o directivascoincide
Jóvenes fundadores -menores de 25 años-no coincide

Plan

El catálogo dice Jóvenes fundadores (menores de 25 años) con paréntesis; un registro quedó con guiones. Se corrige ese único valor y se conecta el campo al catálogo.

Depende de la decisión de H8 (codigo vs texto): aplicamos el mismo criterio aquí.

PPaíses Fragmentado
Columnas: startups.country · icgs.country · eventos.pais_code · Catálogo: catalogo_pais

Cómo se guarda hoy

startups / icgsnombre en español
eventos.pais_code37 variantes / 1844
codigo telefónicono se usa en ningún lado

El desorden en eventos

Méxicoy también "Mexico"
Perúy también "Peru"
United States / Brazilen inglés

Tu decisión · identificador (ver alerta arriba)

Primero definir el identificador. Como el código telefónico colisiona (+1, +39, +7), propongo guardar el ISO de dos letras (CO, US) como identificador interno y mostrar el nombre en español en pantalla. El código telefónico se conserva en el catálogo como atributo de cada país para lo que lo necesites.

Con el identificador definido, normalizo las 37 variantes de eventos a un único valor por país. Este campo lo trato aparte, es el de mayor volumen.

Cómo lo ejecuto, una vez que decidas