# Estructura y datos

`public/` contiene la web publicable y puntos de entrada PHP. `app/` concentra autorización, validación y acceso a la base. `config/` contiene únicamente la plantilla versionada; el archivo real es privado. `database/talento.sql` es el esquema de instalación completo. `storage/` guarda documentos y sesiones fuera de la web. `tools/` contiene cron y verificación. `tests/` usa una instancia aislada sin SMTP real. `archive/` conserva el prototipo y las referencias anteriores y nunca entra al ZIP.

La interfaz mantiene en memoria una vista de los datos autorizados. No almacena cuentas, roles, postulaciones ni documentos en localStorage o IndexedDB. Las cookies PHP HttpOnly/SameSite identifican la sesión; los formularios usan CSRF. Cada petición comprueba el rol en la base y la versión de la sesión. Cambiar el rol o la contraseña invalida las sesiones anteriores.

Los aspirantes reciben solo su perfil, postulaciones, documentos, reportes y notificaciones. RH puede gestionar los expedientes y permisos. El visitante recibe categorías y vacantes públicas. Las notas internas y el historial interno de entrevistas se omiten de las respuestas a aspirantes. La identidad de una cuenta no se modifica mediante el formulario de perfil.

Las operaciones de contratación se serializan dentro de transacciones y comprueban la revisión del registro. Fechas de entrevistas se convierten de su zona horaria a UTC. Las etapas y su historial los genera PHP; cron avanza las entrevistas terminadas. Las fechas límite de vacantes usan la zona institucional configurada.

Los PDF se validan en el servidor por tamaño, MIME y cabecera, se guardan con nombres aleatorios y solo se descargan mediante una sesión autorizada. Las fotos JPEG se validan y sirven por separado para no incluir imágenes grandes en cada consulta de datos. Los perfiles profesionales flexibles y detalles de vacantes/entrevistas usan JSON dentro de tablas relacionadas mediante claves foráneas.

Las autorizaciones Google y los datos pendientes de la cola de correo usan AES-256-GCM. Los hashes de contraseña y de clave temporal no salen de PHP. Los eventos de Calendar se construyen desde la base; el navegador no puede enviar un destinatario o calendario arbitrario. Los trabajos usan candados MySQL para evitar que dos cron dupliquen el procesamiento simultáneo.

La entrega SMTP y Google requieren servicios externos configurados. La prueba local simula ambos; la guía de publicación incluye la comprobación real en el hosting.
