LAP-256 Fase 1 — Inventario de campos para revisión

Generado: 2026-04-22 · PR #1 · Ver pull request en GitHub
65campos Startup
100 ptssuma score Startup
67campos ICG
100 ptssuma score ICG

Este reporte es el inventario completo de los campos que hoy existen para Startups e ICGs, organizados tal como aparecen (o aparecerán) en el formulario detallado. La Fase 1 de LAP-256 solo declara estos campos en un único archivo por entidad — nada en producción cambia todavía. Las fases siguientes van a regenerar formularios, perfiles y score desde esta fuente única, para que no se vuelva a desincronizar.

Startup / PyME

65 campos totales · Suma de pesos de score: 100 pts

Panel 1 · Identidad legal · 9 campos · 5 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Nombre comercial
companyName
string 1
País de origen
country
string 1 Se solapa con originCountry en la BD — `country` es el canónico (NOT NULL). `origin_country` es legacy usado por algunas UIs. En Fase posterior unificar.
Ciudad
city
string NOT NULL en BD pero el FS actualmente inserta "" (string vacío) porque no se pide. No cuenta para score.
País de origen (legacy)
originCountry
string No 1 Campo usado por el FD actual (profileScore.ts lo cuenta). Duplicado con `country`. Consolidar en Fase 2.
Región de origen
originRegion
string No Derivable de country via tabla catalogo_pais. No se pide explícitamente.
Domicilio fiscal
fiscalDomicile
string No 2 Prisma tiene `fiscal_domicile` (string). El FD actual persiste además `fiscal_domicile_countries` (array), pero esa columna NO está en schema.prisma — es deuda técnica.
Consentimiento de email
emailConsent
boolean DEFAULT false. Flag de consentimiento, no cuenta para score.
Email de contacto de la empresa
contactEmail
email NOT NULL. Obligatorio para el registro, por eso no cuenta al score (siempre estará lleno).
Teléfono de contacto
contactPhone
phone No

Panel 2 · Perfil de la compañía · 11 campos · 20 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Tipo de empresa
companyType
enum 2
¿Es empresa tech?
isTechBased
boolean No 2
Industria principal
industryId
uuid No Legacy: industria principal singular. Hoy el form usa `StartupIndustry` (many-to-many). Mantener por retrocompatibilidad.
Sub-industria principal
subIndustryId
uuid No Legacy. Se consolida en Fase 2.
Rango de facturación anual
revenueRange
enum No 3 El FD maneja `annual_revenue_by_year` (jsonb) fuera del schema Prisma. Este campo es el rango consolidado.
Año del rango de facturación
revenueYear
number No Año asociado al rango. Opcional.
Nivel BRL (Business Readiness Level)
brlLevel
string No 3.5
Nivel TRL (Technology Readiness Level)
trlLevel
string No 3.5 Solo aplica si isTechBased === true.
Acerca de la compañía
aboutCompany
text No Descripción libre larga mostrada en el perfil. No cuenta en score actual (profileScore.ts no lo incluye); puede agregarse en Fase 2.
Industrias seleccionadas
industries
array<object> No 3 Many-to-many: cada fila tiene industryId/industryName/subIndustryId/subIndustryName. UI lo maneja como picker de industria+sub-industria.
Países de operación
operatingCountries
array<object> No 3 Cada fila tiene country+region. UI lo maneja como multi-select.

Panel 3 · Nivel de madurez · 2 campos · 15 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Nivel CRL (Commercial Readiness Level)
crlLevel
string No 7.5
Nivel TMRL (Team Maturity Readiness Level)
tmrlLevel
string No 7.5 En el UI actual aparece dentro del Panel 6 Equipo; lo asignamos al stepper 3 (Nivel de madurez) para alinear con el modelo de score.

