Gestión de Staffing para Eventos: del formulario de candidatura al margen de cada turno
Una aplicación web que ha sustituido formularios dispersos y hojas de Excel: recogida de candidaturas, búsqueda de perfiles, planificación de turnos y cálculo de costes y márgenes en tiempo real.
-
endpoints HTTP
-
modelos de dominio
-
formularios de candidatura activos
-
+
candidatos gestionados
En breve
- Gestión de Staffing para Eventos es una aplicación web en Python y Flask que gestiona todo el ciclo del personal para eventos, de la candidatura al turno.
- Cada agencia socia tiene su propio formulario de candidatura, configurable sin tocar el código, pero todos escriben en el mismo modelo de datos.
- La búsqueda de perfiles combina más de 20 filtros y plantillas listas como «Disponibles ahora» o «Expertos con 5+ años».
- Los costes del proveedor, los ingresos del cliente y el margen de cada turno se ven mientras se planifica, no a fin de mes.
- En producción desde junio de 2025, con el consentimiento de privacidad registrado y los documentos accesibles solo mediante enlaces firmados que caducan.
Cuál era el problema
La agencia recogía las candidaturas con formularios online distintos para cada una de las agencias de empleo con las que colabora, y las pasaba a mano a hojas de Excel. De ahí salían tres problemas que se alimentaban entre sí: cada cliente quería un formulario distinto, y cada formulario nuevo producía datos que no se podían comparar con los demás; encontrar a la persona adecuada, por ejemplo «un conductor con carnet D, disponible en Milán la semana que viene, que hable inglés», significaba abrir varias hojas y filtrar a mano; y los márgenes se descubrían solo a fin de mes, cuando ya no había forma de actuar.
Además, los datos recogidos incluyen documentos de identidad, carnets de conducir y permisos de residencia: hacían falta trazabilidad del consentimiento y control de accesos a la altura del RGPD.
Formularios distintos, un solo modelo de datos
Cada agencia socia tiene su propio formulario de candidatura con una dirección dedicada. Los campos visibles, los obligatorios y las opciones de los desplegables se configuran desde el panel de administración, sin tocar el código, y un formulario existente se duplica con toda su configuración.
La decisión clave fue no hacer dinámico el esquema de la base de datos. Todos los formularios escriben en el mismo modelo de datos normalizado, y una tabla de configuración decide para cada uno qué mostrar y qué hacer obligatorio: los formularios son tan flexibles como si fueran dinámicos, pero los candidatos siguen siendo comparables y consultables con consultas normales. El candidato rellena un recorrido guiado en tres pasos, a menudo desde el móvil, con currículum y foto de perfil hecha en el momento.
Encontrar a la persona adecuada en un clic
La búsqueda combina más de 20 filtros (carnet, idiomas, ciudad de disponibilidad, años de experiencia, puntuación) y plantillas de filtrado ya listas que traducen las preguntas recurrentes: «Candidatos recientes», «Puntuación alta», «Disponibles ahora», «Expertos con 5+ años». Nacieron de cómo los operadores formulaban las peticiones de viva voz, y se han convertido en la forma más usada de buscar.
Cada operador guarda sus propias columnas y su orden, porque quien busca conductores y quien planifica turnos miran datos distintos. Los perfiles se valoran con categorías de puntuación configurables, se archivan en lugar de borrarlos y se exportan a CSV, Excel y PDF.
El margen se ve mientras se planifica
Cada turno enlaza un candidato con un proveedor y un cliente, cada uno con su propia tarifa horaria. El sistema calcula horas efectivas, coste del proveedor, ingreso del cliente y beneficio, gestionando las pausas, los mínimos de horas garantizados, que pueden ser distintos para proveedor y cliente en el mismo turno, y los costes extra.
Cada turno congela la tarifa aplicada en el momento de su creación, así retocar una tarifa no reescribe el histórico. Y el cálculo vive en un solo punto del código: da el mismo resultado donde sea que ocurra, de la creación a la edición en línea con doble clic hasta la importación masiva.
Compartir sin dar cuentas de acceso
Los clientes de la agencia quieren ver las listas de candidatos propuestos, pero no pueden tener una cuenta en el sistema. Los enlaces compartidos resuelven el problema: para cada uno se eligen los campos visibles y los filtros aplicados, con contraseña y caducidad opcionales, y se cuentan los accesos. El mismo mecanismo vale para compartir las jornadas de turnos.
Los datos personales, tratados como tales
Para el RGPD no basta una casilla: hay que poder demostrar qué información se aceptó, cuándo y por parte de quién. Cada consentimiento registra fecha y hora, dirección IP, navegador, y versión y huella de la información en vigor, y de ahí se genera el PDF de consentimiento del candidato concreto.
Currículums, documentos y fotos están en un almacenamiento privado en Azure y la aplicación nunca expone su dirección directa: genera cada vez un enlace firmado con caducidad. Un enlace copiado y pasado a terceros deja de funcionar por sí solo.
Cómo está construido
Flask con páginas generadas en el servidor en lugar de una aplicación de página única: los usuarios son operadores de back-office en ordenador, y el renderizado en servidor redujo los tiempos de desarrollo y la superficie de mantenimiento. Las partes que de verdad necesitan reactividad (tablas, filtros, gráficos, edición en línea) se alimentan de API JSON dedicadas.
El código está dividido por área funcional en nueve blueprints, lo que permitió añadir el módulo de turnos, que llegó como petición posterior del cliente, sin tocar la parte de candidatos ya en producción. Las funciones delicadas están detrás de interruptores activables en caliente, para apagarlas en segundos sin una nueva publicación. Base de datos Azure SQL con migraciones versionadas, publicación automática en Azure App Service con GitHub Actions.
Qué se entregó
- Análisis de requisitos con la agencia
- Modelo de datos y base de datos en Azure SQL
- Backend Flask con 184 endpoints
- Interfaz adaptable con Bootstrap 5 y Chart.js
- Publicación continua en Azure con GitHub Actions
- Mantenimiento evolutivo en producción
Ficha técnica
- Plataforma: aplicación web en Azure
- Año: 2025
- Estado: En producción
- Tecnologías: Python, Flask, SQLAlchemy, Azure, Chart.js, Web App, Base de datos
Las capturas vienen del entorno de producción: los nombres y los contactos son ficticios, y están difuminados la marca del cliente, las agencias socias y los importes.
¿Necesitas un software así?
Si tienes un proceso que hoy gestionas a mano y querrías automatizar, cuéntamelo: vemos juntos si tiene sentido construir una herramienta encima.
¿Necesitas algo parecido? Este proyecto es un ejemplo de desarrollo de aplicaciones web y sistemas de gestión a medida. La primera reunión y el presupuesto son gratuitos: escríbeme y lo hablamos.

