Exámenes online y certificación automática
Problema
La fundación emite cualificaciones profesionales reconocidas oficialmente, y todo el proceso funcionaba sobre un sistema antiguo cuyo código fuente la fundación no tenía. Eso significaba que ningún otro programador podía ampliarlo ni siquiera corregir sus errores. Además, se había perdido el contacto con el único desarrollador responsable. El sistema era inestable y estaba lleno de fallos que ya no quedaba nadie para reparar. La fundación necesitaba dos cosas: un sistema reconstruido desde cero y alguien que se ocupara de él tras el lanzamiento, un programador con quien pudiera contar de verdad.
Solución
Construí un sistema que lleva todo este proceso de principio a fin en un solo lugar. El centro registra un examen en la aplicación, la fundación lo aprueba, el examinador lo dirige, el candidato lo realiza en el navegador y el certificado, con su número de registro, se genera solo como un PDF listo para imprimir. Cada quien ve únicamente lo que le concierne: el centro sus propios exámenes, el examinador sus fechas, la fundación todo.
Un examen no se crea desde cero cada vez. El sistema guarda plantillas de examen, un banco de preguntas y los resultados de aprendizaje. La fundación monta el examen a partir de piezas ya existentes, y cada pregunta está vinculada a un resultado de aprendizaje concreto, de modo que queda claro que el examen comprueba exactamente lo que exige la cualificación.
El tiempo del examen lo controla el sistema, no el ordenador del candidato. Si a alguien se le cae internet a mitad del examen, vuelve y sigue escribiendo, y las respuestas no se pierden. Cuando se agota el tiempo, el examen se cierra solo. Durante la fase de pruebas tenía una vista en directo de todo lo que ocurría en la aplicación, así que corregía los fallos antes de que nadie llegara a reportarlos.
Lo hice todo yo solo: diseñé la UX/UI a petición del cliente, escribí el código y desplegué el sistema.
En producción
Pantallas de la app
Algunas capturas del producto en vivo. Los pies de foto te dicen qué estás viendo.



Panel de gestión con estadísticas y navegación según el rol
Qué hace
Capacidades clave
Proceso de examen de principio a fin
Desde que un centro registra un examen, pasando por la aprobación de la fundación y la conducción del examinador, hasta que el candidato lo realiza en el navegador, todo en un mismo lugar.
Exámenes robustos e imposibles de manipular
Una caída de la conexión no pierde respuestas, y el temporizador corre en el servidor, así que el reloj no se puede manipular desde el equipo del candidato.
Exámenes montados con bloques reutilizables
Plantillas, un banco de preguntas y resultados de aprendizaje; cada pregunta se asocia a un resultado, así que el examen comprueba de forma demostrable lo que exige la cualificación.
Certificados numerados automáticos
Al aprobar, se genera solo un certificado PDF listo para imprimir con su número de registro, sin papeleo manual.
Acceso según el rol
Cuatro roles con vistas separadas: el centro solo ve sus propios exámenes, el examinador solo sus fechas, el candidato solo su examen y la fundación tiene la imagen completa.
Datos aislados por entidad
Los datos de cada entidad quedan totalmente separados y protegidos, con aislamiento a nivel de fila en la base de datos.
Stack técnico
Tecnologías principales
Los paquetes e integraciones concretos están listados más abajo.
Arquitectura
Capas del sistema
- Flutter Web sobre Clean Architecture
- Paneles según el rol: fundación, centro, examinador, examinando
- Temporizador de examen gobernado por el servidor, con desconexión y reconexión
- Responsive, desplegado en Firebase Hosting (no-cache, PWA off)
- PostgreSQL con row-level security en cada tabla
- RPC SECURITY DEFINER que rompen la recursión de RLS y acotan según el rol
- Edge functions en Deno para correo transaccional (Resend)
- pg_cron: cierre automático de exámenes caducados, tareas keep-warm
- Numeración de certificados continua y por año
Librerías
Paquetes clave
- flutter_blocgestión de estado con Cubit
- freezedentidades y estados inmutables
- dartzmanejo de errores con Either<Failure, T>
- get_it + injectableinyección de dependencias
- go_routerenrutado y guards según el rol
- pdf + printinggeneración de certificados listos para imprimir
Integraciones
Servicios externos
- SupabasePostgres, Auth, Storage, Edge Functions
- Resendcorreo transaccional (invitaciones, cuentas)
- Azure Application Insightsmétricas en vivo, errores, dependencias
- Firebasehosting + analítica de producto con GA4
- Sentryseguimiento de errores con breadcrumbs
¿Estás construyendo algo parecido?
Escribe unas líneas sobre el proyecto y te respondo con notas concretas y la fecha en que puedo empezar.