Docs

Modelo de Datos

Documentación técnica del schema de base de datos de Nvito, incluyendo diagramas ER, enums, índices, politicas RLS y seed data.

PublicadoMarzo 2026Equipo de desarrollo, arquitectos, stakeholders

1. Resumen del Schema

AspectoDetalle
ORMPrisma 5.22
Base de datosPostgreSQL (adaptador nativo + linux-musl-openssl)
Total de modelos51 modelos
Total de enums37 enums
ArquitecturaMulti-tenant con organizationId en la mayoria de modelos
IDsUUID v4 (@default(uuid()) @db.Uuid)
TimestampscreatedAt, updatedAt, deletedAt (soft delete)
Campos JSONsettings, preferences, config, metadata, theme, schema
Mapeo de tablasSnake_case en BD (@@map), camelCase en Prisma

Estrategia Multi-Tenant

La plataforma utiliza un modelo multi-tenant a nivel de fila (Row-Level). Cada Organization representa un tenant aislado. Los modelos principales incluyen un campo organizationId que vincula los datos a su organización correspondiente. Los índices compuestos sobre [organizationId, ...] garantizan consultas eficientes por tenant.

Modelos Agrupados por Dominio

DominioModelosCantidad
Core / AuthOrganization, User, UserRole, PreRegistration, EventCollaboratorInvitation5
EventosEvent, EventType, EventServiceConfig, ServicePackage, EventContract, EventAccessCode, Client7
InvitacionesInvitation, Section, InvitationVersión, InvitationApproval, Template5
Invitados / RSVPGuest, GuestGroup, GuestAccessToken, GuestMessage, RSVP, QRPass, TableAssignment, EventTable8
ComunicacionesNotification, CommunicationCampaign, CommunicationMessage3
Media / MúsicaMedia, Music, AudioGuestbook, BackgroundMusic, BackgroundMusicTrack5
FeaturesLocation, ItineraryItem, GiftRegistry, GiftRegistryItem, GiftBankAccount, Accommodation, AccommodationHotel, AccommodationTransportOption, CustomDomain9
AnalyticsInvitationAnalyticsEvent, InvitationAnalyticsSummary2
IAAIGeneration, AIUsage, AIQuota3
PagosPayment, PaymentLink2
MovilMobileSession1
AuditoriaAuditLog1

2. Diagrama ER - Entidades Core

Relaciones fundamentales entre Organization, User, Event e Invitation.


3. Diagrama ER - Entidades de Invitaciones

El módulo de invitaciones digitales con versionamiento, aprobaciones, secciones, templates y analytics.


4. Diagrama ER - Entidades de Comunicaciones

Sistema de notificaciones individuales y campanas de comunicación masiva.


5. Diagrama ER - Entidades de Features

Funcionalidades adicionales: ubicaciones, itinerario, QR passes, mesa de regalos, hospedaje, media, mesas y más.


6. Enums Principales

6.1 Estado del Evento - EventStatus

ValorDescripción
DRAFTEvento en borrador, aun no publicado
ACTIVEEvento activo y visible para invitados
CANCELLEDEvento cancelado (requiere razon de cancelación)
COMPLETEDEvento finalizado

Estado visual derivado: EXPIRED (Expirado) — No es un valor del enum. Se calcula en el frontend cuando el evento está en COMPLETED pero nunca tuvo invitación publicada (activatedAt === null). Indica que la fecha paso sin completar la preparación.

6.2 Estado de la Invitación - InvitationStatus

ValorDescripción
IN_CONSTRUCTIONInvitación en proceso de diseño/construcción
UNPUBLISHEDInvitación lista pero no publicada
PUBLISHEDInvitación publicada y accesible por URL
CLOSEDInvitación cerrada (ya no acepta RSVPs)

6.3 Origen de la Invitación - InvitationSource

ValorDescripción
INTERNALInvitación creada con el motor de templates y IA de Nvito (default)
EXTERNALHTML disenado fuera de Nvito y cargado manualmente

6.4 Estado del RSVP - RSVPStatus

ValorDescripción
PENDINGConfirmación pendiente de respuesta
CONFIRMEDInvitado confirmo asistencia
DECLINEDInvitado declino la invitación
MAYBEInvitado aun no está seguro

6.5 Estado del Invitado - GuestStatus

ValorDescripción
PENDINGInvitado registrado, sin respuesta
CONFIRMEDInvitado confirmo asistencia via RSVP
DECLINEDInvitado declino la invitación
ATTENDEDInvitado asistio al evento (verificado por QR/check-in)

