Federation & Governance
97 features · 8 subsystems
Management of the global petanque organizational hierarchy from FIPJP down to individual clubs, including governance structures, commissions, elections, and inter-federation coordination.
Federation Hierarchy Management
F01.01Management of the federation structure using **standalone tenants** — every federation (national, continental, FIPJP) is independent. Combined with **OrgNodes** for clubs within each national tenant.
How it works- F01.01.01 Shipped
Standalone tenant per federation (national, continental, world)
✅ PL-F0101a - F01.01.02 Shipped
Tenant creation, configuration, branding
✅ PL-F0101a - F01.01.03 Shipped
Federation profile pages (logo, address, contacts, statutes, history)
✅ PL-F0101a - F01.01.04 Shipped
Federation type classification (continental, national, world)
✅ PL-F0101a - F01.01.05 Shipped
Public API for cross-tenant interactions (license verification, ITC, squad submission)
✅ PL-F0101a - F01.01.06 Shipped
Federation status tracking (active, suspended, provisional, expelled)
✅ PL-F0101a - F01.01.07 Shipped
Federation founding date, affiliation date, recognition history — founding_date, affiliation_date och recognition_history (FederationRecognitionEvent-kronologi) exponerat på admin-CRUD + publik directory
✅ PL-F0101b - F01.01.08 Shipped
Federation directory (public listing of known federations and their API endpoints) — lean GET /public/federations/directory med filter på typ/status/kontinent/with_api_endpoint/fipjp_only
✅ PL-F0101b - F01.01.09 Shipped
Federation map visualization (geographic boundaries) — GET /public/federations/map returnerar GeoJSON Polygon/MultiPolygon + Point-center + map_zoom_default, expelled-federationer exkluderade
✅ PL-F0101b - F01.01.10 Shipped
Federation statistics dashboard (members, clubs, competitions per level) — GET /federations/{id}/statistics aggregerar klubbar/distrikt/medlemmar/tävlingar per nivå, zero-valued för federationer utan tenant-länk (aldrig cross-tenant)
✅ PL-F0101b - F01.01.11 Shipped
Clubs as OrgNodes under their district in the OrgNode hierarchy — Club.district_id kopplar klubbar till distrikt-subtree, verifierat via publik GET /public/clubs
✅ PL-F0101b - F01.01.12 Shipped
District management (OrgNodes with authority — sanction, DM, boards) — DistrictCapabilities overrides layered on tenant OrgNodeTypeConfig defaults, GET/PUT /districts/{id}/capabilities
✅ PL-F0101b / PL-F0101c - F01.01.13 Shipped
Configurable district hierarchy depth per tenant (0 levels: Norway; 1 level: Sweden/Germany; 2+ levels: France ligue→comité) — exposed via GET /org-nodes/hierarchy
✅ PL-F0101c - F01.01.14 Shipped
District-based scope filtering (district admin sees clubs in their OrgNode subtree) — X-District-Scope header / scope_district_id query on /clubs and /districts, BFS subtree resolver
✅ PL-F0101c - F01.01.15 Shipped
Configurable OrgNode capabilities per level — each OrgNode level can be granted: can_sanction (+ sanction_levels), can_set_license_price, has_discipline_body, can_issue_licenses, has_own_league. Exposed via POST /org-nodes/check-capability.
✅ PL-F0101c - F01.01.16 Shipped
OrgNode type registry per tenant — CRUD under /org-nodes/tenant-configs/{id}/types, atomic TenantConfig-validator re-run, localized names via Accept-Language
✅ PL-F0101c - F01.01.17 Shipped
Multi-tenant admin access — operatörer med åtkomst till flera federationer listas via GET /auth/me/tenants (home-tenant först, övriga från RoleAssignment/scope), växling via POST /auth/switch-tenant som mintar ny JWT. UI: avatar-dropdown i admin top-nav (specs/admin/views/tenant-switcher.md).
✅ PL-1902 - F01.01.18 Shipped
Standalone club tenant — TenantType.CLUB enum, self-service POST /public/tenants/club skapar tenant + klubb + admin-användare med magic-link, platt hierarki (0-1 nivåer), migration_source={"created_as":"standalone_club"}.
✅ PL-T001 - F01.01.19 Shipped
Club-to-federation migration — POST /admin/tenants/{id}/migrate-to-federation flyttar Club/License/Match/Membership/Ranking/CalendarEvent till mål-tenant, arkiverar käll-tenant, GET .../migration-preflight ger räknar-rapport + duplikat-detektering. Admin-UI: 3-stegs-wizard i TenantMigration.tsx.
✅ PL-T001 - F01.01.20 Shipped
Affiliate tenant type — TenantType.AFFILIATE för icke-förbundsorganisationer (Korpen, SPF, handisport, skolidrott). €999/år, platt hierarki (depth=0), fritt definierade medlemskategorier, hårdkodade restriktioner (ej licenser, ej rankade tävlingar, ej ITC). POST /admin/tenants/affiliate, CapabilityProfile med hårdkodade+konfigurerbara fält. PL-T302: hybrid signup-flöde — public intake /contact-sales?topic=affiliate → POST /public/contact-sales/affiliate med Turnstile + rate-limit 5/h/IP, sys_support kvalificerar via /customer-base/affiliate-signups innan Stripe Payment Link skickas, webhook driver provisionering via existerande PL-T003-handler.
✅ PL-T003 / PL-T302 - F01.01.21 Shipped
Affiliate bridge link — AffiliateBridgeLink kopplar affiliate-medlem till förbundslicens via opt-in per spelare. POST /affiliate/{id}/bridge verifierar licensnummer mot förbundets publika licens-API. Status: pending→verified→expired/revoked. PL-T302: vid signup med bridge_to_federation=true skickas notifikation + audit-event till nationella federationens sys_engineer post-provisionering.
✅ PL-T003 / PL-T302 - F01.01.22 Shipped
Affiliate consolidated history — GET /affiliate/{id}/members/{user_id}/consolidated-history slår ihop matcher från affiliate- och förbundstenant, sorterade kronologiskt, taggade med source_tenant_id och source_type. Kräver aktiv brygglänk för förbundsdata.
✅ PL-T003 - F01.01.23 Shipped
Multi-discipline club support — Club.disciplines array (min 1 required, default [petanque]). GET/PUT /clubs/{id}/disciplines sub-resource. ?discipline= query param on GET /clubs. Removal blocked by 409 if active competitions/licenses exist. Admin toggle UI.
✅ PL-T013
Governance Bodies & Commissions
F01.02F01.02.01–04 levererade i **PL-F0102a**, F01.02.05–08 levererade i **PL-F0102b**. API: `specs/api/endpoints/commissions.md`, `specs/api/endpoints/meetings.md`, `specs/api/endpoints/governance-audit.md`.
How it works- F01.02.01 Shipped
Commission/committee registry (disciplinary, umpire, medical, selection, etc.) — /commissions CRUD + filter på typ/status/jurisdiction/authority_level
✅ PL-F0102a - F01.02.02 Shipped
Commission membership management (chair, members, terms) — add/update/remove + expiring-terms
✅ PL-F0102a - F01.02.03 Shipped
Commission mandate and scope definition — strukturerad CommissionScope (jurisdiction × authority_level × authority_areas × reports_to) med org_node-invariant
✅ PL-F0102a - F01.02.04 Shipped
Meeting management (agenda, minutes, decisions) — /meetings CRUD + agenda/minutes/decisions-sub-endpoints
✅ PL-F0102a - F01.02.05 Shipped
Decision tracking and publication — lifecycle draft → adopted → published → rescinded, röstningssammanfattning, auto-genererat {YYYY}-{NNN}-referensnummer och tvärmötes-listning på /meetings/published/decisions
✅ PL-F0102b - F01.02.06 Shipped
Term limits and rotation tracking — term_limit_months, max_consecutive_terms, rotation_policy, konsekutiv-term med 120-dagars gap-reset och /commissions/{id}/rotation-report
✅ PL-F0102b - F01.02.07 Shipped
Conflict of interest declarations — strukturerad ConflictOfInterestDeclaration (typ × status) på ledamot, /commissions/{id}/conflicts listning + member-scoped CRUD med lifecycle-invarianter
✅ PL-F0102b - F01.02.08 Shipped
Audit trail on all governance actions — append-only GovernanceAuditLog skrivs från samtliga muterande endpoints, read-only /governance/audit-router med filter och /actions-taxonomi, tenant-isolerad
✅ PL-F0102b
Elections & Voting
F01.03Implementerat i PL-1601 och utökat i PL-F0103a/b. API: `specs/api/endpoints/elections.md`. PL-F0103a levererade publikt tillkännagivande, röstberättigandeservice och publik listning av tillkännagivna val. PL-F0103b färdigställde subsectionen med enterprise-kvalitet på rösträkning (kvorum + tie-break-detektion), fullmaktsröstning (proxy-kedjespärr, positionsbegränsade fullmakter, `revocation_reason`, konfigurerbar `max_proxies_per_voter`) och append-only granskningslogg (`ElectionAuditLog` + `ElectionAuditAction`-enum där ballot-secrecy upprätthålls av både modellvalidator och service-lagrets `_sanitize_details`). Ny publik resultat-endpoint `GET /public/elections/{id}/results`.
How it works- F01.03.01 Shipped
Election scheduling and announcement
✅ PL-F0103a - F01.03.02 Shipped
Candidate registration and profile
✅ PL-F0103a - F01.03.03 Shipped
Voter eligibility rules per federation level
✅ PL-F0103a - F01.03.04 Shipped
Secure online voting (anonymous, verifiable)
✅ PL-F0103a - F01.03.05 Shipped
Vote counting and result publication
✅ PL-F0103b - F01.03.06 Shipped
Proxy voting support
✅ PL-F0103b - F01.03.07 Shipped
Audit trail on voting processes
✅ PL-F0103b - F01.03.08 Shipped
Governance meetings (AGM, board, committee) with quorum, voting, minutes and QES signing via Freja eID/BankID/DocuSign
✅ PL-T104
Rules & Regulations
F01.04Implemented in PL-1602 and extended in PL-F0104a/b. API: `RuleDocument`, `RuleVersion`, `RuleInterpretation`, `RuleChangeSubscription`, `RuleChangeEvent` models with full CRUD, versioning with diff, workflow (draft→proposed→approved→archived), translation status tracking, multilingual search, BFS cross-reference graph, interpretation database with FAQ/case-law/guidance classification and precedent chains, and a per-tenant rule-change notification fan-out that writes audit events and emits `FEDERATION_CIRCULAR` notifications. Spec: `specs/api/endpoints/rules.md`. PL-F0104a delivered 36 tests for F01.04.01–04; PL-F0104b added 45 more (81 total) covering F01.04.05–07.
How it works- F01.04.01 Shipped
Rule repository with versioning (FIPJP official rules)
✅ PL-F0104a - F01.04.02 Shipped
National/regional rule variations and supplements
✅ PL-F0104a - F01.04.03 Shipped
Rule change proposal workflow
✅ PL-F0104a - F01.04.04 Shipped
Rule translation management (multi-language)
✅ PL-F0104a - F01.04.05 Shipped
Rule search and cross-reference (incl. BFS graph walk)
✅ PL-F0104b - F01.04.06 Shipped
Rule interpretation database (FAQs, case law, precedent chain)
✅ PL-F0104b - F01.04.07 Shipped
Notification of rule changes to affected federations
✅ PL-F0104b
Inter-Federation Communication
F01.05Implemented in PL-F0105 on top of the PL-902 scaffolding. Delivers the
How it works- F01.05.01 Shipped
Official correspondence system (federation to federation)
✅ PL-F0105 - F01.05.02 Shipped
Circular distribution (FIPJP to all members)
✅ PL-F0105 - F01.05.03 Shipped
Document sharing between federation levels
✅ PL-F0105 - F01.05.04 Shipped
Calendar synchronization across federation levels
✅ PL-F0105 - F01.05.05 Shipped
Congress/general assembly management
✅ PL-F0105 - F01.05.06 Shipped
Resolution tracking and compliance monitoring
✅ PL-F0105
Club Management
F01.06Clubs are **OrgNodes** under their district in the OrgNode hierarchy.
How it works- F01.06.01 Shipped
Club registration as OrgNode under district in the OrgNode hierarchy
✅ PL-F0106a - F01.06.02 Shipped
Club profile (name, logo, venue, contact, founding year)
✅ PL-F0106a - F01.06.03 Shipped
Club board/officers management (president, secretary, treasurer, etc.)
✅ PL-F0106a - F01.06.04 Shipped
Club affiliation status and annual renewal
✅ PL-F0106a - F01.06.05 Shipped
Club member roster management
✅ PL-F0106a - F01.06.06 Shipped
Club statistics (members, competitions hosted, results) — GET /clubs/{id}/statistics aggregerar medlemmar/styrelse/anslutning/värdskap/resultat med tenant-scopad, typad fråga i datalagret
✅ PL-F0106b - F01.06.07 Shipped
Club-to-club communication — trådad meddelandetjänst (ClubMessage) med cross-tenant-block, reply/mark-read/direction-filter
✅ PL-F0106b - F01.06.08 Shipped
Club search/directory (by district, facilities, level) — city/level/facility ($all) filter + nya index (level,1), (facilities,1), (venue.city,1)
✅ PL-F0106b - F01.06.09 Shipped
Club document management (statutes, insurance, permits) — ClubDocument med sluten kategori-enum, versionskedja, verify/expiring-sweep, soft-delete
✅ PL-F0106b - F01.06.10 Shipped
Safeguarding officer designation and tracking — embedded SafeguardingOfficer + append-only safeguarding_history, 6 endpoints, BackgroundCheck-länk
✅ PL-F0106b
Per-tenant Hierarchy & OrgNode Configuration
F01.07Per-tenant hierarchy configuration. Every federation chooses its own OrgNode
How it works- F01.07.01 Shipped
Configurable hierarchy depth per tenant (0–3 intermediate levels)
✅ PL-F0107a - F01.07.02 Shipped
Sverige — distrikt → klubb (SBF seed uses depth=1 with distrikt as the only intermediate OrgNode type)
✅ PL-F0107a - F01.07.03 Shipped
France — ligue → comité → club (FFPJP seed uses depth=2 with ligue and comité)
✅ PL-F0107a - F01.07.04 Shipped
Norge — direkt klubb under förbund (NBF seed uses depth=0, no intermediate OrgNodes)
✅ PL-F0107a - F01.07.05 Shipped
Deutschland — Landesverband → Bezirk → Verein (DPV seed uses depth=2 with Landesverband and Bezirk; see note below)
✅ PL-F0107a - F01.07.06 Shipped
Per-OrgNode capabilities (godkänna tävlingar) — audit-logged PUT /org-nodes/districts/{id}/capabilities replaces per-instance overrides
✅ PL-F0107b - F01.07.07 Shipped
Per-OrgNode roles and permissions — the platform's RoleAssignment role model scoped to org_node with list/grant/revoke endpoints
✅ PL-F0107b - F01.07.08 Shipped
OrgNode tree view with drag-and-drop — nested GET /org-nodes/tree + move endpoints for districts and clubs (cycle detection, level guard)
✅ PL-F0107b - F01.07.09 Shipped
OrgNode history and audit trail — append-only OrgNodeAuditLog, per-node history endpoint and tenant-wide audit query
✅ PL-F0107b - F01.07.10 Shipped
Merge and split of OrgNodes — POST /org-nodes/districts/merge and POST /org-nodes/districts/{id}/split reassign clubs + sub-districts with paired audit entries
✅ PL-F0107b - F01.07.11 Shipped
OrgNode autonomy delegation — four explicit flags (financial, discipline, ranking, pricing) per district/club, no inheritance, federation-admin-only toggling via GET/PUT /admin/orgnodes/{id}/autonomy, guard-based enforcement on finance/disciplinary/ranking/license-fee endpoints, audit-logged with before/after diff
✅ PL-T006
Federation Onboarding & Migration
F01.08Self-service onboarding-wizard för nya federationer plus bulk-import av
How it works- F01.08.01 Shipped
Self-service onboarding wizard for new federations
✅ PL-F0108a - F01.08.02 Shipped
Bulk import of clubs and players (CSV, XML)
✅ PL-F0108a - F01.08.03 Shipped
Business-rule validation of imported rows per tenant
✅ PL-F0108a - F01.08.04 Shipped
Dry-run diff report (new/update/unchanged/error)
✅ PL-F0108a - F01.08.05 Shipped
Migrationsplan-generator (källsystem → Petanque Life) — POST /federation-onboarding/migration-plans returnerar ordnade steg, källsystemsspecifika varningar och risknivåer (FFBE/SBF/DPV-heuristik, volymbaserad eskalering)
✅ PL-F0108b - F01.08.06 Shipped
Sandbox-tenant för pilotinstallation — /federation-onboarding/sandboxes wrappar TenantConfig, lifecycle active → promoted \
discarded, discard soft-deletar konfigen | ✅ PL-F0108b - F01.08.07 Shipped
Datavalidering och rensning under import — idempotent städpipeline före validering, per-fält-normalisering (whitespace, casing, email, telefon, DD/MM/YYYY → ISO), omskrivningar rapporteras som warnings/cleaned_count
✅ PL-F0108b - F01.08.08 Shipped
Rollback av import vid fel — ImportBatch spårar created_ids + pre-mutation update_snapshots, manuell rollback via /imports/batches/{id}/rollback och auto-rollback vid mid-apply-fel (stämplas auto_rolled_back)
✅ PL-F0108b - F01.09.01 Shipped
Dry-run migration plan with per-collection document counting and conflict detection
✅ PL-T010 - F01.09.02 Shipped
Consent flow — one-time token invitation to club admin, acceptance endpoint
✅ PL-T010 - F01.09.03 Shipped
Migration execution — move documents, update tenant_id, set source read-only
✅ PL-T010 - F01.09.04 Shipped
30-day rollback window — revert all migrated documents, lift read-only
✅ PL-T010 - F01.09.05 Shipped
Conflict resolution — license number / club code collision (skip/rename/overwrite)
✅ PL-T010 - F01.09.06 Shipped
Four-step admin wizard UI with migration dashboard and rollback controls
✅ PL-T010 - F01.10.01 Shipped
Adaptiv, org-medveten guide — ramfrågor (structure/licensed/preset) formar stegen; GET /v1/onboarding/guide returnerar variant + framing + härlett stegset + readiness[] + recommended_next[]; POST /v1/onboarding/framing sparar svaren och räknar om stegseten idempotent (If-Match)
✅ f154e12a.m-1.t-1 (BACKEND) - F01.10.02 Shipped
Per-variant stegset (federation/distrikt/klubb/venue) beräknat server-side ur org-typ + framing; klient-satt ?variant/tenant_id ignoreras
✅ f154e12a.m-1.t-1 - F01.10.03 Shipped
Klubbens avgift ovanpå federationslicensen — club_fee-steget skriver via befintliga D-ORGS PUT /v1/tenant/license-types/{id}/fees (license_fee_component + org_node_id + pricing-guard)
✅ f154e12a.m-1.t-1 - F01.10.04 Shipped
Utfalls-mätare (readiness[]) data-driven ur riktig konfiguration (licenstyper, sanktionerande nivåer) — aldrig hårdkodade booleans
✅ f154e12a.m-1.t-1 - F01.10.05 Shipped
Aktörsattribuering + resumerbarhet — step_status jsonb spårar per-steg state + actor (tenant/sys); steg-komplettering registrerar aktören
✅ f154e12a.m-1.t-1 - F01.10.06 Shipped
Hoppa-över + hem-checklista — POST /v1/onboarding/steps/{step}:skip (icke-obligatoriska steg → skipped); obligatoriskt steg → 422 required_step_not_skippable; steg utanför set → 422 step_not_in_set
✅ f154e12a.m-1.t-1 - F01.10.07 Planned
Betal-steg (Connect payments — ✅ m-3), no-touch medlemsimport (✅ m-4, se F03), admin-vyer
🔜 syskon-milstolpar - F01.10.08 Shipped
Sys warm-start vid approve (D-SIGNUP-2 m-5, backend) — F1-6:s approve-body utökad ADDITIVT med valfritt warm_start (preset/structure/tier/queue_member_import); validerat mot guidens BEFINTLIGA closed sets FÖRE beslutstransaktionen (ogiltigt → 422 med warm_start.*-fältfel, atomärt — ingen tenant); seedning i SAMMA transaktion som provisioneringen (framing + server-härledd variant + köad member_import som MARKERING + requested_tier-kod framåtburen — inga pengar); auditerat onboarding.warmstart.seed i TENANTENS logg attribuerat den beslutande operatören (aldrig "system"); idempotens/409-no-op ärvd; aldrig låst (framing omskrivbar). Guiden får additivt toppnivå-warm_start (actor_id, queued_steps) + per steg queued. Spec: specs/api/endpoints/onboarding-warmstart-assist.md — f154e12a.m-5.t-1
✅ f154e12a.m-5.t-1 - F01.10.09 Shipped
Assist — consent-gated sam-fyllning (D-SIGNUP-2 m-5, backend) — steg-skopat, återkallbart, tidsbegränsat (TTL 7 d) engångs-samtycke onboarding_assist_consent (00095; max ETT öppet per {tenant, steg} via partiellt unikt index): tenant POST /v1/onboarding/steps/{step}:request-assist
:revoke-assist (samma gate + stegset-grind som :complete; idempotent; auditerat); sys GET /v1/sys/onboarding-assists (inkorg), GET /v1/sys/tenants/{id}/onboarding/guide (läs endast m. levande samtycke) och POST /v1/sys/tenants/{id}/onboarding/steps/{step}:complete — genom SAMMA stepDelegate-validering/If-Match som tenant-vägen; step_status={done, sys, <op>} ("Set up for you"-producenten), audit i tenantens logg attribuerad operatören, samtycket förbrukas (422 förbrukar inte). Deny-by-default: allt utan levande steg-exakt samtycke (inkl. okänd tenant) → identiskt opakt 403 — ingen enumeration, ingen D-SYS-impersonation. Domän: docs/domain/onboarding-assist-consent.md — f154e12a.m-5.t-1 | ✅ f154e12a.m-5.t-1 - F01.10.10 Shipped
Sys warm-start-panel + assist-yta, admin assist + warm-start-banner (D-SIGNUP-2 m-5, frontend) — sys ärendedetaljen får "🤝 Warm start (valfritt)"-panelen (ENBART beslutbara ärenden — submitted/in_review; preset/strukturdjup/tier — tier-katalogen DATA-driven ur GET /v1/public/onboarding/tiers — + köa-import-checkbox; valen rider som warm_start på den BEFINTLIGA approve-mutationen; 422 warm_start.*-fältfel renderas per fält) och "Assistera en pågående tenant"-ytan (GET /v1/sys/onboarding-assists → assist-läge: tenantens guide-läsmodell via GET /v1/sys/tenants/{id}/onboarding/guide + sam-fyll DET samtyckta steget via POST …/steps/{k}:complete; opakt 403 → ärligt felstate, aldrig krasch). Admin-guiden får warm-start-bannern (guide.warm_start), "🤝 Set up for you" på warm-startat innehåll (prefilled/köat + completed_by_actor='sys'), köad-import-markeringen (step.queued) och steg-generisk "🤝 Be Petanque Life sätta upp det här →"-begäran med status + återkallning (assist_state, :request-assist/:revoke-assist). Allt via den genererade klienten mot riktiga endpoints — inga hårdkodade badges. Vy-spec: specs/sys/views/onboarding-inbox.md + specs/views/admin-onboarding-guide-views.md — f154e12a.m-5.t-2
✅ f154e12a.m-5.t-2
No features match your filters.