191 lines
8.7 KiB
Markdown
191 lines
8.7 KiB
Markdown
# Guion de presentación — 5 a 7 minutos
|
|
|
|
> Script para el pitch del hackathon. Cubre los puntos clave que los jueces evalúan.
|
|
|
|
---
|
|
|
|
## ⏱️ Distribución del tiempo
|
|
|
|
| Sección | Duración | Objetivo |
|
|
|---------|----------|----------|
|
|
| 1. Problema | 30s | Sembrar el dolor del usuario |
|
|
| 2. Solución | 30s | Decir qué construimos |
|
|
| 3. Demo ciudadano | 2 min | Mostrar el flujo principal |
|
|
| 4. Demo empleado | 1 min | RBAC + motivación |
|
|
| 5. Demo admin | 1 min | Gestión y métricas |
|
|
| 6. Arquitectura técnica | 1 min | Convencer en lo técnico |
|
|
| 7. Privacy by Design | 30s | Punto innegociable del reto |
|
|
| 8. Cierre | 30s | Llamado a la acción |
|
|
|
|
---
|
|
|
|
## 🎬 Guion completo
|
|
|
|
### 1. Problema (30 segundos)
|
|
|
|
> **"En Celaya, todos hemos sacado la basura demasiado temprano… o demasiado tarde. La basura termina en la calle, atrae fauna nociva, y los vecinos se molestan. La solución obvia sería ponerle un GPS al camión, pero eso es peligroso: la gente lo persigue, expone información operativa, y rompe la privacidad."**
|
|
|
|
Mostrar imagen o slide con el problema.
|
|
|
|
---
|
|
|
|
### 2. Solución (30 segundos)
|
|
|
|
> **"Mi Ruta Limpia: una app que te dice cuándo viene el camión a tu casa, sin nunca mostrarte dónde está. Privacy by Design, multiplataforma, con folio oficial en cada reporte, y tres vistas: ciudadano, empleado operativo y administrador."**
|
|
|
|
Mostrar la pantalla principal en el simulador.
|
|
|
|
---
|
|
|
|
### 3. Demo CIUDADANO (2 minutos)
|
|
|
|
**Login:**
|
|
- *"Entro como `demo@celaya.gob.mx`."*
|
|
|
|
**Inicio:**
|
|
- *"Esta es mi pantalla principal. Veo mi domicilio asignado a la **RUTA-01 (Zona Centro)**, y el camión llegará entre las 7:20 y 7:35. Si me faltan menos de 30 minutos, me muestra los minutos exactos."*
|
|
- *"Atrás de esta sencilla pantalla hay un cálculo geo-espacial: cuando registro mi domicilio, el backend usa **distancia Haversine** para asignarme automáticamente la ruta más cercana."*
|
|
- *"Importante: NO veo dónde está el camión. Solo veo MI ventana horaria. Esto es privacy by design real."*
|
|
|
|
**Confirmar ya pasó:**
|
|
- *"Cuando el camión pasa, confirmo con esta calificación. La tarjeta se pone verde. Si me equivoqué, tengo un **botón de deshacer**."*
|
|
|
|
**Educación:**
|
|
- *"Toco la hojita y entro a la sección educativa: 4 categorías de residuos, datos de impacto, puntos de acopio reales en Celaya y un FAQ extenso. Cada categoría tiene un modal con qué SÍ y qué NO va, y un dato de impacto."*
|
|
|
|
**Reportes:**
|
|
- *"Si el camión no pasó, levanto un reporte. Recibo un **folio oficial** tipo `MRL-20260523-A4B5C6` y puedo **compartirlo por WhatsApp, correo, o lo que sea** — porque es mi comprobante."*
|
|
|
|
---
|
|
|
|
### 4. Demo EMPLEADO (1 minuto)
|
|
|
|
**Logout y login como empleado:**
|
|
- *"Cierro sesión y entro como empleado: `empleado@celaya.gob.mx`. **El navegador cambia: ahora solo tengo 3 pestañas**."*
|
|
|
|
**Dashboard del empleado:**
|
|
- *"Esta es la vista del operador del camión. Aquí está el corazón motivacional: **mi racha de puntualidad** — 19 días seguidos. **Mi bono acumulado** — $950 MXN. Me faltan 11 días para desbloquear el siguiente bono de $500."*
|
|
- *"También veo mi horario con descansos preestablecidos: 5 min de estiramiento a las 8 AM. Esto es bienestar laboral integrado."*
|
|
- *"Y arriba hay una **frase motivacional que rota cada día**: 'Tu puntualidad permite que miles de familias planifiquen su día.'"*
|
|
|
|
**Reportes operativos:**
|
|
- *"Si algo pasa en mi turno — falla mecánica, accidente, tráfico — lo reporto. Tengo **8 categorías** con iconos. Esto le permite al equipo central reaccionar inmediatamente."*
|
|
|
|
**RBAC en acción:**
|
|
- *"Y muy importante: **el empleado NO puede ver los reportes ciudadanos**. Está en su pantalla de Cuenta: hay permisos en gris bloqueados. Si intento llamar a `/admin/reports` desde mi token de empleado, el backend responde **403 Forbidden**."*
|
|
|
|
---
|
|
|
|
### 5. Demo ADMIN (1 minuto)
|
|
|
|
**Login admin:**
|
|
- *"Cierro sesión, entro como admin: `admin@celaya.gob.mx`. Ahora tengo 4 pestañas."*
|
|
|
|
**Dashboard:**
|
|
- *"KPIs en vivo de toda la ciudad: 185 ciudadanos activos, 302 domicilios, 280 reportes totales, 8 en las últimas 24h, calificación promedio 4.07/5."*
|
|
- *"Gráficas por estado y por tipo de reporte. Veo de un vistazo que hay 84 pendientes."*
|
|
|
|
**Gestión de reportes:**
|
|
- *"Aquí veo TODOS los reportes ciudadanos de la ciudad. Filtro por estado. Puedo cambiar el estado con un botón: **PENDIENTE → EN_PROCESO → RESUELTO**. Esto cierra el loop con el ciudadano, que ve la actualización en su app."*
|
|
|
|
**Gestión de usuarios:**
|
|
- *"Y solo el admin puede ver esta pestaña: 202 usuarios, filtrables por rol. Puedo promover a alguien a empleado o demovrer si es necesario."*
|
|
|
|
---
|
|
|
|
### 6. Arquitectura técnica (1 minuto)
|
|
|
|
> **"Backend en FastAPI con SQLAlchemy. JWT con RBAC de 3 niveles. SQLite para el hackathon, pero migración a PostgreSQL es trivial."**
|
|
|
|
> **"Frontend en React Native con Expo, multiplataforma — corre en iOS, Android y Web con un solo código."**
|
|
|
|
> **"La simulación de eventos es elegante: no usamos cron jobs ni websockets. Los timestamps del JSON son templates que se reinterpretan cada día, y el ETA se calcula on-demand con interpolación temporal. Cero infraestructura, máxima escalabilidad."**
|
|
|
|
> **"Tenemos 28 endpoints REST documentados en OpenAPI."**
|
|
|
|
(Opcional: mostrar `localhost:8000/docs` con Swagger)
|
|
|
|
---
|
|
|
|
### 7. Privacy by Design (30 segundos)
|
|
|
|
> **"El reto fue tajante: PROHIBIDO el seguidor activo, PROHIBIDO el snooping. Lo cumplimos así:"**
|
|
|
|
> **"Primero, el endpoint `/eta/address/:id` **nunca** devuelve coordenadas del camión. Solo: status, mensaje, ventana, progreso porcentual."**
|
|
|
|
> **"Segundo, el backend valida en cada petición que el `address_id` pertenezca al usuario autenticado. Si intento consultar el domicilio de otro, **404**."**
|
|
|
|
> **"Tercero, la interfaz tiene mensajes preventivos: 'Por tu seguridad, no persigas al camión'."**
|
|
|
|
> **"Privacy by Design no es un slogan, es nuestra arquitectura."**
|
|
|
|
---
|
|
|
|
### 8. Cierre (30 segundos)
|
|
|
|
> **"Mi Ruta Limpia es: una app que **resuelve el problema real** del ciudadano sin romper la privacidad."**
|
|
|
|
> **"Tiene **arquitectura productiva** lista para escalar."**
|
|
|
|
> **"Da **dignidad al trabajador** con motivación y bonos, no solo control."**
|
|
|
|
> **"Y le da al gobierno **datos accionables** para gestionar la ciudad."**
|
|
|
|
> **"Es lo que Celaya necesita. Gracias."**
|
|
|
|
---
|
|
|
|
## 🎯 Posibles preguntas de los jueces
|
|
|
|
### "¿Cómo escalan a 50,000 usuarios?"
|
|
- Cambiar SQLite por PostgreSQL (solo cambia `DATABASE_URL`)
|
|
- Containerizar con Docker, desplegar en AWS ECS / Cloud Run
|
|
- Cache con Redis para `/eta/*` (ya está stateless)
|
|
- Notificaciones via Firebase Cloud Messaging (esquema `push_token` ya en User)
|
|
- CDN para el bundle de Expo Web
|
|
|
|
### "¿Cómo manejan días festivos?"
|
|
- El simulador permite ajustar las rutas por fecha
|
|
- Endpoint admin podría exponer `/admin/holidays` para excluir días
|
|
- La notificación push avisaría al ciudadano
|
|
|
|
### "¿Cómo validan que la ruta es la correcta para mi casa?"
|
|
- El algoritmo `assign_route` usa Haversine con O(120) waypoints; en producción se usaría PostGIS con polígonos reales de zonas de cobertura
|
|
|
|
### "¿Y si tengo Android?"
|
|
- React Native + Expo compila a iOS, Android y Web con un solo código
|
|
- La demo es en iOS pero funciona idéntico en Android
|
|
|
|
### "¿OAuth real?"
|
|
- El endpoint `/auth/oauth` ya recibe datos del provider; falta integrar el SDK del cliente. Es 1-2 horas de trabajo.
|
|
|
|
### "¿Por qué SQLite y no Postgres?"
|
|
- Hackathon: zero-config, portable. Para producción, cambio trivial.
|
|
|
|
### "¿La simulación es real?"
|
|
- Es un mock realista que cumple el requisito del reto. En producción se reemplaza el `eta_service.get_eta()` para leer de una tabla de telemetría real, sin cambiar nada del cliente.
|
|
|
|
### "¿Mostraron el código?"
|
|
- Todo el código está en estructura limpia: 27 archivos backend, 22 archivos frontend src, todo en GitHub (o donde lo tengas).
|
|
|
|
---
|
|
|
|
## 📝 Notas para el presentador
|
|
|
|
### Antes de iniciar:
|
|
1. Verifica que backend y frontend estén corriendo
|
|
2. Cierra cualquier app que muestre notificaciones en pantalla
|
|
3. Limpia las pestañas de Safari/Chrome (que no se vea historial sensible)
|
|
4. Pon el simulador en modo de "Demo" si quieres ocultar status bar
|
|
|
|
### Durante la demo:
|
|
- **No tartamudees**: si no sabes algo, di "buena pregunta, eso lo cubrimos en la documentación técnica"
|
|
- **Mira a los jueces**, no al simulador
|
|
- **Habla en futuro presente**: "esta app permite", no "esta app permitirá"
|
|
- **Energía**: convierte el problema en algo emocional ("todos hemos sacado la basura")
|
|
|
|
### Si algo falla:
|
|
- "El simulador se está reiniciando, mientras tanto les muestro el código..."
|
|
- Ten capturas de pantalla en backup por si el simulador muere
|
|
- Ten el OpenAPI docs (`/docs`) abierto en una pestaña como respaldo
|