Panel 4 · Tesis de inversión · 11 campos · 25 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Fuentes de inversión
investmentSources
array<string> No 2
Financiamiento actual
financing
string No Campo texto libre legacy. Superseded por `financing_sources`.
Fuentes de financiamiento (deuda)
financingSources
array<string> No 2
Ticket de inversión buscado
investmentTicket
string No 2
Propósito de la inversión
investmentPurpose
string No 2 En BD se guarda como string JSON serializado (ver registro-startup-detallado/+page.server.ts).
Inversiones previas
previousInvestments
string No 1.5 En BD se guarda como string JSON serializado.
Rondas de inversión previas
previousRounds
string No 1.5 En BD se guarda como string JSON serializado.
Capital total levantado
totalCapitalRaised
string No 2
Pitch deck
pitchDeckUrl
url No 10 Binario en score: 10 pts si tiene pitch deck, 0 si no (replicando profileScore.ts pC_score).
Consentimiento para compartir pitch deck
pitchDeckConsent
boolean DEFAULT false. No cuenta para score (es un flag de consentimiento, no contenido).
Necesidades del modelo de negocio
businessNeeds
array<object> No 2 En profileScore.ts pA_core vale 10 pts compartidos con investmentSources/ticket/purpose; acá lo repartimos entre los 5 campos del subpanel A.

Panel 5 · Modelo de Negocio · 8 campos · 15 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
High concept pitch
highConceptPitch
text No 2.5
Perfil de cliente ideal (ICP)
icp
text No 2.5
Perfil de cliente ideal (legacy)
idealClientProfile
text No Duplicado con `icp`. Mantener por retrocompatibilidad; consolidar en Fase 2.
Problema que resuelve
problemStatement
text No 2.5
Problema a resolver (legacy)
problemToSolve
text No Duplicado con `problem_statement`. Mantener por retrocompatibilidad.
Solución propuesta
solution
text No 2.5
Modelo de negocio (legacy)
businessModel
text No Superseded por `business_model_description`. Mantener por retrocompatibilidad.
Descripción del modelo de negocio
businessModelDescription
text No 5

Panel 6 · Equipo · 13 campos · 15 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Tamaño del equipo
teamSize
number No profileScore.ts no cuenta teamSize (usa teamComposition). Mantener por retrocompatibilidad.
Composición del equipo
teamComposition
string No 0.75 En BD se guarda como string JSON serializado (array de objetos con rol/cantidad).
Consentimiento del equipo
teamConsent
boolean 0.75 DEFAULT false. Flag de consentimiento; en profileScore.ts SI cuenta al score (pTeamA).
Equipo verificado
teamVerified
boolean Flag operativo (admin). DEFAULT false.
Nombre del CEO
ceoFirstName
string No 0.3
Apellido del CEO
ceoLastName
string No 0.3
Género del CEO
ceoGender
string No 0.3
LinkedIn del CEO
ceoLinkedIn
url No 0.3
Email del CEO
ceoEmail
email No 0.3
Teléfono del CEO
ceoPhone
phone No Dato privado, no cuenta para score (no es señal de "perfil completo" visible).
¿El CEO es fundador?
ceoIsFounder
boolean No
Consentimiento de contacto del CEO
ceoContactConsent
boolean DEFAULT false. Flag de consentimiento.
Fundadores y equipo directivo
founders
array<object> No 12 Hasta N fundadores. profileScore.ts asigna 12 pts a miembros adicionales al CEO (el CEO ya se cuenta en ceo* scalar fields).

Panel 7 · Presencia digital · 9 campos · 5 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Sitio web
website
url No 0.7
LinkedIn
linkedIn
url No 0.7
Instagram
instagram
url No 0.7
Facebook
facebook
url No 0.7
Twitter / X
twitter
url No 0.2 En el FS actual `twitter` espejo de `tiktok` por retrocompatibilidad (ver registro-startup/+page.server.ts).
YouTube
youtube
url No 0.5
TikTok
tiktok
url No 0.5
Logo
logoUrl
url No 1
Redes sociales (extendido)
socialMedia
array<object> No Tabla extendida platform/url. Duplicada con columnas escalares linkedin/instagram/facebook/twitter/youtube/tiktok en Startup — consolidar en Fase 2. Peso cubierto en las columnas escalares.

Campos sin panel (sistema / auxiliares) · 2 campos · 0 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Usuario registrante
registeredById
uuid FK a profiles.id. Se setea server-side desde la sesión auth; no se muestra al usuario.
Estado del registro
status
enum Gestionado por admins. DEFAULT DRAFT en BD.

ICG (Inversionista · Corporativo · Gestor)

67 campos totales · Suma de pesos de score: 100 pts

