El problema
Un cine necesita vender entradas online sin que dos personas compren la misma butaca, controlar el acceso en la puerta y que cada rol (cliente, empleado, administrador) vea solo lo que le corresponde.
Qué construí
- Selección de butacas en tiempo real con control de venta doble.
- Compra registrada o anónima, candy bar y combos, puntos, crédito y cupones.
- Entradas con QR de un solo uso y PDF, validadas por cámara desde el perfil de empleado.
- Panel de administración: películas, funciones con sala asignada automáticamente, precios y reportes en PDF y Excel.
- PWA con notificaciones push de estrenos.
Decisiones técnicas
La seguridad vive en la base de datos
Los permisos de cada rol están en Row Level Security de Postgres. Los guards de Angular solo ordenan la navegación: aunque alguien los saltee, la base no le devuelve datos ajenos.
Butacas sincronizadas con Realtime
Cada cliente ve en vivo las butacas que toman los demás, con Supabase Realtime.
Requisitos y decisiones documentados
42 requerimientos y 14 decisiones técnicas escritas en el repo, cada una con las alternativas evaluadas.
Stack
Angular 22 TypeScript Signals Supabase Auth Postgres + RLS Realtime Storage Edge Functions PWA Vitest Vercel
Qué haría distinto
- Probaría el diseño en celular desde el primer día: hoy, en pantallas angostas, la cartelera se corta a la derecha.
- Haría que la demo se mantenga sola, con una tarea programada en la base que cree funciones a futuro. Las funciones cargadas a mano se vencen y la compra deja de poder probarse.

