Modelo de Datos
Documentacion tecnica del schema de base de datos de Nvito. Ultima actualizacion: Marzo 2026
1. Resumen del Schema
| Aspecto | Detalle |
|---|---|
| ORM | Prisma 5.22 |
| Base de datos | PostgreSQL (adaptador nativo + linux-musl-openssl) |
| Total de modelos | 51 modelos |
| Total de enums | 37 enums |
| Arquitectura | Multi-tenant con organizationId en la mayoria de modelos |
| IDs | UUID v4 (@default(uuid()) @db.Uuid) |
| Timestamps | createdAt, updatedAt, deletedAt (soft delete) |
| Campos JSON | settings, preferences, config, metadata, theme, schema |
| Mapeo de tablas | Snake_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 organizacion correspondiente. Los indices compuestos sobre [organizationId, ...] garantizan consultas eficientes por tenant.
Modelos Agrupados por Dominio
| Dominio | Modelos | Cantidad |
|---|---|---|
| Core / Auth | Organization, User, UserRole, PreRegistration, EventCollaboratorInvitation | 5 |
| Eventos | Event, EventType, EventServiceConfig, ServicePackage, EventContract, EventAccessCode, Client | 7 |
| Invitaciones | Invitation, Section, InvitationVersion, InvitationApproval, Template | 5 |
| Invitados / RSVP | Guest, GuestGroup, GuestAccessToken, GuestMessage, RSVP, QRPass, TableAssignment, EventTable | 8 |
| Comunicaciones | Notification, CommunicationCampaign, CommunicationMessage | 3 |
| Media / Musica | Media, Music, AudioGuestbook, BackgroundMusic, BackgroundMusicTrack | 5 |
| Features | Location, ItineraryItem, GiftRegistry, GiftRegistryItem, GiftBankAccount, Accommodation, AccommodationHotel, AccommodationTransportOption, CustomDomain | 9 |
| Analytics | InvitationAnalyticsEvent, InvitationAnalyticsSummary | 2 |
| IA | AIGeneration, AIUsage, AIQuota | 3 |
| Pagos | Payment, PaymentLink | 2 |
| Movil | MobileSession | 1 |
| Auditoria | AuditLog | 1 |
2. Diagrama ER - Entidades Core
Relaciones fundamentales entre Organization, User, Event e Invitation.
3. Diagrama ER - Entidades de Invitaciones
El modulo de invitaciones digitales con versionamiento, aprobaciones, secciones, templates y analytics.
4. Diagrama ER - Entidades de Comunicaciones
Sistema de notificaciones individuales y campanas de comunicacion masiva.
5. Diagrama ER - Entidades de Features
Funcionalidades adicionales: ubicaciones, itinerario, QR passes, mesa de regalos, hospedaje, media, mesas y mas.
6. Enums Principales
6.1 Estado del Evento - EventStatus
| Valor | Descripcion |
|---|---|
DRAFT | Evento en borrador, aun no publicado |
ACTIVE | Evento activo y visible para invitados |
CANCELLED | Evento cancelado (requiere razon de cancelacion) |
COMPLETED | Evento finalizado |
6.2 Estado de la Invitacion - InvitationStatus
| Valor | Descripcion |
|---|---|
IN_CONSTRUCTION | Invitacion en proceso de diseno/construccion |
UNPUBLISHED | Invitacion lista pero no publicada |
PUBLISHED | Invitacion publicada y accesible por URL |
CLOSED | Invitacion cerrada (ya no acepta RSVPs) |
6.3 Origen de la Invitacion - InvitationSource
| Valor | Descripcion |
|---|---|
INTERNAL | Invitacion creada con el motor de templates y IA de Nvito (default) |
EXTERNAL | HTML disenado fuera de Nvito y cargado manualmente |
6.4 Estado del RSVP - RSVPStatus
| Valor | Descripcion |
|---|---|
PENDING | Confirmacion pendiente de respuesta |
CONFIRMED | Invitado confirmo asistencia |
DECLINED | Invitado declino la invitacion |
MAYBE | Invitado aun no esta seguro |
6.5 Estado del Invitado - GuestStatus
| Valor | Descripcion |
|---|---|
PENDING | Invitado registrado, sin respuesta |
CONFIRMED | Invitado confirmo asistencia via RSVP |
DECLINED | Invitado declino la invitacion |
ATTENDED | Invitado asistio al evento (verificado por QR/check-in) |
6.6 Roles del Sistema - RoleType
| Valor | Descripcion |
|---|---|
SUPER_ADMIN | Administrador global de la plataforma Nvito |
PLATFORM_ADMIN | Administrador de plataforma. Lectura cross-org, escritura en orgs asignadas |
ORGANIZATION_OWNER | Propietario de la organizacion (tenant) |
ORGANIZATION_ADMIN | Administrador de la organizacion |
EVENT_MANAGER | Gestor completo del evento |
EVENT_EDITOR | Editor del evento (puede modificar contenido) |
EVENT_COLLABORATOR | Colaborador con acceso limitado al evento |
EVENT_VIEWER | Solo lectura del evento |
Nota:
SUPER_ADMINyPLATFORM_ADMINson mutuamente excluyentes -- un usuario no puede tener ambos roles simultaneamente.
6.7 Scope del Rol - RoleScope
| Valor | Descripcion |
|---|---|
GLOBAL | Aplica a toda la plataforma (Super Admin, Platform Admin) |
ORGANIZATION | Aplica a nivel de organizacion |
EVENT | Aplica a un evento especifico |
6.8 Plan de Suscripcion - SubscriptionPlan
| Valor | Descripcion |
|---|---|
FREE | Plan gratuito con funcionalidades basicas |
ESSENTIAL | Plan esencial para eventos individuales |
PLUS | Plan plus con herramientas avanzadas |
VIP | Plan VIP con todas las funcionalidades |
ENTERPRISE | Plan empresarial con soporte prioritario |
6.9 Tipo de Media - MediaType
| Valor | Descripcion |
|---|---|
IMAGE | Imagen (JPG, PNG, WebP) |
VIDEO | Video (MP4, WebM) |
AUDIO | Audio (MP3, WAV, OGG) |
6.10 Categoria de Media - MediaCategory
| Valor | Descripcion |
|---|---|
GALLERY | Imagen de galeria del evento |
HERO | Imagen principal / hero de la invitacion |
OG_IMAGE | Imagen para meta tags Open Graph (SEO) |
AUDIO_GUESTBOOK | Audio del libro de visitas |
LOGO | Logo de la organizacion |
AVATAR | Avatar del usuario |
COVER | Imagen de portada del evento |
6.11 Restricciones Dieteticas - DietaryRestriction
| Valor | Descripcion |
|---|---|
VEGETARIAN | Dieta vegetariana |
VEGAN | Dieta vegana |
GLUTEN_FREE | Sin gluten (celiaco) |
HALAL | Comida halal |
KOSHER | Comida kosher |
NUT_FREE | Sin frutos secos |
DAIRY_FREE | Sin lacteos |
OTHER | Otra restriccion (detalle en notas) |
6.12 Tipos de Servicio de Evento - EventServiceType
Los 18 servicios que pueden habilitarse por evento:
| Valor | Descripcion |
|---|---|
INVITATION | Invitacion digital |
LOCATIONS | Ubicaciones del evento |
GUEST_LIST | Lista de invitados |
RSVP | Confirmacion de asistencia |
GUEST_GROUPS | Grupos de invitados |
ITINERARY | Programa / itinerario del evento |
TABLES | Asignacion de mesas |
QR_PASSES | Pases QR de entrada |
CHECK_IN | Check-in en el evento |
GALLERY | Galeria de fotos |
AUDIO_GUESTBOOK | Libro de visitas con audio |
GUEST_UPLOADS | Subida de fotos por invitados |
CUSTOM_DOMAIN | Dominio personalizado |
BACKGROUND_MUSIC | Musica de fondo en la invitacion |
GIFT_REGISTRY | Mesa de regalos |
ACCOMMODATION | Informacion de hospedaje |
SPONSORS | Patrocinadores del evento |
PRAYER | Seccion de oracion/bendicion |
THANK_YOU | Seccion de agradecimiento |
DRESS_CODE | Codigo de vestimenta |
6.13 Estado de Notificacion - NotificationStatus
| Valor | Descripcion |
|---|---|
PENDING | Notificacion en cola de envio |
SENT | Enviada al proveedor (Resend) |
DELIVERED | Entregada al destinatario |
FAILED | Fallo en el envio |
BOUNCED | Rebotada (email invalido) |
6.14 Tipo de Cliente - ClientType
| Valor | Descripcion |
|---|---|
INDIVIDUAL | Persona fisica que contrata un evento |
COMPANY | Persona moral / empresa |
6.15 Estado del Cliente - ClientStatus
| Valor | Descripcion |
|---|---|
PROSPECT | Cliente potencial, en etapa de cotizacion |
ACTIVE | Cliente con evento(s) activo(s) en curso |
COMPLETED | Todos los eventos del cliente finalizaron |
INACTIVE | Cliente inactivo o dado de baja |
6.16 Fuente de Adquisicion - AcquisitionSource
| Valor | Descripcion |
|---|---|
SOCIAL_MEDIA | Captado via redes sociales (Instagram, Facebook, etc) |
REFERRAL | Referido por otro cliente |
GOOGLE | Busqueda en Google / SEO / Google Ads |
WEBSITE | Visita directa al sitio web de Nvito |
DIRECT | Contacto directo (evento presencial, networking) |
OTHER | Otra fuente (detalle en acquisitionDetail) |
6.17 Otros Enums
| Enum | Valores |
|---|---|
GiftRegistryType | AMAZON, LIVERPOOL, PALACIO_HIERRO, SANBORNS, COPPEL, SEARS, OTHER |
MusicSourceType | SPOTIFY, YOUTUBE, FILE, SPOTIFY_PLAYLIST, APPLE_MUSIC_PLAYLIST, YOUTUBE_PLAYLIST |
TableShape | ROUND, SQUARE, RECTANGLE, OVAL |
LocationType | VENUE, CEREMONY, RECEPTION, PARKING, OTHER |
RsvpType | REQUIRED, OPTIONAL, CLOSED |
InvitationAnalyticsEventType | VIEW, RSVP_OPEN, RSVP_SUBMIT, LINK_CLICK, SHARE, DOWNLOAD |
PreRegistrationStatus | PENDING, REGISTERED, ACTIVATED, EXPIRED, CANCELLED |
CommunicationCampaignStatus | DRAFT, SENDING, COMPLETED, FAILED |
CommunicationMessageStatus | PENDING, SENT, DELIVERED, FAILED, OPENED, BOUNCED |
CollaboratorInvitationStatus | PENDING, ACCEPTED, DECLINED, EXPIRED, CANCELLED |
TemplateStatus | DRAFT, ACTIVE, INACTIVE |
NotificationChannel | EMAIL, WHATSAPP, BOTH |
PaymentMethod | TRANSFER, CARD, CASH, OTHER |
PaymentStatus | PENDING, PARTIAL, PAID, REFUNDED, CANCELLED |
PaymentType | SERVICE_PAYMENT, CASH_FUND_CONTRIBUTION |
StripePaymentStatus | PENDING, PROCESSING, SUCCEEDED, FAILED, REFUNDED, CANCELLED |
PaymentLinkStatus | ACTIVE, USED, EXPIRED, CANCELLED |
AdjustmentType | NONE, DISCOUNT, COURTESY, SURCHARGE |
AIGenerationStatus | PENDING, COMPLETED, FAILED |
QRPassType | ENTRY, EXIT, VIP |
MobileRole | HOST, GUEST |
ClientType | INDIVIDUAL, COMPANY |
ClientStatus | PROSPECT, ACTIVE, COMPLETED, INACTIVE |
AcquisitionSource | SOCIAL_MEDIA, REFERRAL, GOOGLE, WEBSITE, DIRECT, OTHER |
InvitationSource | INTERNAL, EXTERNAL |
7. Indices y Politicas
7.1 Indices Principales
Los indices estan disenados para optimizar las consultas mas frecuentes del sistema multi-tenant.
Indices por Tenant (Organization)
| Tabla | Indice | Proposito |
|---|---|---|
organizations | (clerk_org_id) | Lookup por Clerk ID en autenticacion |
organizations | (slug) | Busqueda por slug unico |
organizations | (plan) | Filtro por plan de suscripcion |
events | (organization_id) | Eventos por organizacion |
events | (organization_id, date DESC) | Eventos por organizacion ordenados por fecha |
notifications | (organization_id, status, created_at DESC) | Notificaciones por org con filtro de estado |
Indices de Clientes
| Tabla | Indice | Proposito |
|---|---|---|
clients | (organization_id) | Clientes por organizacion |
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
| Tabla | Indice | Proposito |
|---|---|---|
users | (clerk_user_id) | Lookup rapido en autenticacion |
users | (email) | Busqueda 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 organizacion |
user_roles | (event_id) | Roles por evento |
Indices de Eventos e Invitaciones
| Tabla | Indice | Proposito |
|---|---|---|
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 invitacion |
invitations | (slug) (idx_invitations_slug) | Lookup publico por slug |
sections | (invitation_id, order) | Secciones ordenadas de una invitacion |
Indices de Invitados y RSVP
| Tabla | Indice | Proposito |
|---|---|---|
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) | Busqueda por email |
rsvps | (invitation_id) | RSVPs de una invitacion |
rsvps | (invitation_id, status) | RSVPs filtrados por estado |
rsvps | (deleted_at) | RSVPs activos (soft delete) |
Indices de Analytics
| Tabla | Indice | Proposito |
|---|---|---|
invitation_analytics_events | (invitation_id, created_at) | Eventos de analytics por invitacion |
invitation_analytics_events | (event_type) | Filtro por tipo de evento analytics |
7.2 Constraints Unicos
| Tabla | Constraint | Descripcion |
|---|---|---|
organizations | slug UNIQUE | Slug unico por organizacion |
organizations | clerk_org_id UNIQUE | Un Clerk org por organizacion |
users | clerk_user_id UNIQUE | Un Clerk user por usuario |
users | email UNIQUE | Email unico global |
events | (slug, organization_id) UNIQUE | Slug unico por organizacion |
invitations | slug UNIQUE | Slug unico global para URLs publicas |
guests | (email, event_id) UNIQUE | Un invitado por email por evento |
rsvps | (guest_id, invitation_id) UNIQUE | Un RSVP por invitado por invitacion |
user_roles | (userId, role, scope, organizationId, eventId) UNIQUE | Sin roles duplicados |
invitation_versions | (invitation_id, version_number) UNIQUE | Numero de version unico por invitacion |
qr_passes | code UNIQUE | Codigo QR unico global |
table_assignments | guest_id UNIQUE | Un invitado en una sola mesa |
custom_domains | domain UNIQUE | Dominio personalizado unico global |
pre_registrations | (email, organization_id) UNIQUE | Un pre-registro por email por organizacion |
templates | slug UNIQUE | Slug unico global por template |
service_packages | slug UNIQUE | Slug unico global por paquete |
clients | (email, organization_id) UNIQUE | Un cliente por email por organizacion |
7.3 Relaciones con Cascade Delete
Las siguientes relaciones tienen onDelete: Cascade, lo que significa que al eliminar el padre se eliminan los hijos automaticamente:
Event-> Invitation, Guest, GuestGroup, Location, ItineraryItem, QRPass, Media, EventTable, AudioGuestbook, Accommodation, GiftRegistry, BackgroundMusic, CustomDomain, EventServiceConfig, EventContract, CommunicationCampaignInvitation-> Section, InvitationVersion, InvitationApproval, Music, RSVP, InvitationAnalyticsEvent, InvitationAnalyticsSummary, AIGenerationGuest-> RSVP, QRPass, TableAssignmentGiftRegistry-> GiftRegistryItem, GiftBankAccountAccommodation-> AccommodationHotel, AccommodationTransportOptionBackgroundMusic-> BackgroundMusicTrackCommunicationCampaign-> CommunicationMessageUserRole-> (cascade desde User, Organization, Event)
7.4 Soft Delete
Los siguientes modelos implementan soft delete con el campo deletedAt:
OrganizationUserEventGuestRSVPMediaInvitationVersionTableAssignmentTemplateClient
8. Seed Data
El archivo seed.ts es idempotente (puede ejecutarse multiples veces sin duplicar datos). Utiliza upsert para crear o actualizar registros existentes.
8.1 Super Admin
| Campo | Valor |
|---|---|
developer.pezfred@gmail.com | |
| Clerk User ID | user_395ntlOdgiElz480VOcKNaYfeXj |
| Nombre | Alfredo Admin |
| isSuperAdmin | true |
| Rol asignado | SUPER_ADMIN con scope GLOBAL |
| Preferences | timezone: America/Mexico_City, language: es, notifications: email + push |
8.2 Tipos de Evento (9)
| # | Slug | Nombre | Icono | Secciones Default |
|---|---|---|---|---|
| 1 | wedding | Boda | ring | Hero, Couple, Itinerary, Location, RSVP, GiftRegistry, Gallery |
| 2 | xv-anos | XV Anos | crown | Hero, Quincanera, Itinerary, Location, RSVP, Gallery |
| 3 | baptism | Bautizo | church | Hero, Details, Location, RSVP, Gallery |
| 4 | birthday | Cumpleanos | cake | Hero, Details, Location, RSVP, Gallery |
| 5 | first-communion | Primera Comunion | cross | Hero, Details, Location, RSVP, Gallery |
| 6 | baby-shower | Baby Shower | bottle | Hero, Details, Location, RSVP, GiftRegistry |
| 7 | graduation | Graduacion | cap | Hero, Details, Location, RSVP, Gallery |
| 8 | corporate | Evento Corporativo | bldg | Hero, Details, Itinerary, Location, RSVP |
| 9 | other | Otro | party | Hero, Details, Location, RSVP |
8.3 Paquetes de Servicios (5)
| # | Slug | Nombre | Precio (MXN) | Recomendado | Servicios Incluidos |
|---|---|---|---|---|---|
| 1 | essential | Essential | $1,499 | No | INVITATION, GUEST_LIST, RSVP, LOCATIONS |
| 2 | plus | Plus | $2,999 | Si | Essential + ITINERARY, GUEST_GROUPS, TABLES, QR_PASSES |
| 3 | vip | VIP | $4,999 | No | Plus + CHECK_IN, GALLERY, AUDIO_GUESTBOOK, GUEST_UPLOADS |
| 4 | elite | Elite | $9,999 | No | Todos los servicios del VIP (para multiples eventos) |
| 5 | personalizado | Personalizado | $0 | No | Sin servicios predefinidos (seleccion a medida) |
8.4 Templates de Invitacion (16)
| # | Slug | Nombre | Tipo Evento | Featured | Fuentes |
|---|---|---|---|---|---|
| 1 | wedding-classic | Boda Clasica Romantica | wedding | Si | Playfair Display / Lato |
| 2 | wedding-garden | Boda Jardin Botanico | wedding | Si | Cormorant Garamond / Nunito |
| 3 | wedding-modern | Boda Moderna Minimalista | wedding | Si | Raleway / DM Sans |
| 4 | xv-princess | XV Anos Princesa Glamorosa | xv | Si | Cormorant Garamond / Montserrat |
| 5 | xv-modern | XV Anos Moderna Elegante | xv | No | Poppins / DM Sans |
| 6 | birthday-festive | Cumpleanos Festivo Vibrante | birthday | Si | Quicksand / Nunito |
| 7 | birthday-elegant | Cumpleanos Elegante | birthday | No | Cormorant Garamond / Inter |
| 8 | baptism-celestial | Bautizo Celestial Pastel | baptism | Si | Cormorant Infant / Nunito |
| 9 | baptism-golden | Bautizo Clasico Dorado | baptism | No | Playfair Display / Lato |
| 10 | communion-serene | Primera Comunion Espiritual | communion | Si | Cormorant Garamond / Source Sans Pro |
| 11 | babyshower-sweet | Baby Shower Dulce y Tierno | babyshower | Si | Quicksand / Nunito |
| 12 | babyshower-modern | Baby Shower Moderno Neutral | babyshower | No | Poppins / DM Sans |
| 13 | graduation-classic | Graduacion Academica Clasica | graduation | Si | Merriweather / Open Sans |
| 14 | graduation-bold | Graduacion Moderna Bold | graduation | No | Poppins / Inter |
| 15 | corporate-clean | Corporativo Profesional | corporate | Si | Inter / DM Sans |
| 16 | other-versatile | Versatil Universal | other | No | DM Sans / Inter |
Distribucion de Templates por Tipo de Evento
| Tipo de Evento | Cantidad | Templates |
|---|---|---|
| Boda (wedding) | 3 | Classic, Garden, Modern |
| XV Anos (xv) | 2 | Princess, Modern |
| Cumpleanos | 2 | Festive, Elegant |
| Bautizo | 2 | Celestial, Golden |
| Primera Comunion | 1 | Serene |
| Baby Shower | 2 | Sweet, Modern |
| Graduacion | 2 | Classic, Bold |
| Corporativo | 1 | Clean |
| Otro | 1 | Versatile |
Secciones Comunes en Templates de Boda
Los templates de boda incluyen 14 secciones con variantes configurables:
hero- Encabezado principal con imagenwelcome- Mensaje de bienvenidaevent_details- Detalles del eventocountdown- Cuenta regresivastory- Historia de la pareja (timeline vertical)gallery- Galeria de fotositinerary- Programa del eventolocation- Ubicacion con maparegistry- Mesa de regalosaccommodation- Hospedajefaq- Preguntas frecuentesrsvp- Formulario de confirmacionmusic- Reproductor de musicafooter- Pie de pagina
Notas Adicionales
Campos JSON Importantes
| Modelo | Campo | Estructura |
|---|---|---|
| Organization | settings | { timezone, language, dateFormat, features: { aiEnabled } } |
| Organization | limits | { maxEvents, maxGuestsPerEvent, maxStorage, maxAIGenerations } |
| User | preferences | { timezone, language, notifications: { email, push } } |
| Event | settings | { allowPlusOnes, requireDietaryInfo, theme, primaryColor } |
| Invitation | schema | Estructura completa de secciones y componentes de la invitacion |
| Invitation | theme | { colors, fonts, spacing } - Tema visual de la invitacion |
| Section | config | Configuracion especifica segun el tipo de seccion |
| Template | config | { colors, fonts, sections[] con variantes, animaciones } |
| Template | sampleData | Datos de ejemplo para preview/demo del template |
| RSVP | dietaryInfo | { vegetarian: 1, vegan: 0, allergies: ["nuts"] } |
| Guest | metadata | Campos personalizados adicionales por invitado |
| AuditLog | changes | Registro de cambios anteriores y nuevos valores |
Proveedores Externos
| Servicio | Proveedor | Campo de referencia |
|---|---|---|
| Autenticacion | Clerk | clerkUserId, clerkOrgId |
| Resend | provider, providerId | |
| Almacenamiento | AWS S3 | htmlUrl, cssUrl, jsUrl, url |
| Mapas | Google Maps | placeId, googleMapsUrl |
| IA | Varios | provider, model en AIGeneration |