Audiencia: negocio Vertical: tourism
Objetivo
Operar el sitio hotelero multi-tenant: chrome fijo de reserva, paquetes desde el catálogo, reuniones como página de consulta (WhatsApp), portada editable, inventario de habitaciones en el panel, y facturación manual de estadías.
Quién puede hacerlo
- Habitaciones operación (
/rooms): ver agenda, estadías y mantenimiento —module.rooms.view/editsegún la acción. - Habitaciones configurar (
/rooms/config): crear inventario y campos públicos —module.rooms.edit. - Marca / sitio / portada / reuniones / fuente del sitio web: Organización → Sitio web si el plan incluye
storefront. - Paquetes: módulo Productos (
product_kind= paquete de viaje) + web pública. - Fiscal y ventas: mismos módulos core que el resto de verticales.
Antes de empezar
- Vertical = tourism.
- Inventario de habitaciones en Habitaciones → Configurar (número, tipo, foto, precio, Disponible en búsqueda pública).
- Plan con sitio público (
storefront). Habitaciones en el panel requierenvertical_surface. - WhatsApp del hotel en Sitio web → Contacto si vas a cotizar reuniones por chat.
Chrome fijo vs dinámico
| Elemento | Siempre | Condicional |
|---|---|---|
| Marca, idioma, ingresar / cuenta | Sí | — |
| RESERVAR + barra de búsqueda (check-in/out, huéspedes, RESERVAR AHORA) | Sí → /buscar | — |
| PAQUETES DE VIAJE | — | Solo si hay ≥1 producto público con tipo Paquete de viaje |
| REUNIONES Y GRUPOS | — | Solo si la página Reuniones está publicada en Sitio web |
| Servicios / tarjetas bajo el hero | — | Bloque Sección de tarjetas de Portada (título editable; también se muestran banners antiguos con contenido) |
Rutas públicas (visitante)
| Acción | Ruta |
|---|---|
| Inicio | / |
| Buscar habitaciones | /buscar |
| Reservar y pagar una habitación | /reservar/{habitación} |
| Estado de una reserva | /reserva/{código} |
| Listado de paquetes | /paquetes |
| Detalle de paquete | /paquetes/{slug} (slug del producto) |
| Reuniones | /reuniones |
| Recompensas / eventos especiales | /recompensas, /eventos-especiales (legado demo; no son el MVP hotelero) |
| Cuenta huésped | /cuenta, /cuenta/reservas, /cuenta/perfil, … |
| Auth | /iniciar-sesion, /registro, /activacion, /recuperar-contrasena |
Pasos — Inventario y sitio (staff)
- Habitaciones → Configurar (
/rooms/config):- Si el hotel está vacío: lote inicial (suites / penthouses) o Agregar habitación una a una. No se abre solo al entrar a Operación.
- Con inventario: Agregar habitación cuando haga falta; Configurar o Eliminar en cada tarjeta. La eliminación pide confirmación (como borradores fiscales) y no permite borrar si hay residente o reserva/retención activa.
- Panel Habitaciones → Operación (
/rooms): agenda, estadías de huésped y mantenimiento. Vacío → enlace a Configurar (sin modal automático).- Las acciones por habitación libre son Nueva estadía y Mantenimiento. Ya no existe Nuevo residente (contratos de larga estadía del modelo anterior a las verticales); los residentes registrados antes siguen apareciendo en la agenda y ocupando la habitación.
- Nueva estadía: buscá o creá el huésped en Contactos (mismo directorio que facturas/POS), luego fechas y ocupación. No se crea una ficha anónima.
- Búsqueda pública (
/buscar): solo habitaciones con Visible en el sitio web público. Aparecen aunque no estén libres esas fechas (available: falsesi ocupación, residente, hold o capacidad). La página tiene título/meta propios del hotel; las fotos usanaltdesde la descripción (o tipo + número). No hay ficha SEO por habitación todavía. - Organización → Sitio web → Portada: carrusel y Sección de tarjetas (título y subtítulo de la sección + hasta 6 tarjetas con imagen, texto, botón y enlace a
/buscar,/paquetes, un paquete,/reuniones, etc.; toda la tarjeta es clicable). Los banners vacíos ya no se muestran como tarjetas en blanco. Un hotel nuevo llega con carrusel, sección de tarjetas «Nuestros servicios», paquetes de viaje «(muestra)» (p. ej. «Habitación doble (muestra)») y marca de muestra; el título del hero («Bienvenidos a …»), la promo de paquetes y el copyright del pie usan el nombre público del negocio (ver 19 — Sitio web). - Sitio web → Contacto: WhatsApp del hotel (número para CTAs de reuniones).
- Sitio web → Reuniones: título y cuerpo de
/reuniones; publicar para que aparezca en el menú. El CTA Cotizar abre WhatsApp con un mensaje preparado (no hay carrito ni hold). - Productos: crear un Servicio con tipo de ítem Paquete de viaje, marcar visible en la web, foto y slug. Solo aparece en vertical tourism. El menú Paquetes se muestra cuando hay al menos uno publicado.
- Obligatorios para publicar: nombre, código, IVA, precio, visible en la web, slug, meta título, foto principal.
- Opcionales: categoría, descripción, unidad, código auxiliar, ICE, marca, precio comparado, precios extra, costo, galería, meta descripción.
- No aplica (el formulario los oculta): GTIN, inventario, colores, peso ni clase de empaque.
- Ver sitio público: inicio,
/buscar, paquetes y (si aplica) reuniones. Pie con Impulsado por DILEPACK. - Sitio web → Reservas (solo turismo): activá las reservas en línea, elegí qué formas de pago ve el huésped (tarjeta, transferencia, pagar en el hotel), el tiempo de espera de cada una (minutos para tarjeta, horas para transferencia) y la política de cancelación (ES/EN). En la misma pestaña, la tarjeta de checkout guarda la cuenta bancaria, PayPhone y el establecimiento / punto de emisión de las notas de pedido.
- Facturación de estadías: cada reserva web genera una nota de pedido (folio) con la línea de hospedaje; se factura desde la NP como cualquier otra (07, 16). Las estadías creadas por el personal en Habitaciones siguen facturándose manualmente.
Reservas en línea con pago (huésped)
- El huésped busca en
/buscary pulsa Reservar en una habitación disponible →/reservar/{habitación}?check_in=…&check_out=…. - Ve el desglose: noches × tarifa neta, IVA 15 % y total. Completa nombre, correo, teléfono, tipo y número de identificación (cédula, RUC o pasaporte) y elige la forma de pago. No necesita cuenta; si inició sesión, los datos se prellenan.
- Al confirmar se crea el Contacto si esa identificación no existe, o se vincula el contacto ya guardado sin cambiar su nombre, correo ni teléfono. Los datos que escribió el huésped quedan en la reserva; el correo de confirmación sale a ese correo. En la misma operación se crean la nota de pedido con canal Reserva web y la reserva en la agenda. El huésped recibe un código de reserva (8 caracteres) y el hotel recibe el aviso en el correo de notificaciones.
- Según la forma de pago:
| Forma de pago | Estado de la reserva | Qué pasa después |
|---|---|---|
| Tarjeta (PayPhone, 100 %) | Pago pendiente | El huésped va a PayPhone. Si la notificación (webhook) de PayPhone está configurada, al aprobarse el pago la reserva pasa a Confirmada sola; si no, el personal verifica el aviso de PayPhone y usa Confirmar pago recibido en la NP. Si no paga en el tiempo configurado (30 min por defecto), se libera. |
| Transferencia | Pago pendiente | Ve los datos bancarios en /reserva/{código} y en el correo. El personal confirma el pago en la NP (Confirmar pago recibido) → Confirmada. Si no llega en el plazo (48 h por defecto), se libera. |
| Pagar en el hotel | Confirmada al instante | Queda un compromiso de cobro en la NP; se cobra en recepción al check-in con Confirmar pago recibido. Aplica la política de cancelación publicada. |
- Página de estado:
/reserva/{código}(sin login). Muestra estado, fechas, total, datos bancarios o el botón Pagar ahora (tarjeta, mismo navegador). Huéspedes con cuenta ven sus reservas en/cuenta/reservas(por correo).
Liberación automática: las reservas con pago pendiente vencidas se cancelan junto con su NP (estado Anulada) y las fechas vuelven a estar disponibles. Lo hace el worker (WORKER_KINDS con bookings) y, además, cada búsqueda pública o apertura de agenda del hotel.
Personal (staff)
- Habitaciones → Agenda: las reservas web muestran la etiqueta Web · código, la forma de pago, el estado del pago y el enlace a la Nota de pedido.
- Datos de contacto distintos: si la reserva web se vinculó a un contacto ya guardado y el correo o el teléfono que escribió el huésped no coinciden con los del directorio, la estadía muestra el aviso «Los datos de contacto difieren de los guardados» con ambos valores (en la reserva / guardado). El contacto no cambia solo:
- Actualizar contacto (pide confirmación) copia al contacto el correo y/o teléfono escritos en la reserva (el teléfono se guarda como celular). Requiere
module.rooms.editymodule.contacts.edit; sin ambos permisos el botón no aparece. - Ver contacto abre la ficha (
/contacts/{id}) para revisarla o editarla a mano. - Si preferís mantener los datos guardados, no hagas nada: la reserva conserva lo que escribió el huésped y el aviso sigue visible mientras los datos difieran. Las mayúsculas, espacios y el prefijo
+593no cuentan como diferencia.
- Actualizar contacto (pide confirmación) copia al contacto el correo y/o teléfono escritos en la reserva (el teléfono se guarda como celular). Requiere
- Cancelar una reserva web en la agenda anula también su NP si aún no está pagada. Si ya está pagada, cancelá/reembolsá desde la NP (16).
- Confirmar transferencia o cobro en recepción: abrí la NP desde la agenda o Notas de pedido (filtro de origen Reserva web) y usá Confirmar pago recibido.
- Facturar la estadía: con el pago confirmado, Convertir a borrador en la NP (no se puede convertir ni editar una reserva sin pago confirmado; para cambiar fechas o tarifa, anulá y creá otra).
Holds de noche (API, sin pago)
Sigue disponible la retención (hold) sin cobro para integraciones (POST /api/public/rooms/{room_id}/holds); el sitio público usa el flujo de reserva con pago de arriba.
Estado actual (importante)
| Capacidad | Estado |
|---|---|
| Búsqueda pública de habitaciones | Disponible |
| Reserva web con pago (tarjeta / transferencia / en el hotel) | Disponible |
| Hold de noche sin pago (API) | Disponible (sin UI pública) |
Paquetes (travel_package) | Catálogo + menú condicional |
| Reuniones (página + WhatsApp) | Disponible si está publicada |
| Portada / servicios (sección de tarjetas) | Bloques CMS |
| Dashboard hotelero | KPIs de turismo en el panel |
Resultado esperado
- Huésped ve marca + barra de reserva siempre; paquetes y reuniones solo si el hotel los configuró.
- Staff gestiona habitaciones, portada, paquetes y página de reuniones sin código hardcodeado de Buena Vida.
- Emisión SRI sigue los procedimientos fiscales del negocio.
Si algo falla
- No ves Habitaciones → vertical no es tourism, el slug oculta el módulo, o falta
vertical_surface. - No podés crear habitaciones → usá Configurar (
/rooms/config); el lote inicial solo sirve con inventario vacío; después Agregar habitación. - Superficie pública bloqueada → falta
storefront. - Menú Paquetes no aparece → ningún producto
Paquete de viajepúblico. - Menú Reuniones no aparece → página Reuniones no creada/publicada.
- Cotizar no abre WhatsApp → falta número en Sitio web → Contacto.
- Búsqueda vacía → sin habitaciones con Visible en el sitio web público / tenant incorrecto en el Host.
- «Las reservas en línea no están disponibles» → Sitio web → Reservas desactivado o ninguna forma de pago utilizable (transferencia apagada en checkout, PayPhone sin credenciales o plan sin pagos en línea).
- Error al reservar «Store is not configured for orders» → falta establecimiento fiscal / punto de emisión por defecto.
- La reserva con transferencia se anuló sola → venció el plazo sin Confirmar pago recibido en la NP.
- Activación de huésped: enlace en el dominio público del hotel; token 24 h; contraseña con política fuerte. Personal: 06 — Invitar empleados.
Relacionados
- 19 — Índice sitio web
- ADR chrome:
docs/adr/tourism-public-chrome.md - ADR habitaciones:
docs/adr/rooms-tenant-domain.md - Holds de noche:
docs/adr/tourism-night-holds.md
Última revisión: 2026-10-25
Si este flujo cambia en el producto, actualiza esta página.