Votacion y links publicos

Esta guia describe el bloque vigente de v3.0 para experiencia publica y links tokenizados: landing publica de la eleccion, recuperacion de links, nominacion desde organizaciones, apoyos, aceptacion/completitud de candidatura, votacion y resultados publicos. El contenido fue contrastado contra las rutas montadas, las paginas tokenizadas, PublicTokenBasePage, ElectionLinkRecoveryMode, PublicElectionRecoverLinkPanel, PublicElectionVisibilityResolver, PreElectionReportsPanel y los EJB/DAO que validan tokens y buscan coincidencias para recovery.

Inventario real de rutas tokenizadas

  • /token/public-election: landing publica principal de la eleccion usando Election.publicElectionToken.
  • /token/public-election-v2: variante alternativa montada en paralelo con el mismo token, pero hoy los links generados por dominio y utilitarios siguen apuntando a /token/public-election.
  • /token/organization/do-nomination: nominacion desde organizacion usando Organization.doNominationToken.
  • /token/nomination/support: confirmacion o rechazo de apoyo usando SupportNomination.token.
  • /token/nomination/tasks: link de aceptacion y luego completitud de candidatura usando Nomination.acceptNominationToken.
  • /token/vote: votacion usando UserVoter.voteToken.
  • /token/result: resultados publicos usando Election.resultToken.
  • /token/access-denied: pagina generica usada por todas las paginas tokenizadas cuando el token es valido pero la ventana aun no abrio, ya cerro o el switch manual esta bloqueado.
  • Los links de auditoria /token/audit* siguen vigentes, pero su detalle funcional ya quedo separado en la guia de auditoria.

Modelo comun de acceso

  • Todas las paginas tokenizadas pasan por PublicTokenBasePage: primero validan el token, despues aplican la compuerta de calendario/flags y, si corresponde, redirigen a /token/access-denied.
  • Los bloqueos no responden 404 cuando el token existe pero la ventana no aplica: muestran countdown contra una fecha/calendario concreto con errores como VOTE_NOT_OPEN, VOTE_CLOSED, RESULTS_NOT_PUBLIC o ACCESS_NOT_AVAILABLE.
  • Los intentos fallidos de acceso publico por token invalidado se rate-limitean por IP. El default actual es 50 intentos fallidos antes de responder 429, y la cache de ese rate limit se limpia por scheduler.

Landing publica de la eleccion

  • La landing publica valida Election.publicElectionToken y exige publicElectionLinkAvailable=true.
  • Su ventana de acceso abre en N_1_SINGLE_CALL_FOR_CANDIDATES_PUBLISHED y no tiene fecha de cierre propia.
  • La misma ruta soporta modos por parametro action: landing, candidate y roll. Tambien acepta aliases electoral-roll y padron para el modo de padron publico.
  • El detalle de candidato usa action=candidate&candidateId=...; el padron usa action=roll&page=... y admite filtros country y orgname.
  • La landing puede mostrar calendario, candidatos, resumen de candidaturas incompletas, resumen de padron publico, resultados y recovery, pero cada seccion tiene su propia regla de visibilidad.

Para consultar al ganador desde la navegacion publica: cierre la sesion administrativa, entre en Elecciones publicas y abra la eleccion. Tambien puede acceder directamente a /public-elections o usar una ventana privada; cerrar sesion no es un requisito de publicacion. Las condiciones de visibilidad y la diferencia entre tarjetas de ganadores y texto oficial se explican en Resultados y reportes.

Que se publica realmente en la landing

  • Calendario: aparece desde N_1.
  • Candidatos y resumen de nominaciones: aparecen desde N_11_SINGLE_CANDIDATES_PUBLISHED.
  • Padron publico: solo aplica a elecciones estatutarias y aparece desde N_4_SINGLE_PADRON_PUBLISHED.
  • Resultados en landing: solo aparecen si resultLinkAvailable=true y ya se alcanzo N_17_SINGLE_PROVISIONAL_RESULTS_PUBLISHED.
  • Sidebar de candidato: depende de N_11 y de que al menos una tarea lateral siga marcada como publica (PROFILE, COUNTRIES, ORG_SUPPORTS, USER_SUPPORTS_2, USER_SUPPORTS_5, ORGANIZATIONS).
  • Preguntas estatutarias/no estatutarias: dependen de N_11 mas la bandera publicable de cada tarea. Ese detalle ya esta documentado en la guia de preguntas y declaraciones.

Recuperacion publica de links

  • La recuperacion publica se muestra dentro de la landing; no tiene ruta separada.
  • Para que se vea, la eleccion debe seguir abierta y publicLinkRecoveryMode debe ser distinto de NONE.
  • La landing sigue necesitando publicElectionLinkAvailable=true y haber alcanzado N_1; el recovery no agrega un calendario propio adicional.
  • Los modos posibles son NONE, ONLY_BR y ALL.
  • En esta distribucion publica, las elecciones nuevas arrancan en ALL, independientemente del tipo. Los modos ONLY_BR y NONE siguen disponibles para configuracion explicita.
  • Si el modo es ONLY_BR, la UI muestra una advertencia para participantes que puedan recuperar enlaces desde el portal historico de la organizacion.
  • Si CAPTCHA esta habilitado globalmente y existe dataSiteKey, el formulario exige reCAPTCHA antes de procesar el envio.

