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

users (asesora)1 : Nadvisory_requests
leads / visa_cases1 : Nadvisory_requests (relación opcional)
users1 : 1auth.users
users1 : Nuser_roles
customers1 : Nleads
customers1 : Nquotes
customers1 : Nreservations
customers1 : Nvisa_cases
customers1 : Ndocuments
customers1 : 1loyalty_accounts
users (asesor)1 : Ncustomers / leads / visa_cases asignados
products1 : Nquotes
quotes1 : 0..1reservations
reservations1 : Ntravelers
reservations1 : Npayments
loyalty_accounts1 : Nloyalty_transactions
users1 : Ntasks / notifications

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 visas

Implementado 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)

· Usuarios

Perfil 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

· Roles

Roles 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

· Clientes

Registro Ú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

· Prospectos

Oportunidades 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 / paquetes

Catá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

· Cotizaciones

Cotizaciones 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

· Reservas

Servicios 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

· Pasajeros

Personas 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

· Pagos

Registro 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 visa

Trá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

· Documentos

Vouchers 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 PlanetClub

Membresí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 puntos

Acumulaciones, 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

· Tareas

Seguimientos 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

· Notificaciones

Avisos 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