Files
localesp/openspec/specs/pasarela-proponer-local/spec.md
T
edgar.friendly 49e965b248
deploy-branch / deploy (push) Successful in 2m18s
deploy-branch / teardown (push) Skipped
tests / Unitarias + componente + build (pull_request) Successful in 2m23s
tests / Integración (Nominatim real, opt-in) (pull_request) Skipped
tests / Unitarias + componente + build (push) Successful in 2m30s
tests / Integración (Nominatim real, opt-in) (push) Skipped
feat(pasarela): datos inferidos juntos en una pantalla "Datos del local"
- Nuevo PasoDatosLocal con nombre, provincia y dirección (ahora editable)
  en la misma pantalla, con aviso cuando vienen de la inferencia
- El wizard pasa de 6 a 5 pasos: Ubicación → Datos del local → Categoría
  → Tipo específico → Resumen
- Eliminados PasoNombre y PasoProvincia (absorbidos)
- Spec principal actualizada al nuevo orden de pantallas
2026-09-12 19:00:33 +02:00

5.4 KiB

Pasarela de propuesta de local

Purpose

Experiencia guiada (wizard) en un modal para proponer un local con un solo campo por pantalla —empezando por la ubicación con autodetección del proveedor e inferencia de nombre/provincia—, sin campos de comentario ni puntuación, conservando las validaciones existentes (palabras prohibidas, duplicados, privacidad obligatoria).

Requirements

Requirement: Pasarela paso a paso en un modal

El sistema SHALL presentar la propuesta de un local como una pasarela (wizard) dentro de un modal, con un solo campo por pantalla, navegación atrás/siguiente e indicador de progreso.

Scenario: Una pantalla por campo

  • WHEN la pasarela está abierta
  • THEN cada pantalla muestra únicamente el campo correspondiente al paso actual, con botones para avanzar y retroceder

Scenario: Navegación hacia atrás

  • WHEN el usuario pulsa "Atrás" en una pantalla intermedia
  • THEN vuelve a la pantalla anterior conservando los datos ya introducidos

Scenario: Avance bloqueado sin dato válido

  • WHEN el campo de la pantalla actual está vacío o es inválido
  • THEN el botón "Siguiente" está deshabilitado y la pantalla no avanza

Scenario: Cierre del modal

  • WHEN el usuario cierra el modal (botón ✕, botón Cancelar o tecla Escape)
  • THEN la pasarela se cierra y se descarta el borrador en curso

Requirement: Orden de las pantallas empezando por Ubicación

La pasarela SHALL presentar las pantallas en este orden: 1) Ubicación, 2) Datos del local (nombre, provincia y dirección inferidos, juntos en una misma pantalla), 3) Categoría, 4) Tipo específico (opcional), 5) Revisión y envío.

Scenario: Primera pantalla

  • WHEN se abre la pasarela
  • THEN la primera pantalla que se muestra es la de Ubicación

Scenario: Tipo específico omitible

  • WHEN el usuario está en la pantalla de Tipo específico
  • THEN puede continuar sin seleccionar ninguna subcategoría

Requirement: Inferencia de Nombre, Provincia y Dirección desde la Ubicación

El sistema SHALL pre-rellenar los campos Nombre, Provincia y Dirección a partir de la ubicación introducida en la primera pantalla (geocodificación inversa), mostrándolos juntos en la pantalla de Datos del local y permitiendo al usuario corregirlos (incluida la dirección).

Scenario: Datos pre-rellenados en su pantalla conjunta

  • WHEN el usuario introduce una ubicación válida en la primera pantalla y esta se resuelve con éxito
  • THEN al llegar a la pantalla de Datos del local los campos nombre, provincia y dirección aparecen pre-rellenados con los valores inferidos

Scenario: Valores corregibles

  • WHEN los valores inferidos no son correctos
  • THEN el usuario puede editarlos libremente antes de enviar

Scenario: Degradación sin inferencia

  • WHEN la inferencia falla o devuelve campos vacíos
  • THEN la pantalla de Datos del local aparece vacía y el usuario la rellena manualmente, sin bloquear la pasarela

Requirement: Sin campo de comentario ni puntuación

La pasarela SHALL NOT incluir el campo de comentario/descripción ni el campo de puntuación; la propuesta se envía sin esos datos.

Scenario: Envío sin comentario ni puntuación

  • WHEN el usuario completa la pasarela y envía
  • THEN la propuesta se registra con nombre, provincia, categoría, subcategoría, dirección/enlace y coordenadas, sin descripción y sin puntuación

Requirement: Revisión y aceptación de privacidad antes de enviar

La última pantalla de la pasarela SHALL mostrar un resumen de los datos introducidos y el checkbox de aceptación de la política de privacidad, siendo este último obligatorio para enviar.

Scenario: Envío bloqueado sin aceptar privacidad

  • WHEN el usuario llega a la pantalla final sin marcar la casilla de privacidad
  • THEN el botón de envío está deshabilitado hasta que la marque

Scenario: Resumen antes de enviar

  • WHEN el usuario llega a la pantalla final
  • THEN ve un resumen legible de todos los datos introducidos con posibilidad de volver atrás a corregirlos

Requirement: Validaciones existentes integradas en la pasarela

La pasarela SHALL conservar las validaciones actuales del formulario: filtro de palabras prohibidas y comprobación de duplicados, mostrando los avisos dentro del modal.

Scenario: Palabra prohibida detectada

  • WHEN el texto introducido contiene una palabra no permitida
  • THEN se muestra un aviso dentro del modal y la propuesta no se envía

Scenario: Posible duplicado detectado

  • WHEN al enviar se detecta un local igual o muy cercano
  • THEN se muestra el aviso de duplicado dentro del modal con las coincidencias y las opciones de enviar de todos modos o revisar los datos

Scenario: Envío correcto

  • WHEN la propuesta se envía con éxito
  • THEN el modal se cierra y aparece la confirmación de propuesta enviada en la página principal

Requirement: Modal responsive accesible

El modal de la pasarela SHALL ser usable en PC (diálogo centrado) y móvil (ocupando prácticamente toda la pantalla), con foco contenido y cierre mediante Escape.

Scenario: Uso en móvil

  • WHEN la pasarela se abre en una pantalla estrecha
  • THEN el modal ocupa el ancho completo y es operativo con teclado y scroll táctil

Scenario: Foco contenido en el modal

  • WHEN el modal está abierto
  • THEN el foco de teclado permanece dentro del modal y la tecla Escape lo cierra