6.6 Roles del Sistema - RoleType

ValorDescripción
SUPER_ADMINAdministrador global de la plataforma Nvito
PLATFORM_ADMINAdministrador de plataforma. Lectura cross-org, escritura en orgs asignadas
ORGANIZATION_OWNERPropietario de la organización (tenant)
ORGANIZATION_ADMINAdministrador de la organización
EVENT_MANAGERGestor completo del evento
EVENT_EDITOREditor del evento (puede modificar contenido)
EVENT_COLLABORATORColaborador con acceso limitado al evento
EVENT_VIEWERSolo lectura del evento

Nota: SUPER_ADMIN y PLATFORM_ADMIN son mutuamente excluyentes -- un usuario no puede tener ambos roles simultaneamente.

6.7 Scope del Rol - RoleScope

ValorDescripción
GLOBALAplica a toda la plataforma (Super Admin, Platform Admin)
ORGANIZATIONAplica a nivel de organización
EVENTAplica a un evento específico

6.8 Plan de Suscripcion - SubscriptionPlan

ValorDescripción
FREEPlan gratuito con funcionalidades básicas
ESSENTIALPlan esencial para eventos individuales
PLUSPlan plus con herramientas avanzadas
VIPPlan VIP con todas las funcionalidades
ENTERPRISEPlan empresarial con soporte prioritario

6.9 Tipo de Media - MediaType

ValorDescripción
IMAGEImagen (JPG, PNG, WebP)
VIDEOVideo (MP4, WebM)
AUDIOAudio (MP3, WAV, OGG)

6.10 Categoría de Media - MediaCategory

ValorDescripción
GALLERYImagen de galería del evento
HEROImagen principal / hero de la invitación
OG_IMAGEImagen para meta tags Open Graph (SEO)
AUDIO_GUESTBOOKAudio del libro de visitas
LOGOLogo de la organización
AVATARAvatar del usuario
COVERImagen de portada del evento

6.11 Restricciones Dieteticas - DietaryRestriction

ValorDescripción
VEGETARIANDieta vegetariana
VEGANDieta vegana
GLUTEN_FREESin gluten (celiaco)
HALALComida halal
KOSHERComida kosher
NUT_FREESin frutos secos
DAIRY_FREESin lacteos
OTHEROtra restriccion (detalle en notas)

6.12 Tipos de Servicio de Evento - EventServiceType

Los 18 servicios que pueden habilitarse por evento:

ValorDescripción
INVITATIONInvitación digital
LOCATIONSUbicaciones del evento
GUEST_LISTLista de invitados
RSVPConfirmación de asistencia
GUEST_GROUPSGrupos de invitados
ITINERARYPrograma / itinerario del evento
TABLESAsignación de mesas
QR_PASSESPases QR de entrada
CHECK_INCheck-in en el evento
GALLERYGalería de fotos
AUDIO_GUESTBOOKLibro de visitas con audio
GUEST_UPLOADSSubida de fotos por invitados
CUSTOM_DOMAINDominio personalizado
BACKGROUND_MUSICMúsica de fondo en la invitación
GIFT_REGISTRYMesa de regalos
ACCOMMODATIONInformación de hospedaje
SPONSORSPatrocinadores del evento
PRAYERSección de oración/bendicion
THANK_YOUSección de agradecimiento
DRESS_CODECódigo de vestimenta

6.13 Estado de Notificación - NotificationStatus

ValorDescripción
PENDINGNotificación en cola de envio
SENTEnviada al proveedor (Resend)
DELIVEREDEntregada al destinatario
FAILEDFallo en el envio
BOUNCEDRebotada (email invalido)

6.14 Tipo de Cliente - ClientType

ValorDescripción
INDIVIDUALPersona fisica que contrata un evento
COMPANYPersona moral / empresa

6.15 Estado del Cliente - ClientStatus

ValorDescripción
PROSPECTCliente potencial, en etapa de cotizacion
ACTIVECliente con evento(s) activo(s) en curso
COMPLETEDTodos los eventos del cliente finalizaron
INACTIVECliente inactivo o dado de baja

6.16 Fuente de Adquisicion - AcquisitionSource

ValorDescripción
SOCIAL_MEDIACaptado via redes sociales (Instagram, Facebook, etc)
REFERRALReferido por otro cliente
GOOGLEBúsqueda en Google / SEO / Google Ads
WEBSITEVisita directa al sitio web de Nvito
DIRECTContacto directo (evento presencial, networking)
OTHEROtra fuente (detalle en acquisitionDetail)

