Solicitudes aprobadas
Esquema de base de datos
Solicitudes, roles y configuración de la agencia ya están creados. Las demás entidades y relaciones siguen como propuesta para las siguientes etapas.
Relaciones principales
Todas las tablas tendrán Row Level Security. Los roles se validan con una función segura en la base de datos, no en la pantalla.
advisory_requests
· Solicitudes de viajes y visasImplementado en Lovable Cloud: copia completa antes de WhatsApp, aviso Gmail central y archivo privado en Drive. Sin precios públicos, presupuestos automáticos ni documentos sensibles.
Apps: Explorer, PlanetVisa, CRM, Admin
- iduuidPK
- request_typetextviaje o visa
- submission_key / codeuuid / textúnicos; evita repetir solicitudes
- full_name / email / phonetextcontacto del solicitante
- detailsjsonbpaís, ciudad, días/noches, adultos/menores, tours; o tipo de visa, situación, respuestas y fechas
- messagetextmensaje completo para WhatsApp y correo
- assigned_touuidcuenta asignada opcional
- assigned_area / advisor_nameapp_role / textviajes: Cristy; visas: Karen
- stagetextetapa comercial actual
- summary / summary_statustextresumen IA de destino, duración y grupo
- email_status / email_message_idtextresultado del aviso central
- drive_status / drive_file_idtextcopia privada y estado de sincronización
- marketing_consentbooleanopcional; no se envían campañas todavía
- created_attimestamptz
🔒 Público: solo envío validado; sin lectura
🔒 Asesora: solo su área y asignación
🔒 Presidencia/Gerencia: todas
🔒 Edición autenticada: solo etapa comercial
🔒 Correo central conectado y probado
users (profiles)
· UsuariosPerfil de cada persona con acceso. Vinculado 1:1 a la cuenta de autenticación.
Apps: Todas
- iduuidPK · = auth.users.id
- full_nametext
- phonetext
- customer_iduuidFK → customers (solo clientes)
- commission_ratenumericasesores
- created_attimestamptz
🔒 Cada usuario lee y edita su propio perfil
🔒 Presidencia/Gerencia leen todos
user_roles
· RolesRoles en tabla separada (nunca en el perfil) para evitar escalamiento de privilegios.
Apps: Todas
- iduuidPK
- user_iduuidFK → users
- roleapp_rolepresidencia · gerencia · asesor_comercial · asesor_visas · cliente
🔒 Solo Presidencia asigna roles
🔒 Verificación vía función has_role() security definer
customers
· ClientesRegistro ÚNICO de cliente compartido por las 5 apps (sin duplicados por email/teléfono).
Apps: Explorer, PlanetVisa, Mi Viaje, CRM, Club
- iduuidPK
- full_nametext
- emailcitextúnico
- phonetextúnico normalizado
- citytext
- assigned_touuidFK → users (asesor)
- created_attimestamptz
🔒 Asesor: solo clientes asignados
🔒 Cliente: solo su propio registro
🔒 Gerencia/Presidencia: todos
leads
· ProspectosOportunidades del embudo comercial, captadas desde Explorer, PlanetVisa, WhatsApp u oficina.
Apps: Explorer, PlanetVisa, CRM
- iduuidPK
- customer_iduuidFK → customers (se vincula o crea)
- interesttext
- sourcelead_source
- stagelead_stagenuevo · contactado · cotizacion_enviada · negociacion · ganado · perdido
- assigned_touuidFK → users
- estimated_valuenumeric
- next_follow_update
🔒 Inserción pública solo vía función validada (formularios)
🔒 Asesor: solo asignados
🔒 Gerencia: todos
products
· Productos / paquetesCatálogo de paquetes con precios y promociones editables desde el administrador.
Apps: Explorer, Admin
- iduuidPK
- slugtextúnico
- destinationtext
- nametext
- nightsint
- price_fromnumeric
- promo_pricenumericopcional
- is_example_pricebooleanmarca precio referencial
- activeboolean
🔒 Lectura pública solo de activos
🔒 Edición: Presidencia y Gerencia
quotes
· CotizacionesCotizaciones enviadas a prospectos o clientes, con pasajeros y fechas.
Apps: Explorer, CRM
- iduuidPK
- codetextCOT-####
- lead_iduuidFK → leads
- customer_iduuidFK → customers
- product_iduuidFK → products
- travelers_countint
- departure_datedate
- totalnumeric
- statusquote_status
- created_byuuidFK → users
🔒 Asesor: las suyas
🔒 Cliente: las de su customer_id
🔒 Gerencia: todas
reservations
· ReservasServicios contratados (registro interno; sin emisión real de boletos todavía).
Apps: Mi Viaje, CRM
- iduuidPK
- codetext
- customer_iduuidFK → customers
- quote_iduuidFK → quotes
- start_date / end_datedate
- statusreservation_status
- totalnumeric
- itineraryjsonbvuelos, hotel, traslados, tours
🔒 Cliente: solo reservas de su customer_id
🔒 Asesor: clientes asignados
🔒 Gerencia: todas
travelers
· PasajerosPersonas que viajan en una reserva (titular y acompañantes).
Apps: Mi Viaje, CRM
- iduuidPK
- reservation_iduuidFK → reservations
- full_nametext
- traveler_typetexttitular · acompañante · menor
- birth_datedatesin número de pasaporte en fase 1
🔒 Hereda permisos de la reserva
payments
· PagosRegistro manual de abonos y saldos (sin cobros en línea en esta fase).
Apps: Mi Viaje, CRM
- iduuidPK
- reservation_iduuidFK → reservations
- amountnumeric
- methodpayment_method
- statuspayment_status
- recorded_byuuidFK → users
- paid_attimestamptz
🔒 Cliente: lectura de sus pagos
🔒 Asesor: registra en sus clientes
🔒 Gerencia: todos
visa_cases
· Expedientes de visaTrámites de asesoría de visa y su estado. Nunca se garantiza aprobación.
Apps: PlanetVisa, CRM, Mi Viaje
- iduuidPK
- codetextPV-####
- customer_iduuidFK → customers
- countrytext
- visa_typetext
- statusvisa_status
- evaluationjsonbrespuestas orientativas
- assigned_touuidFK → users (asesor de visas)
- appointment_attimestamptz
🔒 Asesor de visas: asignados
🔒 Cliente: los suyos
🔒 Gerencia: todos
documents
· DocumentosVouchers e itinerarios. Pasaportes y documentos sensibles DESACTIVADOS hasta tener almacenamiento cifrado y permisos.
Apps: Mi Viaje, PlanetVisa, CRM
- iduuidPK
- customer_iduuidFK → customers
- reservation_iduuidFK → reservations (opcional)
- visa_case_iduuidFK → visa_cases (opcional)
- kindtextvoucher · itinerario · seguro
- storage_pathtextbucket privado
- sensitivebooleanbloqueado en fase 1
🔒 Cliente: solo sus documentos
🔒 Bucket privado con URLs firmadas
loyalty_accounts
· Cuentas PlanetClubMembresía, saldo de puntos, categoría y código de referido.
Apps: Club, Mi Viaje, CRM
- iduuidPK
- customer_iduuidFK → customers (único)
- points_balanceintcalculado por transacciones
- referral_codetextúnico
- referred_byuuidFK → loyalty_accounts
🔒 Socio: solo su cuenta
🔒 Gerencia: todas
loyalty_transactions
· Movimientos de puntosAcumulaciones, canjes y bonos de referidos (libro contable de puntos).
Apps: Club, CRM
- iduuidPK
- account_iduuidFK → loyalty_accounts
- pointsint+ acumula / − canje
- reasontext
- reservation_iduuidFK opcional
🔒 Socio: lectura de los suyos
🔒 Solo el sistema/gerencia inserta
tasks
· TareasSeguimientos y pendientes de los asesores con alertas de vencimiento.
Apps: CRM, PlanetVisa
- iduuidPK
- titletext
- owner_iduuidFK → users
- lead_id / visa_case_id / reservation_iduuidrelación opcional
- due_datedate
- prioritytask_priority
- doneboolean
🔒 Cada asesor: sus tareas
🔒 Gerencia: todas
notifications
· NotificacionesAvisos a clientes y usuarios internos (portal, CRM).
Apps: Mi Viaje, CRM, Club
- iduuidPK
- user_iduuidFK → users
- title / bodytext
- read_attimestamptz
🔒 Cada usuario: solo las suyas