Que links reenvia el recovery

  • El formulario normaliza el email a minusculas y busca coincidencias en tres universos separados: UserVoter.mail, Organization.membershipContactEmail y SupportNomination.supportingContactEmail.
  • Votacion: reenvia UserVoter.getTokenVoteLink() para cada coincidencia de la eleccion.
  • Nominacion: reenvia Organization.getDoNominationLink(), pero solo para organizaciones que todavia tengan doNominationToken no vacio.
  • Apoyos: reenvia SupportNomination.getSupportNominationLink().
  • El modo ONLY_BR aplica filtro por pais: en votantes usa UserVoter.country, en organizaciones usa Organization.country y en apoyos usa el pais de la organizacion que emitio la nominacion.
  • El backend corta en 10 coincidencias por tipo de link. Si un email aparece mas veces, el recovery no sigue mas alla de ese tope por categoria.
  • El sistema responde siempre con el mismo mensaje de aceptacion si no hubo error operativo, incluso cuando el email no coincide con ningun acceso. No expone al usuario si encontro o no registros.
  • Si falta template LINK_RECOVERY, el backend usa un fallback trilingue armado en codigo.

Links de nominacion y apoyo

  • Nominacion desde organizacion: /token/organization/do-nomination usa Organization.doNominationToken, depende de doNominationLinkAvailable=true y de la ventana N_2_PERIODO_CALL_FOR_CANDIDATES.
  • Si la organizacion ya tiene una nominacion en PROPOSED, ACCEPTED_BY_CANDIDATE o APPROVED, la pagina sigue mostrando el estado historico pero bloquea una nueva nominacion.
  • Apoyo de nominacion: /token/nomination/support usa SupportNomination.token, depende de nominationSupportLinkAvailable=true y tambien de N_2.
  • La pagina de apoyo permite aceptar o rechazar mientras el apoyo siga pendiente; cuando el estado ya es ACCEPTED, REJECTED, APPROVED o INVALID, la decision queda bloqueada y la pagina pasa a modo informativo.

Link de aceptacion y tareas de candidatura

  • El link que recibe la persona nominada se construye hoy sobre /token/nomination/tasks con Nomination.acceptNominationToken.
  • No existe una ruta publica separada y estable para condiciones iniciales: si la nominacion todavia no fue aceptada, la misma ruta redirige internamente a AcceptNominationConditionsPage.
  • La fase de aceptacion inicial depende de nominationTasksLinkAvailable=true y de N_2_PERIODO_CALL_FOR_CANDIDATES.
  • La fase posterior de tareas ya no depende de un solo calendario: la ventana efectiva va desde el inicio mas temprano hasta el cierre mas tardio entre las tareas configuradas para el candidato.
  • Si el checklist no tiene progresos o no hay calendarios efectivos, la pagina de tareas cae en acceso denegado aunque el token siga siendo valido.
  • Las preguntas de comunidad que el candidato responde desde ese flujo usan ademas la ventana N_12_PERIODO_CANDIDATE_QUESTIONS.

Votacion

  • /token/vote usa UserVoter.voteToken, depende de votingLinkAvailable=true y de la ventana N_16_PERIODO_VOTING.
  • Antes de N_16 responde acceso denegado con cuenta regresiva al inicio; despues del cierre responde acceso denegado al fin de la ventana.
  • Si el votante ya emitio voto, la pagina no vuelve al formulario: muestra AlreadyVotedPanel.
  • Para elecciones conjuntas, si la eleccion no es simple y no llegan subtokens explicitos, la pagina arma una vista conjunta buscando el segundo votante por ORGID en la otra eleccion del par.
  • Cuando se usan los parametros token1 o token2, la misma ruta entra directo al voto de la boleta seleccionada y evita la vista conjunta inicial.
  • La locale de la pagina intenta tomar el idioma preferido del votante salvo que el usuario ya haya forzado idioma por URL o por la topbar.

Resultados publicos

  • /token/result usa Election.resultToken, depende de resultLinkAvailable=true y se abre cuando arranca N_17_SINGLE_PROVISIONAL_RESULTS_PUBLISHED.
  • No tiene fecha de cierre en la compuerta publica actual: una vez publicado N_17, el acceso sigue disponible mientras no se corte manualmente el switch.
  • La pagina carga PublicResultsPanel con idioma resuelto desde locale actual, y la landing publica puede ademas mostrar una tarjeta/resumen de resultados cuando ya se alcanzo esa misma etapa.

Notas operativas

  • El pre-reporte administrativo ya consolida el estado de disponibilidad de todos estos links y los cruza contra su calendario o ventana efectiva.
  • La bandera manual de cada link funciona como corte operacional; el calendario sigue siendo quien define la apertura temporal real de cada flujo.
  • Los utilitarios de dominio siguen generando los links publicos a partir de Constants.URL, concatenando el contexto web y el segmento tokenizado correspondiente.

Bloques relacionados

  • Candidaturas y nominaciones: estados, aceptacion y apoyos ya quedaron detallados en esta guia.
  • Preguntas, declaraciones y comunidad: la experiencia publica de preguntas a candidatos esta detallada en esta guia.
  • Auditoria previa y final: los links publicos de auditoria quedaron separados en esta guia.
  • Resultados y reportes: el consumo administrativo y publico de la informacion que sale de estos links quedo documentado en esta guia.

Fuentes contrastadas

ElectionsManagerApp, PublicTokenBasePage, PublicAccessDeniedPage, PublicElectionPage, PublicElectionPageV2, PublicElectionPageParameters, PublicElectionRecoverLinkPanel, DoNominationPage, SupportNominationPage, AcceptNominationConditionsPage, GenericAcceptNominationTasksPage, VotePublicPage, ResultPublicPage, PreElectionReportsPanel, PublicElectionVisibilityResolver, PublicElectionSnapshotBuilder, ElectionLinkRecoveryMode, PublicLinkRecoveryType, LinksUtils, Constants, UserVoterDao, OrganizationDao, SupportNominationDao, ElectionsManagerEJBBean, ElectionsVoterEJBBean, MailsSendingEJBBean y ElectionsManagerApp.properties.xml.