Elections & Voting
En resumen
Elections & Voting handles the full election cycle for federation positions plus the digital meetings (AGM, board, committee, EGM) where those elections happen — eligibility resolution per OrgNode level, secret online ballots, proxy chains with anti-circularity guards, quorum checks, tie-break detection, versioned signed minutes and an append-only audit log built to satisfy national association law and FIPJP statutes.
Cómo funciona
An Election document carries scheduling, eligibility predicates and candidates. Voter eligibility is resolved per federation level: who can vote in an FFPJP national election differs from a club AGM, and the eligibility service consults the OrgNode tree, license status, membership age and any explicit denylist. When a candidate registers, their profile and platform are stored against the election.
Voting opens at the scheduled time. Each ballot is cast through the secure online voting endpoint, anonymised by separating the voter-identity check from the ballot-storage write — the ElectionAuditLog model validator and the service-layer _sanitize_details helper both enforce ballot secrecy so even a compromised audit reader cannot reconstruct individual votes. Proxy voting is layered on top: a voter can grant a proxy to another voter, but proxy chains are blocked (A→B→C is rejected), proxies can be limited to specific positions, max_proxies_per_voter is configurable per tenant and revocations carry a structured revocation_reason.
When voting closes the count runs with quorum verification and tie-break detection; results land at GET /public/elections/{id}/results. Around the election sits the Meeting domain (PL-T104) — a state machine draft → notice_sent → in_progress → concluded → minutes_draft → awaiting_signatures → signed. Each MeetingAgendaItem can include a voting widget with simple/2-thirds/3-quarters/consensus thresholds.
MeetingMinutes are versioned, content-hashed (SHA-256) and the signed PDF is WORM-archived. Signing runs through a pluggable adapter — BankID, Freja eID (qualified electronic signature), DocuSign, Clickwrap or eIDAS Wallet — gated by the tenant's SigningConfig.allowed_providers and require_qualified_signature flag. Two scheduled jobs (meeting-reminder-dispatch, minutes-signature-expiry) keep the workflow moving, and the Freja webhook is HMAC-SHA256-validated.
Capacidades clave
- Schedule and announce elections with eligibility rules tailored per OrgNode level.
- Run secret online ballots whose audit trail provably cannot reconstruct individual votes.
- Support proxy voting with chain prevention, position scoping and configurable per-voter caps.
- Detect quorum failures and tied results during count and publish verifiable outcomes.
- Drive AGMs, board meetings and EGMs through a notice-to-signed-minutes state machine.
- Sign minutes with qualified electronic signatures via BankID, Freja eID, DocuSign or eIDAS.
En la práctica
An SBF club secretary needs to convene an extraordinary general meeting on a Friday evening to approve revised statutes. She creates the Meeting in state draft, attaches the agenda item with a 2-thirds voting widget, and triggers notice_sent — the platform mails every eligible member with a unique join link. Two members cannot attend and grant her their proxies (chain block engages and stops a third member from re-delegating).
At the meeting, in_progress, she opens the vote — 18 in favour, 4 against, 2 abstain, 2-thirds threshold met. Minutes are drafted, content-hashed, and routed to the chair and two adjusters for Freja eID signing. When the third signature lands, the WORM-archived PDF replaces the draft and the meeting transitions to signed.
The ElectionAuditLog and minutes-signature-expiry job take over from there.
Funcionalidades de este subsistema
8| ID | Status | Funcionalidades |
|---|---|---|
| F01.03.01 | Entregado | Election scheduling and announcement ✅ PL-F0103a |
| F01.03.02 | Entregado | Candidate registration and profile ✅ PL-F0103a |
| F01.03.03 | Entregado | Voter eligibility rules per federation level ✅ PL-F0103a |
| F01.03.04 | Entregado | Secure online voting (anonymous, verifiable) ✅ PL-F0103a |
| F01.03.05 | Entregado | Vote counting and result publication ✅ PL-F0103b |
| F01.03.06 | Entregado | Proxy voting support ✅ PL-F0103b |
| F01.03.07 | Entregado | Audit trail on voting processes ✅ PL-F0103b |
| F01.03.08 | Entregado | Governance meetings (AGM, board, committee) with quorum, voting, minutes and QES signing via Freja eID/BankID/DocuSign ✅ PL-T104 |