6.17 Otros Enums

EnumValores
GiftRegistryTypeAMAZON, LIVERPOOL, PALACIO_HIERRO, SANBORNS, COPPEL, SEARS, OTHER
MusicSourceTypeSPOTIFY, YOUTUBE, FILE, SPOTIFY_PLAYLIST, APPLE_MUSIC_PLAYLIST, YOUTUBE_PLAYLIST
TableShapeROUND, SQUARE, RECTANGLE, OVAL
LocationTypeVENUE, CEREMONY, RECEPTION, PARKING, OTHER
RsvpTypeREQUIRED, OPTIONAL, CLOSED
InvitationAnalyticsEventTypeVIEW, RSVP_OPEN, RSVP_SUBMIT, LINK_CLICK, SHARE, DOWNLOAD
PreRegistrationStatusPENDING, REGISTERED, ACTIVATED, EXPIRED, CANCELLED
CommunicationCampaignStatusDRAFT, SENDING, COMPLETED, FAILED
CommunicationMessageStatusPENDING, SENT, DELIVERED, FAILED, OPENED, BOUNCED
CollaboratorInvitationStatusPENDING, ACCEPTED, DECLINED, EXPIRED, CANCELLED
TemplateStatusDRAFT, ACTIVE, INACTIVE
NotificationChannelEMAIL, WHATSAPP, BOTH
PaymentMethodTRANSFER, CARD, CASH, OTHER
PaymentStatusPENDING, PARTIAL, PAID, REFUNDED, CANCELLED
PaymentTypeSERVICE_PAYMENT, CASH_FUND_CONTRIBUTION
StripePaymentStatusPENDING, PROCESSING, SUCCEEDED, FAILED, REFUNDED, CANCELLED
PaymentLinkStatusACTIVE, USED, EXPIRED, CANCELLED
AdjustmentTypeNONE, DISCOUNT, COURTESY, SURCHARGE
AIGenerationStatusPENDING, COMPLETED, FAILED
QRPassTypeENTRY, EXIT, VIP
MobileRoleHOST, GUEST
ClientTypeINDIVIDUAL, COMPANY
ClientStatusPROSPECT, ACTIVE, COMPLETED, INACTIVE
AcquisitionSourceSOCIAL_MEDIA, REFERRAL, GOOGLE, WEBSITE, DIRECT, OTHER
InvitationSourceINTERNAL, EXTERNAL

7. Indices y Politicas

7.1 Indices Principales

Los índices estan disenados para optimizar las consultas más frecuentes del sistema multi-tenant.

Indices por Tenant (Organization)

TablaIndiceProposito
organizations(clerk_org_id)Lookup por Clerk ID en autenticación
organizations(slug)Búsqueda por slug único
organizations(plan)Filtro por plan de suscripcion
events(organization_id)Eventos por organización
events(organization_id, date DESC)Eventos por organización ordenados por fecha
notifications(organization_id, status, created_at DESC)Notificaciones por org con filtro de estado

Indices de Clientes

TablaIndiceProposito
clients(organization_id)Clientes por organización
clients(status)Filtro por estado del cliente
clients(type)Filtro por tipo (individual/empresa)
clients(assigned_to_id)Clientes por responsable asignado
clients(organization_id, status)Clientes por org filtrados por estado

Indices de Usuarios y Roles

TablaIndiceProposito
users(clerk_user_id)Lookup rápido en autenticación
users(email)Búsqueda por email
users(is_super_admin)Filtro de super admins
users(is_platform_admin)Filtro de platform admins
user_roles(user_id)Roles de un usuario
user_roles(role)Usuarios por tipo de rol
user_roles(organization_id)Roles por organización
user_roles(event_id)Roles por evento

Indices de Eventos e Invitaciones

TablaIndiceProposito
events(event_type_id)Eventos por tipo
events(status)Filtro por estado del evento
events(date)Ordenamiento por fecha
invitations(event_id)Invitaciones de un evento
invitations(status)Filtro por estado de invitación
invitations(slug) (idx_invitations_slug)Lookup público por slug
sections(invitation_id, order)Secciones ordenadas de una invitación

Indices de Invitados y RSVP

