00-paper-reference.md
Abrir documentoReferencia Paper — COMAL
| Campo | Valor |
|---|---|
| File ID | 01KYX2GFM9EGHF4EG0AQZJPZ5G |
| URL | https://app.paper.design/file/01KYX2GFM9EGHF4EG0AQZJPZ5G |
| Nombre del archivo | COMAL — Daily UX 2026-07-31 |
| Fecha de creación | 2026-07-31 |
| Cierre UX/UI | 2026-08-01 |
| Estado UI | Completo — 46 artboards UI/UX + 7 etiquetas de sección (canvas jerárquico) |
Mapa del canvas (bandas verticales, CRON §5.2)
Lectura arriba → abajo. Etiquetas §N encima de cada banda.
| § | Banda | Contenido |
|---|---|---|
| 1 | UX PROCESS | UX-00 … UX-10 (2 filas) |
| 2 | DESIGN SYSTEM + DESKTOP | 00 DS · Landing · Landing ops · Explorar desktop |
| 3 | MOBILE — AUTH | Login · Registro · Recuperar · Email · Onboarding |
| 4 | MOBILE — BOOKING FLOW | Explorar · Detalle · Reserva · Checkout · Confirmación · Check-in |
| 5 | MOBILE — ACCOUNT | Reservas · Detalle · Cancelar · Perfil · Planes · Notif · Facturas |
| 6 | OPS / STAFF | Op-01 … Op-05 |
| 7 | SYSTEM STATES | Empty · Loading · errores de pago/sesión/validación/red |
Inventario completo de artboards — UI producto
| # | Artboard | Dispositivo | Contenido |
|---|---|---|---|
| 00 | Design System | 1440×1200 | Tokens, botones, chips, slots |
| 01 | Landing — Desktop | 1440×900 | Captación cocineros |
| 01b | Landing operadores | 1440×900 | Captación operadores |
| 02 | Auth — Login | 390×844 | Entrada |
| 02b | Recuperar contraseña | 390×844 | Solicitud de enlace |
| 02c | Email enviado | 390×844 | Confirmación envío |
| 03 | Auth — Registro | 390×844 | Alta cocinero/operador |
| 04 | Onboarding | 390×844 | Equipos y ciudad |
| 05 | Explorar — Mobile | 390×844 | Listado + filtros + nav |
| 06 | Detalle cocina | 390×844 | Ficha + CTA sticky |
| 07 | Reserva — Calendario | 390×844 | Fecha, estación, slots |
| 08b | Checkout — Pago | 390×844 | Resumen + tarjeta |
| 08 | Confirmación | 390×844 | Éxito post-pago |
| 09 | Mis reservas | 390×844 | Próximas + historial |
| 09b | Detalle reserva | 390×844 | Acciones + cancelar |
| 09c | Cancelar reserva | 390×844 | Sheet confirmación |
| 10 | Check-in | 390×844 | QR + PIN dark |
| 11 | Perfil y membresía | 390×844 | Cuenta y plan |
| 11b | Planes membresía | 390×844 | PayGo / Base / Pro |
| 11c | Notificaciones | 390×844 | Toggles preferencias |
| 11d | Facturas y pagos | 390×844 | Métodos + historial |
| 12 | Explorar — Desktop | 1440×900 | Filtros + grid |
| 13 | Empty — Sin resultados | 390×844 | Filtros vacíos |
| 14 | Error — Pago fallido | 390×844 | Hold + reintento |
| 15 | Loading — Explorar | 390×844 | Skeletons |
| 16 | Empty — Sin reservas | 390×844 | Primera vez |
| 17 | Sesión expirada | 390×844 | Re-login |
| 18 | Error validación login | 390×844 | Email inválido |
| 19 | Reserva — Sin huecos | 390×844 | Día lleno |
| 20 | Error de red | 390×844 | Offline / reintentar |
| Op-01 | Dashboard operador | 1440×900 | Día y métricas |
| Op-02 | Calendario operador | 1440×900 | Semana |
| Op-03 | Bloquear franja | 1440×900 | Modal bloqueo |
| Op-04 | Precios y estaciones | 1440×900 | Tabla precios |
| Op-05 | Check-in recepción | 768×1024 | Tablet PIN |
Inventario proceso UX (11) — alineado a markdown del case
| Artboard | Contenido | Doc fuente |
|---|---|---|
| UX-00 Research cover | Portada proceso UX industrial | — |
| UX-01 Stakeholders | Mapa influencia × interés | 02 |
| UX-02 Personas | Lucía, Marcos, Elena, Andrés | 02 |
| UX-03 JTBD | 3 jobs cocinero/operador | 02 |
| UX-04 User stories | Épicas A–D MoSCoW + AC | 02 / 19 |
| UX-05 Journey maps | Lucía reserva + Elena ops | 02 |
| UX-06 Service blueprint | Capas + fallos pago/slot | 02 |
| UX-07 Site map + IA | Público · cook · ops | 03 |
| UX-08 Flujos de usuario | F4 reserva E2E + auth/ops | 04 |
| UX-09 Modelo datos + roles | ER + COOK/OPERATOR | 05 |
| UX-10 Definición + métricas | Problema, valor, north star | 01 |
Total: 46 artboards hi-fi en Paper (35 UI + 11 proceso UX).
Media real (2026-08-01)
Fotos fotorrealistas generadas en las cards/heroes de cocinas (no placeholders de color):
| Asset local | Uso en Paper |
|---|---|
assets/kitchens/kitchen-hub-vallecas.jpg | Card explorar mobile/desktop Kitchen Hub |
assets/kitchens/obrador-sur-legazpi.jpg | Card explorar Obrador Sur |
assets/kitchens/cocina-abatidor.jpg | Card desktop Fogón Centro |
assets/kitchens/hero-kitchen-hub.jpg | Detalle cocina + hero landing |
Insertadas con paper-asset:// (regla permanente del cron: ver CRON.md §5.1).
Design tokens
Definidos en el archivo Paper (CSS variables). Duplicados en 08-design-system.md.
Prototipo y navegación
Ver 17-prototype-map.md.
Auditoría de completitud
Ver 18-completeness-audit.md.
01-project-definition.md
Abrir documento01 — Definición del proyecto · COMAL
5.1 Identidad
| Campo | Valor |
|---|---|
| Nombre | COMAL |
| Significado | Del comal, plancha tradicional de cocina en Mesoamérica: superficie compartida donde se cocina lo esencial. Evoca profesionalidad culinaria, cultura y trabajo colectivo. |
| Eslogan | Tu cocina profesional, cuando la necesitas. |
| Una frase | Plataforma para reservar y gestionar cocinas certificadas por horas. |
| Descripción ejecutiva | COMAL conecta emprendedores gastronómicos (food trucks, pasteleros, caterings emergentes) con operadores de cocinas compartidas certificadas. El cocinero descubre espacios por ubicación, equipo y franjas; reserva y paga online; hace check-in digital. El operador gestiona ocupación, precios, reglas sanitarias y cobros. El modelo combina membresía (acceso prioritario y descuentos) con reserva por horas. |
| Sector | Alimentación · Hostelería · Emprendimiento gastronómico |
| Tipo de producto | Sistema de reservas + gestión ligera de espacios (PWA) |
| Plataforma principal | Progressive Web App (responsive web-first) |
| Plataformas secundarias | SMS/email transaccional; futuro: app nativa iOS/Android; tablet en recepción del local |
| Mercado objetivo | España (lanzamiento ciudad piloto: Madrid / Barcelona / Valencia) con expansión LATAM hispanohablante |
| Idioma principal UI | Español (España) |
| Otros idiomas | Español LATAM (variantes de copy); inglés (fase posterior) |
5.2 Problema
Problema principal
Los emprendedores gastronómicos sin cocina propia certificada no pueden producir de forma legal, predecible y escalable. Coordinan espacios por WhatsApp, Excel o boca a boca, con conflictos de horarios, falta de trazabilidad sanitaria y pagos informales.
Problemas secundarios
- Dificultad para demostrar cumplimiento (HACCP, registros de uso) ante inspecciones.
- Operadores de cocinas con ocupación irregular y cobro manual.
- Falta de transparencia en equipamiento real disponible por franja.
- Cancelaciones de última hora sin política clara.
- Desconfianza en la limpieza y el solapamiento entre usuarios.
Quién lo experimenta
- Cocinero emprendedor — produce para venta online, delivery o eventos.
- Operador de cocina compartida — dueño o gestor del local.
- Indirectamente: clientes finales del emprendedor (calidad/seguridad alimentaria).
Cómo se resuelve hoy (supuesto de mercado)
- Grupos de WhatsApp y Telegram.
- Alquiler de cocinas de restaurantes en horario muerto (acuerdos informales).
- Coworkings gastronómicos con reserva por email/teléfono.
- Ghost kitchens B2B con contratos largos y precios altos.
Deficiencias de las soluciones actuales (hipótesis)
- No hay inventario en tiempo real de franjas y equipos.
- Sin flujo de pago unificado ni facturación automática.
- Sin evidencia digital de quién usó qué y cuándo.
- Onboarding del operador lento; del cocinero, opaco.
Coste del problema (supuestos, no medidos)
| Tipo | Estimación cualitativa |
|---|---|
| Humano | Estrés, jornadas perdidas por cancelaciones |
| Económico | Horas no productivas; multas por no conformidad |
| Operativo | Doble agenda, cobros a mano, disputas |
Oportunidad de producto
Digitalizar el marketplace de capacidad de cocina certificada con confianza (certificados, reseñas, reglas) y operaciones (calendario, pago, check-in).
Clasificación de evidencias
| Tipo | Contenido |
|---|---|
| Comprobado en esta ejecución | N/A — no se realizó investigación de campo ni desk research citando fuentes primarias |
| Supuestos | Demanda de cocinas por horas en ciudades grandes; operadores abiertos a comisión 10–15 % |
| Hipótesis | La visibilidad de certificaciones y equipamiento aumenta conversión a primera reserva ≥ 25 % vs. listado opaco |
| Decisiones de diseño | PWA primero; español ES; foco en 2 roles (Cocinero, Operador); no IA en MVP |
5.3 Objetivos
Negocio
- Alcanzar product-market fit en 1 ciudad piloto en 6 meses.
- GMV de reservas y tasa de ocupación media de cocinas listadas.
- Retención de operadores (oferta) y cocineros activos mensuales (demanda).
Usuario (cocinero)
- Reservar una franja adecuada en < 5 minutos en el primer uso.
- Confiar en que el espacio está limpio, equipado y certificado.
- Recibir comprobante y acceso sin fricción el día de la reserva.
Usuario (operador)
- Ver ocupación del día y huecos en un vistazo.
- Reducir no-shows y cobros pendientes.
- Publicar reglas y precios sin intermediación manual constante.
Producto
- Flujo completo: descubrir → reservar → pagar → check-in → valorar.
- Panel operador MVP: calendario, precios base, bloqueos, check-in.
Experiencia
- Claridad industrial: horarios y precios siempre visibles.
- Reducir ansiedad pre-reserva (qué incluye, qué no, política de cancelación).
Técnicos
- Disponibilidad 99,5 % en horario comercial.
- Confirmación de pago < 3 s percibidos tras autorización.
- WCAG 2.2 AA en flujos críticos.
- PWA instalable; offline limitado (ver mis reservas cacheadas).
No objetivos (Won’t have por ahora)
- Marketplace de ingredientes o personal de cocina.
- IA de planificación de menús.
- App nativa en v1.
- Multi-país con compliance fiscal local completo.
- Reservas de comensales (no es OpenTable).
Restricciones
- Cumplimiento RGPD; pagos PCI vía PSP (Stripe).
- No almacenar datos de tarjetas en claro.
- Contenido legal/sanitario: el operador es responsable de la veracidad de certificados subidos (COMAL verifica de forma ligera en onboarding).
Dependencias
- Stripe (pagos y suscripciones).
- Proveedor SMS/email.
- Mapas (Mapbox o Google) para geolocalización.
- Identidad (Auth.js / OAuth email + Google).
Riesgos iniciales
| Riesgo | Mitigación |
|---|---|
| Oferta insuficiente en ciudad piloto | Onboarding concierge de 10–20 cocinas |
| No-shows altos | Depósito / cargo parcial + reputación |
| Disputas de limpieza | Checklist de salida + fotos + reportes |
| Regulación local ambigua | Copy que no promete licencia al usuario final; disclaimer |
5.4 Métricas
| Métrica | Definición |
|---|---|
| North Star | Horas de cocina confirmadas y completadas / semana (completed kitchen-hours) |
| Activación | % de registros que completan 1ª reserva pagada en ≤ 7 días |
| Conversión listado→reserva | % de vistas de ficha que inician checkout |
| Conversión checkout | % de checkouts iniciados que pagan |
| Retención D30 | % de cocineros con ≥ 1 reserva en mes 2 si reservaron en mes 1 |
| Frecuencia | Reservas / cocinero activo / mes |
| Finalización de tarea | Tiempo medio a primera reserva exitosa |
| Abandono | Drop-off por paso del funnel de reserva |
| Errores | Tasa de fallos de pago y de check-in |
| Satisfacción | CSAT post-sesión; NPS trimestral |
| CES | Esfuerzo percibido para re-reservar la misma cocina |
| Ingresos | Take rate + suscripciones membresía |
| Costes operativos | Coste soporte / reserva completada |
| Accesibilidad | 0 issues críticos AA en flujos core (auditoría automatizada + manual) |
| Rendimiento | LCP < 2,5 s en 4G mediano en listado y ficha |
Roles del producto
| Rol | Descripción |
|---|---|
| Cocinero | Reserva y usa cocinas |
| Operador | Publica y gestiona un espacio (o varios) |
| Admin COMAL | Moderación, soporte L2, verificación de listados (fuera de UI MVP detallada) |
02-ux-research-strategy.md
Abrir documento02 — Investigación UX y estrategia · COMAL
Nota metodológica: No se realizó investigación primaria en esta ejecución. Los perfiles, JTBD y journeys son constructos de diseño basados en supuestos documentados. Antes de implementar, validar con entrevistas y observación en cocinas compartidas reales.
6.1 Stakeholders
| Stakeholder | Influencia | Interés | Necesidades | Riesgos | Relación |
|---|---|---|---|---|---|
| Product Owner COMAL | Alta | Alta | PMF, ingresos, marca | Scope creep | Propietario |
| Cocinero emprendedor | Media | Alta | Reserva fiable, precio claro | Abandono si fricción | Usuario principal |
| Operador de cocina | Alta (oferta) | Alta | Ocupación, cobro, menos soporte | Churn si take rate alto | Usuario + partner |
| Soporte COMAL | Media | Media | Casos claros, herramientas | Colapso en disputas | Operador interno |
| Legal / Compliance | Alta | Media | RGPD, términos, disclaimers sanitarios | Multas, reputación | Gatekeeper |
| Seguridad / Seguridad de pago | Alta | Media | PCI, fraude, acceso físico | Incidentes | Gatekeeper |
| PSP (Stripe) | Media | Baja | Integración correcta | Downtime pagos | Dependencia |
| Autoridad sanitaria (local) | Alta situacional | Baja | Cumplimiento locales | Cierre de cocina listada | Externo / regulador |
| Cliente final del cocinero | Baja | Baja | Inocuidad alimentaria | Daño reputacional cascada | Indirecto |
6.2 Perfiles de usuario
Perfil 1 — Lucía “Food truck” (Cocinera)
| Campo | Detalle |
|---|---|
| Rol | Emprendedora gastronómica, food truck de tacos |
| Edad | 32 |
| Contexto | Produce 3–4 días/semana; no tiene local propio; necesita cocina con freidora y abatidor |
| Experiencia digital | Media-alta (apps de delivery, Instagram, banca móvil) |
| Motivaciones | Cumplir normativa; escalar pedidos sin mudarse a un local fijo |
| Necesidades | Franjas predecibles, freidora industrial, parking cercano, factura |
| Objetivos | Reservar 12–16 h/semana fijas + puntuales de pico |
| Frustraciones | WhatsApp sin respuesta; cocinas que “no tienen lo que prometen” |
| Limitaciones | Presupuesto ajustado; madrugones; no puede perder un sábado de evento |
| Comportamientos | Reserva en el móvil entre servicios; relee políticas de cancelación |
| Dispositivos | iPhone 13; a veces portátil en casa |
| Entorno de uso | Móvil con grasa en las manos (guantes o toallitas); conexión 4G |
| Accesibilidad | Prefiere botones grandes; contraste alto en exterior soleado |
| Cita | «Si no puedo confirmar la freidora, no reservo.» |
| Escenario | Jueves 22:00: ve pico de pedidos para el sábado y necesita 6 h extras el viernes 05:00–11:00 |
Perfil 2 — Marcos “Pastelería B2B” (Cocinero)
| Campo | Detalle |
|---|---|
| Rol | Pastelero casero profesionalizando venta a cafeterías |
| Edad | 41 |
| Contexto | Horarios nocturnos; necesita horno de convección y obrador limpio |
| Experiencia digital | Media |
| Motivaciones | Legalizar producción; dejar de cocinar en casa |
| Necesidades | Silencio nocturno permitido; almacenamiento en frío opcional; membresía |
| Objetivos | Turno fijo martes y jueves 22:00–04:00 |
| Frustraciones | Contratos rígidos de 20 h mínimas; depósitos opacos |
| Limitaciones | Poca paciencia con jerga tech; prefiere español claro |
| Dispositivos | Android mid-range; Chrome |
| Entorno | Casa por la noche; tablet del hijo a veces |
| Accesibilidad | Lectura de 16px mínimo; evita captchas difíciles |
| Cita | «Dime el precio final con IVA y ya.» |
| Escenario | Quiere membresía “Nocturna” y bloquear franjas recurrentes |
Perfil 3 — Elena “Kitchen Hub” (Operadora)
| Campo | Detalle |
|---|---|
| Rol | Gestora de cocina compartida de 4 estaciones en polígono industrial |
| Edad | 38 |
| Contexto | Gestiona limpieza, llaves, turnos y cobros; tiene un empleado a media jornada |
| Experiencia digital | Alta (Excel, TPV, email) |
| Motivaciones | Subir ocupación del 45 % al 70 %; menos mensajes a las 23:00 |
| Necesidades | Calendario unificado; check-in; reportes de ingresos; bloqueos por mantenimiento |
| Objetivos | Menos no-shows; facturación automática |
| Frustraciones | Doble reserva por error humano; pagos en efectivo |
| Dispositivos | MacBook + iPad en recepción |
| Entorno | Oficina del local; ruido de extractores |
| Accesibilidad | Ninguna especial |
| Cita | «Si el sistema no me dice quién entra a las 6, no me sirve.» |
| Escenario | Lunes 08:00: revisa ocupación de la semana y bloquea estación 2 por avería del horno |
Perfil 4 — Andrés “Soporte COMAL” (secundario)
| Campo | Detalle |
|---|---|
| Rol | Agente de soporte L1 |
| Contexto | Resuelve disputas de cancelación y fallos de check-in |
| Necesidades | Timeline de reserva, logs de pago, estado de acceso |
| Cita | «Necesito el ID de reserva y el estado del pago en una pantalla.» |
6.3 Jobs To Be Done
JTBD 1 — Cocinero, reserva puntual
Cuando me sale un pedido grande o un evento, quiero asegurar una cocina certificada con el equipo que necesito en una franja concreta, para poder producir sin incumplir la normativa ni improvisar a última hora.
| Dimensión | Detalle |
|---|---|
| Funcional | Encontrar y pagar franja con equipo X |
| Emocional | Reducir ansiedad de “no tener dónde cocinar” |
| Social | Ser percibido como profesional serio ante clientes B2B |
| Disparador | Pico de demanda o inspección pendiente |
| Resultado | Confirmación + acceso el día D |
| Barreras | Precio, distancia, desconfianza limpieza |
| Alternativas | WhatsApp a conocidos; cocinar en casa (ilegal en muchos casos) |
JTBD 2 — Cocinero, hábito recurrente
Cuando ya sé mis días de producción, quiero fijar turnos recurrentes con descuento de membresía, para planificar stock y personal sin renegociar cada semana.
JTBD 3 — Operador, ocupación
Cuando abro la semana, quiero ver huecos y cobros pendientes de un vistazo, para llenar franjas y cobrar sin perseguir a nadie.
6.4 Historias de usuario (por épicas)
Épica A — Descubrimiento y ficha
| ID | Historia | Prioridad | MoSCoW |
|---|---|---|---|
| A1 | Como cocinero, quiero filtrar cocinas por ciudad, precio/h y equipo, para acotar opciones útiles | Alta | Must |
| A2 | Como cocinero, quiero ver certificaciones y fotos reales, para confiar antes de pagar | Alta | Must |
| A3 | Como cocinero, quiero leer la política de cancelación en la ficha, para evitar sorpresas | Alta | Must |
A1 — Criterios de aceptación
- Filtros: ciudad/barrio, rango €/h, equipos (multi-select), franja horaria, valoración mínima.
- Resultados actualizan en < 1 s percibido o muestran skeleton.
- Contador de resultados visible.
- Sin resultados → empty state con sugerencia de ampliar filtros.
Dependencias: catálogo de equipos normalizado.
Errores: fallo de red → reintentar.
Métrica: CTR ficha desde listado.
Épica B — Reserva y pago
| ID | Historia | Prioridad | MoSCoW |
|---|---|---|---|
| B1 | Como cocinero, quiero elegir fecha y franjas de 1 h, para reservar solo lo necesario | Alta | Must |
| B2 | Como cocinero, quiero ver precio desglosado (base, tasas, descuento membresía), para pagar con claridad | Alta | Must |
| B3 | Como cocinero, quiero pagar con tarjeta y recibir confirmación, para tener comprobante | Alta | Must |
| B4 | Como cocinero, quiero cancelar según política, para recuperar parte del importe si aplica | Media | Should |
B1 — Criterios de aceptación
- Slots de 1 h; selección continua (no huecos en medio en la misma reserva).
- Slots ocupados deshabilitados con razón tooltip (“Reservado” / “Bloqueado”).
- Mínimo 2 h por reserva (configurable por cocina) — decisión de diseño.
- Zona horaria Europe/Madrid explícita.
Épica C — Check-in y sesión
| ID | Historia | Prioridad | MoSCoW |
|---|---|---|---|
| C1 | Como cocinero, quiero un código QR/PIN el día de la reserva, para acceder sin llaves físicas | Alta | Must |
| C2 | Como cocinero, quiero un checklist de salida, para dejar constancia de limpieza | Media | Should |
Épica D — Operador
| ID | Historia | Prioridad | MoSCoW |
|---|---|---|---|
| D1 | Como operador, quiero ver el calendario del día por estación, para anticipar llegadas | Alta | Must |
| D2 | Como operador, quiero bloquear franjas por mantenimiento, para evitar reservas inválidas | Alta | Must |
| D3 | Como operador, quiero exportar ingresos del mes, para contabilidad | Media | Should |
Épica E — Cuenta y membresía
| ID | Historia | Prioridad | MoSCoW |
|---|---|---|---|
| E1 | Como cocinero, quiero registrarme con email, para guardar reservas | Alta | Must |
| E2 | Como cocinero, quiero contratar plan “Base” o “Pro”, para descuentos y prioridad | Media | Should |
| E3 | Como usuario, quiero exportar/borrar mis datos, para ejercer derechos RGPD | Alta | Must |
Won’t have por ahora
- Reservas de personal de cocina.
- Chat in-app entre cocinero y operador (usar email/teléfono del listado).
- IA de sugerencia de horarios.
6.5 Journey map — Lucía: primera reserva de emergencia
| Fase | Acciones | Pensamientos | Emociones | Touchpoints | Problemas | Oportunidades | Métricas | Responsable |
|---|---|---|---|---|---|---|---|---|
| Descubrimiento | Busca “cocina compartida Madrid” / ve anuncio | “¿Será fiable?” | Escepticismo | SEO, ads, IG | Marca desconocida | Prueba social en landing | CTR landing | Growth |
| Exploración | Filtra freidora + mañana | “¿Hay hueco viernes?” | Urgencia | Listado PWA | Filtros confusos | Chips de equipo claros | Filtros usados | Product |
| Evaluación | Abre ficha, lee reviews | “¿Está limpia?” | Duda | Ficha | Fotos stock | Fotos reales + cert. | Tiempo en ficha | Design |
| Reserva | Elige 05–11, ve precio | “Es caro pero no hay otra” | Tensión | Calendario | Precio sorpresa | Desglose transparente | Inicio checkout | Product |
| Pago | Paga con tarjeta | “Que no falle” | Ansiedad | Stripe sheet | Error tarjeta | Reintento + soporte | Pago OK % | Eng |
| Confirmación | Guarda PDF/ICS | “Listo” | Alivio | Email + app | Email spam | Push/PWA | Open rate | Ops |
| Uso | Check-in 04:55 | “¿Funciona el PIN?” | Nervios | QR/PIN | WiFi del local | PIN offline-capable | Check-in OK | Ops |
| Cierre | Checklist + valora | “Volveré si OK” | Calma | App | Olvida valorar | Recordatorio 2 h | CSAT | Product |
6.6 Service blueprint (reserva completada)
| Capa | Elementos |
|---|---|
| Acciones usuario | Busca → reserva → paga → llega → check-in → cocina → checkout checklist |
| Frontstage | PWA, email confirmación, pantalla check-in, cartel con WiFi del local |
| Backstage | Matching inventario slots, motor precios, webhooks Stripe, generación PIN |
| Sistemas | API COMAL, Postgres, Redis locks, Stripe, Twilio/email, (opcional) cerradura smart |
| Soporte | Limpieza programada, operador en recepción, soporte COMAL L1 |
| Evidencias | Factura PDF, ICS, log check-in, fotos checklist |
| Fallos | Doble booking (race), pago capturado sin slot, PIN inválido, no-show |
| Recuperación | Lock optimista + idempotency keys; reembolso automático si fallo post-pago; PIN de respaldo operador; política no-show |
Decisiones de investigación pendientes (reales)
- Entrevistas con 8–12 cocineros y 5 operadores en ciudad piloto.
- Shadowing de un día de cocina compartida.
- Benchmark de comisiones y precios/h de mercado local.
- Prueba de usabilidad del flujo de reserva (5 usuarios).
03-information-architecture.md
Abrir documento03 — Arquitectura de información · COMAL
Mapa del sitio
PÚBLICO
├── / Landing marketing
├── /como-funciona
├── /precios
├── /para-operadores
├── /cocinas Explorar (listado)
│ └── /cocinas/:slug Ficha cocina
├── /entrar
├── /registro
└── /legal
├── privacidad
├── terminos
└── cookies
APP COCINERO (auth)
├── /app Redirect → explorar o home
├── /app/explorar
├── /app/cocinas/:id
├── /app/reservar/:id Flujo reserva
├── /app/reservas Mis reservas
│ └── /app/reservas/:id Detalle + check-in
├── /app/membresia
├── /app/perfil
│ ├── datos
│ ├── pagos
│ ├── notificaciones
│ └── privacidad
└── /app/soporte
APP OPERADOR (auth + rol)
├── /ops Dashboard día
├── /ops/calendario
├── /ops/estaciones
├── /ops/precios
├── /ops/bloqueos
├── /ops/reservas
├── /ops/checkin
├── /ops/ingresos
└── /ops/configuracion
Navegación
Principal (cocinero, bottom nav móvil)
| Tab | Destino | Icono conceptual |
|---|---|---|
| Explorar | Listado | Brújula / grid |
| Reservas | Mis reservas | Calendario |
| Acceso | Check-in activo o próximo | QR |
| Perfil | Cuenta | Usuario |
Principal (operador, sidebar desktop)
Dashboard · Calendario · Reservas · Estaciones · Ingresos · Configuración
Secundaria
- Filtros en explorar (sheet / sidebar)
- Breadcrumbs en desktop: Explorar / Cocina X / Reservar
Contextual
- CTA “Reservar” sticky en ficha
- Acciones en reserva: cancelar, añadir al calendario, contactar operador
Búsqueda
- Texto libre: nombre de cocina, barrio
- Filtros facetados: equipo, €/h, horario, valoración, certificados
Taxonomías
Equipos (catálogo cerrado)
Horno convección · Freidora · Plancha · Fogones · Abatidor · Cámara frigorífica · Obrador pastelería · Empaquetado · Lavavajillas industrial · Campana extractora
Certificaciones (etiquetas)
Registro sanitario · Formación manipuladores · Seguro RC · Acceso 24h · Parking · Zona carga
Tipos de espacio
Estación individual · Cocina completa · Obrador · Solo packaging
Inventario de contenido
| Tipo | Propietario | Estado | Prioridad | Frecuencia | Visibilidad |
|---|---|---|---|---|---|
| Ficha cocina | Operador | Publicado | P0 | Semanal | Público |
| Fotos | Operador | Moderado | P0 | Mensual | Público |
| Certificados | Operador | Verificado light | P0 | Anual | Público (estado) / detalle privado |
| Franjas/slots | Sistema | Live | P0 | Continuo | Auth para reservar |
| Reseñas | Cocinero | Publicado | P1 | Post-uso | Público |
| Políticas | Operador + COMAL | Publicado | P0 | Raro | Público |
| FAQ | COMAL | Publicado | P1 | Trimestral | Público |
| Facturas | Sistema | Generado | P0 | Por pago | Privado dueño |
Matriz de permisos
| Módulo | Cocinero V | Cocinero C | Cocinero E | Cocinero D | Operador V | Operador C/E | Operador Aprobar | Admin |
|---|---|---|---|---|---|---|---|---|
| Listado público | ✓ | — | — | — | ✓ | — | — | ✓ |
| Ficha | ✓ | — | — | — | ✓ | ✓ propia | — | ✓ |
| Reserva propia | ✓ | ✓ | ✓ cancel | ✓ soft | ✓ de su local | — | ✓ no-show | ✓ |
| Check-in | ✓ propio | — | — | — | ✓ | forzar | — | ✓ |
| Calendario ops | — | — | — | — | ✓ | ✓ | — | ✓ |
| Precios ops | — | — | — | — | ✓ | ✓ | — | ✓ |
| Ingresos | — | — | — | — | ✓ propios | — | — | ✓ |
| Membresía | ✓ | ✓ | ✓ | cancel | — | — | — | ✓ |
| Export datos | ✓ propios | — | — | cuenta | ✓ local | — | — | ✓ |
| Usuarios | — | — | — | — | staff local | invitar | — | ✓ |
Leyenda: V=Ver C=Crear E=Editar D=Eliminar
04-user-flows.md
Abrir documento04 — Flujos de usuario · COMAL
Convenciones
- TZ: Europe/Madrid
- Slot: 1 hora; reserva mínima configurable (default 2 h)
- Idempotencia:
Idempotency-Keyen pago y creación de reserva
F1 — Descubrimiento → Landing → Explorar
| Entrada | SEO, ads, link compartido, / |
| Pasos | Ver hero → CTA Explorar → Listado con geo default ciudad |
| Resultado | Usuario en explorar (auth opcional para ver precios completos: decisión — precios visibles sin auth) |
| Analytics | landing_view, cta_explore_click |
F2 — Registro / Login
Registro
- Email + contraseña (min 10 chars) o Google OAuth
- Nombre y teléfono
- Rol inicial: Cocinero (default) u Operador (ruta separada)
- Aceptación términos + privacidad
- Verificación email (magic link)
- Onboarding: ciudad, equipos frecuentes, aviso legal producción
Errores: email en uso, contraseña débil, OAuth cancelado
Recuperación: mensaje + link a login
Login
Email/password o Google · “Recordarme” · link olvidé contraseña
Recuperación contraseña
Email → link 30 min → nueva contraseña → sesión invalidada en otros dispositivos
Analytics: sign_up, login, password_reset_request
F3 — Explorar y filtrar
- Listado ordenado por distancia o relevancia
- Abrir filtros → aplicar chips equipo / precio / horario
- Vacío → empty state
- Tap en card → ficha
Estados: loading skeleton, error red, empty, resultados
Analytics: search_filter_apply, listing_impression, listing_click
F4 — Reserva end-to-end (crítico)
Ficha → Reservar → Fecha → Slots → Resumen → Pago → Confirmación
| Paso | UI | Reglas |
|---|---|---|
| Fecha | Calendario 14–60 días vista | No pasado; lead time min 2 h |
| Slots | Grid horas | Solo disponibles; selección contigua |
| Resumen | Cocina, estación, horas, € | Desglose IVA, descuento membresía |
| Pago | Stripe Payment Element | 3DS si aplica |
| OK | ID reserva, ICS, QR preview | Email + push opcional |
Decisiones en branch:
- Slot se ocupa entre resumen y pago → error “ya no disponible” + reembolso si cargo
- Pago falla → reintentar; no crear reserva
- Usuario cierra → carrito no persistente (slots no hold largos); hold 10 min opcional v1.1
Analytics: booking_start, slot_select, checkout_start, payment_success|fail, booking_confirmed
F5 — Check-in
- Desde Mis reservas o tab Acceso
- Ventana: desde 15 min antes hasta fin de franja
- Muestra QR + PIN de 6 dígitos
- Operador escanea o introduce PIN en /ops/checkin
- Estado → “En curso”
Offline: PIN visible si reserva cacheada; validación operador puede ser manual
Error: fuera de ventana; reserva cancelada; PIN revocado
F6 — Cancelación
- Detalle reserva → Cancelar
- Mostrar política y importe reembolsable
- Confirmar
- Reembolso Stripe (parcial/total) async
- Slot liberado
Analytics: booking_cancel, refund_initiated
F7 — Membresía
Planes:
- Sin plan: pay-as-you-go
- Base (29€/mes): 10 % dto, soporte prioritario
- Pro (59€/mes): 15 % dto, hold prioritario, 1 cancelación flexible/mes
Flujo: ver planes → Stripe Subscription → badge en UI
F8 — Operador: bloqueo y dashboard
- Login rol operador
- Dashboard: estaciones del día, llegadas, ocupación %
- Bloquear franja: motivo + rango
- Slots dejan de venderse
Estados de UI transversales
| Estado | Comportamiento |
|---|---|
| Empty listado | Ilustración industrial + “Ampliar zona o quitar filtros” |
| Loading | Skeletons, no spinners de página completa en móvil |
| Error red | Banner + Reintentar |
| Validación | Inline bajo campo, aria-invalid |
| 403 | “No tienes acceso” + volver |
| Sesión expirada | Modal → re-login, preservar deep link |
| Sin resultados | Empty específico |
| Pago parcial | No aplica (all-or-nothing) |
| Destructivo | Modal confirmación cancelar/borrar cuenta |
| Undo | Toast 5 s solo en favoritos (no en pagos) |
Eventos analíticos (lista maestra)
Ver 12-analytics.md.
05-data-model.md
Abrir documento05 — Modelo de datos · COMAL
Diagrama ER simplificado
User 1──* Membership
User 1──* Booking
User *──* Kitchen (via KitchenStaff for operators)
Kitchen 1──* Station
Kitchen 1──* KitchenEquipment
Kitchen 1──* KitchenCertification
Station 1──* SlotLock / AvailabilityRule
Booking *──1 Station
Booking 1──1 Payment
Booking 1──0..1 CheckIn
Booking 1──0..1 Review
Booking 1──0..* BookingEvent (audit)
Entidades principales
User
| Campo | Tipo | Notas |
|---|---|---|
| id | uuid PK | |
| citext unique | ||
| password_hash | text null | null si solo OAuth |
| name | text | |
| phone | text null | E.164 |
| role_default | enum | cook, operator, admin |
| locale | text | es-ES |
| created_at / updated_at | timestamptz | |
| deleted_at | timestamptz null | soft delete |
Kitchen
| Campo | Tipo | Notas |
|---|---|---|
| id | uuid PK | |
| slug | text unique | |
| name | text | |
| description | text | |
| address_line / city / postal / country | text | |
| lat / lng | numeric | índice geo |
| timezone | text | Europe/Madrid |
| base_price_cents | int | por hora |
| min_hours | int | default 2 |
| cancellation_policy | jsonb | |
| status | enum | draft, published, suspended |
| owner_user_id | uuid FK |
Station
| Campo | Tipo |
|---|---|
| id | uuid |
| kitchen_id | uuid FK |
| name | text |
| capacity_notes | text |
| is_active | bool |
Equipment (catálogo) + KitchenEquipment (M2M)
code, label_es, icon_key
Certification
type, issuer, valid_until, document_url, verification_status
Booking
| Campo | Tipo | Notas |
|---|---|---|
| id | uuid | |
| public_code | text | COM-XXXX human |
| cook_user_id | uuid | |
| station_id | uuid | |
| starts_at / ends_at | timestamptz | exclusion constraint |
| status | enum | pending_payment, confirmed, checked_in, completed, cancelled, no_show |
| price_breakdown | jsonb | |
| total_cents | int | |
| currency | char(3) | EUR |
| hold_expires_at | timestamptz null | |
| cancelled_at | timestamptz null |
Constraint: EXCLUDE USING gist (station_id WITH =, tstzrange(starts_at, ends_at) WITH &&) WHERE (status IN ('confirmed','checked_in','completed','pending_payment'))
Payment
provider, provider_ref, amount_cents, status, raw_events jsonb
CheckIn
booking_id, method (qr|pin|manual), pin_hash, checked_in_at, checked_in_by
Membership
user_id, plan (base|pro), stripe_subscription_id, status, current_period_end
Review
booking_id unique, rating 1–5, body, published
Audit / BookingEvent
booking_id, actor_id, type, payload, created_at
Índices recomendados
- bookings (cook_user_id, starts_at desc)
- bookings gist exclusion (arriba)
- kitchens (city), kitchens gist geo
- kitchens (status) where published
Privacidad y retención
| Dato | Clasificación | Retención |
|---|---|---|
| PII usuario | Personal | Hasta borrado + 30 días backup |
| Pagos | Sensible financiero | Según obligación fiscal (ES ~5–6 años refs) |
| Logs acceso | Técnico | 12 meses |
| Certificados docs | Partner | Mientras kitchen activa + 1 año |
Cifrado: TLS en tránsito; campo phone opcional encrypted at rest; documentos en bucket privado firmado.
Multitenancy
- Lógico por
kitchen_idpara operadores - Admin COMAL cross-tenant
- No shared DB por tenant en v1 (single DB, RLS por rol)
Eventos de dominio
UserRegistered KitchenPublished BookingHoldCreated BookingConfirmed PaymentCaptured BookingCancelled CheckInCompleted ReviewSubmitted MembershipStarted
06-tech-stack.md
Abrir documento06 — Stack tecnológico · COMAL
Decisión de arquitectura
PWA monorepo full-stack orientada a velocidad de MVP y operaciones de reserva con integridad temporal.
| Capa | Elección | Justificación |
|---|---|---|
| Frontend | Next.js 15 (App Router) + TypeScript | SSR landing SEO + app autenticada; PWA via serwist/next-pwa |
| UI | Tailwind CSS v4 + tokens Paper exportados | Paridad con design tokens |
| Componentes | Radix UI primitives + estilos propios | Accesibilidad de base |
| API | tRPC o Route Handlers REST | tRPC si monorepo TS puro; REST si apps móviles después |
| Auth | Auth.js (NextAuth v5) | Email magic link + Google; roles en JWT/session |
| DB | PostgreSQL (Neon) | Exclusion constraints para slots; branching previews |
| ORM | Drizzle ORM | Tipado, migraciones SQL claras |
| Cache / locks | Redis (Upstash) | Hold de slots, rate limit |
| Pagos | Stripe Checkout/PaymentIntents + Billing | PCI SAQ-A; suscripciones membresía |
| Resend | Transaccional ES templates | |
| SMS (opc.) | Twilio | Recordatorios check-in |
| Maps | Mapbox GL | Listado geo |
| Storage | S3 compatible (R2/S3) | Fotos y certificados firmados |
| Hosting | Vercel | Edge + serverless; ES region |
| Observability | Sentry + Axiom/OpenTelemetry | Errores y traces |
| Analytics | PostHog | Product analytics + feature flags |
| CI | GitHub Actions | lint, typecheck, e2e Playwright |
Por qué no X
| Alternativa | Motivo de descarte (v1) |
|---|---|
| React Native | Coste dual sin validar demanda |
| Firebase | Menos control de exclusion constraints de booking |
| Supabase Auth only | Viable; Auth.js + Neon da más control de modelo |
| MongoDB | Debil para rangos temporales concurrentes |
Integridad de reservas
- Hold en Redis 10 min (v1.1) o
pending_paymentcon TTL EXCLUDEgist en Postgres al confirmar- Webhook Stripe idempotente →
confirmed - Job de limpieza de pending expirados
Entornos
local·preview(Neon branch) ·staging·production
Estimación de equipo mínimo implementación
2 fullstack, 1 designer part-time, 1 ops/product part-time — 10–14 semanas MVP ciudad piloto.
07-creative-direction.md
Abrir documento07 — Dirección creativa · COMAL
Brief de diseño (Paper)
| Campo | Valor |
|---|---|
| Mood candidates | industrial · rusted · botanical · maritime · signage |
| Mood chosen | industrial (hormigón × naranja de seguridad) |
| Por qué no el primero instinto | El instinto “food” suele ir a cream + terracotta (cliché 2023–25). Industrial evoca cocina profesional real: señalética, extractores, turnos, no brunch lifestyle. |
| Dirección | Claridad de planta industrial con un momento de color naranja para acción; tipografía display editorial + UI técnica. |
Paleta
| Rol | Hex | Referencia de escena |
|---|---|---|
| Background | #F4F2EF | Polvo de hormigón / hueso |
| Surface | #FFFFFF | Superficie de acero limpio |
| Ink | #1A1A1A | Caucho / tinta de rotulación |
| Ink muted | #5C5955 | Acero oxidado suave |
| Ink subtle | #8A8680 | Gris de tubería |
| Border | #E0DCD6 | Junta de panel |
| Primary | #E85D04 | Naranja de seguridad / baliza |
| Primary strong | #C44D03 | Naranja quemado (pressed) |
| Primary soft | #FFF0E6 | Halo de baliza |
| Secondary | #5C6B5A | Sage de azulejo de cocina |
| Danger | #B42318 | Señal de parada |
Tipografía
| Uso | Familia | Pesos |
|---|---|---|
| Display / headlines | Fraunces | 700 |
| UI / body | IBM Plex Sans | 400–600 |
| Horas, códigos, PIN | IBM Plex Mono | 500–600 |
Escala
12 / 14 / 16 / 18 / 22 / 28 / 36 / 48 px
Line-height display ~1.15; body 1.5.
Principios visuales
- Un acento intenso (naranja) para CTAs y estados activos; el resto es neutro industrial.
- Asimetría controlada en marketing; alineación estricta en app y ops.
- Sin emojis; iconos SVG de trazo 2px.
- Precios y horas siempre legibles — nunca decoración sobre dato crítico.
- Fotos de cocina reales (placeholder oscuro en mockups) con badge VERIFICADA.
Logo wordmark
COMAL en Fraunces Bold + cuadrado naranja 1:1 a la izquierda (marca de “estación”).
Voz de marca (enlace a content guide)
Directa, profesional, sin jerga startup. Español de España claro.
08-design-system.md
Abrir documento08 — Design system · COMAL
Tokens definidos en Paper como CSS variables. Fuente de verdad: archivo Paper + este documento.
Tokens de color
--color-background: #F4F2EF;
--color-surface: #FFFFFF;
--color-ink: #1A1A1A;
--color-ink-muted: #5C5955;
--color-ink-subtle: #8A8680;
--color-border: #E0DCD6;
--color-primary: #E85D04;
--color-primary-strong: #C44D03;
--color-primary-soft: #FFF0E6;
--color-secondary: #5C6B5A;
--color-secondary-soft: #E8EDE7;
--color-danger: #B42318;
--color-danger-soft: #FEE4E2;
--color-warning: #B54708;
--color-info: #175CD3;
Espaciado
4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48 · 64 px
Radios
4 (sm) · 8 (md) · 12 (lg) · 16 (xl) · 9999 (full)
Componentes
Button
| Variante | Uso |
|---|---|
| Primary | CTA principal (bg primary, text white) |
| Secondary | Alternativa (surface + border) |
| Ghost | Texto ink, sin borde |
| Danger | Acciones destructivas |
| Disabled | opacity 0.45, no pointer |
Altura táctil mínima: 44px. Padding horizontal 18–28px.
Input
- Label 12–14px medium sobre campo
- Campo: border border, radius md, padding 12–14
- Focus: border primary 1.5–2px
- Error: border danger + texto danger
Chip / Filter
- Default: surface + border
- Selected: ink bg + white text (listado) o primary-soft + primary border (estaciones)
Card cocina
- Imagen 16:9 o altura fija ~120–140
- Badge VERIFICADA / 24H
- Título Fraunces 18
- Meta 13 muted
- Precio display alineado a la derecha
Slot hour
- Disponible: surface + border
- Selected: primary + white mono
- Occupied: border fill + subtle text, no interactive
Bottom nav (móvil)
4 tabs: Explorar · Reservas · Acceso · Perfil
Active: primary stroke + label primary
Sidebar ops
Fondo ink; item activo #2A2A2A
Status badges
| Estado | Estilo |
|---|---|
| En curso | primary-soft / primary-strong |
| Confirmada | secondary-soft / secondary |
| Bloqueada | border / muted |
| Error | danger-soft / danger |
Empty / Error
Icono en frame 64–72, título Fraunces, body muted, CTA primary + secondary link
Breakpoints
640 · 768 · 1024 · 1280
Responsive rules
| Viewport | Layout explorar |
|---|---|
| <768 | Lista vertical + chips + bottom nav |
| ≥1024 | Sidebar filtros + grid 3 cols + top nav |
Librería en Paper
Implementada en artboards: botones, chips, cards, slots, badges, nav, sidebar, empty, error, check-in dark.
09-content-guide.md
Abrir documento09 — Guía de contenido · COMAL
Voz y tono
| Atributo | Sí | No |
|---|---|---|
| Clara | “54€ por 3 horas, IVA incluido” | “¡Tu cocina soñada te espera!” |
| Profesional | “Reserva confirmada” | “¡Boom, listo chef!” |
| Honesta | “Sin reembolso con menos de 6 h” | Omitir políticas en letra pequeña |
| Local ES | “franja”, “cocina certificada” | “slot”, “ghost kitchen” sin explicar |
Principios UX writing
- Acción primero en botones: “Reservar franja”, no “Continuar”.
- Consecuencia visible en destructivos: “Cancelar reserva (reembolso 50%)”.
- Errores con salida: qué pasó + qué hacer + contacto.
- Números y horas en formato ES: 31 jul 2026 · 05:00–08:00 · 54,00 €.
- Zona horaria explícita en selección de franjas (Europe/Madrid).
Microcopy clave
| Contexto | Copy |
|---|---|
| CTA landing | Explorar cocinas |
| CTA ficha | Reservar franja |
| Checkout | Continuar al pago |
| Éxito | Reserva confirmada |
| Empty | Sin cocinas con esos filtros |
| Pago fail | No pudimos completar el pago |
| Check-in | Acceso activo · ventana abierta |
| PIN | PIN de respaldo |
| Ops block | + Bloquear franja |
Terminología
| Usar | Evitar |
|---|---|
| Cocina / estación | Kitchen unit (sin traducir) |
| Franja | Slot (en UI) |
| Cocinero | Usuario final genérico |
| Operador | Host / landlord |
| Verificada | “Premium trust” |
| Membresía | Subscription (en UI) |
Legal en UI (no es asesoramiento legal)
- Disclaimer en ficha: el operador declara la veracidad de certificados.
- COMAL no otorga licencia sanitaria al cocinero.
- Enlace a términos y privacidad en registro y pie.
10-accessibility.md
Abrir documento10 — Accesibilidad · COMAL
Objetivo: WCAG 2.2 nivel AA en flujos críticos (explorar, reservar, pagar, check-in, ops dashboard).
Auditoría de diseño (checklist)
| Criterio | Estado diseño | Notas |
|---|---|---|
| Contraste texto ink sobre background | OK | ~15:1 |
| Contraste texto white sobre primary | OK | naranja #E85D04 + white verificar ≥4.5 (ajustar a primary-strong en labels pequeños si hace falta) |
| Contraste muted 14px+ | Revisar en QA | ink-muted sobre surface |
| Target size ≥24px (2.2) / prefer 44px táctil | OK en CTAs y nav | |
| Focus visible | Especificado | anillo 2px primary |
| Orden de foco lógico | Especificado en handoff | |
| Labels en inputs | Sí | |
| Errores asociados al campo | Sí | aria-describedby |
| No solo color en slots | Sí | leyenda + relleno |
| Texto en imágenes | Evitado | badges como texto real |
| Motion | Reducir en prefers-reduced-motion | |
| Idioma | lang="es" | |
| Skip link | Desktop app | “Saltar al contenido” |
Hallazgos y correcciones en esta entrega
- Primary sobre soft backgrounds — chips de equipo usan secondary-soft + secondary para no depender solo de naranja.
- Check-in dark mode — PIN en mono grande 36px; contraste white/ink OK.
- Estados ocupados — no solo gris: deshabilitados + leyenda.
- Pendiente QA real — axe-core + prueba teclado + VoiceOver en iOS Safari PWA.
Riesgos
- Mapas: proporcionar lista equivalente.
- QR: siempre PIN alternativo (cumplido en diseño).
- PDF facturas: generar etiquetados en implementación.
No se declara cumplimiento legal definitivo — solo intención de diseño AA.
11-privacy-security.md
Abrir documento11 — Privacidad y seguridad · COMAL
No constituye asesoramiento legal. Revisar con counsel antes de lanzamiento.
Datos personales tratados
| Dato | Base (hipótesis) | Finalidad |
|---|---|---|
| Email, nombre | Contrato | Cuenta |
| Teléfono | Contrato / interés legítimo recordatorios | Check-in, soporte |
| Ubicación aproximada | Consentimiento | Distancia a cocinas |
| Pagos | Contrato | Stripe como encargado |
| Logs de acceso | Interés legítimo seguridad | Fraude, incidentes |
| Reseñas | Contrato | Confianza marketplace |
Principios
- Minimización: no pedir NIF en v1 salvo facturación empresa.
- PSP: Stripe — no almacenar PAN.
- Cifrado en tránsito TLS 1.2+.
- Secretos en vault / env, no en repo.
- RLS o checks de autorización por
kitchen_idyuser_id. - Soft delete + derecho de supresión (export + delete account).
- Retención de facturas según obligación fiscal.
Amenazas y controles
| Amenaza | Control |
|---|---|
| Doble booking | Exclusion constraint + locks |
| Enumeración de reservas ajenas | AuthZ en API |
| Scraping de listados | Rate limit |
| Fraude de pago | Stripe Radar, 3DS |
| PIN filtrado | PIN de un solo uso por reserva, hash at rest |
| Subida de malware en certificados | MIME allowlist, scan, bucket privado |
| XSS | React escape + CSP |
| CSRF | SameSite + tokens en mutaciones cookie |
Roles y acceso físico
COMAL no garantiza cerraduras smart en v1; el check-in puede ser validación humana. Documentar responsabilidad del operador.
Cookies
- Esenciales sesión
- Analytics (PostHog) con consentimiento si no estrictamente necesarias
- Banner ES conforme ePrivacy (implementación)
Incidentes
Runbook: detectar → contener → notificar DPO/usuarios si alto riesgo (72h AEPD si aplica).
12-analytics.md
Abrir documento12 — Plan analítico · COMAL
Herramienta recomendada: PostHog (product) + Stripe (revenue) + Sentry (errors).
North Star
Horas de cocina confirmadas y completadas / semana
Funnel principal
landing_view → cta_explore_click → listing_view → listing_click
→ kitchen_view → booking_start → slot_select → checkout_start
→ payment_success → booking_confirmed → checkin_complete → review_submit
Eventos
| Evento | Props clave |
|---|---|
landing_view | utm_*, city |
sign_up | method |
login | method |
search_filter_apply | filters[] |
listing_impression | kitchen_id, position |
kitchen_view | kitchen_id |
booking_start | kitchen_id, station_id |
slot_select | hours, start |
checkout_start | total_cents |
payment_success / payment_fail | reason |
booking_confirmed | booking_id, hours |
booking_cancel | refund_cents |
checkin_complete | method |
membership_start | plan |
ops_block_created | station_id |
KPIs semanales
- Activation rate (1ª reserva ≤7d)
- Checkout conversion
- Completed kitchen-hours
- No-show rate
- Operator occupancy %
- CSAT post-sesión
Privacidad analytics
IP truncada; no PII en props; opt-out en ajustes.
13-qa-test-plan.md
Abrir documento13 — Plan y casos de prueba · COMAL
Alcance MVP
Flujos: registro, explorar, reserva+pago, cancelación, check-in, ops bloqueo, membresía básica.
Tipos
| Tipo | Herramienta |
|---|---|
| Unit | Vitest |
| Integration API | Vitest + test DB Neon branch |
| E2E | Playwright |
| A11y | axe + manual teclado |
| Pago | Stripe test clocks |
| Carga | k6 en hold/confirm (smoke) |
Casos prioritarios
| ID | Caso | Esperado |
|---|---|---|
| TC01 | Registro email válido | Cuenta + mail verificación |
| TC02 | Filtro freidora sin resultados | Empty state |
| TC03 | Selección 3h contiguas | Total 3×precio |
| TC04 | Slot se ocupa en checkout | Error + no cargo / refund |
| TC05 | Pago 3DS OK | booking confirmed |
| TC06 | Pago fail | Hold permanece, reintento |
| TC07 | Cancelación >24h | 100% refund |
| TC08 | Check-in fuera de ventana | Bloqueado |
| TC09 | Check-in PIN correcto | checked_in |
| TC10 | Ops bloquea franja | No vendible |
| TC11 | Usuario A no ve reserva B | 403 |
| TC12 | WCAG teclado reserva | Completable sin ratón |
Criterios de salida a staging
- 0 P0 abiertos
- Pago y booking race cubiertos
- Lighthouse a11y ≥ 90 en ficha y checkout
14-dev-handoff.md
Abrir documento14 — Handoff de diseño (UX/UI) · COMAL
Alcance actual: entrega de producto, UX y UI de alta fidelidad.
Fuera de alcance ahora: implementación de código, repos de app o pipelines.
Referencias
| Recurso | Ubicación |
|---|---|
| Paper hi-fi | https://app.paper.design/file/01KYX2GFM9EGHF4EG0AQZJPZ5G |
| File ID | 01KYX2GFM9EGHF4EG0AQZJPZ5G |
| Inventario artboards | 00-paper-reference.md (35 pantallas) |
| Definición producto | 01-project-definition.md |
| Flujos | 04-user-flows.md |
| Interacciones | 16-interaction-specs.md |
| Datos (orientativo) | 05-data-model.md |
| Stack recomendado (futuro) | 06-tech-stack.md |
| Tokens | Paper + 08-design-system.md |
| Contenido | 09-content-guide.md |
| Accesibilidad | 10-accessibility.md |
Artboards entregados (35 — completos en Paper)
Marketing: Landing cocineros · Landing operadores
Auth: Login · Registro · Recuperar contraseña · Email enviado · Validación error · Sesión expirada
Cocinero: Onboarding · Explorar m/d · Ficha · Reserva · Sin huecos · Checkout · Confirmación · Mis reservas · Empty reservas · Detalle · Cancelar · Check-in · Perfil · Planes · Notificaciones · Facturas
Estados: Empty filtros · Loading · Error pago · Error red
Operador: Dashboard · Calendario · Bloquear franja · Precios/estaciones · Check-in recepción (tablet)
Sistema: Design System
Especificaciones de interacción (resumen)
| Elemento | Comportamiento |
|---|---|
| Slot select | Contiguo; mínimo 2 h |
| Hold pago | Countdown en pantalla error |
| Sticky CTA ficha | fixed bottom + safe-area |
| Bottom nav | Explorar · Reservas · Acceso · Perfil |
| Filtros mobile | bottom sheet |
| Ops | filas ≥48px; badges de estado |
Detalle completo: 16-interaction-specs.md.
Cuando se implemente (futuro)
- Exportar desde Paper (
get_jsx/ computed styles), no desde capturas. - Orden sugerido: Auth → Catálogo → Booking → Check-in → Ops → Membresía.
- DoD por pantalla: tokens, empty/loading/error, a11y, analytics, e2e.
Definition of Done — entrega UX/UI (esta fase)
- Flujo cocinero end-to-end en hi-fi
- Flujo operador principal en hi-fi
- Auth + recuperación + onboarding
- Cancelación, membresía, facturas, notificaciones
- Estados empty, loading, error, red, sesión, sin huecos
- Responsive mobile + desktop + tablet ops
- Design system en Paper
- 35 artboards con contenido en Paper
- Documentación de producto y UX
- Spec de interacciones + mapa de prototipo
- Auditoría de completitud
15-roadmap.md
Abrir documento15 — Roadmap · COMAL
Fase 0 — Foundation (2–3 sem)
- Design system en código
- Auth, layout PWA shell
- CI, entornos Neon
Fase 1 — MVP ciudad piloto (8–10 sem)
- Listado + ficha + reserva + pago
- Check-in PIN
- Ops: calendario día, bloqueos, listado reservas
- Emails transaccionales
- 10–20 cocinas onboarded concierge
Fase 2 — Retención (4–6 sem)
- Membresías Stripe Billing
- Reseñas
- Reservas recurrentes
- Hold de slots + mejor race handling
- CSAT in-app
Fase 3 — Escala (6–8 sem)
- Multi-ciudad
- Cerraduras smart (partner)
- App nativa si métricas PWA lo justifican
- Facturación avanzada operadores
- Programa referidos
Métricas de go/no-go entre fases
| De → A | Condición |
|---|---|
| 1 → 2 | ≥ 200 completed kitchen-hours / mes; no-show < 12% |
| 2 → 3 | Retención D30 cocineros ≥ 40%; ≥ 2 ciudades con waitlist operadores |
16-interaction-specs.md
Abrir documento16 — Especificación de interacciones · COMAL
Documento de prototipo / comportamiento UI. Sin implementación de código en esta entrega: sirve como especificación para diseño y futuro desarrollo.
Mapa de pantallas y navegación
Landing ──► Explorar ──► Ficha ──► Reserva (slots) ──► Checkout ──► Confirmación ──► Check-in
│ │ │
│ │ └── (auth gate si no sesión) → Login / Registro → Onboarding → vuelve
│ └── Empty | Loading
└── Login / Registro
Bottom nav (auth): Explorar | Reservas | Acceso | Perfil
Ops sidebar: Dashboard | Calendario | Reservas | Estaciones | Ingresos | Config
Transiciones y microinteracciones
| Elemento | Interacción | Detalle |
|---|---|---|
| CTA primary | Press | Fondo → primary-strong; scale 0.98 opcional 100ms |
| Chip filtro | Toggle | Active: ink bg + white; multi-select equipos |
| Slot hora | Select | Solo contiguos; al romper contigüidad se reinicia o se extiende el rango |
| Sticky CTA ficha | Fixed | Safe-area bottom; no tapa contenido (padding-bottom lista) |
| Bottom sheet filtros (móvil) | Drag | Backdrop 40% ink; dismiss swipe down |
| Modal cancelación | Confirm | 2 botones: Cancelar reserva (danger) / Volver |
| Hold pago | Countdown | Visible en error pago; al 00:00 liberar slot y mensaje |
| Check-in QR | Fullscreen dark | Brightness note en copy; PIN siempre visible |
| Skeleton loading | Pulse | Opacity 0.6↔1, 1.2s, prefers-reduced-motion = static |
| Toast éxito | 4s | Bottom, no bloquea nav |
| Ops bloqueo | Click franja | Side panel o modal: motivo + rango + guardar |
Gestos móviles
- Pull-to-refresh en Explorar y Mis reservas
- Swipe back en iOS/Android nativo web (browser)
- No swipe-to-delete en reservas (evitar accidente); cancelar solo en detalle
Validaciones en UI
| Campo | Regla visual |
|---|---|
| Formato; error inline rojo | |
| Contraseña | Min 10; meter strength opcional v1.1 |
| Teléfono | Máscara ES +34 |
| Slots | Min 2 h (mensaje si 1 sola hora) |
| Términos | Checkbox required; CTA disabled hasta check |
Estados por pantalla (matriz)
| Pantalla | Default | Loading | Empty | Error | Success |
|---|---|---|---|---|---|
| Explorar | Lista | Skeleton 15 | Empty filtros | Banner reintentar | — |
| Ficha | Contenido | Skeleton hero | — | No disponible | — |
| Reserva | Slots | Pulse slots | Sin huecos día | Red | — |
| Checkout | Form | Button spinner | — | Pago fallido → 14 | → Confirmación |
| Reservas | Cards | Skeleton cards | Sin próximas | — | — |
| Check-in | QR+PIN | — | Fuera de ventana | PIN inválido ops | Checked-in |
| Ops dash | Tabla | Skeleton rows | Día vacío | — | — |
Flujo de prototipo recomendado (demo stakeholder)
- Landing → Explorar
- Abrir Kitchen Hub Vallecas
- Reservar 05–08
- Checkout → (simular éxito) Confirmación
- Mis reservas → Check-in
- Ops Dashboard + Calendario
En Paper: artboards enlazables manualmente o presentación en orden de capa.
Criterios de aceptación UX (no código)
- Usuario entiende precio total antes de pagar
- Política de cancelación legible en ficha y checkout
- Check-in usable con una mano en exterior
- Operador ve ocupación del día en < 5 s de mirada
- Empty y error tienen siguiente acción clara
17-prototype-map.md
Abrir documento17 — Mapa de prototipo y navegación · COMAL
Especificación de prototipo clicable de extremo a extremo.
En Paper: artboards hi-fi. Donde el MCP de Paper esté limitado, los mockups complementarios están en ui-mockups/.
Flujo maestro (cocinero)
[01 Landing]
├─ CTA Explorar ──────────────────────────────► [05 Explorar]
├─ CTA Soy operador ──────────────────────────► [01b Landing operadores]
├─ Entrar ────────────────────────────────────► [02 Login]
└─ Crear cuenta ──────────────────────────────► [03 Registro]
[02 Login]
├─ Entrar OK ─────────────────────────────────► [05 Explorar] | deep link
├─ ¿Olvidaste? ───────────────────────────────► [02b Recuperar]
├─ Google OK ─────────────────────────────────► [05] o [04 Onboarding] si nuevo
├─ Crear cuenta ──────────────────────────────► [03 Registro]
└─ Error validación ──────────────────────────► [18 Error validación]
[02b Recuperar] ── Enviar ──► [02c Email enviado] ── Volver ──► [02 Login]
[03 Registro]
├─ Cocinero + OK ─────────────────────────────► [04 Onboarding]
└─ Operador ──────────────────────────────────► onboarding ops (concierge / 01b)
[04 Onboarding] ── Continuar / Saltar ────────────► [05 Explorar]
[05 Explorar]
├─ Card cocina ───────────────────────────────► [06 Detalle]
├─ Filtros sin resultados ────────────────────► [13 Empty]
├─ Carga ─────────────────────────────────────► [15 Loading]
├─ Error red ─────────────────────────────────► [20 Error red]
└─ Bottom: Reservas|Acceso|Perfil ────────────► [09]|[10]|[11]
[06 Detalle] ── Reservar ──► [07 Reserva] (auth gate → 02 si hace falta)
[07 Reserva]
├─ Continuar al pago ─────────────────────────► [08b Checkout]
└─ Sin huecos día ────────────────────────────► [19 Sin huecos]
[08b Checkout]
├─ Pagar OK ──────────────────────────────────► [08 Confirmación]
└─ Pago fail ─────────────────────────────────► [14 Error pago] ⇄ reintentar
[08 Confirmación]
├─ Ver acceso ────────────────────────────────► [10 Check-in]
└─ Mis reservas (implícito) ──────────────────► [09]
[09 Mis reservas]
├─ Empty ─────────────────────────────────────► [16 Empty reservas]
├─ Detalle ───────────────────────────────────► [09b Detalle reserva]
└─ Check-in ──────────────────────────────────► [10]
[09b Detalle]
├─ Check-in ──────────────────────────────────► [10]
└─ Cancelar ──────────────────────────────────► [09c Cancelar] ── confirmar ──► [09]
[10 Check-in] ── Reportar problema ───────────────► soporte (mailto / form futuro)
[11 Perfil]
├─ Ver planes ────────────────────────────────► [11b Planes]
├─ Notificaciones ────────────────────────────► [11c]
├─ Facturas / pagos ──────────────────────────► [11d]
├─ Privacidad ────────────────────────────────► copy + export/delete (doc)
└─ Cerrar sesión ─────────────────────────────► [02]
[17 Sesión expirada] ── Entrar ───────────────────► [02] + restore deep link
Flujo operador
[01b Landing operadores]
├─ Publicar / Solicitar ──────────────────────► lead form (copy en landing)
└─ Entrar ────────────────────────────────────► [02] rol operador
[Op-01 Dashboard]
├─ Bloquear ──────────────────────────────────► [Op-03 Bloquear]
└─ Nav ───────────────────────────────────────► Op-02 | Op-04 | Op-05
[Op-02 Calendario] ── + Bloquear ─────────────────► [Op-03]
[Op-04 Precios y estaciones]
[Op-05 Check-in recepción] (tablet)
Orden de demo stakeholder (15 min)
- 01 Landing → 05 Explorar → 06 Ficha → 07 Reserva → 08b Checkout → 08 Confirmación → 10 Check-in
- 09 Mis reservas → 09b → 09c (cancelación)
- 11 → 11b Planes
- 01b Operadores → Op-01 → Op-02 → Op-03 → Op-04 → Op-05
- Estados: 13, 14, 15, 16, 17, 18, 19, 20
Hotspots mínimos por artboard
| Desde | Hotspot | Hacia |
|---|---|---|
| Landing CTA | Explorar cocinas | 05 |
| Explorar card | Kitchen Hub | 06 |
| Ficha sticky | Reservar franja | 07 |
| Reserva CTA | Continuar al pago | 08b |
| Checkout | Pagar | 08 |
| Confirmación | Ver acceso | 10 |
| Reservas card | Detalle | 09b |
| Detalle | Cancelar | 09c |
| Perfil | Ver planes | 11b |
| Login | ¿Olvidaste? | 02b |
| Ops dash | + Bloquear | Op-03 |
Criterio de “prototipo completo”
- Camino feliz cocinero documentado y diseñado
- Auth + recuperación
- Cancelación con confirmación
- Membresía
- Estados empty / loading / error / sesión / validación / red / sin huecos
- Ops: dash, calendario, bloqueo, precios, check-in recepción
- Landing operadores
- Enlaces hotspots nativos en Paper (cuando la herramienta lo permita; mapa aquí es fuente de verdad)
18-completeness-audit.md
Abrir documento18 — Auditoría de completitud UX/UI · COMAL
Cierre: 2026-08-01
Alcance: producto + UX + UI hi-fi. Excluido: implementación de código de producto.
Matriz de entregables del brief diario
| # | Entregable | Estado | Evidencia |
|---|---|---|---|
| 1 | Identidad y definición | ✅ | 01-project-definition.md |
| 2 | Problema / supuestos | ✅ | 01 |
| 3 | Objetivos y métricas | ✅ | 01 |
| 4 | Stakeholders | ✅ | 02 |
| 5 | Personas | ✅ | 02 (4 perfiles) |
| 6 | JTBD | ✅ | 02 |
| 7 | Historias + MoSCoW + AC | ✅ | 02 + 19-backlog-completo.md |
| 8 | Journey map | ✅ | 02 |
| 9 | Service blueprint | ✅ | 02 |
| 10 | Arquitectura de información | ✅ | 03 |
| 11 | Matriz de permisos | ✅ | 03 |
| 12 | Flujos prioritarios | ✅ | 04 + 17 |
| 13 | Modelo de datos | ✅ | 05 |
| 14 | Stack recomendado | ✅ | 06 (recomendación, no código) |
| 15 | Dirección creativa | ✅ | 07 |
| 16 | Tokens | ✅ | Paper + 08 |
| 17 | Design system / componentes | ✅ | Paper 00 + 08 |
| 18 | Pantallas hi-fi | ✅ | 35 artboards en Paper |
| 19 | Estados y edge cases | ✅ | Empty, loading, error pago/red, validación, sesión, sin huecos, cancel |
| 20 | Responsive | ✅ | Mobile 390 + Desktop 1440 + tablet 768 |
| 21 | Spec interacciones / prototipo | ✅ | 16 + 17 |
| 22 | Guía de contenido | ✅ | 09 |
| 23 | Accesibilidad WCAG 2.2 AA (diseño) | ✅ | 10 |
| 24 | Privacidad y seguridad | ✅ | 11 |
| 25 | Plan analítico | ✅ | 12 |
| 26 | Plan de pruebas | ✅ | 13 |
| 27 | Handoff diseño | ✅ | 14 |
| 28 | Roadmap producto | ✅ | 15 |
| 29 | Presentación ejecutiva | ✅ | presentation/ |
| 30 | Registry + memory | ✅ | actualizados |
| 31 | Código de producto | ⛔ | Excluido a propósito |
Inventario Paper (35/35 con contenido)
Todos los artboards listados en 00-paper-reference.md tienen contenido hi-fi en el archivo Paper (incluyendo los rellenados tras Paper Pro: landing operadores, bloqueo, precios, estados 16–20, facturas, check-in recepción).
Autoverificación §29
| Pregunta | Resultado |
|---|---|
| Concepto distinto y problema concreto | ✅ |
| Flujos principales completos | ✅ |
| Empty / load / error / recovery | ✅ |
| Auth + cancelación + membresía + ops | ✅ |
| Responsive | ✅ |
| Design system | ✅ |
| Docs de producto y handoff | ✅ |
| Paper hi-fi completo | ✅ |
| Código de producto | ⛔ no aplica |
Deuda residual (no bloqueante)
- Hotspots nativos clicables en Paper (mapa en
17es la fuente de verdad). - Investigación de campo real.
- Fotografía real de cocinas (placeholders controlados).
- Certificación legal WCAG / RGPD (orientación de diseño solo).
Declaración de cierre
COMAL se declara completo en alcance UX/UI de principio a fin para el cron diario, sin implementación de código.
19-backlog-completo.md
Abrir documento19 — Backlog completo (historias + AC) · COMAL
Todas las historias con MoSCoW. Las Must tienen criterios de aceptación.
Épica A — Descubrimiento
| ID | Historia | MoSCoW | AC resumidos |
|---|---|---|---|
| A1 | Filtrar por ciudad, €/h, equipo | Must | chips multi; contador; empty 13 |
| A2 | Ver certificaciones y fotos | Must | badge VERIFICADA; galería |
| A3 | Política cancelación en ficha | Must | bloque legible antes de CTA |
| A4 | Ordenar por distancia | Should | default distancia si geo |
| A5 | Mapa de cocinas | Could | lista siempre primaria |
| A6 | Favoritos | Could | — |
| A7 | Comparar 2 cocinas | Won’t | — |
Épica B — Reserva y pago
| ID | Historia | MoSCoW | AC |
|---|---|---|---|
| B1 | Elegir fecha y franjas 1 h | Must | contiguas; min 2 h; TZ Madrid |
| B2 | Desglose precio | Must | base, dto, IVA, total |
| B3 | Pagar tarjeta | Must | 3DS; success→08; fail→14 |
| B4 | Cancelar según política | Must | 09c; reembolso mostrado |
| B5 | Hold 10 min | Should | visible en 14 |
| B6 | ICS calendario | Should | CTA confirmación y detalle |
| B7 | Reservas recurrentes | Won’t v1 | — |
Épica C — Check-in
| ID | Historia | MoSCoW | AC |
|---|---|---|---|
| C1 | QR + PIN en ventana | Must | 15 min antes → fin; fuera→mensaje |
| C2 | Checklist salida | Should | post check-out |
| C3 | Ops validar PIN | Must | Op-05 |
Épica D — Operador
| ID | Historia | MoSCoW | AC |
|---|---|---|---|
| D1 | Dashboard día | Must | ocupación, lista, CTAs |
| D2 | Bloquear franjas | Must | Op-03; deja de vender |
| D3 | Editar precios/estaciones | Must | Op-04 |
| D4 | Calendario semanal | Must | Op-02 |
| D5 | Export ingresos | Should | CSV |
| D6 | Multi-local | Could | — |
Épica E — Cuenta
| ID | Historia | MoSCoW | AC |
|---|---|---|---|
| E1 | Registro email | Must | rol, términos |
| E2 | Login + Google | Must | |
| E3 | Recuperar contraseña | Must | 02b→02c |
| E4 | Onboarding equipos/ciudad | Should | skippable |
| E5 | Membresía Base/Pro | Should | 11b |
| E6 | Notificaciones | Should | 11c toggles |
| E7 | Facturas | Should | 11d |
| E8 | Export/borrar datos | Must | privacidad |
| E9 | Sesión expirada | Must | 17 + deep link |
Épica F — Confianza y soporte
| ID | Historia | MoSCoW | AC |
|---|---|---|---|
| F1 | Reseñas post-uso | Should | |
| F2 | Reportar acceso | Must | CTA check-in |
| F3 | Error red recoverable | Must | 20 |
No objetivos (Won’t)
IA menús · chat in-app · app nativa v1 · marketplace de personal · reservas de comensales.
20-implementation.md
Abrir documento20 — Implementación · COMAL
Repositorio
| Campo | Valor |
|---|---|
| GitHub | https://github.com/Criscode2022/comal-app |
| Local | /Users/cristian/orca/comal-app |
| Stack | Angular 19 + NestJS 11 + Prisma 6 + Neon + Tailwind CSS |
Neon
| Campo | Valor |
|---|---|
| Project | comal-app |
| Project ID | super-cell-05525663 |
| Branch | main (br-holy-night-a65dwu42) |
| Database | neondb |
| Región | us-west-2 |
Connection string en apps/api/.env (local, no commiteado). Plantilla: .env.example.
Arranque
cd /Users/cristian/orca/comal-app
# API (puerto 3000)
cd apps/api && npm install && npx prisma generate && npm run start:dev
# Web (puerto 4200)
cd apps/web && npm install && npm start
Cuentas seed
| Rol | Password | |
|---|---|---|
| Cocinero | lucia@tacosmovil.es | password123 |
| Operador | elena@kitchenhub.es | password123 |
API (prefijo /api)
| Método | Ruta | Auth |
|---|---|---|
| POST | /auth/register | No |
| POST | /auth/login | No |
| GET | /auth/me | JWT |
| GET | /kitchens | No |
| GET | /kitchens/:slug | No |
| GET | /bookings/availability | No |
| GET/POST | /bookings | JWT |
| POST | /bookings/:id/cancel | JWT |
| POST | /bookings/:id/check-in | JWT |
| GET | /ops/dashboard | JWT operador |
| POST | /ops/check-in | JWT operador |
| POST | /ops/blocks | JWT operador |
UI Angular (rutas)
| Ruta | Pantalla |
|---|---|
/ | Landing |
/entrar | Login |
/registro | Registro |
/explorar | Listado cocinas |
/cocinas/:slug | Ficha |
/reservar/:slug | Reserva franjas |
/reservas | Mis reservas |
/reservas/:id | Detalle + PIN + cancelar |
/perfil | Cuenta |
/ops | Dashboard operador + PIN recepción |
Alcance implementado vs Paper
Must del vertical slice: explorar, ficha, reserva, auth, listado/detalle reserva, cancelar, check-in, ops dashboard + validar PIN.
No en v1 de código (sí en diseño Paper): Stripe real, membresía de pago, PWA offline, multi-ciudad, tablets dedicadas, OAuth Google.
Verificación
- Neon proyecto + migrate + seed
- API Nest arranca y responde
- Angular build OK
- Repo GitHub pusheado