Panel 1 · Datos básicos · 17 campos · 10 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Tipo de ICG (enum)
icgType
enum Derivado de icgRoleCategory via categoryToIcgType (ver registro-icg/+page.server.ts). No cuenta al score (es computado).
Rol en el ecosistema
icgRole
string No 1.5
Categoría del rol
icgRoleCategory
string No En profileScore ICG aparece como fallback de icgRole (p1Raw[0] = icgRole ?? icgRoleCategory). El peso lo lleva icgRole.
Nombre de la organización
organizationName
string 1 Obligatorio salvo para Inversionista Individual (donde se derivará de investorFirst+investorLast).
Nombre del inversionista
investorFirstName
string No 0.5 Solo aplica cuando icgRoleCategory === "Inversionista Individual".
Apellido del inversionista
investorLastName
string No 0.5 Solo aplica cuando icgRoleCategory === "Inversionista Individual".
Presentación / acerca del ICG
presentation
text No 1.5
País de origen
country
string 1.5
Ciudad
city
string NOT NULL en BD pero el submit actualmente inserta "" (string vacío). No cuenta al score.
Países de operación
operatingCountries
array<string> No 1.5 DEFAULT []. La tabla auxiliar IcgOperatingCountry duplica este dato con region — consolidar en Fase 2.
Industrias de interés (Panel 1)
interestIndustries
array<string> No 2 DEFAULT []. En BD se guardan como array de strings JSON-serializados (ver submit action). Duplicado semánticamente con IcgIndustry.
Correo corporativo / de contacto
contactEmail
email NOT NULL. Obligatorio para registro, no cuenta al score (siempre lleno).
Consentimiento de email
emailConsent
boolean DEFAULT false. Flag de consentimiento.
Términos y condiciones aceptados
termsAccepted
boolean DEFAULT false. Requerido al crear la cuenta.
Política de privacidad aceptada
privacyAccepted
boolean DEFAULT false. Requerido al crear la cuenta.
Industrias ICG (tabla aux many-to-many)
icgIndustries
array<object> No Duplicada con Icg.interest_industries (scalar array). Mantener peso en interest_industries (columna principal). Consolidar en Fase 2.
Países de operación ICG (tabla aux)
icgOperatingCountries
array<object> No Duplicada con Icg.operating_countries. Consolidar en Fase 2.

Panel 2 · Datos de contacto · 7 campos · 10 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Teléfono de contacto
contactPhone
phone No 1.5 Asignado al Panel 2 (Datos de contacto) aunque el schema legacy lo tenía suelto en el root; el formulario actual solo lo pide una vez dentro del panel de contacto.
Nombre del contacto
contactFirstName
string No 2
Apellido del contacto
contactLastName
string No 2
Posición / cargo del contacto
contactPosition
string No 1.5
Correo personal del contacto
contactPersonalEmail
email No 1.5 profileScore ICG cuenta contactEmail en P2; acá usamos el personal_email como el "email del contacto" distinto del corporativo.
LinkedIn del contacto
contactLinkedIn
url No 1.5
Usuario vinculado al contacto
contactUserId
uuid No FK resuelta server-side cuando contactPersonalEmail matchea (o se crea) un Profile.

Panel 3 · Propuesta de valor / Tesis · 9 campos · 30 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Propuesta de valor
valuePropositionP4
jsonb No 10 DEFAULT "[]". Array de objetos { categoryId, subcategoryId, label }. El campo p3 pesa más porque define condicionalmente qué otros campos de P3 aparecen.
Fuentes de inversión (P3)
investmentSourcesP4
array<string> No 5 DEFAULT []. Visible condicionalmente según valuePropositionP4.
Rondas de inversión de interés
investmentRounds
array<string> No 5 DEFAULT []. Visible condicionalmente.
Fuentes de financiamiento por deuda
debtFinancingSources
array<string> No 2.5 DEFAULT []. Visible solo si valuePropositionP4 incluye "financiamiento-deuda".
Valor del ticket
ticketValue
array<string> No 5 DEFAULT []. Visible condicionalmente.
¿Tiene convocatoria activa?
hasActiveCall
boolean 2.5 DEFAULT false.
Fecha de cierre de la convocatoria
callClosingDate
date No Solo si hasActiveCall=true y isPermanentCall=false. No cuenta para score.
¿Convocatoria permanente?
isPermanentCall
boolean DEFAULT false. Subordinado a hasActiveCall.
Procesos activos (legacy)
activeProcesses
text No Legacy. No usado en formulario actual.