TablaIndiceProposito
guests(event_id)Invitados de un evento
guests(event_id, status)Invitados filtrados por estado
guests(event_id, deleted_at)Invitados activos (soft delete)
guests(email)Búsqueda por email
rsvps(invitation_id)RSVPs de una invitación
rsvps(invitation_id, status)RSVPs filtrados por estado
rsvps(deleted_at)RSVPs activos (soft delete)

Indices de Analytics

TablaIndiceProposito
invitation_analytics_events(invitation_id, created_at)Eventos de analytics por invitación
invitation_analytics_events(event_type)Filtro por tipo de evento analytics

7.2 Constraints Unicos

TablaConstraintDescripción
organizationsslug UNIQUESlug único por organización
organizationsclerk_org_id UNIQUEUn Clerk org por organización
usersclerk_user_id UNIQUEUn Clerk user por usuario
usersemail UNIQUEEmail único global
events(slug, organization_id) UNIQUESlug único por organización
invitationsslug UNIQUESlug único global para URLs públicas
guests(email, event_id) UNIQUEUn invitado por email por evento
rsvps(guest_id, invitation_id) UNIQUEUn RSVP por invitado por invitación
user_roles(userId, role, scope, organizationId, eventId) UNIQUESin roles duplicados
invitation_versións(invitation_id, versión_number) UNIQUENumero de versión único por invitación
qr_passescode UNIQUECódigo QR único global
table_assignmentsguest_id UNIQUEUn invitado en una sola mesa
custom_domainsdomain UNIQUEDominio personalizado único global
pre_registrations(email, organization_id) UNIQUEUn pre-registro por email por organización
templatesslug UNIQUESlug único global por template
service_packagesslug UNIQUESlug único global por paquete
clients(email, organization_id) UNIQUEUn cliente por email por organización

7.3 Relaciones con Cascade Delete

Las siguientes relaciones tienen onDelete: Cascade, lo que significa que al eliminar el padre se eliminan los hijos automáticamente:

  • Event -> Invitation, Guest, GuestGroup, Location, ItineraryItem, QRPass, Media, EventTable, AudioGuestbook, Accommodation, GiftRegistry, BackgroundMusic, CustomDomain, EventServiceConfig, EventContract, CommunicationCampaign
  • Invitation -> Section, InvitationVersión, InvitationApproval, Music, RSVP, InvitationAnalyticsEvent, InvitationAnalyticsSummary, AIGeneration
  • Guest -> RSVP, QRPass, TableAssignment
  • GiftRegistry -> GiftRegistryItem, GiftBankAccount
  • Accommodation -> AccommodationHotel, AccommodationTransportOption
  • BackgroundMusic -> BackgroundMusicTrack
  • CommunicationCampaign -> CommunicationMessage
  • UserRole -> (cascade desde User, Organization, Event)

7.4 Soft Delete

Los siguientes modelos implementan soft delete con el campo deletedAt:

  • Organization
  • User
  • Event
  • Guest
  • RSVP
  • Media
  • InvitationVersión
  • TableAssignment
  • Template
  • Client

8. Seed Data

El archivo seed.ts es idempotente (puede ejecutarse múltiples veces sin duplicar datos). Utiliza upsert para crear o actualizar registros existentes.

8.1 Super Admin

CampoValor
Emaildeveloper.pezfred@gmail.com
Clerk User IDuser_395ntlOdgiElz480VOcKNaYfeXj
NombreAlfredo Admin
isSuperAdmintrue
Rol asignadoSUPER_ADMIN con scope GLOBAL
Preferencestimezone: America/Mexico_City, language: es, notifications: email + push

8.2 Tipos de Evento (9)

#SlugNombreIconoSecciones Default
1weddingBodaringHero, Couple, Itinerary, Location, RSVP, GiftRegistry, Gallery
2xv-anosXV AñoscrownHero, Quinceañera, Itinerary, Location, RSVP, Gallery
3baptismBautizochurchHero, Details, Location, RSVP, Gallery
4birthdayCumpleañoscakeHero, Details, Location, RSVP, Gallery
5first-communionPrimera ComunióncrossHero, Details, Location, RSVP, Gallery
6baby-showerBaby ShowerbottleHero, Details, Location, RSVP, GiftRegistry
7graduationGraduacióncapHero, Details, Location, RSVP, Gallery
8corporateEvento CorporativobldgHero, Details, Itinerary, Location, RSVP
9otherOtropartyHero, Details, Location, RSVP

8.3 Paquetes de Servicios (5)

#SlugNombrePrecio (MXN)RecomendadoServicios Incluidos
1essentialEssential$1,499NoINVITATION, GUEST_LIST, RSVP, LOCATIONS
2plusPlus$2,999SiEssential + ITINERARY, GUEST_GROUPS, TABLES, QR_PASSES
3vipVIP$4,999NoPlus + CHECK_IN, GALLERY, AUDIO_GUESTBOOK, GUEST_UPLOADS
4eliteElite$9,999NoTodos los servicios del VIP (para múltiples eventos)
5personalizadoPersonalizado$0NoSin servicios predefinidos (seleccion a medida)

8.4 Templates de Invitación (16)

#SlugNombreTipo EventoFeaturedFuentes
1wedding-classicBoda Clasica RomanticaweddingSiPlayfair Display / Lato
2wedding-gardenBoda Jardin BotanicoweddingSiCormorant Garamond / Nunito
3wedding-modernBoda Moderna MinimalistaweddingSiRaleway / DM Sans
4xv-princessXV Años Princesa GlamorosaxvSiCormorant Garamond / Montserrat
5xv-modernXV Años Moderna ElegantexvNoPoppins / DM Sans
6birthday-festiveCumpleaños Festivo VibrantebirthdaySiQuicksand / Nunito
7birthday-elegantCumpleaños ElegantebirthdayNoCormorant Garamond / Inter
8baptism-celestialBautizo Celestial PastelbaptismSiCormorant Infant / Nunito
9baptism-goldenBautizo Clasico DoradobaptismNoPlayfair Display / Lato
10communion-serenePrimera Comunión EspiritualcommunionSiCormorant Garamond / Source Sans Pro
11babyshower-sweetBaby Shower Dulce y TiernobabyshowerSiQuicksand / Nunito
12babyshower-modernBaby Shower Moderno NeutralbabyshowerNoPoppins / DM Sans
13graduation-classicGraduación Academica ClasicagraduationSiMerriweather / Open Sans
14graduation-boldGraduación Moderna BoldgraduationNoPoppins / Inter
15corporate-cleanCorporativo ProfesionalcorporateSiInter / DM Sans
16other-versatileVersatil UniversalotherNoDM Sans / Inter

Distribucion de Templates por Tipo de Evento

Tipo de EventoCantidadTemplates
Boda (wedding)3Classic, Garden, Modern
XV Años (xv)2Princess, Modern
Cumpleaños2Festive, Elegant
Bautizo2Celestial, Golden
Primera Comunión1Serene
Baby Shower2Sweet, Modern
Graduación2Classic, Bold
Corporativo1Clean
Otro1Versatile

Secciones Comunes en Templates de Boda

Los templates de boda incluyen 14 secciones con variantes configurables:

  1. hero - Encabezado principal con imagen
  2. welcome - Mensaje de bienvenida
  3. event_details - Detalles del evento
  4. countdown - Cuenta regresiva
  5. story - Historia de la pareja (timeline vertical)
  6. gallery - Galería de fotos
  7. itinerary - Programa del evento
  8. location - Ubicación con mapa
  9. registry - Mesa de regalos
  10. accommodation - Hospedaje
  11. faq - Preguntas frecuentes
  12. rsvp - Formulario de confirmación
  13. music - Reproductor de música
  14. footer - Pie de página

Notas Adicionales

Campos JSON Importantes

ModeloCampoEstructura
Organizationsettings{ timezone, language, dateFormat, features: { aiEnabled } }
Organizationlimits{ maxEvents, maxGuestsPerEvent, maxStorage, maxAIGenerations }
Userpreferences{ timezone, language, notifications: { email, push } }
Eventsettings{ allowPlusOnes, requireDietaryInfo, theme, primaryColor }
InvitationschemaEstructura completa de secciones y componentes de la invitación
Invitationtheme{ colors, fonts, spacing } - Tema visual de la invitación
SectionconfigConfiguración específica según el tipo de sección
Templateconfig{ colors, fonts, sections[] con variantes, animaciones }
TemplatesampleDataDatos de ejemplo para preview/demo del template
RSVPdietaryInfo{ vegetarian: 1, vegan: 0, allergies: ["nuts"] }
AuditLogchangesRegistro de cambios anteriores y nuevos valores

Proveedores Externos

ServicioProveedorCampo de referencia
AutenticaciónClerkclerkUserId, clerkOrgId
EmailResendprovider, providerId
AlmacenamientoAWS S3htmlUrl, cssUrl, jsUrl, url
MapasGoogle MapsplaceId, googleMapsUrl
IAVariosprovider, model en AIGeneration
Esta pagina fue util?