Panel 4 · Empresas de interés · 9 campos · 30 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Tipos de empresa de interés
selectedCompanyTypes
array<string> No 5 DEFAULT []. Controla visibilidad de trlLevels/crlLevels (solo Startup/Scaleup).
Industrias de interés (P4)
interestIndustriesP3
array<string> No 5 DEFAULT []. Array de subName strings. Duplica semánticamente interestIndustries/icgIndustries; consolidar en Fase 2.
Niveles BRL de interés
brlLevels
array<string> No 4 DEFAULT [].
Niveles TRL de interés
trlLevels
array<string> No 4 DEFAULT []. Solo aplica para Startup/Scaleup.
Niveles CRL de interés
crlLevels
array<string> No 4 DEFAULT []. Solo aplica para Startup/Scaleup.
Rangos de facturación de interés
revenueRange
array<string> No 3 DEFAULT []. Columna BD es `revenue_range_icg` (el sufijo _icg evita colisión con Startup.revenue_range).
Composición de equipo de interés
teamCompositionP3
array<string> No 3 DEFAULT [].
Constitución legal requerida
legalConstitution
string No 1
Países de domicilio fiscal aceptados
fiscalCountries
array<string> No 1 DEFAULT [].

Panel 5 · Necesidades estratégicas · 4 campos · 15 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Necesidades estratégicas
strategicNeedsP5
jsonb No 8 DEFAULT "[]". Array de objetos { categoryId, subcategoryId, label }.
Aliado ideal
idealAllyP5
jsonb No 6 DEFAULT "[]". Array de objetos { label, ... }.
Otra necesidad estratégica (texto libre)
otherStrategicNeed
string No 1 Solo aparece si strategicNeedsP5 incluye subcategoryId === "otra". Máx 100 chars.
Necesidades estratégicas (tabla aux)
strategicNeedsAux
array<object> No 'Tabla auxiliar con categoría/subcategoría. Legacy respecto de strategic_needs_p5 (jsonb). Consolidar en Fase 2. Enum StrategicNeedCategory: ' + ENUM_STRATEGIC_NEED_CATEGORY.join('|')

Panel 6 · Presencia digital · 8 campos · 5 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Sitio web
website
url No 1
LinkedIn
linkedIn
url No 0.7
Instagram
instagram
url No 0.5
Facebook
facebook
url No 0.5
Twitter / X
twitter
url No 0.3
TikTok
tiktok
url No 0.5
YouTube
youtube
url No 0.5
Logo
logoUrl
url No 1

Campos sin panel (sistema / legacy / auxiliares) · 13 campos · 0 pts

Campo Tipo Obligatorio Form. simplif. Form. detallado Perfil Peso Nota
Usuario registrante
registeredById
uuid FK a profiles.id. Se setea server-side desde la sesión auth.
Estado del registro
status
enum Gestionado por admins. DEFAULT DRAFT.
Perfil público
isPublic
boolean DEFAULT true. Flag de visibilidad en directorio público.
Industria principal (legacy)
industryId
uuid No Legacy. Superseded por IcgIndustry (many-to-many) y por interest_industries.
Sub-industria principal (legacy)
subIndustryId
uuid No Legacy.
Propuesta de valor (legacy text)
valuePropositionLegacy
text No Legacy. Superseded por valuePropositionP4 (jsonb). Mantener por retrocompatibilidad.
Aliado ideal (legacy text)
idealAllyLegacy
text No Legacy. Superseded por idealAllyP5 (jsonb).
Fuentes de inversión (legacy)
investmentSourcesLegacy
array<string> No Legacy. Superseded por investmentSourcesP4. DEFAULT [].
Financiamiento (legacy)
financing
string No Legacy text. No usado en formulario actual.
Ticket de inversión (legacy)
investmentTicketLegacy
string No Legacy. Superseded por ticketValue (array).
Rondas previas (legacy)
previousRoundsLegacy
string No Legacy. Superseded por investmentRounds.
Tamaño del equipo ICG (legacy)
teamSize
number No Legacy. No usado en formulario actual.
Composición del equipo ICG (legacy)
teamComposition
string No Legacy. No usado en formulario actual (teamCompositionP3 es el canónico).

Cómo revisar este inventario

Frank, esta es la oportunidad de corregir errores antes de que se vuelvan deuda. Te pido revisar con estos 5 lentes:

Formato de respuesta: comenta por Slack lo que encuentres — no necesitas tocar GitHub. Con tus notas vamos a armar los ajustes antes de arrancar Fase 2 (migrar consumidores).